Example usage for org.eclipse.jdt.core.dom NodeFinder NodeFinder

List of usage examples for org.eclipse.jdt.core.dom NodeFinder NodeFinder

Introduction

In this page you can find the example usage for org.eclipse.jdt.core.dom NodeFinder NodeFinder.

Prototype

public NodeFinder(ASTNode root, int start, int length) 

Source Link

Document

Instantiate a new node finder using the given root node, the given start and the given length.

Usage

From source file:com.android.ide.eclipse.adt.internal.lint.AddSuppressAnnotation.java

License:Open Source License

/**
 * Adds any applicable suppress lint fix resolutions into the given list
 *
 * @param marker the marker to create fixes for
 * @param id the issue id/*w  w  w.  jav  a  2 s .c om*/
 * @param resolutions a list to add the created resolutions into, if any
 */
public static void createFixes(IMarker marker, String id, List<IMarkerResolution> resolutions) {
    ITextEditor textEditor = AdtUtils.getActiveTextEditor();
    IDocumentProvider provider = textEditor.getDocumentProvider();
    IEditorInput editorInput = textEditor.getEditorInput();
    IDocument document = provider.getDocument(editorInput);
    if (document == null) {
        return;
    }

    IWorkingCopyManager manager = JavaUI.getWorkingCopyManager();
    ICompilationUnit compilationUnit = manager.getWorkingCopy(editorInput);
    int offset = 0;
    int length = 0;
    int start = marker.getAttribute(IMarker.CHAR_START, -1);
    int end = marker.getAttribute(IMarker.CHAR_END, -1);
    offset = start;
    length = end - start;
    CompilationUnit root = SharedASTProvider.getAST(compilationUnit, SharedASTProvider.WAIT_YES, null);
    if (root == null) {
        return;
    }

    int api = -1;
    if (id.equals(ApiDetector.UNSUPPORTED.getId()) || id.equals(ApiDetector.INLINED.getId())) {
        String message = marker.getAttribute(IMarker.MESSAGE, null);
        if (message != null) {
            Pattern pattern = Pattern.compile("\\s(\\d+)\\s"); //$NON-NLS-1$
            Matcher matcher = pattern.matcher(message);
            if (matcher.find()) {
                api = Integer.parseInt(matcher.group(1));
            }
        }
    }

    Issue issue = EclipseLintClient.getRegistry().getIssue(id);
    boolean isClassDetector = issue != null && issue.getImplementation().getScope().contains(Scope.CLASS_FILE);

    // Don't offer to suppress (with an annotation) the annotation checks
    if (issue == AnnotationDetector.ISSUE) {
        return;
    }

    NodeFinder nodeFinder = new NodeFinder(root, offset, length);
    ASTNode coveringNode;
    if (offset <= 0) {
        // Error added on the first line of a Java class: typically from a class-based
        // detector which lacks line information. Map this to the top level class
        // in the file instead.
        coveringNode = root;
        if (root.types() != null && root.types().size() > 0) {
            Object type = root.types().get(0);
            if (type instanceof ASTNode) {
                coveringNode = (ASTNode) type;
            }
        }
    } else {
        coveringNode = nodeFinder.getCoveringNode();
    }
    for (ASTNode body = coveringNode; body != null; body = body.getParent()) {
        if (body instanceof BodyDeclaration) {
            BodyDeclaration declaration = (BodyDeclaration) body;

            String target = null;
            if (body instanceof MethodDeclaration) {
                target = ((MethodDeclaration) body).getName().toString() + "()"; //$NON-NLS-1$
            } else if (body instanceof FieldDeclaration) {
                target = "field";
                FieldDeclaration field = (FieldDeclaration) body;
                if (field.fragments() != null && field.fragments().size() > 0) {
                    ASTNode first = (ASTNode) field.fragments().get(0);
                    if (first instanceof VariableDeclarationFragment) {
                        VariableDeclarationFragment decl = (VariableDeclarationFragment) first;
                        target = decl.getName().toString();
                    }
                }
            } else if (body instanceof AnonymousClassDeclaration) {
                target = "anonymous class";
            } else if (body instanceof TypeDeclaration) {
                target = ((TypeDeclaration) body).getName().toString();
            } else {
                target = body.getClass().getSimpleName();
            }

            // In class files, detectors can only find annotations on methods
            // and on classes, not on variable declarations
            if (isClassDetector && !(body instanceof MethodDeclaration || body instanceof TypeDeclaration
                    || body instanceof AnonymousClassDeclaration || body instanceof FieldDeclaration)) {
                continue;
            }

            String desc = String.format("Add @SuppressLint '%1$s\' to '%2$s'", id, target);
            resolutions.add(new AddSuppressAnnotation(id, marker, declaration, desc, null));

            if (api != -1
                    // @TargetApi is only valid on methods and classes, not fields etc
                    && (body instanceof MethodDeclaration || body instanceof TypeDeclaration)) {
                String apiString = SdkVersionInfo.getBuildCode(api);
                if (apiString == null) {
                    apiString = Integer.toString(api);
                }
                desc = String.format("Add @TargetApi(%1$s) to '%2$s'", apiString, target);
                resolutions.add(new AddSuppressAnnotation(id, marker, declaration, desc, apiString));
            }
        }
    }
}

From source file:com.android.ide.eclipse.auidt.internal.lint.AddSuppressAnnotation.java

License:Open Source License

/**
 * Adds any applicable suppress lint fix resolutions into the given list
 *
 * @param marker the marker to create fixes for
 * @param id the issue id/* ww w .  j  av  a  2  s .  co  m*/
 * @param resolutions a list to add the created resolutions into, if any
 */
public static void createFixes(IMarker marker, String id, List<IMarkerResolution> resolutions) {
    ITextEditor textEditor = AdtUtils.getActiveTextEditor();
    IDocumentProvider provider = textEditor.getDocumentProvider();
    IEditorInput editorInput = textEditor.getEditorInput();
    IDocument document = provider.getDocument(editorInput);
    if (document == null) {
        return;
    }
    IWorkingCopyManager manager = JavaUI.getWorkingCopyManager();
    ICompilationUnit compilationUnit = manager.getWorkingCopy(editorInput);
    int offset = 0;
    int length = 0;
    int start = marker.getAttribute(IMarker.CHAR_START, -1);
    int end = marker.getAttribute(IMarker.CHAR_END, -1);
    offset = start;
    length = end - start;
    CompilationUnit root = SharedASTProvider.getAST(compilationUnit, SharedASTProvider.WAIT_YES, null);
    if (root == null) {
        return;
    }

    int api = -1;
    if (id.equals(ApiDetector.UNSUPPORTED.getId())) {
        String message = marker.getAttribute(IMarker.MESSAGE, null);
        if (message != null) {
            Pattern pattern = Pattern.compile("\\s(\\d+)\\s"); //$NON-NLS-1$
            Matcher matcher = pattern.matcher(message);
            if (matcher.find()) {
                api = Integer.parseInt(matcher.group(1));
            }
        }
    }

    Issue issue = EclipseLintClient.getRegistry().getIssue(id);
    boolean isClassDetector = issue != null && issue.getScope().contains(Scope.CLASS_FILE);

    NodeFinder nodeFinder = new NodeFinder(root, offset, length);
    ASTNode coveringNode;
    if (offset <= 0) {
        // Error added on the first line of a Java class: typically from a class-based
        // detector which lacks line information. Map this to the top level class
        // in the file instead.
        coveringNode = root;
        if (root.types() != null && root.types().size() > 0) {
            Object type = root.types().get(0);
            if (type instanceof ASTNode) {
                coveringNode = (ASTNode) type;
            }
        }
    } else {
        coveringNode = nodeFinder.getCoveringNode();
    }
    for (ASTNode body = coveringNode; body != null; body = body.getParent()) {
        if (body instanceof BodyDeclaration) {
            BodyDeclaration declaration = (BodyDeclaration) body;

            String target = null;
            if (body instanceof MethodDeclaration) {
                target = ((MethodDeclaration) body).getName().toString() + "()"; //$NON-NLS-1$
            } else if (body instanceof FieldDeclaration) {
                target = "field";
                FieldDeclaration field = (FieldDeclaration) body;
                if (field.fragments() != null && field.fragments().size() > 0) {
                    ASTNode first = (ASTNode) field.fragments().get(0);
                    if (first instanceof VariableDeclarationFragment) {
                        VariableDeclarationFragment decl = (VariableDeclarationFragment) first;
                        target = decl.getName().toString();
                    }
                }
            } else if (body instanceof AnonymousClassDeclaration) {
                target = "anonymous class";
            } else if (body instanceof TypeDeclaration) {
                target = ((TypeDeclaration) body).getName().toString();
            } else {
                target = body.getClass().getSimpleName();
            }

            // In class files, detectors can only find annotations on methods
            // and on classes, not on variable declarations
            if (isClassDetector && !(body instanceof MethodDeclaration || body instanceof TypeDeclaration
                    || body instanceof AnonymousClassDeclaration || body instanceof FieldDeclaration)) {
                continue;
            }

            String desc = String.format("Add @SuppressLint '%1$s\' to '%2$s'", id, target);
            resolutions.add(new AddSuppressAnnotation(id, marker, declaration, desc, -1));

            if (api != -1
                    // @TargetApi is only valid on methods and classes, not fields etc
                    && (body instanceof MethodDeclaration || body instanceof TypeDeclaration)) {
                desc = String.format("Add @TargetApi(%1$d) to '%2$s'", api, target);
                resolutions.add(new AddSuppressAnnotation(id, marker, declaration, desc, api));
            }
        }
    }
}

From source file:edu.illinois.jflow.core.transformations.code.ExtractClosureRefactoring.java

License:Open Source License

private MethodDeclaration locateSelectedMethod() {
    NodeFinder nodeFinder = new NodeFinder(fRoot, fSelectionStart, fSelectionLength);
    ASTNode coveringNode = nodeFinder.getCoveringNode();
    MethodDeclaration methodDeclaration = (MethodDeclaration) ASTNodes.getParent(coveringNode,
            MethodDeclaration.class);
    return methodDeclaration;
}

From source file:edu.illinois.jflow.core.transformations.code.ExtractClosureRefactoring.java

License:Open Source License

private Statement locateEnclosingLoopStatement() {
    NodeFinder nodeFinder = new NodeFinder(fRoot, fSelectionStart, fSelectionLength);
    ASTNode node = nodeFinder.getCoveringNode();
    do {//from  www . j  a  v  a2 s .  c  om
        node = node.getParent();
    } while (node != null && !(node instanceof EnhancedForStatement || node instanceof ForStatement));
    return (Statement) node;
}

From source file:org.autorefactor.refactoring.rules.CommentsRefactoring.java

License:Open Source License

private ASTNode getNextNode(Comment node) {
    final int nodeEndPosition = node.getStartPosition() + node.getLength();
    final ASTNode coveringNode = getCoveringNode(node);
    final int parentNodeEndPosition = coveringNode.getStartPosition() + coveringNode.getLength();
    final NodeFinder finder = new NodeFinder(coveringNode, nodeEndPosition,
            parentNodeEndPosition - nodeEndPosition);
    if (node instanceof Javadoc) {
        return finder.getCoveringNode();
    }/*from ww w . jav  a  2  s.  c o m*/
    return finder.getCoveredNode();
}

From source file:org.autorefactor.refactoring.rules.CommentsRefactoring.java

License:Open Source License

private ASTNode getCoveringNode(int start, int length) {
    final NodeFinder finder = new NodeFinder(this.astRoot, start, length);
    return finder.getCoveringNode();
}

From source file:org.eclim.plugin.jdt.command.correct.ProblemLocation.java

License:Open Source License

/**
 * {@inheritDoc}//from  w  w  w .j  ava  2  s  .c om
 */
public ASTNode getCoveredNode(CompilationUnit astRoot) {
    NodeFinder finder = new NodeFinder(astRoot, offset, length);
    return finder.getCoveredNode();
}

From source file:org.eclim.plugin.jdt.command.correct.ProblemLocation.java

License:Open Source License

/**
 * {@inheritDoc}//from   w w  w .j  a v a  2s .c  om
 */
public ASTNode getCoveringNode(CompilationUnit astRoot) {
    NodeFinder finder = new NodeFinder(astRoot, offset, length);
    return finder.getCoveringNode();
}

From source file:org.eclim.plugin.jdt.util.ASTUtils.java

License:Open Source License

/**
 * Finds the node at the specified offset.
 *
 * @param cu The CompilationUnit./*w  w w  . j a va2  s  . c  o  m*/
 * @param offset The node offset in the compilation unit.
 * @return The node at the specified offset.
 */
public static ASTNode findNode(CompilationUnit cu, int offset) throws Exception {
    NodeFinder finder = new NodeFinder(cu, offset, 1);
    //return finder.getCoveredNode();
    return finder.getCoveringNode();
}

From source file:org.eclipse.ajdt.internal.ui.refactoring.pullout.PullOutRefactoring.java

License:Open Source License

/**
 * Find AST node corresponding to a given IMember.
 *//*from w ww  . jav  a  2 s.  c  o  m*/
private ASTNode findASTNode(ASTNode cuNode, IMember member) throws JavaModelException {
    ISourceRange range = member.getSourceRange();
    NodeFinder finder = new NodeFinder(cuNode, range.getOffset(), range.getLength());
    return finder.getCoveredNode();
    // Note: why we *have* to use getCoveredNode explicitly rather than use the
    // perform methods defined on NodeFinder.
    // See BUG 316945: Normally, we have exact positions and covering/covered are the same node.
    // but in the BUG case we should use the covered node since a JDT bug makes the source range 
    // be too large.
}