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; } } }