aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-11-28 15:13:21 -0800
committerGerrit Code Review <noreply-gerritcodereview@google.com>2012-11-28 15:13:21 -0800
commit5c17297c01fe9eda5faf3358c201764b5dccf8e0 (patch)
tree10ef6ea8cb2cfc5d28502eaed4c0578292af34ad
parent203d65fbce21bf9e6d3c10155ff7091f41f57b6a (diff)
parent230245601e6727dbdbaea20daae5e56073a9fb37 (diff)
downloadsdk-5c17297c01fe9eda5faf3358c201764b5dccf8e0.zip
sdk-5c17297c01fe9eda5faf3358c201764b5dccf8e0.tar.gz
sdk-5c17297c01fe9eda5faf3358c201764b5dccf8e0.tar.bz2
Merge "Fixes for go to declaration for theme references"
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java75
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java6
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt7
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml1
4 files changed, 73 insertions, 16 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
index e94822b..3a47eb2 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
@@ -25,6 +25,7 @@ import static com.android.SdkConstants.ATTR_CLASS;
import static com.android.SdkConstants.ATTR_CONTEXT;
import static com.android.SdkConstants.ATTR_NAME;
import static com.android.SdkConstants.ATTR_ON_CLICK;
+import static com.android.SdkConstants.ATTR_REF_PREFIX;
import static com.android.SdkConstants.CLASS_ACTIVITY;
import static com.android.SdkConstants.EXT_XML;
import static com.android.SdkConstants.FD_DOCS;
@@ -914,24 +915,50 @@ public class Hyperlinks {
String targetTag = getTagName(type);
Element root = document.getDocumentElement();
if (root.getTagName().equals(TAG_RESOURCES)) {
- NodeList children = root.getChildNodes();
- for (int i = 0, n = children.getLength(); i < n; i++) {
- Node child = children.item(i);
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- Element element = (Element)child;
- if (element.getTagName().equals(targetTag)) {
- String elementName = element.getAttribute(ATTR_NAME);
- if (elementName.equals(name)) {
- IRegion region = null;
- if (element instanceof IndexedRegion) {
- IndexedRegion r = (IndexedRegion) element;
- // IndexedRegion.getLength() returns bogus values
- int length = r.getEndOffset() - r.getStartOffset();
- region = new Region(r.getStartOffset(), length);
+ NodeList topLevel = root.getChildNodes();
+ Pair<IFile, IRegion> value = findValueInChildren(name, file, targetTag, topLevel);
+ if (value == null && type == ResourceType.ATTR) {
+ for (int i = 0, n = topLevel.getLength(); i < n; i++) {
+ Node child = topLevel.item(i);
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)child;
+ String tagName = element.getTagName();
+ if (tagName.equals("declare-styleable")) {
+ NodeList children = element.getChildNodes();
+ value = findValueInChildren(name, file, targetTag, children);
+ if (value != null) {
+ return value;
}
+ }
+ }
+ }
+ }
+
+ return value;
+ }
+
+ return null;
+ }
- return Pair.of(file, region);
+ private static Pair<IFile, IRegion> findValueInChildren(String name, IFile file,
+ String targetTag, NodeList children) {
+ for (int i = 0, n = children.getLength(); i < n; i++) {
+ Node child = children.item(i);
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)child;
+ String tagName = element.getTagName();
+ if (tagName.equals(targetTag)) {
+ String elementName = element.getAttribute(ATTR_NAME);
+ if (elementName.equals(name)) {
+ IRegion region = null;
+ if (element instanceof IndexedRegion) {
+ IndexedRegion r = (IndexedRegion) element;
+ // IndexedRegion.getLength() returns bogus values
+ int length = r.getEndOffset() - r.getStartOffset();
+ region = new Region(r.getStartOffset(), length);
}
+
+ return Pair.of(file, region);
}
}
}
@@ -1115,10 +1142,20 @@ public class Hyperlinks {
return getResourceLinks(range, url, project, configuration);
}
- /** Parse a resource reference or a theme reference and return the individual parts */
+ /**
+ * Parse a resource reference or a theme reference and return the individual
+ * parts
+ *
+ * @param url the url to parse
+ * @return a pair which represents the resource type and name
+ */
public static Pair<ResourceType,String> parseResource(String url) {
if (url.startsWith(PREFIX_THEME_REF)) {
String remainder = url.substring(PREFIX_THEME_REF.length());
+ if (url.startsWith(ATTR_REF_PREFIX)) {
+ url = PREFIX_RESOURCE_REF + url.substring(1);
+ return ResourceHelper.parseResource(url);
+ }
int colon = url.indexOf(':');
if (colon != -1) {
// Convert from ?android:progressBarStyleBig to ?android:attr/progressBarStyleBig
@@ -1128,6 +1165,12 @@ public class Hyperlinks {
}
url = PREFIX_RESOURCE_REF + remainder;
return ResourceHelper.parseResource(url);
+ } else {
+ int slash = url.indexOf('/');
+ if (slash == -1) {
+ url = PREFIX_RESOURCE_REF + RESOURCE_CLZ_ATTR + '/' + remainder;
+ return ResourceHelper.parseResource(url);
+ }
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java
index 4c81bc9..cb83947 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java
@@ -186,6 +186,12 @@ public class HyperlinksTest extends AdtProjectTest {
"?android:attr/alert^DialogStyle");
}
+ public void testNavigate16() throws Exception {
+ // Check navigating to a theme resource
+ checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
+ "?android:alert^DialogStyle");
+ }
+
// Left to test:
// onClick handling
// class attributes
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt
new file mode 100644
index 0000000..b6f6cb2
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt
@@ -0,0 +1,7 @@
+Go To Declaration in navigation1.xml for ?android:alert^DialogStyle:
+Open Declaration in values/attrs.xml : [?android:alertDialogStyle]
+ data/res/values/attrs.xml
+
+
+After open, the selected text is:
+ <attr name="alertDialogStyle" format="reference" />^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml
index e7ac4bc..c5b292e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml
@@ -14,4 +14,5 @@
android:text="@android:string/ok"
</EditText>
<EditText android:text="?android:attr/alertDialogStyle" />
+ <EditText android:text="?android:alertDialogStyle" />
</LinearLayout>