IDEA-87399 quick fix if resource class is unresolved, navigate to resource from any place inside R.<class>.<field> reference

This commit is contained in:
Eugene Kudelevsky
2012-06-21 21:10:36 +04:00
parent 40c8c3b8c9
commit ce01c69747
7 changed files with 87 additions and 13 deletions
@@ -54,7 +54,19 @@ public class AndroidGotoDeclarationHandler implements GotoDeclarationHandler {
return null;
}
final Pair<String, String> pair = AndroidResourceUtil.getReferredResourceField(facet, refExp);
Pair<String, String> 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;
}
@@ -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<String, String> pair = AndroidResourceUtil.getReferredResourceField(facet, exp);
Pair<String, String> 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;
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = R<caret>.styleable.Dec1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = <caret>R.styleable.Dec1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = R.styleable<caret>.Dec1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = R.style<caret>able.Dec1;
}
}
@@ -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<? extends PsiElement> 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<? extends PsiElement> 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);
}
}
}