Search in sources :

Example 21 with JCTree

use of com.sun.tools.javac.tree.JCTree in project error-prone by google.

the class MissingDefault method matchSwitch.

@Override
public Description matchSwitch(SwitchTree tree, VisitorState state) {
    Type switchType = ASTHelpers.getType(tree.getExpression());
    if (switchType.asElement().getKind() == ElementKind.ENUM) {
        // by MissingCasesInEnumSwitch
        return NO_MATCH;
    }
    Optional<? extends CaseTree> maybeDefault = tree.getCases().stream().filter(c -> c.getExpression() == null).findFirst();
    if (!maybeDefault.isPresent()) {
        Description.Builder description = buildDescription(tree);
        if (!tree.getCases().isEmpty()) {
            // Inserting the default after the last case is easier than finding the closing brace
            // for the switch statement. Hopefully we don't often see switches with zero cases.
            description.addFix(SuggestedFix.postfixWith(getLast(tree.getCases()), "\ndefault: // fall out\n"));
        }
        return description.build();
    }
    CaseTree defaultCase = maybeDefault.get();
    if (!defaultCase.getStatements().isEmpty()) {
        return NO_MATCH;
    }
    int idx = tree.getCases().indexOf(defaultCase);
    // The default case may appear before a non-default case, in which case the documentation
    // should say "fall through" instead of "fall out".
    boolean isLast = idx == tree.getCases().size() - 1;
    int end = isLast ? state.getEndPosition(tree) : ((JCTree) tree.getCases().get(idx + 1)).getStartPosition();
    if (ErrorProneTokens.getTokens(state.getSourceCode().subSequence(state.getEndPosition(defaultCase), end).toString(), state.context).stream().anyMatch(t -> !t.comments().isEmpty())) {
        return NO_MATCH;
    }
    return buildDescription(defaultCase).setMessage("Default case should be documented with a comment").addFix(SuggestedFix.postfixWith(defaultCase, isLast ? " // fall out" : " // fall through")).build();
}
Also used : ElementKind(javax.lang.model.element.ElementKind) Iterables.getLast(com.google.common.collect.Iterables.getLast) NO_MATCH(com.google.errorprone.matchers.Description.NO_MATCH) CaseTree(com.sun.source.tree.CaseTree) JCTree(com.sun.tools.javac.tree.JCTree) SwitchTreeMatcher(com.google.errorprone.bugpatterns.BugChecker.SwitchTreeMatcher) SwitchTree(com.sun.source.tree.SwitchTree) VisitorState(com.google.errorprone.VisitorState) ErrorProneTokens(com.google.errorprone.util.ErrorProneTokens) Description(com.google.errorprone.matchers.Description) BugPattern(com.google.errorprone.BugPattern) Optional(java.util.Optional) WARNING(com.google.errorprone.BugPattern.SeverityLevel.WARNING) SuggestedFix(com.google.errorprone.fixes.SuggestedFix) JDK(com.google.errorprone.BugPattern.Category.JDK) ASTHelpers(com.google.errorprone.util.ASTHelpers) Type(com.sun.tools.javac.code.Type) CaseTree(com.sun.source.tree.CaseTree) Type(com.sun.tools.javac.code.Type) Description(com.google.errorprone.matchers.Description)

Example 22 with JCTree

use of com.sun.tools.javac.tree.JCTree in project error-prone by google.

the class IsInstanceOfClass method classify.

static Operand classify(JCTree tree, VisitorState state) {
    CharSequence source = state.getSourceForNode(tree);
    if (tree instanceof MethodInvocationTree) {
        // expr.getClass() -> "expr"
        MethodInvocationTree receiverInvocation = (MethodInvocationTree) tree;
        MethodSymbol sym = ASTHelpers.getSymbol(receiverInvocation);
        if (sym != null) {
            if (sym.getSimpleName().contentEquals("getClass") && sym.params().isEmpty()) {
                if (receiverInvocation.getMethodSelect() instanceof IdentifierTree) {
                    // unqualified `getClass()`
                    return Operand.create(Kind.EXPR, state.getSourceForNode(tree), source);
                }
                return Operand.create(Kind.GET_CLASS, state.getSourceForNode((JCTree) ASTHelpers.getReceiver(receiverInvocation)), source);
            }
        }
    } else if (tree instanceof MemberSelectTree) {
        // Foo.class -> "Foo"
        MemberSelectTree select = (MemberSelectTree) tree;
        if (select.getIdentifier().contentEquals("class")) {
            return Operand.create(Kind.LITERAL, state.getSourceForNode((JCTree) select.getExpression()), source);
        }
    }
    return Operand.create(Kind.EXPR, source, source);
}
Also used : MethodSymbol(com.sun.tools.javac.code.Symbol.MethodSymbol) MethodInvocationTree(com.sun.source.tree.MethodInvocationTree) MemberSelectTree(com.sun.source.tree.MemberSelectTree) IdentifierTree(com.sun.source.tree.IdentifierTree) JCTree(com.sun.tools.javac.tree.JCTree)

Example 23 with JCTree

use of com.sun.tools.javac.tree.JCTree in project error-prone by google.

the class JUnit3FloatingPointComparisonWithoutDelta method getArgumentTypesWithoutMessage.

/**
   * Gets the argument types, excluding the message argument if present.
   */
private List<Type> getArgumentTypesWithoutMessage(MethodInvocationTree methodInvocationTree, VisitorState state) {
    List<Type> argumentTypes = new ArrayList<>();
    for (ExpressionTree argument : methodInvocationTree.getArguments()) {
        JCTree tree = (JCTree) argument;
        argumentTypes.add(tree.type);
    }
    removeMessageArgumentIfPresent(state, argumentTypes);
    return argumentTypes;
}
Also used : Type(com.sun.tools.javac.code.Type) ArrayList(java.util.ArrayList) ExpressionTree(com.sun.source.tree.ExpressionTree) JCTree(com.sun.tools.javac.tree.JCTree)

Example 24 with JCTree

use of com.sun.tools.javac.tree.JCTree in project error-prone by google.

the class HashtableContains method replaceMethodName.

private Fix replaceMethodName(MethodInvocationTree tree, VisitorState state, String newName) {
    String source = state.getSourceForNode((JCTree) tree.getMethodSelect()).toString();
    int idx = source.lastIndexOf("contains");
    String replacement = source.substring(0, idx) + newName + source.substring(idx + "contains".length());
    Fix fix = SuggestedFix.replace(tree.getMethodSelect(), replacement);
    return fix;
}
Also used : SuggestedFix(com.google.errorprone.fixes.SuggestedFix) Fix(com.google.errorprone.fixes.Fix) JCTree(com.sun.tools.javac.tree.JCTree)

Example 25 with JCTree

use of com.sun.tools.javac.tree.JCTree in project error-prone by google.

the class SuggestedFixes method addModifiers.

/** Add modifiers to the given class, method, or field declaration. */
@Nullable
public static SuggestedFix addModifiers(Tree tree, VisitorState state, Modifier... modifiers) {
    ModifiersTree originalModifiers = getModifiers(tree);
    if (originalModifiers == null) {
        return null;
    }
    Set<Modifier> toAdd = Sets.difference(new TreeSet<>(Arrays.asList(modifiers)), originalModifiers.getFlags());
    if (originalModifiers.getFlags().isEmpty()) {
        int pos = state.getEndPosition(originalModifiers) != Position.NOPOS ? state.getEndPosition(originalModifiers) + 1 : ((JCTree) tree).getStartPosition();
        int base = ((JCTree) tree).getStartPosition();
        java.util.Optional<Integer> insert = state.getTokensForNode(tree).stream().map(token -> token.pos() + base).filter(thisPos -> thisPos >= pos).findFirst();
        // shouldn't ever be able to get to the else
        int insertPos = insert.orElse(pos);
        return SuggestedFix.replace(insertPos, insertPos, Joiner.on(' ').join(toAdd) + " ");
    }
    // a map from modifiers to modifier position (or -1 if the modifier is being added)
    // modifiers are sorted in Google Java Style order
    Map<Modifier, Integer> modifierPositions = new TreeMap<>();
    for (Modifier mod : toAdd) {
        modifierPositions.put(mod, -1);
    }
    List<ErrorProneToken> tokens = state.getTokensForNode(originalModifiers);
    int base = ((JCTree) originalModifiers).getStartPosition();
    for (ErrorProneToken tok : tokens) {
        Modifier mod = getTokModifierKind(tok);
        if (mod != null) {
            modifierPositions.put(mod, base + tok.pos());
        }
    }
    SuggestedFix.Builder fix = SuggestedFix.builder();
    // walk the map of all modifiers, and accumulate a list of new modifiers to insert
    // beside an existing modifier
    List<Modifier> modifiersToWrite = new ArrayList<>();
    for (Modifier mod : modifierPositions.keySet()) {
        int p = modifierPositions.get(mod);
        if (p == -1) {
            modifiersToWrite.add(mod);
        } else if (!modifiersToWrite.isEmpty()) {
            fix.replace(p, p, Joiner.on(' ').join(modifiersToWrite) + " ");
            modifiersToWrite.clear();
        }
    }
    if (!modifiersToWrite.isEmpty()) {
        fix.postfixWith(originalModifiers, " " + Joiner.on(' ').join(modifiersToWrite));
    }
    return fix.build();
}
Also used : Arrays(java.util.Arrays) SimpleTypeVisitor8(javax.lang.model.util.SimpleTypeVisitor8) Modifier(javax.lang.model.element.Modifier) TreeScanner(com.sun.tools.javac.tree.TreeScanner) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) AssignmentTree(com.sun.source.tree.AssignmentTree) FluentIterable(com.google.common.collect.FluentIterable) Optional(com.google.common.base.Optional) Map(java.util.Map) NewArrayTree(com.sun.source.tree.NewArrayTree) ASTHelpers.getAnnotationWithSimpleName(com.google.errorprone.util.ASTHelpers.getAnnotationWithSimpleName) Builder(com.google.errorprone.fixes.SuggestedFix.Builder) ParenthesizedTree(com.sun.source.tree.ParenthesizedTree) ArrayType(javax.lang.model.type.ArrayType) TreePath(com.sun.source.util.TreePath) Function(com.google.common.base.Function) ImmutableSet(com.google.common.collect.ImmutableSet) Collection(java.util.Collection) Position(com.sun.tools.javac.util.Position) ASTHelpers.getSymbol(com.google.errorprone.util.ASTHelpers.getSymbol) Symbol(com.sun.tools.javac.code.Symbol) Set(java.util.Set) Iterables.getLast(com.google.common.collect.Iterables.getLast) DocTreePath(com.sun.source.util.DocTreePath) Sets(com.google.common.collect.Sets) JavacTrees(com.sun.tools.javac.api.JavacTrees) List(java.util.List) Tokens(com.sun.tools.javac.parser.Tokens) ASTHelpers.getAnnotation(com.google.errorprone.util.ASTHelpers.getAnnotation) ModifiersTree(com.sun.source.tree.ModifiersTree) Type(com.sun.tools.javac.code.Type) Joiner(com.google.common.base.Joiner) AnnotationTree(com.sun.source.tree.AnnotationTree) MethodTree(com.sun.source.tree.MethodTree) VariableTree(com.sun.source.tree.VariableTree) CLASS(com.sun.tools.javac.code.TypeTag.CLASS) Deque(java.util.Deque) TreeSet(java.util.TreeSet) ArrayList(java.util.ArrayList) VisitorState(com.google.errorprone.VisitorState) Lists(com.google.common.collect.Lists) ImmutableList(com.google.common.collect.ImmutableList) DeclaredType(javax.lang.model.type.DeclaredType) Predicates(com.google.common.base.Predicates) NEW_ARRAY(com.sun.source.tree.Tree.Kind.NEW_ARRAY) StreamSupport(java.util.stream.StreamSupport) Tree(com.sun.source.tree.Tree) ClassTree(com.sun.source.tree.ClassTree) Nullable(javax.annotation.Nullable) ErrorProneToken(com.google.errorprone.util.ErrorProneToken) ElementKind(javax.lang.model.element.ElementKind) ExpressionTree(com.sun.source.tree.ExpressionTree) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) DCTree(com.sun.tools.javac.tree.DCTree) TreeMaker(com.sun.tools.javac.tree.TreeMaker) JCTree(com.sun.tools.javac.tree.JCTree) ASSIGNMENT(com.sun.source.tree.Tree.Kind.ASSIGNMENT) TypeMirror(javax.lang.model.type.TypeMirror) TreeMap(java.util.TreeMap) ASTHelpers.getModifiers(com.google.errorprone.util.ASTHelpers.getModifiers) PARENTHESIZED(com.sun.source.tree.Tree.Kind.PARENTHESIZED) DocTree(com.sun.source.doctree.DocTree) ArrayDeque(java.util.ArrayDeque) ModifiersTree(com.sun.source.tree.ModifiersTree) ArrayList(java.util.ArrayList) JCTree(com.sun.tools.javac.tree.JCTree) TreeMap(java.util.TreeMap) ErrorProneToken(com.google.errorprone.util.ErrorProneToken) Builder(com.google.errorprone.fixes.SuggestedFix.Builder) Modifier(javax.lang.model.element.Modifier) Nullable(javax.annotation.Nullable)

Aggregations

JCTree (com.sun.tools.javac.tree.JCTree)183 JCExpression (com.sun.tools.javac.tree.JCTree.JCExpression)28 Symbol (com.sun.tools.javac.code.Symbol)22 JCVariableDecl (com.sun.tools.javac.tree.JCTree.JCVariableDecl)22 Type (com.sun.tools.javac.code.Type)19 Tree (com.redhat.ceylon.compiler.typechecker.tree.Tree)17 Tree (com.sun.source.tree.Tree)15 ExpressionTree (com.sun.source.tree.ExpressionTree)14 JCFieldAccess (com.sun.tools.javac.tree.JCTree.JCFieldAccess)14 SuggestedFix (com.google.errorprone.fixes.SuggestedFix)11 JCClassDecl (com.sun.tools.javac.tree.JCTree.JCClassDecl)11 JCStatement (com.sun.tools.javac.tree.JCTree.JCStatement)10 ArrayList (java.util.ArrayList)10 MethodInvocationTree (com.sun.source.tree.MethodInvocationTree)9 JCMethodDecl (com.sun.tools.javac.tree.JCTree.JCMethodDecl)9 JCNewClass (com.sun.tools.javac.tree.JCTree.JCNewClass)8 ListBuffer (com.sun.tools.javac.util.ListBuffer)8 Type (com.redhat.ceylon.model.typechecker.model.Type)7 ClassTree (com.sun.source.tree.ClassTree)7 MemberSelectTree (com.sun.source.tree.MemberSelectTree)7