static void ide_clang_service_parse_worker (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable) { g_autoptr(IdeClangTranslationUnit) ret = NULL; g_autoptr(IdeHighlightIndex) index = NULL; g_autoptr(IdeFile) file_copy = NULL; IdeClangService *self = source_object; CXTranslationUnit tu = NULL; ParseRequest *request = task_data; IdeContext *context; const gchar * const *argv; GFile *gfile; gsize argc = 0; const gchar *detail_error = NULL; enum CXErrorCode code; GArray *ar = NULL; gsize i; g_assert (G_IS_TASK (task)); g_assert (IDE_IS_CLANG_SERVICE (source_object)); g_assert (!cancellable || G_IS_CANCELLABLE (cancellable)); g_assert (IDE_IS_FILE (request->file)); file_copy = g_object_ref (request->file); ar = g_array_new (FALSE, FALSE, sizeof (struct CXUnsavedFile)); g_array_set_clear_func (ar, clear_unsaved_file); for (i = 0; i < request->unsaved_files->len; i++) { IdeUnsavedFile *iuf = g_ptr_array_index (request->unsaved_files, i); struct CXUnsavedFile uf; GBytes *content; GFile *file; file = ide_unsaved_file_get_file (iuf); content = ide_unsaved_file_get_content (iuf); uf.Filename = g_file_get_path (file); uf.Contents = g_bytes_get_data (content, NULL); uf.Length = g_bytes_get_size (content); g_array_append_val (ar, uf); } argv = (const gchar * const *)request->command_line_args; argc = argv ? g_strv_length (request->command_line_args) : 0; EGG_COUNTER_INC (ParseAttempts); code = clang_parseTranslationUnit2 (request->index, request->source_filename, argv, argc, (struct CXUnsavedFile *)(void *)ar->data, ar->len, request->options, &tu); switch (code) { case CXError_Success: index = ide_clang_service_build_index (self, tu, request); #ifdef IDE_ENABLE_TRACE ide_highlight_index_dump (index); #endif break; case CXError_Failure: detail_error = _("Unknown failure"); break; case CXError_Crashed: detail_error = _("Clang crashed"); break; case CXError_InvalidArguments: detail_error = _("Invalid arguments"); break; case CXError_ASTReadError: detail_error = _("AST read error"); break; default: break; } if (!tu) { g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to create translation unit: %s"), detail_error ? detail_error : ""); goto cleanup; } context = ide_object_get_context (source_object); gfile = ide_file_get_file (request->file); ret = _ide_clang_translation_unit_new (context, tu, gfile, index, request->sequence); g_task_return_pointer (task, g_object_ref (ret), g_object_unref); cleanup: g_array_unref (ar); }
static void gbp_flatpak_dependency_updater_update_async (IdeDependencyUpdater *updater, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GbpFlatpakDependencyUpdater *self = (GbpFlatpakDependencyUpdater *)updater; GbpFlatpakDownloadStage *stage = NULL; g_autoptr(IdeTask) task = NULL; IdePipeline *pipeline; IdeBuildManager *manager; IdeContext *context; g_assert (GBP_IS_FLATPAK_DEPENDENCY_UPDATER (self)); g_assert (!cancellable || G_IS_CANCELLABLE (cancellable)); task = ide_task_new (self, cancellable, callback, user_data); ide_task_set_source_tag (task, gbp_flatpak_dependency_updater_update_async); ide_task_set_priority (task, G_PRIORITY_LOW); context = ide_object_get_context (IDE_OBJECT (self)); g_assert (IDE_IS_CONTEXT (context)); manager = ide_build_manager_from_context (context); g_assert (IDE_IS_BUILD_MANAGER (manager)); pipeline = ide_build_manager_get_pipeline (manager); g_assert (!pipeline || IDE_IS_PIPELINE (pipeline)); if (pipeline == NULL) { ide_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "Cannot update flatpak dependencies until build pipeline is initialized"); return; } /* Find the downloads stage and tell it to download updates one time */ ide_pipeline_foreach_stage (pipeline, find_download_stage_cb, &stage); if (stage == NULL) { /* Synthesize success if they weren't using flatpak. */ ide_task_return_boolean (task, TRUE); return; } gbp_flatpak_download_stage_force_update (stage); /* Ensure downloads and everything past it is invalidated */ ide_pipeline_invalidate_phase (pipeline, IDE_PIPELINE_PHASE_DOWNLOADS); /* Start building all the way up to the project configure so that * the user knows if the updates broke their configuration or anything. */ ide_build_manager_rebuild_async (manager, IDE_PIPELINE_PHASE_CONFIGURE, NULL, NULL, gbp_flatpak_dependency_updater_update_cb, g_steal_pointer (&task)); }