예제 #1
0
파일: AutoRun.java 프로젝트: riby/logm
  public static void buildIndex(List<String> files) throws Exception {
    File writableIndex = new File("/tmp/standaloneIndexFile.pdom");
    IIndexLocationConverter converter = new MyIndexLocationConverter();
    // See PDOMCPPLinkageFactory if needed ..
    Map<String, IPDOMLinkageFactory> linkageFactoryMappings =
        new HashMap<String, IPDOMLinkageFactory>();
    linkageFactoryMappings.put(ILinkage.C_LINKAGE_NAME, new PDOMCLinkageFactory());
    linkageFactoryMappings.put(ILinkage.CPP_LINKAGE_NAME, new PDOMCPPLinkageFactory());
    IStandaloneScannerInfoProvider scannerProvider = new MyStandaloneScannerInfoProvider();
    ILanguageMapper mapper = new MyLanguageMapper();
    IParserLogService log = new MyParserLogService();
    IProgressMonitor monitor = new MyProgressMonitor();
    StandaloneIndexer indexer =
        new StandaloneFastIndexer(
            writableIndex, converter, linkageFactoryMappings, scannerProvider, mapper, log);
    indexer.setTraceStatistics(true);

    indexer.rebuild(files, monitor);
    IWritableIndex i = indexer.getIndex();
    GlobalResultCollector.bindingindex = i;
    i.acquireReadLock();
    try {
      System.out.println("internals");
      for (IIndexFile file : i.getAllFiles()) {
        System.out.printf("Index has file: %s\n", file.toString());
      }
      char[] prefix = {};
      for (IIndexBinding binding :
          i.findBindingsForPrefix(prefix, false, IndexFilter.ALL, monitor)) {
        System.out.println(binding);
      }
      System.out.println(i);
    } finally {
      i.releaseReadLock();
    }
  }
  public final void runTask(IProgressMonitor monitor) throws InterruptedException {
    try {
      if (!fIndexFilesWithoutConfiguration) {
        fIndexHeadersWithoutContext = UnusedHeaderStrategy.skip;
      }

      fIndex = createIndex();
      if (fIndex == null) {
        return;
      }
      fTodoTaskUpdater = createTodoTaskUpdater();

      fASTOptions =
          ILanguage.OPTION_NO_IMAGE_LOCATIONS
              | ILanguage.OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS;

      if (getSkipReferences() == SKIP_ALL_REFERENCES) {
        fASTOptions |= ILanguage.OPTION_SKIP_FUNCTION_BODIES;
      }

      fIndex.resetCacheCounters();
      fIndex.acquireReadLock();

      try {
        try {
          // Split into sources and headers, remove excluded sources.
          HashMap<Integer, List<IIndexFileLocation>> files =
              new HashMap<Integer, List<IIndexFileLocation>>();
          final ArrayList<IIndexFragmentFile> indexFilesToRemove =
              new ArrayList<IIndexFragmentFile>();
          extractFiles(files, indexFilesToRemove, monitor);

          setResume(true);

          // Remove files from index
          removeFilesInIndex(fFilesToRemove, indexFilesToRemove, monitor);

          HashMap<Integer, List<IIndexFileLocation>> moreFiles = null;
          while (true) {
            for (int linkageID : getLinkagesToParse()) {
              final List<IIndexFileLocation> filesForLinkage = files.get(linkageID);
              if (filesForLinkage != null) {
                parseLinkage(linkageID, filesForLinkage, monitor);
                for (Iterator<LocationTask> it = fOneLinkageTasks.values().iterator();
                    it.hasNext(); ) {
                  LocationTask task = it.next();
                  if (task.isCompleted()) it.remove();
                }
                fIndexContentCache.clear();
                fIndexFilesCache.clear();
              }
              if (hasUrgentTasks()) break;
            }
            synchronized (this) {
              if (fUrgentTasks.isEmpty()) {
                if (moreFiles == null) {
                  // No urgent tasks and no more files to parse. We are done.
                  fTaskCompleted = true;
                  break;
                } else {
                  files = moreFiles;
                  moreFiles = null;
                }
              }
            }
            AbstractIndexerTask urgentTask;
            while ((urgentTask = getUrgentTask()) != null) {
              // Move the lists of not yet parsed files from 'files' to 'moreFiles'.
              if (moreFiles == null) {
                moreFiles = files;
              } else {
                for (Map.Entry<Integer, List<IIndexFileLocation>> entry : files.entrySet()) {
                  List<IIndexFileLocation> list = moreFiles.get(entry.getKey());
                  if (list == null) {
                    moreFiles.put(entry.getKey(), entry.getValue());
                  } else {
                    list.addAll(0, entry.getValue());
                  }
                }
              }
              // Extract files from the urgent task.
              files = new HashMap<Integer, List<IIndexFileLocation>>();
              fFilesToUpdate = urgentTask.fFilesToUpdate;
              fForceNumberFiles = urgentTask.fForceNumberFiles;
              fFilesToRemove = urgentTask.fFilesToRemove;
              incrementRequestedFilesCount(fFilesToUpdate.length + fFilesToRemove.size());
              extractFiles(files, indexFilesToRemove, monitor);
              removeFilesInIndex(fFilesToRemove, indexFilesToRemove, monitor);
            }
          }
          if (!monitor.isCanceled()) {
            setResume(false);
          }
        } finally {
          fIndex.flush();
        }
      } catch (CoreException e) {
        logException(e);
      } finally {
        fIndex.releaseReadLock();
      }
    } finally {
      synchronized (this) {
        fTaskCompleted = true;
      }
    }
  }