diff options
author | Tor Norbye <tnorbye@google.com> | 2012-11-28 15:13:21 -0800 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2012-11-28 15:13:21 -0800 |
commit | 5c17297c01fe9eda5faf3358c201764b5dccf8e0 (patch) | |
tree | 10ef6ea8cb2cfc5d28502eaed4c0578292af34ad | |
parent | 203d65fbce21bf9e6d3c10155ff7091f41f57b6a (diff) | |
parent | 230245601e6727dbdbaea20daae5e56073a9fb37 (diff) | |
download | sdk-5c17297c01fe9eda5faf3358c201764b5dccf8e0.zip sdk-5c17297c01fe9eda5faf3358c201764b5dccf8e0.tar.gz sdk-5c17297c01fe9eda5faf3358c201764b5dccf8e0.tar.bz2 |
Merge "Fixes for go to declaration for theme references"
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> |