From ce01c69747fdd7619fdb1bb2bb99ff22a22abbd5 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 21 Jun 2012 21:08:38 +0400 Subject: [PATCH] IDEA-87399 quick fix if resource class is unresolved, navigate to resource from any place inside R.. reference --- .../AndroidGotoDeclarationHandler.java | 14 +++++- .../inspections/AndroidQuickFixProvider.java | 9 +++- .../src/p1/p2/JavaFileNavigation10.java | 7 +++ .../src/p1/p2/JavaFileNavigation11.java | 7 +++ .../src/p1/p2/JavaFileNavigation8.java | 7 +++ .../src/p1/p2/JavaFileNavigation9.java | 7 +++ .../AndroidResourcesLineMarkerTest.java | 49 ++++++++++++++----- 7 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation10.java create mode 100644 plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation11.java create mode 100644 plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation8.java create mode 100644 plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation9.java diff --git a/plugins/android/src/org/jetbrains/android/AndroidGotoDeclarationHandler.java b/plugins/android/src/org/jetbrains/android/AndroidGotoDeclarationHandler.java index 9b23a4cc2c3a..a0b77ead13b0 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidGotoDeclarationHandler.java +++ b/plugins/android/src/org/jetbrains/android/AndroidGotoDeclarationHandler.java @@ -54,7 +54,19 @@ public class AndroidGotoDeclarationHandler implements GotoDeclarationHandler { return null; } - final Pair pair = AndroidResourceUtil.getReferredResourceField(facet, refExp); + Pair pair = AndroidResourceUtil.getReferredResourceField(facet, refExp); + if (pair == null) { + PsiElement parent = refExp.getParent(); + if (parent instanceof PsiReferenceExpression) { + pair = AndroidResourceUtil.getReferredResourceField(facet, (PsiReferenceExpression)parent); + } + if (pair == null) { + parent = parent.getParent(); + if (parent instanceof PsiReferenceExpression) { + pair = AndroidResourceUtil.getReferredResourceField(facet, (PsiReferenceExpression)parent); + } + } + } if (pair == null) { return null; } diff --git a/plugins/android/src/org/jetbrains/android/inspections/AndroidQuickFixProvider.java b/plugins/android/src/org/jetbrains/android/inspections/AndroidQuickFixProvider.java index 5ec1a6699031..65218ec351e9 100644 --- a/plugins/android/src/org/jetbrains/android/inspections/AndroidQuickFixProvider.java +++ b/plugins/android/src/org/jetbrains/android/inspections/AndroidQuickFixProvider.java @@ -6,6 +6,7 @@ import com.intellij.codeInsight.quickfix.UnresolvedReferenceQuickFixProvider; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.util.Pair; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReferenceExpression; import org.jetbrains.android.dom.manifest.Manifest; @@ -44,7 +45,13 @@ public class AndroidQuickFixProvider extends UnresolvedReferenceQuickFixProvider return; } - final Pair pair = AndroidResourceUtil.getReferredResourceField(facet, exp); + Pair pair = AndroidResourceUtil.getReferredResourceField(facet, exp); + if (pair == null) { + final PsiElement parent = exp.getParent(); + if (parent instanceof PsiReferenceExpression) { + pair = AndroidResourceUtil.getReferredResourceField(facet, (PsiReferenceExpression)parent); + } + } if (pair == null) { return; } diff --git a/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation10.java b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation10.java new file mode 100644 index 000000000000..5149f3c6fd64 --- /dev/null +++ b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation10.java @@ -0,0 +1,7 @@ +package p1.p2; + +class Java { + public void g() { + int[] ar = R.styleable.Dec1; + } +} \ No newline at end of file diff --git a/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation11.java b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation11.java new file mode 100644 index 000000000000..8fe374076932 --- /dev/null +++ b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation11.java @@ -0,0 +1,7 @@ +package p1.p2; + +class Java { + public void g() { + int[] ar = R.styleable.Dec1; + } +} \ No newline at end of file diff --git a/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation8.java b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation8.java new file mode 100644 index 000000000000..e7a1d9e94172 --- /dev/null +++ b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation8.java @@ -0,0 +1,7 @@ +package p1.p2; + +class Java { + public void g() { + int[] ar = R.styleable.Dec1; + } +} \ No newline at end of file diff --git a/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation9.java b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation9.java new file mode 100644 index 000000000000..0f063fe08809 --- /dev/null +++ b/plugins/android/testData/resNavigation/src/p1/p2/JavaFileNavigation9.java @@ -0,0 +1,7 @@ +package p1.p2; + +class Java { + public void g() { + int[] ar = R.styleable.Dec1; + } +} \ No newline at end of file diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java index 10c5a336de88..0db7679853aa 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java @@ -3,6 +3,9 @@ package org.jetbrains.android; import com.intellij.codeInsight.navigation.actions.GotoDeclarationAction; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlAttributeValue; +import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -10,7 +13,8 @@ import java.io.IOException; * @author Eugene.Kudelevsky */ public class AndroidResourcesLineMarkerTest extends AndroidTestCase { - public void test1() {} + public void test1() { + } private static final String BASE_PATH = "/resNavigation/"; @@ -26,41 +30,60 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase { } public void testJavaFileNavigation1() throws Exception { - doJavaFileNavigationTest(1, true); + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); } public void testJavaFileNavigation2() throws Exception { - doJavaFileNavigationTest(3, true); + doJavaFileNavigationTest(3, true, XmlAttributeValue.class); } public void testJavaFileNavigation3() throws Exception { - doJavaFileNavigationTest(2, true); + doJavaFileNavigationTest(2, true, PsiFile.class); } public void testJavaFileNavigation4() throws Exception { - doJavaFileNavigationTest(0, false); + doJavaFileNavigationTest(0, false, null); } public void testJavaFileNavigation5() throws Exception { - doJavaFileNavigationTest(1, true); + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); } public void testJavaFileNavigation6() throws Exception { - doJavaFileNavigationTest(1, true); + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); } public void testJavaFileNavigation7() throws Exception { - doJavaFileNavigationTest(1, true); + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); } - private void doJavaFileNavigationTest(int expectedTargets, boolean expectedEnabled) throws IOException { + public void testJavaFileNavigation8() throws Exception { + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); + } + + public void testJavaFileNavigation9() throws Exception { + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); + } + + public void testJavaFileNavigation10() throws Exception { + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); + } + + public void testJavaFileNavigation11() throws Exception { + doJavaFileNavigationTest(1, true, XmlAttributeValue.class); + } + + private void doJavaFileNavigationTest(int expectedTargets, + boolean expectedEnabled, + @Nullable Class targetElementClass) + throws IOException { copyRJava(); String path = "src/p1/p2/" + getTestName(false) + ".java"; - doJavaFileNavigationTest(path, path, expectedTargets, expectedEnabled, true); + doJavaFileNavigationTest(path, path, expectedTargets, expectedEnabled, true, targetElementClass); } private void doJavaFileNavigationTest(String srcPath, String destPath, int expectedTargets, boolean expectedEnabled, - boolean testGotoDeclaration) throws IOException { + boolean testGotoDeclaration, Class targetElementClass) throws IOException { VirtualFile file = myFixture.copyFileToProject(BASE_PATH + srcPath, destPath); myFixture.configureFromExistingVirtualFile(file); @@ -69,6 +92,10 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase { PsiElement[] targets = GotoDeclarationAction.findAllTargetElements(getProject(), myFixture.getEditor(), myFixture.getCaretOffset()); assertNotNull(targets); assertEquals(expectedTargets, targets.length); + + for (PsiElement target : targets) { + assertInstanceOf(target, targetElementClass); + } } }