diff --git a/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java b/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java index f6ea4e35cf36..52163c045387 100644 --- a/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java +++ b/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java @@ -1,5 +1,6 @@ package org.jetbrains.android.util; +import com.android.resources.ResourceFolderType; import com.android.sdklib.IAndroidTarget; import com.android.sdklib.ISdkLog; import com.android.sdklib.SdkConstants; @@ -39,7 +40,7 @@ public class AndroidCommonUtils { private static Pattern R_PATTERN = Pattern.compile("R(\\$.*)?\\.class"); public static final Pattern COMPILER_MESSAGE_PATTERN = Pattern.compile("(.+):(\\d+):.+"); - public static final String[] FILE_RESOURCE_TYPES = new String[]{"drawable", "anim", "layout", "values", "menu", "xml", "raw", "color"}; + @NonNls public static final String PNG_EXTENSION = "png"; private static final String[] DRAWABLE_EXTENSIONS = new String[]{PNG_EXTENSION, "jpg", "gif"}; @@ -242,7 +243,7 @@ public class AndroidCommonUtils { public static String getResourceTypeByDirName(@NotNull String name) { final int index = name.indexOf('-'); final String type = index >= 0 ? name.substring(0, index) : name; - return ArrayUtil.find(FILE_RESOURCE_TYPES, type) >= 0 ? type : null; + return ResourceFolderType.getTypeByName(type) != null ? type : null; } @NotNull diff --git a/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java b/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java index 0802c6d5a896..159f3e23db90 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java +++ b/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java @@ -15,6 +15,7 @@ */ package org.jetbrains.android; +import com.android.resources.ResourceType; import com.intellij.codeHighlighting.Pass; import com.intellij.codeInsight.daemon.GutterIconNavigationHandler; import com.intellij.codeInsight.daemon.LineMarkerInfo; @@ -175,9 +176,9 @@ public class AndroidResourcesLineMarkerProvider implements LineMarkerProvider { final Map> result = new HashMap>(); Collection resourceFiles = resManager.getResourceElements(); for (Resources res : resourceFiles) { - for (String valueResourceType : AndroidResourceUtil.VALUE_RESOURCE_TYPES) { - for (ResourceElement valueResource : AndroidResourceUtil.getValueResourcesFromElement(valueResourceType, res)) { - addResource(valueResourceType, valueResource, result); + for (ResourceType valueResourceType : AndroidResourceUtil.VALUE_RESOURCE_TYPES) { + for (ResourceElement valueResource : AndroidResourceUtil.getValueResourcesFromElement(valueResourceType.getName(), res)) { + addResource(valueResourceType.getName(), valueResource, result); } } for (Attr attr : res.getAttrs()) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 3b69b90b5b00..d3e5a3c1eaca 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -661,8 +661,8 @@ public class AndroidCompileUtil { final LocalResourceManager manager = facet.getLocalResourceManager(); final Project project = facet.getModule().getProject(); - for (final String resType : ResourceType.getNames()) { - for (final ResourceElement element : manager.getValueResources(resType)) { + for (final ResourceType resType : AndroidResourceUtil.VALUE_RESOURCE_TYPES) { + for (final ResourceElement element : manager.getValueResources(resType.getName())) { waitForSmartMode(project); ApplicationManager.getApplication().runReadAction(new Runnable() { @@ -674,7 +674,7 @@ public class AndroidCompileUtil { final String name = element.getName().getValue(); if (name != null) { - resourceSet.add(new ResourceEntry(resType, name)); + resourceSet.add(new ResourceEntry(resType.getName(), name)); } } }); diff --git a/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java b/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java index c3f28df316d1..edf81db40cfb 100644 --- a/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java +++ b/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java @@ -128,7 +128,7 @@ public class AndroidDomUtil { if (containsReference) { if (resourceTypes.contains("color")) resourceTypes.add("drawable"); if (resourceTypes.size() == 0) { - resourceTypes.addAll(AndroidResourceUtil.REFERABLE_RESOURCE_TYPES); + resourceTypes.addAll(AndroidResourceUtil.getNames(AndroidResourceUtil.REFERRABLE_RESOURCE_TYPES)); } } if (resourceTypes.size() > 0) { diff --git a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java index 6d8b4bdfd934..c24a9576749f 100644 --- a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java +++ b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java @@ -15,6 +15,7 @@ */ package org.jetbrains.android.dom.converters; +import com.android.resources.ResourceType; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.command.undo.UndoUtil; @@ -29,7 +30,6 @@ import com.intellij.psi.PsiReference; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.ArrayUtil; import com.intellij.util.PsiNavigateUtil; import com.intellij.util.xml.*; import org.jetbrains.android.dom.AdditionalConverter; @@ -55,8 +55,8 @@ import static org.jetbrains.android.util.AndroidUtils.SYSTEM_RESOURCE_PACKAGE; * @author yole */ public class ResourceReferenceConverter extends ResolvingConverter implements CustomReferenceConverter { - private static final Set FIXABLE_RESOURCE_TYPES = - new HashSet(Arrays.asList("anim", "layout", "style", "menu", "xml", "dimen", "color", "string", "array", "id", "drawable")); + private static final Set XML_FILE_RESOURCE_TYPES = + EnumSet.of(ResourceType.ANIM, ResourceType.LAYOUT, ResourceType.MENU, ResourceType.XML, ResourceType.COLOR, ResourceType.DRAWABLE); private final List myResourceTypes; private ResolvingConverter myAdditionalConverter; @@ -145,7 +145,8 @@ public class ResourceReferenceConverter extends ResolvingConverter= 0) { + if (AndroidResourceUtil.isValueResourceType(myResourceType)) { containerName = AndroidResourceUtil.getDefaultResourceFileName(myResourceType); } else { @@ -359,7 +362,8 @@ public class ResourceReferenceConverter extends ResolvingConverter= 0) { + + if (AndroidResourceUtil.isValueResourceType(myResourceType)) { String initialValue = !myResourceType.equals("id") ? "value" : null; ResourceElement resElement = manager.addValueResource(myResourceType, myResourceName, initialValue); if (resElement != null) { diff --git a/plugins/android/src/org/jetbrains/android/dom/resources/Item.java b/plugins/android/src/org/jetbrains/android/dom/resources/Item.java index b2472ff5801d..be41b9fcb440 100644 --- a/plugins/android/src/org/jetbrains/android/dom/resources/Item.java +++ b/plugins/android/src/org/jetbrains/android/dom/resources/Item.java @@ -16,7 +16,6 @@ package org.jetbrains.android.dom.resources; -import com.intellij.util.ArrayUtil; import com.intellij.util.xml.Convert; import com.intellij.util.xml.GenericAttributeValue; import org.jetbrains.android.dom.attrs.AttributeFormat; @@ -38,7 +37,7 @@ import java.util.List; public interface Item extends ResourceElement { class TypeConverter extends StaticEnumConverter { public TypeConverter() { - super(ArrayUtil.toStringArray(AndroidResourceUtil.REFERABLE_RESOURCE_TYPES)); + super(AndroidResourceUtil.getNamesArray(AndroidResourceUtil.REFERRABLE_RESOURCE_TYPES)); } } diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java index c81de42468f7..237f62ec06f6 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java @@ -143,8 +143,8 @@ public class LocalResourceManager extends ResourceManager { final FileBasedIndex index = FileBasedIndex.getInstance(); final GlobalSearchScope scope = GlobalSearchScope.projectScope(myModule.getProject()); - for (String resourceType : ResourceType.getNames()) { - final ResourceEntry typeMarkerEntry = AndroidValueResourcesIndex.createTypeMarkerEntry(resourceType); + for (ResourceType resourceType : AndroidResourceUtil.VALUE_RESOURCE_TYPES) { + final ResourceEntry typeMarkerEntry = AndroidValueResourcesIndex.createTypeMarkerEntry(resourceType.getName()); for (Set entrySet : index.getValues(AndroidValueResourcesIndex.INDEX_ID, typeMarkerEntry, scope)) { for (ResourceEntry entry : entrySet) { diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java b/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java index de145f8db2ce..f74c20bb8b35 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java @@ -16,6 +16,8 @@ package org.jetbrains.android.util; +import com.android.resources.ResourceFolderType; +import com.android.resources.ResourceType; import com.android.sdklib.SdkConstants; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -42,31 +44,34 @@ import org.jetbrains.android.sdk.AndroidSdkUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import static java.util.Collections.addAll; +import java.util.*; /** * @author Eugene.Kudelevsky */ public class AndroidResourceUtil { public static final String NEW_ID_PREFIX = "@+id/"; - public static final String[] VALUE_RESOURCE_TYPES = - new String[]{"drawable", "dimen", "color", "string", "style", "array", "id", "bool", "integer", "integer-array"}; - public static final Set REFERABLE_RESOURCE_TYPES = new HashSet(); - static { - addAll(REFERABLE_RESOURCE_TYPES, AndroidCommonUtils.FILE_RESOURCE_TYPES); - addAll(REFERABLE_RESOURCE_TYPES, VALUE_RESOURCE_TYPES); - REFERABLE_RESOURCE_TYPES.remove("values"); - } + public static final Set VALUE_RESOURCE_TYPES = EnumSet.of(ResourceType.DRAWABLE, ResourceType.COLOR, ResourceType.DIMEN, + ResourceType.STRING, ResourceType.STYLE, ResourceType.ARRAY, + ResourceType.ID, ResourceType.BOOL, ResourceType.INTEGER); + + public static final Set REFERRABLE_RESOURCE_TYPES = EnumSet.noneOf(ResourceType.class); private AndroidResourceUtil() { } + static { + REFERRABLE_RESOURCE_TYPES.addAll(Arrays.asList(ResourceType.values())); + REFERRABLE_RESOURCE_TYPES.remove(ResourceType.ATTR); + REFERRABLE_RESOURCE_TYPES.remove(ResourceType.STYLEABLE); + } + + public static boolean isValueResourceType(@NotNull String resTypeName) { + final ResourceType type = ResourceType.getEnum(resTypeName); + return type != null && VALUE_RESOURCE_TYPES.contains(type); + } + @NotNull public static PsiField[] findResourceFields(@NotNull AndroidFacet facet, @NotNull String resClassName, @@ -383,7 +388,7 @@ public class AndroidResourceUtil { @NotNull public static List getResourceSubdirs(@Nullable String resourceType, @NotNull VirtualFile[] resourceDirs) { - if (ArrayUtil.find(AndroidCommonUtils.FILE_RESOURCE_TYPES, resourceType) < 0 && resourceType != null) { + if (resourceType != null && ResourceFolderType.getTypeByName(resourceType) == null) { return Collections.emptyList(); } final List dirs = new ArrayList(); @@ -407,10 +412,7 @@ public class AndroidResourceUtil { @Nullable public static String getDefaultResourceFileName(@NotNull String resourceType) { - if (ArrayUtil.find(VALUE_RESOURCE_TYPES, resourceType) < 0) { - return null; - } - return resourceType + "s.xml"; + return isValueResourceType(resourceType) ? resourceType + "s.xml" : null; } @NotNull @@ -540,4 +542,22 @@ public class AndroidResourceUtil { } return false; } + + public static List getNames(@NotNull Collection resourceTypes) { + if (resourceTypes.size() == 0) { + return Collections.emptyList(); + } + final List result = new ArrayList(); + + for (ResourceType type : resourceTypes) { + result.add(type.getName()); + } + return result; + } + + @NotNull + public static String[] getNamesArray(@NotNull Collection resourceTypes) { + final List names = getNames(resourceTypes); + return ArrayUtil.toStringArray(names); + } } diff --git a/plugins/android/testData/dom/resources/resourceTypeCompletion.xml b/plugins/android/testData/dom/resources/resourceTypeCompletion.xml new file mode 100644 index 000000000000..b3e884dad006 --- /dev/null +++ b/plugins/android/testData/dom/resources/resourceTypeCompletion.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/android/testData/dom/resources/resourceTypeCompletion_after.xml b/plugins/android/testData/dom/resources/resourceTypeCompletion_after.xml new file mode 100644 index 000000000000..896518df8fc1 --- /dev/null +++ b/plugins/android/testData/dom/resources/resourceTypeCompletion_after.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java index 3a73317ca1ae..955493a6841e 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java @@ -6,7 +6,6 @@ import com.intellij.testFramework.UsefulTestCase; import com.intellij.util.ArrayUtil; import org.jetbrains.android.AndroidTestCase; import org.jetbrains.android.inspections.AndroidDomInspection; -import org.jetbrains.android.util.AndroidResourceUtil; import java.io.IOException; import java.util.ArrayList; @@ -53,14 +52,6 @@ abstract class AndroidDomTest extends AndroidTestCase { UsefulTestCase.assertSameElements(lookupElementStrings, variants); } - protected static List getAllResources() { - List list = new ArrayList(); - for (String type : AndroidResourceUtil.REFERABLE_RESOURCE_TYPES) { - list.add('@' + type + '/'); - } - return list; - } - protected void doTestHighlighting() throws Throwable { doTestHighlighting(getTestName(true) + ".xml"); } diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java index 1c2dee5fae99..add660f38b76 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java @@ -81,6 +81,10 @@ public class AndroidValueResourcesTest extends AndroidDomTest { toTestCompletion("attrs1.xml", "attrs1_after.xml"); } + public void testResourceTypeCompletion() throws Throwable { + doTestCompletion(); + } + public void testStyles5() throws Throwable { toTestCompletion("styles5.xml", "styles5_after.xml"); }