IDEA-138521 Infer contracts for anonymous class methods resolved to from outside

This commit is contained in:
peter
2015-04-20 18:09:56 +02:00
parent 55dfb5566f
commit 64e2d1b3bb
2 changed files with 24 additions and 2 deletions
@@ -44,8 +44,18 @@ public class InferenceFromSourceUtil {
private static boolean isUnusedInAnonymousClass(@NotNull PsiMethod method) {
PsiClass containingClass = method.getContainingClass();
return containingClass instanceof PsiAnonymousClass &&
MethodReferencesSearch.search(method, new LocalSearchScope(containingClass), false).findFirst() == null;
if (!(containingClass instanceof PsiAnonymousClass)) {
return false;
}
if (containingClass.getParent() instanceof PsiNewExpression &&
containingClass.getParent().getParent() instanceof PsiVariable &&
!method.getHierarchicalMethodSignature().getSuperSignatures().isEmpty()) {
// references outside anonymous class can still resolve to this method, see com.intellij.psi.scope.util.PsiScopesUtil.setupAndRunProcessor()
return false;
}
return MethodReferencesSearch.search(method, new LocalSearchScope(containingClass), false).findFirst() == null;
}
private static boolean isLibraryCode(@NotNull PsiMethod method) {
@@ -507,6 +507,18 @@ class Foo {{
assert ContractInference.inferContracts(method).collect { it as String } == [' -> null']
}
public void "test anonymous class methods potentially used from outside"() {
def method = PsiTreeUtil.findChildOfType(myFixture.addClass("""
class Foo {{
Runnable r = new Runnable() {
public void run() {
throw new RuntimeException();
}
};
}}"""), PsiAnonymousClass).methods[0]
assert ContractInference.inferContracts(method).collect { it as String } == [' -> fail']
}
private String inferContract(String method) {
return assertOneElement(inferContracts(method))
}