Skip to content

Commit

Permalink
Don't assume that all methods have an outermost class
Browse files Browse the repository at this point in the history
RELNOTES: N/A

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=231241506
  • Loading branch information
cushon authored and ronshapiro committed Jan 31, 2019
1 parent af46227 commit 5ca7751
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 6 deletions.
17 changes: 17 additions & 0 deletions check_api/src/main/java/com/google/errorprone/util/ASTHelpers.java
Expand Up @@ -1644,4 +1644,21 @@ public static boolean containsComments(Tree tree, VisitorState state) {
return ErrorProneTokens.getTokens(state.getSourceForNode(tree), state.context).stream()
.anyMatch(t -> !t.comments().isEmpty());
}

/**
* Returns the outermost enclosing owning class, or {@code null}. Doesn't crash on symbols that
* aren't containing in a package, unlike {@link Symbol#outermostClass} (see b/123431414).
*/
// TODO(b/123431414): fix javac and use Symbol.outermostClass insteads
public static ClassSymbol outermostClass(Symbol symbol) {
ClassSymbol curr = symbol.enclClass();
while (curr.owner != null) {
ClassSymbol encl = curr.owner.enclClass();
if (encl == null) {
break;
}
curr = encl;
}
return curr;
}
}
Expand Up @@ -93,7 +93,7 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState
List<MethodSymbol> overriddenMethods = getOverriddenMethods(state, method);

for (Symbol overriddenMethod : overriddenMethods) {
Type declaringClass = overriddenMethod.outermostClass().asType();
Type declaringClass = ASTHelpers.outermostClass(overriddenMethod).asType();
if (!ASTHelpers.isSameType(declaringClass, currentClass, state)) {
String customMessage =
MESSAGE_BASE
Expand Down
Expand Up @@ -59,7 +59,7 @@ public final class RefersToDaggerCodegen extends BugChecker implements MethodInv
@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
MethodSymbol method = getSymbol(tree);
ClassSymbol rootClassOfMethod = method.outermostClass();
ClassSymbol rootClassOfMethod = ASTHelpers.outermostClass(method);

if (!isGeneratedFactoryType(rootClassOfMethod, state)
&& !isMembersInjectionInvocation(method, state)
Expand All @@ -78,7 +78,7 @@ private boolean isMembersInjectionInvocation(MethodSymbol method, VisitorState s
if (method.getSimpleName().contentEquals("injectMembers")) {
return false;
}
return isGeneratedBaseType(method.outermostClass(), state, "dagger.MembersInjector");
return isGeneratedBaseType(ASTHelpers.outermostClass(method), state, "dagger.MembersInjector");
}

// TODO(ronshapiro): if we ever start emitting an annotation that has class retention, use that
Expand All @@ -101,7 +101,8 @@ private static boolean isDaggerInternalClass(ClassSymbol symbol) {
}

private static boolean isAllowedToReferenceDaggerInternals(VisitorState state) {
ClassSymbol rootCallingClass = getSymbol(state.findEnclosing(ClassTree.class)).outermostClass();
ClassSymbol rootCallingClass =
ASTHelpers.outermostClass(getSymbol(state.findEnclosing(ClassTree.class)));
if (rootCallingClass.getQualifiedName().toString().startsWith("dagger.")) {
return true;
}
Expand Down
Expand Up @@ -23,6 +23,7 @@
import com.google.errorprone.SubContext;
import com.google.errorprone.refaster.Bindings.Key;
import com.google.errorprone.refaster.UTypeVar.TypeWithExpression;
import com.google.errorprone.util.ASTHelpers;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.TypeSymbol;
Expand Down Expand Up @@ -146,7 +147,7 @@ public JCExpression visitClassType(ClassType type, Inliner inliner) {
.importPolicy()
.classReference(
inliner,
classSym.outermostClass().getQualifiedName().toString(),
ASTHelpers.outermostClass(classSym).getQualifiedName().toString(),
classSym.getQualifiedName().toString());
List<JCExpression> argExprs = List.nil();
for (Type argType : type.getTypeArguments()) {
Expand Down
Expand Up @@ -49,7 +49,7 @@ public static UClassIdent create(String qualifiedName) {
}

public static UClassIdent create(ClassSymbol sym) {
return create(sym.outermostClass().getQualifiedName(), sym.getQualifiedName());
return create(ASTHelpers.outermostClass(sym).getQualifiedName(), sym.getQualifiedName());
}

private static UClassIdent create(CharSequence topLevelClass, CharSequence name) {
Expand Down

0 comments on commit 5ca7751

Please sign in to comment.