[gnome-builder] code-index: stub out new implementation of index builder



commit b11179b183d3fba395ae98dd9126b7ff1826de4b
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jan 17 18:08:25 2018 -0800

    code-index: stub out new implementation of index builder
    
    We need to rewrite this to avoid using threads. This just stubs out the
    same API for where we will start with.

 src/plugins/code-index/ide-code-index-builder.c | 831 ++----------------------
 src/plugins/code-index/ide-code-index-builder.h |   7 +-
 src/plugins/code-index/ide-code-index-service.c |   2 +-
 3 files changed, 61 insertions(+), 779 deletions(-)
---
diff --git a/src/plugins/code-index/ide-code-index-builder.c b/src/plugins/code-index/ide-code-index-builder.c
index 27fc62434..1f42f0db5 100644
--- a/src/plugins/code-index/ide-code-index-builder.c
+++ b/src/plugins/code-index/ide-code-index-builder.c
@@ -1,6 +1,7 @@
 /* ide-code-index-builder.c
  *
  * Copyright © 2017 Anoop Chandu <anoopchandu96 gmail com>
+ * Copyright © 2018 Christian Hergert <chergert redhat com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,39 +19,15 @@
 
 #define G_LOG_DOMAIN "ide-code-index-builder"
 
-#include <dazzle.h>
-#include <glib/gprintf.h>
-
 #include "ide-code-index-builder.h"
-#include "ide-persistent-map-builder.h"
 
 struct _IdeCodeIndexBuilder
 {
-  IdeObject            parent;
-
-  GMutex               mutex;
-  IdeCodeIndexIndex   *index;
+  IdeObject parent;
   IdeCodeIndexService *service;
-
-  GHashTable          *build_flags;
+  IdeCodeIndexIndex *index;
 };
 
-typedef struct
-{
-  GFile     *directory;
-  GPtrArray *changes;
-  GFile     *destination;
-  guint      recursive : 1;
-} GetChangesTaskData;
-
-typedef struct
-{
-  GPtrArray *files;
-  GFile     *destination;
-} IndexingData;
-
-G_DEFINE_TYPE (IdeCodeIndexBuilder, ide_code_index_builder, IDE_TYPE_OBJECT)
-
 enum {
   PROP_0,
   PROP_INDEX,
@@ -58,734 +35,19 @@ enum {
   N_PROPS
 };
 
-static GParamSpec *properties [N_PROPS];
-
-static void
-get_changes_task_data_free (GetChangesTaskData *data)
-{
-  g_clear_object (&data->directory);
-  g_clear_object (&data->destination);
-  g_clear_pointer (&data->changes, g_ptr_array_unref);
-  g_slice_free (GetChangesTaskData, data);
-}
-
-static void
-indexing_data_free (IndexingData *data)
-{
-  if (data == NULL)
-    return;
-  g_clear_pointer (&data->files, g_ptr_array_unref);
-  g_clear_object (&data->destination);
-  g_slice_free (IndexingData, data);
-}
-
-static gboolean
-timeval_compare (GTimeVal a,
-                 GTimeVal b)
-{
-  return ((a.tv_sec > b.tv_sec) || ((a.tv_sec == b.tv_sec) && (a.tv_usec > b.tv_usec)));
-}
-
-static const gchar * const *
-ide_code_index_builder_get_build_flags (IdeCodeIndexBuilder *self,
-                                        GFile               *file)
-{
-  g_autoptr(IdeFile) ifile = NULL;
-  IdeContext *context;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_FILE (file));
-
-  context = ide_object_get_context (IDE_OBJECT (self));
-  ifile = ide_file_new (context, file);
-
-  return g_hash_table_lookup (self->build_flags, ifile);
-}
-
-static GPtrArray *
-ide_code_index_builder_get_all_files (IdeCodeIndexBuilder *self,
-                                      GPtrArray           *changes)
-{
-  g_autoptr(GPtrArray) all_files = NULL;
-  g_autoptr(GMutexLocker) locker = NULL;
-  IdeContext *context;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (changes != NULL);
-
-  context = ide_object_get_context (IDE_OBJECT (self));
-  all_files = g_ptr_array_new_with_free_func (g_object_unref);
-
-  locker = g_mutex_locker_new (&self->mutex);
-
-  for (guint i = 0; i < changes->len; i++)
-    {
-      const IndexingData *change = g_ptr_array_index (changes, i);
-
-      for (guint j = 0; j < change->files->len; j++)
-        {
-          GFile *gfile = g_ptr_array_index (change->files, j);
-          g_autoptr(IdeFile) file = ide_file_new (context, gfile);
-
-          if (!g_hash_table_contains (self->build_flags, file))
-            g_ptr_array_add (all_files, g_steal_pointer (&file));
-        }
-    }
-
-  return g_steal_pointer (&all_files);
-}
-
-/* Index directories: index all directores, store index and load index */
-
-static void
-ide_code_index_builder_index_file (IdeCodeIndexBuilder      *self,
-                                   GFile                    *file,
-                                   guint32                   file_id,
-                                   IdePersistentMapBuilder  *map_builder,
-                                   DzlFuzzyIndexBuilder     *fuzzy_builder,
-                                   GTask                    *task)
-{
-  g_autofree gchar *file_name = NULL;
-  g_autoptr(IdeCodeIndexEntries) entries = NULL;
-  g_autoptr(GError) error = NULL;
-  IdeCodeIndexer *indexer;
-  GCancellable *cancellable;
-  gpointer indexentryptr;
-  gchar num[16];
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_FILE (file));
-  g_assert (IDE_IS_PERSISTENT_MAP_BUILDER (map_builder));
-  g_assert (DZL_IS_FUZZY_INDEX_BUILDER (fuzzy_builder));
-  g_assert (G_IS_TASK (task));
-
-  file_name = g_file_get_path (file);
-
-  indexer = ide_code_index_service_get_code_indexer (self->service, file_name);
-  if (indexer == NULL)
-    return;
-
-  cancellable = g_task_get_cancellable (task);
-
-  entries = ide_code_indexer_index_file (indexer,
-                                         file,
-                                         ide_code_index_builder_get_build_flags (self, file),
-                                         cancellable,
-                                         &error);
-
-  if (entries == NULL)
-    {
-      if (error != NULL)
-        g_warning ("Failed to index file: %s", error->message);
-      return;
-    }
-
-  g_snprintf (num, sizeof (num), "%u", file_id);
-
-  /*
-   * Storing file_name:id and id:file_name into index, file_name:id will be
-   * used to check whether a file is there in index or not.
-   */
-  dzl_fuzzy_index_builder_set_metadata_uint32 (fuzzy_builder, file_name, file_id);
-  dzl_fuzzy_index_builder_set_metadata_string (fuzzy_builder, num, file_name);
-
-  while (NULL != (indexentryptr = ide_code_index_entries_get_next_entry (entries)))
-    {
-      g_autoptr(IdeCodeIndexEntry) entry = indexentryptr;
-      const gchar *key;
-      const gchar *name;
-      IdeSymbolKind kind;
-      IdeSymbolFlags flags;
-      guint begin_line;
-      guint begin_line_offset;
-
-      key = ide_code_index_entry_get_key (entry);
-      name  = ide_code_index_entry_get_name (entry);
-      kind  = ide_code_index_entry_get_kind (entry);
-      flags  = ide_code_index_entry_get_flags (entry);
-
-      ide_code_index_entry_get_range (entry,
-                                      &begin_line,
-                                      &begin_line_offset,
-                                      NULL,
-                                      NULL);
-
-      /* In our index lines and offsets are 1-based */
-      if (key != NULL)
-        ide_persistent_map_builder_insert (map_builder,
-                                           key,
-                                           g_variant_new ("(uuuu)",
-                                             file_id,
-                                             begin_line, begin_line_offset,
-                                             flags),
-                                           flags & IDE_SYMBOL_FLAGS_IS_DEFINITION);
-      if (name != NULL)
-        dzl_fuzzy_index_builder_insert (fuzzy_builder,
-                                        name,
-                                        g_variant_new ("(uuuuu)",
-                                          file_id,
-                                          begin_line, begin_line_offset,
-                                          flags, kind),
-                                        0);
-    }
-}
-
-static void
-ide_code_index_builder_index_directory (GTask        *task,
-                                        gpointer      source_object,
-                                        gpointer      task_data_ptr,
-                                        GCancellable *cancellable)
-{
-  IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)source_object;
-  IndexingData *data = task_data_ptr;
-  g_autoptr(GFile) keys_file = NULL;
-  g_autoptr(GFile) names_file = NULL;
-  g_autoptr(IdePersistentMapBuilder) map_builder = NULL;
-  g_autoptr(DzlFuzzyIndexBuilder) fuzzy_builder = NULL;
-  g_autoptr(GError) error = NULL;
-
-  g_assert (G_IS_TASK (task));
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (data != NULL);
-  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
-
-  map_builder = ide_persistent_map_builder_new ();
-  fuzzy_builder = dzl_fuzzy_index_builder_new ();
-
-  g_file_make_directory_with_parents (data->destination, NULL, NULL);
-
-  g_debug ("Indexing directory");
-
-  for (guint i = 0; i < data->files->len; i++)
-    {
-      if (g_task_return_error_if_cancelled (task))
-        return;
-
-      ide_code_index_builder_index_file (self,
-                                         g_ptr_array_index (data->files, i),
-                                         i + 1,
-                                         map_builder,
-                                         fuzzy_builder,
-                                         task);
-    }
-
-  g_debug ("Writing directory index");
-
-  keys_file = g_file_get_child (data->destination, "SymbolKeys");
-
-  if (!ide_persistent_map_builder_write (map_builder,
-                                         keys_file,
-                                         G_PRIORITY_LOW,
-                                         cancellable,
-                                         &error))
-    {
-      g_message ("Unable to write keys map, %s", error->message);
-      g_task_return_error (task, g_steal_pointer (&error));
-      return;
-    }
-
-  dzl_fuzzy_index_builder_set_metadata_uint32 (fuzzy_builder,
-                                               "n_files",
-                                               data->files->len);
-
-  names_file = g_file_get_child (data->destination, "SymbolNames");
-
-  if (!dzl_fuzzy_index_builder_write (fuzzy_builder,
-                                      names_file,
-                                      G_PRIORITY_LOW,
-                                      cancellable,
-                                      &error))
-    {
-      g_message ("Unable to write fuzzy index, %s", error->message);
-      g_task_return_error (task, g_steal_pointer (&error));
-      return;
-    }
-
-  if (!ide_code_index_index_load (self->index, data->destination, cancellable, &error))
-    {
-      g_message ("Unable to load indexes, %s", error->message);
-      g_task_return_error (task, g_steal_pointer (&error));
-      return;
-    }
-
-  g_task_return_boolean (task, TRUE);
-}
-
-static void
-ide_code_index_builder_index_directory_cb (GObject      *object,
-                                           GAsyncResult *result,
-                                           gpointer      user_data)
-{
-  IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)object;
-  g_autoptr(GTask) task = user_data;
-  guint n_threads;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_TASK (task));
-
-  g_mutex_lock (&self->mutex);
-
-  n_threads = GPOINTER_TO_UINT (g_task_get_task_data (task)) - 1;
-
-  if (n_threads)
-    g_task_set_task_data (task, GUINT_TO_POINTER (n_threads), NULL);
-  else
-    g_task_return_boolean (task, TRUE);
-
-  g_mutex_unlock (&self->mutex);
-}
-
-static void
-ide_code_index_builder_index_directories_async (IdeCodeIndexBuilder *self,
-                                                GPtrArray           *changes,
-                                                GCancellable        *cancellable,
-                                                GAsyncReadyCallback  callback,
-                                                gpointer             user_data)
-{
-  g_autoptr(GTask) dirs_task = NULL;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (changes != NULL);
-  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
-
-  dirs_task = g_task_new (self, cancellable, callback, user_data);
-
-  g_task_set_priority (dirs_task, G_PRIORITY_LOW);
-  g_task_set_task_data (dirs_task, GUINT_TO_POINTER (changes->len), NULL);
-
-  for (guint i = 0; i < changes->len; i++)
-    {
-      g_autoptr(GTask) dir_task = NULL;
-      IndexingData *idata;
-
-      dir_task = g_task_new (self,
-                             cancellable,
-                             ide_code_index_builder_index_directory_cb,
-                             g_object_ref (dirs_task));
-
-      idata = g_ptr_array_index (changes, i);
-      g_ptr_array_index (changes, i) = NULL;
-
-      g_task_set_priority (dir_task, G_PRIORITY_LOW);
-      g_task_set_source_tag (dir_task, ide_code_index_builder_index_directories_async);
-      g_task_set_task_data (dir_task, idata, (GDestroyNotify)indexing_data_free);
-
-      ide_thread_pool_push_task (IDE_THREAD_POOL_INDEXER,
-                                 dir_task,
-                                 ide_code_index_builder_index_directory);
-    }
-}
-
-static gboolean
-ide_code_index_builder_index_directories_finish (IdeCodeIndexBuilder *self,
-                                                 GAsyncResult        *result,
-                                                 GError             **error)
-{
-  GTask *task = (GTask *)result;
-
-  g_assert (G_IS_TASK (task));
-
-  return g_task_propagate_boolean (task, error);
-}
-
-/* Get Changes: get all directories which are newer than index */
-
-static void
-ide_code_index_builder_get_changes (IdeCodeIndexBuilder *self,
-                                    GFile               *directory,
-                                    GFile               *destination,
-                                    gboolean             recursive,
-                                    GPtrArray           *changes,
-                                    GCancellable        *cancellable)
-{
-  g_autoptr(GPtrArray) files = NULL;
-  g_autoptr(GPtrArray) directories = NULL;
-  g_autoptr(GFileEnumerator) enumerator = NULL;
-  g_autoptr(GError) error = NULL;
-  gpointer infoptr;
-  GTimeVal max_mod_time = { 0 };
-  IdeVcs *vcs;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_FILE (directory));
-  g_assert (G_IS_FILE (destination));
-
-  vcs = ide_context_get_vcs (ide_object_get_context (IDE_OBJECT (self)));
-
-  if (ide_vcs_is_ignored (vcs, directory, NULL))
-    return;
-
-  if (NULL == (enumerator = g_file_enumerate_children (directory,
-                                                       G_FILE_ATTRIBUTE_STANDARD_NAME","
-                                                       G_FILE_ATTRIBUTE_STANDARD_TYPE","
-                                                       G_FILE_ATTRIBUTE_TIME_MODIFIED,
-                                                       G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
-                                                       NULL,
-                                                       &error)))
-    {
-      g_message ("Failed to get children, %s", error->message);
-      return;
-    }
-
-  files = g_ptr_array_new_with_free_func (g_object_unref);
-  directories = g_ptr_array_new_with_free_func (g_free);
-
-  while (NULL != (infoptr = g_file_enumerator_next_file (enumerator, cancellable, NULL)))
-    {
-      g_autoptr(GFileInfo) info = infoptr;
-      const gchar *file_name;
-      GFileType type;
-
-      file_name = g_file_info_get_name (info);
-      type = g_file_info_get_file_type (info);
-
-      if (type == G_FILE_TYPE_DIRECTORY && recursive)
-        {
-          g_ptr_array_add (directories, g_strdup (file_name));
-        }
-      else if (type == G_FILE_TYPE_REGULAR)
-        {
-          if (NULL != ide_code_index_service_get_code_indexer (self->service, file_name))
-            {
-              GTimeVal mod_time;
-              g_autoptr(GFile) file = NULL;
-
-              g_file_info_get_modification_time (info, &mod_time);
-
-              if (timeval_compare (mod_time, max_mod_time))
-                  max_mod_time = mod_time;
-
-              file = g_file_get_child (directory, file_name);
-
-              if (!ide_vcs_is_ignored (vcs, file, NULL))
-                g_ptr_array_add (files, g_steal_pointer (&file));
-            }
-        }
-    }
-
-  g_file_enumerator_close (enumerator, cancellable, NULL);
-
-  if ((files->len != 0) &&
-      !ide_code_index_index_load_if_nmod (self->index, destination, files, max_mod_time, cancellable, NULL))
-    {
-      IndexingData *idata;
-
-      idata = g_slice_new0 (IndexingData);
-      idata->files = g_ptr_array_ref (files);
-      idata->destination = g_object_ref (destination);
-      g_ptr_array_add (changes, idata);
-    }
-
-  for (guint i = 0; i < directories->len; i++)
-    {
-      const gchar *file_name;
-      g_autoptr(GFile) sub_dir = NULL;
-      g_autoptr(GFile) sub_dest = NULL;
-
-      file_name = g_ptr_array_index (directories, i);
-      sub_dir = g_file_get_child (directory, file_name);
-      sub_dest = g_file_get_child (destination, file_name);
-
-      ide_code_index_builder_get_changes (self,
-                                          sub_dir,
-                                          sub_dest,
-                                          recursive,
-                                          changes,
-                                          cancellable);
-    }
-}
-
-static void
-ide_code_index_builder_get_changes_worker (GTask        *task,
-                                           gpointer      source_object,
-                                           gpointer      task_data,
-                                           GCancellable *cancellable)
-{
-  IdeCodeIndexBuilder *self = source_object;
-  GetChangesTaskData *data = task_data;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_TASK (task));
-  g_assert (data != NULL);
-  g_assert (G_IS_FILE (data->directory));
-  g_assert (G_IS_FILE (data->destination));
-  g_assert (data->changes != NULL);
-
-  if (g_task_return_error_if_cancelled (task))
-    return;
-
-  ide_code_index_builder_get_changes (self,
-                                      data->directory,
-                                      data->destination,
-                                      data->recursive,
-                                      data->changes,
-                                      cancellable);
-
-  g_task_return_pointer (task,
-                         g_steal_pointer (&data->changes),
-                         (GDestroyNotify)g_ptr_array_unref);
-}
-
-static void
-ide_code_index_builder_get_changes_async (IdeCodeIndexBuilder *self,
-                                          GFile               *directory,
-                                          gboolean             recursive,
-                                          GCancellable        *cancellable,
-                                          GAsyncReadyCallback  callback,
-                                          gpointer             user_data)
-{
-  g_autoptr(GTask) task = NULL;
-  g_autofree gchar *relative_path = NULL;
-  g_autoptr(GFile) destination = NULL;
-  GetChangesTaskData *data;
-  IdeContext *context;
-  GFile *workdir;
-
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_FILE (directory));
-  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
-
-  context = ide_object_get_context (IDE_OBJECT (self));
-  workdir = ide_vcs_get_working_directory (ide_context_get_vcs (context));
-  relative_path = g_file_get_relative_path (workdir, directory);
-  destination = ide_context_cache_file (context, "code-index", relative_path, NULL);
-
-  data = g_slice_new0 (GetChangesTaskData);
-  data->directory = g_object_ref (directory);
-  data->destination = g_steal_pointer (&destination);
-  data->changes = g_ptr_array_new_with_free_func ((GDestroyNotify)indexing_data_free);
-  data->recursive = !!recursive;
-
-  task = g_task_new (self, cancellable, callback, user_data);
-  g_task_set_source_tag (task, ide_code_index_builder_get_changes_async);
-  g_task_set_priority (task, G_PRIORITY_LOW);
-  g_task_set_task_data (task, data, (GDestroyNotify)get_changes_task_data_free);
-
-  ide_thread_pool_push_task (IDE_THREAD_POOL_INDEXER,
-                             task,
-                             ide_code_index_builder_get_changes_worker);
-}
-
-static GPtrArray *
-ide_code_index_builder_get_changes_finish (IdeCodeIndexBuilder  *self,
-                                           GAsyncResult         *result,
-                                           GError              **error)
-{
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_TASK (result));
-
-  return g_task_propagate_pointer (G_TASK (result), error);
-}
-
-static void
-ide_code_index_builder_build_cb3 (GObject      *object,
-                                  GAsyncResult *result,
-                                  gpointer      user_data)
-{
-  IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)object;
-  g_autoptr(GTask) task = user_data;
-  g_autoptr(GError) error = NULL;
-
-  g_assert (IDE_IS_MAIN_THREAD ());
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_ASYNC_RESULT (result));
-  g_assert (G_IS_TASK (task));
-
-  if (ide_code_index_builder_index_directories_finish (self, result, &error))
-    g_task_return_boolean (task, TRUE);
-  else
-    g_task_return_error (task, g_steal_pointer (&error));
-}
-
-static void
-ide_code_index_builder_build_cb2 (GObject      *object,
-                                  GAsyncResult *result,
-                                  gpointer      user_data)
-{
-  IdeBuildSystem *build_system = (IdeBuildSystem *)object;
-  g_autoptr(GHashTable) build_flags = NULL;
-  g_autoptr(GTask) task = user_data;
-  g_autoptr(GError) error = NULL;
-  g_autoptr(GMutexLocker) locker = NULL;
-  IdeCodeIndexBuilder *self;
-  GCancellable *cancellable;
-  GPtrArray *changes;
-  GHashTableIter iter;
-  gpointer k, v;
-
-  g_assert (IDE_IS_MAIN_THREAD ());
-  g_assert (IDE_IS_BUILD_SYSTEM (build_system));
-  g_assert (G_IS_ASYNC_RESULT (result));
-  g_assert (G_IS_TASK (task));
-
-  build_flags = ide_build_system_get_build_flags_for_files_finish (build_system, result, &error);
-
-  if (build_flags == NULL)
-    {
-      g_task_return_error (task, g_steal_pointer (&error));
-      return;
-    }
-
-  if (g_task_return_error_if_cancelled (task))
-    return;
-
-  self = g_task_get_source_object (task);
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-
-  cancellable = g_task_get_cancellable (task);
-  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
-
-  changes = g_task_get_task_data (task);
-  g_assert (changes != NULL);
-
-  locker = g_mutex_locker_new (&self->mutex);
-
-  g_hash_table_iter_init (&iter, build_flags);
-  while (g_hash_table_iter_next (&iter, &k, &v))
-    {
-      IdeFile *key = k;
-      gchar **value = v;
-
-      g_assert (IDE_IS_FILE (key));
-
-      g_hash_table_iter_steal (&iter);
-      g_hash_table_insert (self->build_flags, key, value);
-    }
-
-  ide_code_index_builder_index_directories_async (self,
-                                                  changes,
-                                                  cancellable,
-                                                  ide_code_index_builder_build_cb3,
-                                                  g_steal_pointer (&task));
-}
-
-static void
-ide_code_index_builder_build_cb (GObject      *object,
-                                 GAsyncResult *result,
-                                 gpointer      user_data)
-{
-  IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)object;
-  g_autoptr(GTask) task = user_data;
-  g_autoptr(GError) error = NULL;
-  g_autoptr(GPtrArray) changes = NULL;
-  g_autoptr(GPtrArray) files = NULL;
-  IdeBuildSystem *build_system;
-  GCancellable *cancellable;
-  IdeContext *context;
-
-  g_assert (IDE_IS_MAIN_THREAD ());
-  g_assert (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_assert (G_IS_ASYNC_RESULT (result));
-  g_assert (G_IS_TASK (task));
-
-  changes = ide_code_index_builder_get_changes_finish (self, result, &error);
-
-  if (changes == NULL)
-    {
-      g_task_return_error (task, g_steal_pointer (&error));
-      return;
-    }
-
-  if (changes->len == 0)
-    {
-      g_task_return_boolean (task, TRUE);
-      return;
-    }
-
-  if (g_task_return_error_if_cancelled (task))
-    return;
-
-  context = ide_object_get_context (IDE_OBJECT (self));
-  g_assert (IDE_IS_CONTEXT (context));
-
-  build_system = ide_context_get_build_system (context);
-  g_assert (IDE_IS_BUILD_SYSTEM (build_system));
-
-  files = ide_code_index_builder_get_all_files (self, changes);
-  g_assert (files != NULL);
-
-  cancellable = g_task_get_cancellable (task);
-  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
-
-  g_message ("Getting build flags for %d directories", changes->len);
-
-  g_task_set_task_data (task,
-                        g_steal_pointer (&changes),
-                        (GDestroyNotify)g_ptr_array_unref);
-
-  ide_build_system_get_build_flags_for_files_async (build_system,
-                                                    files,
-                                                    cancellable,
-                                                    ide_code_index_builder_build_cb2,
-                                                    g_steal_pointer (&task));
-}
-
-/**
- * ide_code_index_builder_build_async:
- * @self: a #IdeCodeIndexBuilder
- * @directory: a #GFile for the directory to load
- * @recursive: if descendants should be recursed into and loaded
- * @cancellable: (nullable): a #GCancellable or %NULL
- * @callback: a callback to execute upon completion
- * @user_data: closure data for @callback
- *
- * This function will index a directory, potentially recursively, and then
- * map those indexes into memory.
- *
- * Thread safety: this function may only be called from the main thread.
- */
-void
-ide_code_index_builder_build_async (IdeCodeIndexBuilder *self,
-                                    GFile               *directory,
-                                    gboolean             recursive,
-                                    GCancellable        *cancellable,
-                                    GAsyncReadyCallback  callback,
-                                    gpointer             user_data)
-{
-  g_autoptr(GTask) task = NULL;
-
-  g_return_if_fail (IDE_IS_MAIN_THREAD ());
-  g_return_if_fail (IDE_IS_CODE_INDEX_BUILDER (self));
-  g_return_if_fail (G_IS_FILE (directory));
-  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
-
-  g_debug ("Started building code index");
-
-  task = g_task_new (self, cancellable, callback, user_data);
-  g_task_set_priority (task, G_PRIORITY_LOW);
-  g_task_set_source_tag (task, ide_code_index_builder_build_async);
-
-  ide_code_index_builder_get_changes_async (self,
-                                            directory,
-                                            recursive,
-                                            cancellable,
-                                            ide_code_index_builder_build_cb,
-                                            g_steal_pointer (&task));
-}
-
-gboolean
-ide_code_index_builder_build_finish (IdeCodeIndexBuilder  *self,
-                                     GAsyncResult         *result,
-                                     GError              **error)
-{
-  g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
-  g_return_val_if_fail (IDE_IS_CODE_INDEX_BUILDER (self), FALSE);
-  g_return_val_if_fail (G_IS_TASK (result), FALSE);
+G_DEFINE_TYPE (IdeCodeIndexBuilder, ide_code_index_builder, IDE_TYPE_OBJECT)
 
-  return g_task_propagate_boolean (G_TASK (result), error);
-}
+static GParamSpec *properties [N_PROPS];
 
 static void
-ide_code_index_builder_finalize (GObject *object)
+ide_code_index_builder_dispose (GObject *object)
 {
   IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)object;
 
-  g_mutex_clear (&self->mutex);
   g_clear_object (&self->index);
   g_clear_object (&self->service);
-  g_clear_pointer (&self->build_flags, g_hash_table_unref);
 
-  G_OBJECT_CLASS(ide_code_index_builder_parent_class)->finalize (object);
+  G_OBJECT_CLASS (ide_code_index_builder_parent_class)->dispose (object);
 }
 
 static void
@@ -794,7 +56,7 @@ ide_code_index_builder_get_property (GObject    *object,
                                      GValue     *value,
                                      GParamSpec *pspec)
 {
-  IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)object;
+  IdeCodeIndexBuilder *self = IDE_CODE_INDEX_BUILDER (object);
 
   switch (prop_id)
     {
@@ -812,12 +74,12 @@ ide_code_index_builder_get_property (GObject    *object,
 }
 
 static void
-ide_code_index_builder_set_property (GObject       *object,
-                                    guint          prop_id,
-                                    const GValue  *value,
-                                    GParamSpec    *pspec)
+ide_code_index_builder_set_property (GObject      *object,
+                                     guint         prop_id,
+                                     const GValue *value,
+                                     GParamSpec   *pspec)
 {
-  IdeCodeIndexBuilder *self = (IdeCodeIndexBuilder *)object;
+  IdeCodeIndexBuilder *self = IDE_CODE_INDEX_BUILDER (object);
 
   switch (prop_id)
     {
@@ -834,54 +96,50 @@ ide_code_index_builder_set_property (GObject       *object,
     }
 }
 
-static void
-ide_code_index_builder_init (IdeCodeIndexBuilder *self)
-{
-  self->build_flags = g_hash_table_new_full ((GHashFunc)ide_file_hash,
-                                             (GEqualFunc)ide_file_equal,
-                                             g_object_unref,
-                                             (GDestroyNotify)g_strfreev);
-  g_mutex_init (&self->mutex);
-}
-
 static void
 ide_code_index_builder_class_init (IdeCodeIndexBuilderClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  object_class->finalize = ide_code_index_builder_finalize;
+  object_class->dispose = ide_code_index_builder_dispose;
   object_class->get_property = ide_code_index_builder_get_property;
   object_class->set_property = ide_code_index_builder_set_property;
 
   properties [PROP_INDEX] =
     g_param_spec_object ("index",
                          "Index",
-                         "Index in which all symbols are stored.",
+                         "The index to update after building sub-indexes",
                          IDE_TYPE_CODE_INDEX_INDEX,
                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
 
   properties [PROP_SERVICE] =
     g_param_spec_object ("service",
                          "Service",
-                         "IdeCodeIndexService.",
+                         "The service to query for various build information",
                          IDE_TYPE_CODE_INDEX_SERVICE,
                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 
+static void
+ide_code_index_builder_init (IdeCodeIndexBuilder *self)
+{
+}
+
 IdeCodeIndexBuilder *
 ide_code_index_builder_new (IdeContext          *context,
-                            IdeCodeIndexIndex   *index,
-                            IdeCodeIndexService *service)
+                            IdeCodeIndexService *service,
+                            IdeCodeIndexIndex   *index)
 {
   g_return_val_if_fail (IDE_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (IDE_IS_CODE_INDEX_SERVICE (service), NULL);
   g_return_val_if_fail (IDE_IS_CODE_INDEX_INDEX (index), NULL);
 
   return g_object_new (IDE_TYPE_CODE_INDEX_BUILDER,
                        "context", context,
-                       "index", index,
                        "service", service,
+                       "index", index,
                        NULL);
 }
 
@@ -890,13 +148,36 @@ ide_code_index_builder_drop_caches (IdeCodeIndexBuilder *self)
 {
   g_return_if_fail (IDE_IS_CODE_INDEX_BUILDER (self));
 
-  /*
-   * Drop our caches so that we force the data to be regenereted
-   * upon the next request. Also helps keep IdeFile from lingering
-   * around forever.
-   */
+  g_warning ("TODO: drop caches");
+}
+
+void
+ide_code_index_builder_build_async (IdeCodeIndexBuilder *self,
+                                    GFile               *directory,
+                                    gboolean             recursive,
+                                    GCancellable        *cancellable,
+                                    GAsyncReadyCallback  callback,
+                                    gpointer             user_data)
+{
+  g_autoptr(GTask) task = NULL;
+
+  g_return_if_fail (IDE_IS_CODE_INDEX_BUILDER (self));
+  g_return_if_fail (G_IS_FILE (directory));
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = g_task_new (self, cancellable, callback, user_data);
+  g_task_set_source_tag (task, ide_code_index_builder_build_async);
+  g_task_set_priority (task, G_PRIORITY_LOW);
+
+}
+
+gboolean
+ide_code_index_builder_build_finish (IdeCodeIndexBuilder  *self,
+                                     GAsyncResult         *result,
+                                     GError              **error)
+{
+  g_return_val_if_fail (IDE_IS_CODE_INDEX_BUILDER (self), FALSE);
+  g_return_val_if_fail (G_IS_TASK (result), FALSE);
 
-  g_mutex_lock (&self->mutex);
-  g_hash_table_remove_all (self->build_flags);
-  g_mutex_unlock (&self->mutex);
+  return g_task_propagate_boolean (G_TASK (result), error);
 }
diff --git a/src/plugins/code-index/ide-code-index-builder.h b/src/plugins/code-index/ide-code-index-builder.h
index 89d6e6032..3fea74b18 100644
--- a/src/plugins/code-index/ide-code-index-builder.h
+++ b/src/plugins/code-index/ide-code-index-builder.h
@@ -1,6 +1,7 @@
 /* ide-code-index-builder.h
  *
  * Copyright © 2017 Anoop Chandu <anoopchandu96 gmail com>
+ * Copyright © 2018 Christian Hergert <chergert redhat com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,6 +30,9 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (IdeCodeIndexBuilder, ide_code_index_builder, IDE, CODE_INDEX_BUILDER, IdeObject)
 
+IdeCodeIndexBuilder *ide_code_index_builder_new          (IdeContext           *context,
+                                                          IdeCodeIndexService  *service,
+                                                          IdeCodeIndexIndex    *index);
 void                 ide_code_index_builder_drop_caches  (IdeCodeIndexBuilder  *self);
 void                 ide_code_index_builder_build_async  (IdeCodeIndexBuilder  *self,
                                                           GFile                *directory,
@@ -39,8 +43,5 @@ void                 ide_code_index_builder_build_async  (IdeCodeIndexBuilder  *
 gboolean             ide_code_index_builder_build_finish (IdeCodeIndexBuilder  *self,
                                                           GAsyncResult         *result,
                                                           GError              **error);
-IdeCodeIndexBuilder *ide_code_index_builder_new          (IdeContext           *context,
-                                                          IdeCodeIndexIndex    *index,
-                                                          IdeCodeIndexService  *service);
 
 G_END_DECLS
diff --git a/src/plugins/code-index/ide-code-index-service.c b/src/plugins/code-index/ide-code-index-service.c
index 26b38ec71..9c5128551 100644
--- a/src/plugins/code-index/ide-code-index-service.c
+++ b/src/plugins/code-index/ide-code-index-service.c
@@ -453,7 +453,7 @@ ide_code_index_service_context_loaded (IdeService *service)
 
   self->code_indexers = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
   self->index = ide_code_index_index_new (context);
-  self->builder = ide_code_index_builder_new (context, self->index, self);
+  self->builder = ide_code_index_builder_new (context, self, self->index);
   self->build_dirs = g_hash_table_new_full (g_file_hash,
                                             (GEqualFunc)g_file_equal,
                                             g_object_unref,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]