/** * Process the given resource within the context of the given working set in order to record the * data and relationships found within the resource. */ public void indexResource(File libraryFile, File sourceFile, DartUnit dartUnit) throws DartModelException { // Get the LibrarySource LibrarySource librarySource = dartUnit.getLibrary().getSource(); // Get the DartLibrary DartLibraryImpl library; IResource resource = ResourceUtil.getResource(libraryFile); if (resource == null) { library = new DartLibraryImpl(librarySource); } else { DartElement element = DartCore.create(resource); if (element instanceof CompilationUnitImpl) { element = ((CompilationUnitImpl) element).getLibrary(); } if (!(element instanceof DartLibrary)) { DartCore.logError("Expected library to be associated with " + libraryFile); return; } library = (DartLibraryImpl) element; } // Get the CompilationUnit DartSource unitSource = (DartSource) dartUnit.getSourceInfo().getSource(); CompilationUnit compilationUnit; IResource res = ResourceUtil.getResource(sourceFile); if (res != null) { DefaultWorkingCopyOwner workingCopy = DefaultWorkingCopyOwner.getInstance(); compilationUnit = new CompilationUnitImpl(library, (IFile) res, workingCopy); } else { String relPath = unitSource.getRelativePath(); compilationUnit = new ExternalCompilationUnitImpl(library, relPath, unitSource); } URI unitUri = unitSource.getUri(); Resource indexerResource; if (PackageLibraryManager.isDartUri(unitUri)) { indexerResource = new Resource( ResourceFactory.composeResourceId( librarySource.getUri().toString(), unitUri.toString())); } else if (PackageLibraryManager.isPackageUri(unitUri)) { indexerResource = new Resource( ResourceFactory.composeResourceId( libraryFile.toURI().toString(), sourceFile.toURI().toString())); } else { indexerResource = ResourceFactory.getResource(compilationUnit); } // Queue the resource to be indexed indexResource(indexerResource, libraryFile, compilationUnit, dartUnit); }
private static Map<URI, DartUnit> createMap(Collection<DartUnit> suppliedUnits) { if (suppliedUnits == null || suppliedUnits.isEmpty()) { return null; } Map<URI, DartUnit> parsedUnits = new HashMap<URI, DartUnit>(suppliedUnits.size()); for (DartUnit unit : suppliedUnits) { DartSource src = (DartSource) unit.getSourceInfo().getSource(); URI uri = src.getUri(); parsedUnits.put(uri, unit); } return parsedUnits; }
@Override public Void visitStringLiteral(DartStringLiteral node) { if (foundElement == null) { int start = node.getSourceInfo().getOffset(); int length = node.getSourceInfo().getLength(); int end = start + length; if (end == 0) { return null; } if (start <= startOffset && end >= endOffset) { wordRegion = computeInternalStringRegion(start, length); DartNode parent = node.getParent(); if (parent instanceof DartSourceDirective && ((DartSourceDirective) parent).getSourceUri() == node) { // resolvedElement = ((DartSourceDirective) parent).getElement(); DartLibrary library = compilationUnit.getLibrary(); String fileName = getFileName(library, node.getValue()); CompilationUnit sourcedUnit = library.getCompilationUnit(fileName); if (sourcedUnit != null && sourcedUnit.exists()) { foundElement = sourcedUnit; } } else if (parent instanceof DartResourceDirective && ((DartResourceDirective) parent).getResourceUri() == node) { // resolvedElement = ((DartResourceDirective) parent).getElement(); DartLibrary library = compilationUnit.getLibrary(); try { DartSource unitSource = compilationUnit.getSourceRef(); if (unitSource != null) { LibrarySource librarySource = unitSource.getLibrary(); if (librarySource != null) { DartSource resourceSource = librarySource.getSourceFor(node.getValue()); if (resourceSource != null) { URI resourceUri = resourceSource.getUri(); DartResource resource = library.getResource(resourceUri); if (resource != null && resource.exists()) { foundElement = resource; } } } } } catch (DartModelException exception) { foundElement = null; } } throw new DartElementFoundException(); } } return null; }
public static DartNode analyzeDelta( LibrarySource library, String sourceString, DartUnit suppliedUnit, DartNode completionNode, int completionLocation, final Collection<DartCompilationError> parseErrors) throws DartModelException { long start = System.currentTimeMillis(); if (cachedLibraries.get(library) == null) { Collection<DartUnit> parsedUnits = new ArrayList<DartUnit>(); parsedUnits.add(suppliedUnit); LibraryUnit resolvedLib = resolveLibrary(library, parsedUnits, parseErrors); synchronized (cachedLibraries) { LibraryUnit newLib = cachedLibraries.get(library); if (newLib == null) { cachedLibraries.put(library, resolvedLib); } } long elapsed = System.currentTimeMillis() - start; Instrumentation.metric("DartCompilerUtils-analyzeDelta", elapsed) .with("Cached", "false") .with("ParsedUnits", parsedUnits.size()) .with("ParseErrors", parseErrors != null ? parseErrors.size() : 0) .with("sourceString-length", sourceString.length()) .with("CachedLibraries", "false") .log(); Instrumentation.operation("DartCompilerUtils-analyzeDelta", elapsed) .with("analyzeDelta.Name", library.getName()) .with("librarySource.LastModified", library.getLastModified()) .with("sourceString", sourceString) .with("sourceString-length", sourceString.length()) .with("CachedLibraries", "true") .log(); return completionNode; } DartSource src = (DartSource) suppliedUnit.getSourceInfo().getSource(); URI unitUri = src.getUri(); Map<URI, String> suppliedSources = new HashMap<URI, String>(); suppliedSources.put(unitUri, sourceString); DeltaAnalysisRunnable runnable = new DeltaAnalysisRunnable( library, unitUri, suppliedSources, suppliedUnit, completionNode, completionLocation, parseErrors); runnable.runSafe(); long elapsed = System.currentTimeMillis() - start; Instrumentation.metric("DartCompilerUtils-analyzeDelta", elapsed) .with("Cached", "false") .with("ParseErrors", parseErrors != null ? parseErrors.size() : 0) .with("sourceString-length", sourceString.length()) .with("CachedLibraries", "false") .log(); Instrumentation.operation("DartCompilerUtils-analyzeDelta", elapsed) .with("analyzeDelta.Name", library.getName()) .with("librarySource.LastModified", library.getLastModified()) .with("sourceString", sourceString) .with("sourceString-length", sourceString.length()) .with("CachedLibraries", "true") .log(); if (runnable.exception != null) { throw new DartModelException( new CoreException( new Status( IStatus.ERROR, DartCore.PLUGIN_ID, "Failed to parse " + library.getName(), runnable.exception))); } return runnable.analyzedNode; }