private void analyzePossibleConflicts_inLibrary(
     final RefactoringStatus result, Source unitSource, Source librarySource) {
   // prepare resolved unit
   CompilationUnit unit = null;
   try {
     unit = context.resolveCompilationUnit(unitSource, librarySource);
   } catch (AnalysisException e) {
   }
   if (unit == null) {
     return;
   }
   // check for conflicts in the unit
   final SourceRange elementRange = element.getVisibleRange();
   unit.accept(
       new RecursiveAstVisitor<Void>() {
         @Override
         public Void visitSimpleIdentifier(SimpleIdentifier node) {
           Element nameElement = node.getBestElement();
           if (nameElement != null && nameElement.getName().equals(newName)) {
             // duplicate declaration
             if (haveIntersectingRanges(element, nameElement)) {
               String message =
                   MessageFormat.format(
                       "Duplicate local {0} ''{1}''.", getElementKindName(nameElement), newName);
               result.addError(message, new RefactoringStatusContext(nameElement));
               return null;
             }
             // shadowing referenced element
             if (elementRange.contains(node.getOffset()) && !node.isQualified()) {
               nameElement = HierarchyUtils.getSyntheticAccessorVariable(nameElement);
               String nameElementSourceName = nameElement.getSource().getShortName();
               String message =
                   MessageFormat.format(
                       "Usage of {0} ''{1}'' declared in ''{2}'' will be shadowed by renamed {3}.",
                       getElementKindName(nameElement),
                       getElementQualifiedName(nameElement),
                       nameElementSourceName,
                       getElementKindName(element));
               result.addError(message, new RefactoringStatusContext(node));
             }
           }
           return null;
         }
       });
 }
 public void test_localVariable_types_invoked() throws Exception {
   Source source =
       addSource(
           createSource( //
               "const A = null;",
               "main() {",
               "  var myVar = (int p) => 'foo';",
               "  myVar(42);",
               "}"));
   LibraryElement library = resolve(source);
   assertNotNull(library);
   CompilationUnit unit = getAnalysisContext().getResolvedCompilationUnit(source, library);
   assertNotNull(unit);
   final boolean[] found = {false};
   final AnalysisException[] thrownException = new AnalysisException[1];
   unit.accept(
       new RecursiveAstVisitor<Void>() {
         @Override
         public Void visitSimpleIdentifier(SimpleIdentifier node) {
           if (node.getName().equals("myVar") && node.getParent() instanceof MethodInvocation) {
             try {
               found[0] = true;
               // check static type
               Type staticType = node.getStaticType();
               assertSame(getTypeProvider().getDynamicType(), staticType);
               // check propagated type
               FunctionType propagatedType = (FunctionType) node.getPropagatedType();
               assertEquals(getTypeProvider().getStringType(), propagatedType.getReturnType());
             } catch (AnalysisException e) {
               thrownException[0] = e;
             }
           }
           return null;
         }
       });
   if (thrownException[0] != null) {
     throw new AnalysisException("Exception", thrownException[0]);
   }
   assertTrue(found[0]);
 }
Exemplo n.º 3
0
  @Override
  public void process(final Context context, final CompilationUnit unit) {
    NodeList<CompilationUnitMember> declarations = unit.getDeclarations();
    // remove NodeList, it is declared in enginelib.dart
    for (Iterator<CompilationUnitMember> iter = declarations.iterator(); iter.hasNext(); ) {
      CompilationUnitMember member = iter.next();
      if (member instanceof ClassDeclaration) {
        ClassDeclaration classDeclaration = (ClassDeclaration) member;
        String name = classDeclaration.getName().getName();
        if (name.equals("NodeList")
            || name.equals("NodeLocator")
            || name.equals("NodeFoundException")) {
          iter.remove();
        }
      }
    }
    // process nodes
    unit.accept(
        new GeneralizingASTVisitor<Void>() {
          @Override
          public Void visitMethodDeclaration(MethodDeclaration node) {
            String name = node.getName().getName();
            if ("accept".equals(name) && node.getParameters().getParameters().size() == 1) {
              node.setReturnType(null);
              FormalParameter formalParameter = node.getParameters().getParameters().get(0);
              ((SimpleFormalParameter) formalParameter).getType().setTypeArguments(null);
            }
            return super.visitMethodDeclaration(node);
          }

          @Override
          public Void visitMethodInvocation(MethodInvocation node) {
            if (isMethodInClass(
                node, "toArray", "com.google.dart.engine.utilities.collection.IntList")) {
              replaceNode(node, node.getTarget());
              return null;
            }
            return super.visitMethodInvocation(node);
          }

          @Override
          public Void visitTypeName(TypeName node) {
            if (node.getName() instanceof SimpleIdentifier) {
              SimpleIdentifier nameNode = (SimpleIdentifier) node.getName();
              String name = nameNode.getName();
              if ("IntList".equals(name)) {
                replaceNode(node, typeName("List", typeName("int")));
                return null;
              }
            }
            return super.visitTypeName(node);
          }

          private boolean isMethodInClass(
              MethodInvocation node, String reqName, String reqClassName) {
            String name = node.getMethodName().getName();
            return Objects.equal(name, reqName)
                && JavaUtils.isMethodInClass(context.getNodeBinding(node), reqClassName);
          }
        });
  }
  public static Element getElementEnclosingOffset(CompilationUnit unit, final int offset) {
    final Element result[] = new Element[] {null};
    unit.accept(
        new GeneralizingAstVisitor<Void>() {
          @Override
          public Void visitClassDeclaration(ClassDeclaration node) {
            if (isNodeEnclosingOffset(node)) {
              result[0] = node.getElement();
              return super.visitClassDeclaration(node);
            }
            return null;
          }

          @Override
          public Void visitConstructorDeclaration(ConstructorDeclaration node) {
            if (isNodeEnclosingOffset(node)) {
              result[0] = node.getElement();
              return super.visitConstructorDeclaration(node);
            }
            return null;
          }

          @Override
          public Void visitFieldDeclaration(FieldDeclaration node) {
            if (isNodeEnclosingOffset(node)) {
              NodeList<VariableDeclaration> variables = node.getFields().getVariables();
              if (!variables.isEmpty()) {
                result[0] = variables.get(0).getElement();
              }
              return super.visitFieldDeclaration(node);
            }
            return null;
          }

          @Override
          public Void visitFunctionDeclaration(FunctionDeclaration node) {
            if (isNodeEnclosingOffset(node)) {
              result[0] = node.getElement();
              return super.visitFunctionDeclaration(node);
            }
            return null;
          }

          @Override
          public Void visitMethodDeclaration(MethodDeclaration node) {
            if (isNodeEnclosingOffset(node)) {
              result[0] = node.getElement();
              return super.visitMethodDeclaration(node);
            }
            return null;
          }

          @Override
          public Void visitNode(AstNode node) {
            if (isNodeEnclosingOffset(node)) {
              super.visitNode(node);
            }
            return null;
          }

          private boolean isNodeEnclosingOffset(AstNode node) {
            return node.getOffset() <= offset && offset <= node.getEnd();
          }
        });
    return result[0];
  }