/*
  * @see edu.berkeley.eduride.isa.corext.dom.GenericVisitor#visitNode(org.eclipse.jdt.core.dom.ASTNode)
  */
 protected boolean visitNode(ASTNode node) {
   if ((node.getFlags() & ASTNode.MALFORMED) == ASTNode.MALFORMED) {
     retainPositions(node.getStartPosition(), node.getLength());
     return false;
   }
   return true;
 }
Exemple #2
0
 protected boolean found(ASTNode node, ASTNode name) {
   if (name.getStartPosition() == this.rangeStart && name.getLength() == this.rangeLength) {
     this.foundNode = node;
     return true;
   }
   return false;
 }
 private void divideTypeRefs(
     List /* <SimpleName> */ importNames,
     List /* <SimpleName> */ staticNames,
     List /* <SimpleName> */ removedRefs,
     List /* <SimpleName> */ unremovedRefs) {
   int[] removedStartsEnds = new int[2 * fRemovedNodes.size()];
   for (int index = 0; index < fRemovedNodes.size(); index++) {
     ASTNode node = (ASTNode) fRemovedNodes.get(index);
     int start = node.getStartPosition();
     removedStartsEnds[2 * index] = start;
     removedStartsEnds[2 * index + 1] = start + node.getLength();
   }
   for (Iterator iterator = importNames.iterator(); iterator.hasNext(); ) {
     SimpleName name = (SimpleName) iterator.next();
     if (isInRemoved(name, removedStartsEnds)) removedRefs.add(name);
     else unremovedRefs.add(name);
   }
   for (Iterator iterator = staticNames.iterator(); iterator.hasNext(); ) {
     SimpleName name = (SimpleName) iterator.next();
     if (isInRemoved(name, removedStartsEnds)) removedRefs.add(name);
     else unremovedRefs.add(name);
   }
   for (Iterator iterator = fInlinedStaticImports.iterator(); iterator.hasNext(); ) {
     ImportDeclaration importDecl = (ImportDeclaration) iterator.next();
     Name name = importDecl.getName();
     if (name instanceof QualifiedName) name = ((QualifiedName) name).getName();
     removedRefs.add(name);
   }
 }
  @SuppressWarnings("rawtypes") // DOM AST API returns raw collections
  public SourcePosition getPosition() {
    final MirrorKind kind = _parent.kind();
    ASTNode astNode = null;
    switch (kind) {
      case ANNOTATION_MIRROR:
        final AnnotationMirrorImpl anno = (AnnotationMirrorImpl) _parent;
        astNode = anno.getASTNodeForElement(_name);
        break;
      case ANNOTATION_ELEMENT:
        final AnnotationElementDeclarationImpl element = (AnnotationElementDeclarationImpl) _parent;
        astNode = element.getAstNodeForDefault();
        break;
      default:
        throw new IllegalStateException(); // should never reach this point.
    }
    // did not come from source.
    if (astNode == null) return null;
    if (_index >= 0 && astNode.getNodeType() == ASTNode.ARRAY_INITIALIZER) {
      final ArrayInitializer arrayInit = (ArrayInitializer) astNode;
      final List exprs = arrayInit.expressions();
      if (exprs != null && _index < exprs.size()) astNode = (ASTNode) exprs.get(_index);
    }
    if (astNode == null) return null;

    final CompilationUnit unit = getCompilationUnit();
    if (unit == null) return null;
    final int offset = astNode.getStartPosition();
    return new SourcePositionImpl(
        astNode.getStartPosition(),
        astNode.getLength(),
        unit.getLineNumber(offset),
        unit.getColumnNumber(offset),
        this);
  }
 private boolean isAffected(ASTNode node) {
   if (fSubRange == null) {
     return true;
   }
   int nodeStart = node.getStartPosition();
   int offset = fSubRange.getOffset();
   return nodeStart + node.getLength() > offset && offset + fSubRange.getLength() > nodeStart;
 }
 public int[] getSelectionStartAndEnd(ICompilationUnit iunit) {
   int[] offsets = new int[2];
   CompilationUnit parsedUnit = ASTreeManipulationMethods.parseICompilationUnit(iunit);
   ASTNode nodeOne = ASTreeManipulationMethods.getASTNodeByIndex(parsedUnit, firstCutNodeIndex);
   ASTNode nodeTwo = ASTreeManipulationMethods.getASTNodeByIndex(parsedUnit, lastCutNodeIndex);
   offsets[0] = nodeOne.getStartPosition();
   offsets[1] = nodeTwo.getStartPosition() + nodeTwo.getLength() - 1;
   return offsets;
 }
  private boolean isNodeEnclosingMethod(ASTNode node) {
    int nodeStartPosition = node.getStartPosition();
    int nodeEndPosition = nodeStartPosition + node.getLength();

    if (nodeStartPosition < fMethodStartPosition && nodeEndPosition > fMethodEndPosition) {
      // Is the method completely enclosed by the node?
      return true;
    }
    return false;
  }
  private boolean isNodeWithinMethod(ASTNode node) {
    int nodeStartPosition = node.getStartPosition();
    int nodeEndPosition = nodeStartPosition + node.getLength();

    if (nodeStartPosition < fMethodStartPosition) {
      return false;
    }

    if (nodeEndPosition > fMethodEndPosition) {
      return false;
    }

    return true;
  }
  /**
   * Adds the specified method binding to the search results.
   *
   * @param calledMethodBinding
   * @param node
   */
  protected void addMethodCall(IMethodBinding calledMethodBinding, ASTNode node) {
    try {
      if (calledMethodBinding != null) {
        fProgressMonitor.worked(1);

        ITypeBinding calledTypeBinding = calledMethodBinding.getDeclaringClass();
        IType calledType = null;

        if (!calledTypeBinding.isAnonymous()) {
          calledType = (IType) calledTypeBinding.getJavaElement();
        } else {
          if (!"java.lang.Object"
              .equals(calledTypeBinding.getSuperclass().getQualifiedName())) { // $NON-NLS-1$
            calledType = (IType) calledTypeBinding.getSuperclass().getJavaElement();
          } else {
            calledType = (IType) calledTypeBinding.getInterfaces()[0].getJavaElement();
          }
        }

        IMethod calledMethod =
            findIncludingSupertypes(calledMethodBinding, calledType, fProgressMonitor);

        IMember referencedMember = null;
        if (calledMethod == null) {
          if (calledMethodBinding.isConstructor()
              && calledMethodBinding.getParameterTypes().length == 0) {
            referencedMember = calledType;
          }
        } else {
          if (calledType.isInterface()) {
            calledMethod = findImplementingMethods(calledMethod);
          }

          if (!isIgnoredBySearchScope(calledMethod)) {
            referencedMember = calledMethod;
          }
        }
        final int position = node.getStartPosition();
        final int number = fCompilationUnit.getLineNumber(position);
        fSearchResults.addMember(
            fMember,
            referencedMember,
            position,
            position + node.getLength(),
            number < 1 ? 1 : number);
      }
    } catch (JavaModelException jme) {
      JavaPlugin.log(jme);
    }
  }
  @Override
  public boolean visit(LambdaExpression node) {
    Selection selection = getSelection();
    int selectionStart = selection.getOffset();
    int selectionExclusiveEnd = selection.getExclusiveEnd();
    int lambdaStart = node.getStartPosition();
    int lambdaExclusiveEnd = lambdaStart + node.getLength();
    ASTNode body = node.getBody();
    int bodyStart = body.getStartPosition();
    int bodyExclusiveEnd = bodyStart + body.getLength();

    boolean isValidSelection = false;
    if ((body instanceof Block)
        && (bodyStart < selectionStart && selectionExclusiveEnd <= bodyExclusiveEnd)) {
      // if selection is inside lambda body's block
      isValidSelection = true;
    } else if (body instanceof Expression) {
      try {
        TokenScanner scanner = new TokenScanner(fCUnit);
        int arrowExclusiveEnd =
            scanner.getTokenEndOffset(ITerminalSymbols.TokenNameARROW, lambdaStart);
        if (selectionStart >= arrowExclusiveEnd) {
          isValidSelection = true;
        }
      } catch (CoreException e) {
        // ignore
      }
    }
    if (selectionStart <= lambdaStart && selectionExclusiveEnd >= lambdaExclusiveEnd) {
      // if selection covers the lambda node
      isValidSelection = true;
    }

    if (!isValidSelection) {
      return false;
    }
    return super.visit(node);
  }
  /*(non-Javadoc)
   * @see org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal#getRewrite()
   */
  @Override
  protected ASTRewrite getRewrite() {
    AST ast = fMethodDecl.getAST();

    ITypeBinding returnBinding = getReturnTypeBinding();

    if (fExistingReturn != null) {
      ASTRewrite rewrite = ASTRewrite.create(ast);

      Expression expression =
          evaluateReturnExpressions(ast, returnBinding, fExistingReturn.getStartPosition());
      if (expression != null) {
        rewrite.set(fExistingReturn, ReturnStatement.EXPRESSION_PROPERTY, expression, null);

        addLinkedPosition(rewrite.track(expression), true, RETURN_EXPRESSION_KEY);
      }
      return rewrite;
    } else {
      ASTRewrite rewrite = ASTRewrite.create(ast);

      Block block = fMethodDecl.getBody();

      List<Statement> statements = block.statements();
      int nStatements = statements.size();
      ASTNode lastStatement = null;
      if (nStatements > 0) {
        lastStatement = statements.get(nStatements - 1);
      }

      if (returnBinding != null
          && lastStatement instanceof ExpressionStatement
          && lastStatement.getNodeType() != ASTNode.ASSIGNMENT) {
        Expression expression = ((ExpressionStatement) lastStatement).getExpression();
        ITypeBinding binding = expression.resolveTypeBinding();
        if (binding != null && binding.isAssignmentCompatible(returnBinding)) {
          Expression placeHolder = (Expression) rewrite.createMoveTarget(expression);

          ReturnStatement returnStatement = ast.newReturnStatement();
          returnStatement.setExpression(placeHolder);

          rewrite.replace(lastStatement, returnStatement, null);
          return rewrite;
        }
      }

      int offset;
      if (lastStatement == null) {
        offset = block.getStartPosition() + 1;
      } else {
        offset = lastStatement.getStartPosition() + lastStatement.getLength();
      }
      ReturnStatement returnStatement = ast.newReturnStatement();
      Expression expression = evaluateReturnExpressions(ast, returnBinding, offset);

      returnStatement.setExpression(expression);

      rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertLast(returnStatement, null);

      addLinkedPosition(
          rewrite.track(returnStatement.getExpression()), true, RETURN_EXPRESSION_KEY);
      return rewrite;
    }
  }
 public boolean visit(VariableDeclarationFragment node) {
   String name = getFieldName(node);
   ASTNode parent = node.getParent();
   push(JavaNode.FIELD, name, parent.getStartPosition(), parent.getLength());
   return false;
 }
  private boolean isClosed(IDocument document, int offset, int length) {

    CompilationUnitInfo info = getCompilationUnitForMethod(document, offset);
    if (info == null) return false;

    CompilationUnit compilationUnit = null;
    try {
      ASTParser parser = ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL);
      parser.setSource(info.buffer);
      compilationUnit = (CompilationUnit) parser.createAST(null);
    } catch (ArrayIndexOutOfBoundsException x) {
      // work around for parser problem
      return false;
    }

    IProblem[] problems = compilationUnit.getProblems();
    for (int i = 0; i != problems.length; ++i) {
      if (problems[i].getID() == IProblem.UnmatchedBracket) return true;
    }

    final int relativeOffset = offset - info.delta;

    ASTNode node = NodeFinder.perform(compilationUnit, relativeOffset, length);

    if (length == 0) {
      while (node != null
          && (relativeOffset == node.getStartPosition()
              || relativeOffset == node.getStartPosition() + node.getLength()))
        node = node.getParent();
    }

    if (node == null) return false;

    switch (node.getNodeType()) {
      case ASTNode.BLOCK:
        return getBlockBalance(document, offset, fPartitioning) <= 0;

      case ASTNode.IF_STATEMENT:
        {
          IfStatement ifStatement = (IfStatement) node;
          Expression expression = ifStatement.getExpression();
          IRegion expressionRegion = createRegion(expression, info.delta);
          Statement thenStatement = ifStatement.getThenStatement();
          IRegion thenRegion = createRegion(thenStatement, info.delta);

          // between expression and then statement
          if (expressionRegion.getOffset() + expressionRegion.getLength() <= offset
              && offset + length <= thenRegion.getOffset()) return thenStatement != null;

          Statement elseStatement = ifStatement.getElseStatement();
          IRegion elseRegion = createRegion(elseStatement, info.delta);

          if (elseStatement != null) {
            int sourceOffset = thenRegion.getOffset() + thenRegion.getLength();
            int sourceLength = elseRegion.getOffset() - sourceOffset;
            IRegion elseToken =
                getToken(
                    document,
                    new Region(sourceOffset, sourceLength),
                    ITerminalSymbols.TokenNameelse);
            return elseToken != null
                && elseToken.getOffset() + elseToken.getLength() <= offset
                && offset + length < elseRegion.getOffset();
          }
        }
        break;

      case ASTNode.WHILE_STATEMENT:
      case ASTNode.FOR_STATEMENT:
        {
          Expression expression =
              node.getNodeType() == ASTNode.WHILE_STATEMENT
                  ? ((WhileStatement) node).getExpression()
                  : ((ForStatement) node).getExpression();
          IRegion expressionRegion = createRegion(expression, info.delta);
          Statement body =
              node.getNodeType() == ASTNode.WHILE_STATEMENT
                  ? ((WhileStatement) node).getBody()
                  : ((ForStatement) node).getBody();
          IRegion bodyRegion = createRegion(body, info.delta);

          // between expression and body statement
          if (expressionRegion.getOffset() + expressionRegion.getLength() <= offset
              && offset + length <= bodyRegion.getOffset()) return body != null;
        }
        break;

      case ASTNode.DO_STATEMENT:
        {
          DoStatement doStatement = (DoStatement) node;
          IRegion doRegion = createRegion(doStatement, info.delta);
          Statement body = doStatement.getBody();
          IRegion bodyRegion = createRegion(body, info.delta);

          if (doRegion.getOffset() + doRegion.getLength() <= offset
              && offset + length <= bodyRegion.getOffset()) return body != null;
        }
        break;
    }

    return true;
  }
 private static IRegion createRegion(ASTNode node, int delta) {
   return node == null ? null : new Region(node.getStartPosition() + delta, node.getLength());
 }
  @Test
  public void testOneMethod() {
    System.out.println("filetypes in given file");
    System.out.println("inheritance " + resolver.getSuperType());
    System.out.println("interfaces " + resolver.getInterfaces());
    Map<String, String> types = resolver.getClassesInFile();
    for (MethodInvocationResolver.TypeDecl typeDeclaration : resolver.getTypeDeclarations()) {
      System.out.println(
          types.get(typeDeclaration.getClassName())
              + "   "
              + unit.getLineNumber(typeDeclaration.getLoc())
              + "  "
              + unit.getColumnNumber(typeDeclaration.getLoc()));
    }

    Map<ASTNode, String> typesAtPos = resolver.getVariableTypesAtPosition();
    System.out.println("~~~~~~variable Typeaatposition  ");
    for (Entry<ASTNode, String> e : typesAtPos.entrySet()) {
      Integer line = unit.getLineNumber(e.getKey().getStartPosition());
      Integer col = unit.getColumnNumber(e.getKey().getStartPosition());
      System.out.println(
          line + " , " + col + " , " + e.getKey().getLength() + " : " + e.getValue());
    }

    System.out.println("########  Import name position");
    for (Entry<ASTNode, String> e : resolver.getImportsDeclarationNode().entrySet()) {
      Integer line = unit.getLineNumber(e.getKey().getStartPosition());
      Integer col = unit.getColumnNumber(e.getKey().getStartPosition());
      System.out.println(
          line + " , " + col + " , " + e.getKey().getLength() + " : " + e.getValue());
    }

    System.out.println("--------------Type at positions ");
    for (Entry<ASTNode, String> e : resolver.getTypesAtPosition().entrySet()) {
      Integer line = unit.getLineNumber(e.getKey().getStartPosition());
      Integer col = unit.getColumnNumber(e.getKey().getStartPosition());
      System.out.println(
          line + " , " + col + " , " + e.getKey().getLength() + " : " + e.getValue());
    }

    for (Entry<ASTNode, ASTNode> e : resolver.getVariableDependencies().entrySet()) {
      ASTNode child = e.getKey();
      Integer chline = unit.getLineNumber(child.getStartPosition());
      Integer chcol = unit.getColumnNumber(child.getStartPosition());
      Integer chLength = child.getLength();
      ASTNode parent = e.getValue();
      Integer pline = unit.getLineNumber(parent.getStartPosition());
      Integer pcol = unit.getColumnNumber(parent.getStartPosition());
      Integer plength = parent.getLength();
      System.out.println(
          "**** "
              + child
              + "["
              + chline
              + ", "
              + chcol
              + ", "
              + chLength
              + "] ==> "
              + parent.toString()
              + "["
              + pline
              + ", "
              + pcol
              + ", "
              + plength
              + "]");
    }

    for (Entry<String, List<MethodInvokRef>> entry : resolver.getMethodInvoks().entrySet()) {
      System.out.println(" ~~~~~~~~~~~ For method " + entry.getKey() + " ~~~~~~~~~~~");
      for (MethodInvokRef m : entry.getValue()) {
        Integer loc = m.getLocation();
        Integer line = unit.getLineNumber(loc);
        Integer col = unit.getColumnNumber(loc);
        System.out.println("[" + line + ", " + col + ", " + m.getLength() + " ] ==> " + m);
      }
    }

    for (MethodDecl m : resolver.getDeclaredMethods()) {
      System.out.println("~~~~~~~~~~~~~~~~~ Declared Methods ~~~~~~~~~~~~~~~~~");
      System.out.println(m);
    }
    System.out.println(resolver.getVariableTypes());
  }