/** Selects a Dart Element in an editor */
  public static void revealInEditor(IEditorPart part, Object element) {
    if (element == null) {
      return;
    }

    // TODO(scheglov) to be removed with method
    //    if (part instanceof DartEditor) {
    //      ((DartEditor) part).setSelection(element);
    //      return;
    //    }

    // Support for non-Dart editor
    try {
      SourceRange range = null;
      DartX.todo();
      if (element instanceof SourceReference) {
        range = ((SourceReference) element).getSourceRange();
      }

      if (range != null) {
        revealInEditor(part, range.getOffset(), range.getLength());
      }
    } catch (DartModelException e) {
      // don't reveal
    }
  }
 private final void processNode(SemanticToken token, DartNode node) {
   token.update(node);
   token.attachSource(fSourceViewer.getDocument());
   // sometimes node has wrong source range; log problem
   if (token.getSource() == null) {
     IDocument document = fSourceViewer.getDocument();
     if (node != null && document != null) {
       SourceInfo sourceInfo = node.getSourceInfo();
       if (sourceInfo != null) {
         DartToolsPlugin.log(
             "Bad node: "
                 + node.getClass().getName()
                 + " offset:"
                 + sourceInfo.getOffset()
                 + " len:"
                 + sourceInfo.getLength()
                 + " in document: "
                 + document.getLength());
       }
     }
     return;
   }
   // try SemanticHighlighting instances
   for (int i = 0, n = fJobSemanticHighlightings.length; i < n; i++) {
     if (fJobHighlightings[i].isEnabled()) {
       SemanticHighlighting semanticHighlighting = fJobSemanticHighlightings[i];
       // try multiple positions
       {
         List<SourceRange> ranges = semanticHighlighting.consumesMulti(token);
         if (ranges != null) {
           for (SourceRange range : ranges) {
             int offset = range.getOffset();
             int length = range.getLength();
             if (offset > -1 && length > 0) {
               fCollector.addPosition(offset, length, fJobHighlightings[i]);
             }
           }
           break;
         }
       }
       // try single position
       boolean consumes;
       if (node instanceof DartIdentifier) {
         consumes = semanticHighlighting.consumesIdentifier(token);
       } else {
         consumes = semanticHighlighting.consumes(token);
       }
       if (consumes) {
         int offset = node.getSourceInfo().getOffset();
         int length = node.getSourceInfo().getLength();
         if (offset > -1 && length > 0) {
           fCollector.addPosition(offset, length, fJobHighlightings[i]);
         }
         break;
       }
     }
   }
   token.clear();
 }
 /**
  * @return if given unqualified {@link SearchMatch} intersects with visibility range of {@link
  *     LocalElement}.
  */
 protected static boolean isReferenceInLocalRange(
     LocalElement localElement, SearchMatch reference) {
   if (reference.isQualified()) {
     return false;
   }
   Source localSource = localElement.getSource();
   Source referenceSource = reference.getElement().getSource();
   SourceRange localRange = localElement.getVisibleRange();
   SourceRange referenceRange = reference.getSourceRange();
   return Objects.equal(referenceSource, localSource) && referenceRange.intersects(localRange);
 }
 /**
  * @return {@code true} if two given {@link Element}s are {@link LocalElement}s and have
  *     intersecting with visibility ranges.
  */
 protected static boolean haveIntersectingRanges(LocalElement localElement, Element element) {
   if (!(element instanceof LocalElement)) {
     return false;
   }
   LocalElement localElement2 = (LocalElement) element;
   Source localSource = localElement.getSource();
   Source localSource2 = localElement2.getSource();
   SourceRange localRange = localElement.getVisibleRange();
   SourceRange localRange2 = localElement2.getVisibleRange();
   return Objects.equal(localSource2, localSource)
       && localRange != null
       && localRange2 != null
       && localRange2.intersects(localRange);
 }
 @Override
 public void matchFound(SearchMatch match) {
   DartElement element = match.getElement();
   SourceRange range = match.getSourceRange();
   search.addMatch(
       new DartElementMatch(
           element,
           0 /* match.getRule() */,
           range.getOffset(),
           range.getLength(),
           match.getQuality().ordinal() /* accuracy */,
           false /* isReadAccess */,
           false /* isWriteAccess */,
           false,
           false));
 }
 /** Test for {@link DartFunction#getVisibleRange()} for local functions. */
 public void test_getVisibleRange() throws Exception {
   TestProject testProject = new TestProject("Test");
   try {
     CompilationUnit unit =
         testProject.setUnitContent(
             "Test.dart",
             Joiner.on("\n")
                 .join(
                     "// filler filler filler filler filler filler filler filler filler filler",
                     "f() {",
                     "  v1() {};",
                     "  {",
                     "    v2() {};",
                     "  }//marker1",
                     "  v3() {};",
                     "}//marker2",
                     ""));
     String source = unit.getSource();
     DartFunction globalFunction = (DartFunction) unit.getChildren()[0];
     DartElement[] functions = globalFunction.getChildren();
     assertThat(functions).hasSize(3);
     // v1
     {
       DartFunction f = (DartFunction) functions[0];
       SourceRange range = f.getVisibleRange();
       assertEquals("v1", f.getElementName());
       assertEquals(source.indexOf("v1"), range.getOffset());
       assertEquals(source.indexOf("marker2") - 1, range.getOffset() + range.getLength());
     }
     // v2
     {
       DartFunction f = (DartFunction) functions[1];
       SourceRange range = f.getVisibleRange();
       assertEquals("v2", f.getElementName());
       assertEquals(source.indexOf("v2"), range.getOffset());
       assertEquals(source.indexOf("marker1") - 1, range.getOffset() + range.getLength());
     }
     // v3
     {
       DartFunction f = (DartFunction) functions[2];
       SourceRange range = f.getVisibleRange();
       assertEquals("v3", f.getElementName());
       assertEquals(source.indexOf("v3"), range.getOffset());
       assertEquals(source.indexOf("marker2") - 1, range.getOffset() + range.getLength());
     }
   } finally {
     testProject.dispose();
   }
 }
 /** Selects and reveals the given source range in the given editor part. */
 public static void revealInEditor(
     IEditorPart part, com.google.dart.engine.utilities.source.SourceRange range) {
   if (part != null && range != null) {
     revealInEditor(part, range.getOffset(), range.getLength());
   }
 }