static void ide_source_snippet_chunk_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { IdeSourceSnippetChunk *chunk = IDE_SOURCE_SNIPPET_CHUNK (object); switch (prop_id) { case PROP_CONTEXT: ide_source_snippet_chunk_set_context (chunk, g_value_get_object (value)); break; case PROP_TAB_STOP: ide_source_snippet_chunk_set_tab_stop (chunk, g_value_get_int (value)); break; case PROP_SPEC: ide_source_snippet_chunk_set_spec (chunk, g_value_get_string (value)); break; case PROP_TEXT: ide_source_snippet_chunk_set_text (chunk, g_value_get_string (value)); break; case PROP_TEXT_SET: ide_source_snippet_chunk_set_text_set (chunk, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } }
static void ide_source_snippet_parser_do_part_named (IdeSourceSnippetParser *parser, const gchar *name) { IdeSourceSnippetChunk *chunk; gchar *spec; chunk = ide_source_snippet_chunk_new (); spec = g_strdup_printf ("$%s", name); ide_source_snippet_chunk_set_spec (chunk, spec); ide_source_snippet_chunk_set_tab_stop (chunk, -1); parser->chunks = g_list_append (parser->chunks, chunk); g_free (spec); }
static void ide_source_snippet_parser_do_part_n (IdeSourceSnippetParser *parser, gint n, const gchar *inner) { IdeSourceSnippetChunk *chunk; g_return_if_fail (IDE_IS_SOURCE_SNIPPET_PARSER (parser)); g_return_if_fail (n >= -1); g_return_if_fail (inner); chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_spec (chunk, n ? inner : ""); ide_source_snippet_chunk_set_tab_stop (chunk, n); parser->chunks = g_list_append (parser->chunks, chunk); }
static void ide_source_snippet_parser_do_part_linked (IdeSourceSnippetParser *parser, gint n) { IdeSourceSnippetChunk *chunk; gchar text[12]; chunk = ide_source_snippet_chunk_new (); if (n) { g_snprintf (text, sizeof text, "$%d", n); text[sizeof text - 1] = '\0'; ide_source_snippet_chunk_set_spec (chunk, text); } else { ide_source_snippet_chunk_set_spec (chunk, ""); ide_source_snippet_chunk_set_tab_stop (chunk, 0); } parser->chunks = g_list_append (parser->chunks, chunk); }
static void ide_clang_completion_item_lazy_init (IdeClangCompletionItem *self) { CXCompletionResult *result; g_autoptr(IdeSourceSnippet) snippet = NULL; GdkPixbuf *icon = NULL; GString *markup = NULL; unsigned num_chunks; unsigned i; guint tab_stop = 0; g_assert (IDE_IS_CLANG_COMPLETION_ITEM (self)); if (G_LIKELY (self->initialized)) return; result = ide_clang_completion_item_get_result (self); num_chunks = clang_getNumCompletionChunks (result); snippet = ide_source_snippet_new (NULL, NULL); markup = g_string_new (NULL); g_assert (result); g_assert (num_chunks); g_assert (IDE_IS_SOURCE_SNIPPET (snippet)); g_assert (markup); /* * Try to determine the icon to use for this result. */ switch ((int)result->CursorKind) { case CXCursor_CXXMethod: case CXCursor_Constructor: case CXCursor_Destructor: case CXCursor_MemberRef: case CXCursor_MemberRefExpr: case CXCursor_ObjCClassMethodDecl: case CXCursor_ObjCInstanceMethodDecl: icon = get_icon ("lang-method-symbolic"); break; case CXCursor_ConversionFunction: case CXCursor_FunctionDecl: case CXCursor_FunctionTemplate: icon = get_icon ("lang-function-symbolic"); break; case CXCursor_FieldDecl: icon = get_icon ("struct-field-symbolic"); break; case CXCursor_VarDecl: /* local? */ case CXCursor_ParmDecl: case CXCursor_ObjCIvarDecl: case CXCursor_ObjCPropertyDecl: case CXCursor_ObjCSynthesizeDecl: case CXCursor_NonTypeTemplateParameter: case CXCursor_Namespace: case CXCursor_NamespaceAlias: case CXCursor_NamespaceRef: break; case CXCursor_StructDecl: icon = get_icon ("lang-struct-symbolic"); break; case CXCursor_UnionDecl: case CXCursor_ClassDecl: case CXCursor_TypeRef: case CXCursor_TemplateRef: case CXCursor_TypedefDecl: case CXCursor_ClassTemplate: case CXCursor_ClassTemplatePartialSpecialization: case CXCursor_ObjCClassRef: case CXCursor_ObjCInterfaceDecl: case CXCursor_ObjCImplementationDecl: case CXCursor_ObjCCategoryDecl: case CXCursor_ObjCCategoryImplDecl: case CXCursor_ObjCProtocolDecl: case CXCursor_ObjCProtocolRef: case CXCursor_TemplateTypeParameter: case CXCursor_TemplateTemplateParameter: icon = get_icon ("lang-class-symbolic"); break; case CXCursor_EnumConstantDecl: icon = get_icon ("lang-enum-value-symbolic"); break; case CXCursor_EnumDecl: icon = get_icon ("lang-enum-symbolic"); break; case CXCursor_NotImplemented: default: break; } /* * Walk the chunks, creating our snippet for insertion as well as our markup * for the row in the completion window. */ for (i = 0; i < num_chunks; i++) { enum CXCompletionChunkKind kind; IdeSourceSnippetChunk *chunk; const gchar *text; g_autofree gchar *escaped = NULL; CXString cxstr; kind = clang_getCompletionChunkKind (result->CompletionString, i); cxstr = clang_getCompletionChunkText (result->CompletionString, i); text = clang_getCString (cxstr); if (text) escaped = g_markup_escape_text (text, -1); else escaped = g_strdup (""); switch (kind) { case CXCompletionChunk_Optional: break; case CXCompletionChunk_TypedText: g_string_append_printf (markup, "<b>%s</b>", escaped); chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, text); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); break; case CXCompletionChunk_Text: g_string_append (markup, escaped); chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, text); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); break; case CXCompletionChunk_Placeholder: g_string_append (markup, escaped); chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, text); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_chunk_set_tab_stop (chunk, ++tab_stop); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); break; case CXCompletionChunk_Informative: if (0 == g_strcmp0 (text, "const ")) g_string_append (markup, text); break; case CXCompletionChunk_CurrentParameter: break; case CXCompletionChunk_LeftParen: g_string_append (markup, " "); chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, " "); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); /* fall through */ case CXCompletionChunk_RightParen: case CXCompletionChunk_LeftBracket: case CXCompletionChunk_RightBracket: case CXCompletionChunk_LeftBrace: case CXCompletionChunk_RightBrace: case CXCompletionChunk_LeftAngle: case CXCompletionChunk_RightAngle: case CXCompletionChunk_Comma: case CXCompletionChunk_Colon: case CXCompletionChunk_SemiColon: case CXCompletionChunk_Equal: case CXCompletionChunk_HorizontalSpace: g_string_append (markup, escaped); chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, text); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); break; case CXCompletionChunk_VerticalSpace: g_string_append (markup, escaped); /* insert the vertical space */ chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, text); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); /* now perform indentation */ chunk = ide_source_snippet_chunk_new (); ide_source_snippet_chunk_set_text (chunk, "\t"); ide_source_snippet_chunk_set_text_set (chunk, TRUE); ide_source_snippet_add_chunk (snippet, chunk); g_clear_object (&chunk); break; case CXCompletionChunk_ResultType: g_string_append_printf (markup, "%s ", escaped); break; default: break; } } self->snippet = g_object_ref (snippet); self->markup = g_string_free (markup, FALSE); self->icon = icon ? g_object_ref (icon) : NULL; }