diff options
Diffstat (limited to 'java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java')
-rw-r--r-- | java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java index 13a18f075aa4..ddaeeb7581b5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java @@ -56,6 +56,7 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { private static final int IS_SERVLET_MASK = 0x400000; private static final int IS_TESTCASE_MASK = 0x800000; private static final int IS_LOCAL_MASK = 0x1000000; + private static final int IS_ANDROID_MASK = 0x2000000; private Set<RefClass> myBases; // singleton (to conserve the memory) or THashSet private Set<RefClass> mySubClasses; // singleton (to conserve the memory) or THashSet @@ -139,6 +140,26 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { } } + // The Android framework has a number of classes that it wants to + // instantiate so it requires these classes to be public, even if + // code analysis suggests that that these are only referenced from + // within the same package. Unfortunately these do not all extend the + // same set of base classes, so we need to check all these cases + // independently. + RefJavaManager refManager = getRefJavaManager(); + if (inheritsFrom(psiClass, refManager.getAndroidActivity()) + || inheritsFrom(psiClass, refManager.getAndroidService()) + || inheritsFrom(psiClass, refManager.getAndroidView()) + || inheritsFrom(psiClass, refManager.getAndroidFragment(false)) + || inheritsFrom(psiClass, refManager.getAndroidFragment(true)) + || inheritsFrom(psiClass, refManager.getAndroidReceiver()) + || inheritsFrom(psiClass, refManager.getAndroidContentProvider()) + || inheritsFrom(psiClass, refManager.getAndroidParcelable()) + || inheritsFrom(psiClass, refManager.getAndroidBackupAgent()) + || inheritsFrom(psiClass, refManager.getAndroidActionProvider())) { + setAndroidPublic(true); + } + for (PsiMethod psiMethod : psiMethods) { RefMethod refMethod = (RefMethod)getRefManager().getReference(psiMethod); @@ -187,6 +208,10 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { } } + private static boolean inheritsFrom(@NotNull PsiClass c1, @Nullable PsiClass c2) { + return c2 != null && c1.isInheritor(c2, true); + } + private static ServerPageFile getJspFile(PsiClass psiClass) { final PsiFile psiFile = PsiUtilCore.getTemplateLanguageFile(psiClass); return psiFile instanceof ServerPageFile ? (ServerPageFile)psiFile : null; @@ -491,6 +516,11 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { } @Override + public boolean isAndroidPublic() { + return checkFlag(IS_ANDROID_MASK); + } + + @Override public boolean isTestCase() { return checkFlag(IS_TESTCASE_MASK); } @@ -557,6 +587,10 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { setFlag(servlet, IS_SERVLET_MASK); } + private void setAndroidPublic(boolean android) { + setFlag(android, IS_ANDROID_MASK); + } + private void setTestCase(boolean testCase) { setFlag(testCase, IS_TESTCASE_MASK); } |