static void ide_source_snippet_parser_store (IdeSourceSnippetParser *parser) { IdeSourceSnippet *snippet; GList *scope_iter; GList *chunck_iter; ide_source_snippet_parser_flush_chunk (parser); for (scope_iter = parser->scope; scope_iter; scope_iter = scope_iter->next) { snippet = ide_source_snippet_new (parser->cur_name, g_strdup(scope_iter->data)); ide_source_snippet_set_description (snippet, parser->cur_desc); ide_source_snippet_set_snippet_text (snippet, parser->snippet_text->str); for (chunck_iter = parser->chunks; chunck_iter; chunck_iter = chunck_iter->next) { #if 0 g_printerr ("%s: Tab: %02d Link: %02d Text: %s\n", parser->cur_name, ide_source_snippet_chunk_get_tab_stop (chunck_iter->data), ide_source_snippet_chunk_get_linked_chunk (chunck_iter->data), ide_source_snippet_chunk_get_text (chunck_iter->data)); #endif ide_source_snippet_add_chunk (snippet, chunck_iter->data); } parser->snippets = g_list_append (parser->snippets, snippet); } }
/** * ide_source_snippet_copy: * * Returns: (transfer full): An #IdeSourceSnippet. */ IdeSourceSnippet * ide_source_snippet_copy (IdeSourceSnippet *self) { IdeSourceSnippetChunk *chunk; IdeSourceSnippet *ret; gint i; g_return_val_if_fail (IDE_IS_SOURCE_SNIPPET (self), NULL); ret = g_object_new (IDE_TYPE_SOURCE_SNIPPET, "trigger", self->trigger, "language", self->language, "description", self->description, NULL); for (i = 0; i < self->chunks->len; i++) { chunk = g_ptr_array_index (self->chunks, i); chunk = ide_source_snippet_chunk_copy (chunk); ide_source_snippet_add_chunk (ret, chunk); g_object_unref (chunk); } return ret; }
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; }