summaryrefslogtreecommitdiff
path: root/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java
diff options
context:
space:
mode:
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.java34
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);
}