/**
   * Parse the specified source. Any exceptions thrown by the {@link DartParser} will be logged and
   * a {@link DartModelException} thrown.
   *
   * @param sourceRef the Dart source being parsed
   * @param source the source to be parsed (not <code>null</code>)
   * @param preserveComments <code>true</code> if comments are to be preserved
   * @param parseErrors a collection to which parse errors are appended or <code>null</code> if
   *     parse errors should be ignored
   * @return the parse result
   */
  public static DartUnit parseSource(
      DartSource sourceRef,
      String source,
      boolean preserveComments,
      Collection<DartCompilationError> parseErrors)
      throws DartModelException {

    long start = System.currentTimeMillis();

    ParserRunnable runnable = new ParserRunnable(sourceRef, source, preserveComments, parseErrors);
    runnable.runSafe();

    long elapsed = System.currentTimeMillis() - start;
    Instrumentation.metric("DartCompilerUtils-parseSource", elapsed).log();
    Instrumentation.operation("DartCompilerUtils-parseSource", elapsed)
        .with("sourceRef.Name", sourceRef.getName())
        .with("source", source)
        .with("parseErrors", parseErrors != null ? parseErrors.size() : 0)
        .log();

    if (runnable.exception != null) {
      throw new DartModelException(
          new CoreException(
              new Status(
                  IStatus.ERROR,
                  DartCore.PLUGIN_ID,
                  "Failed to parse " + sourceRef.getName(),
                  runnable.exception)));
    }
    return runnable.result;
  }
  /**
   * 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;
 }
Exemple #4
0
 @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;
 }
  /** A synchronized call to {@link DartParser#parseUnit(DartSource)} */
  public static DartUnit secureParseUnit(DartParser parser, DartSource sourceRef) {

    long start = System.currentTimeMillis();

    // All calls to DartC must be synchronized
    synchronized (compilerLock) {
      DartUnit ret = parser.parseUnit();

      long elapsed = System.currentTimeMillis() - start;
      Instrumentation.metric("DartCompilerUtils-secureParseUnit", elapsed).log();

      Instrumentation.operation("DartCompilerUtils-secureParseUnit", elapsed)
          .with("sourceRef.Name", sourceRef != null ? sourceRef.getName() : "null")
          .log();

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