From 908c3ea78c73c84444ddceaaeaf5fa529ba29f7c Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 17:07:33 +0400 Subject: [PATCH 01/11] fix typo --- .../android/actions/CreateTypedResourceFileAction.java | 4 ++-- .../android/inspections/CreateFileResourceQuickFix.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java b/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java index f59644879537..17707f18c121 100644 --- a/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java +++ b/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java @@ -65,7 +65,7 @@ public class CreateTypedResourceFileAction extends CreateElementActionBase { AndroidBundle.message("new.typed.resource.action.description", resourcePresentableName), StdFileTypes.XML.getIcon()); myResourceType = resourceFolderType; myResourcePresentableName = resourcePresentableName; - myDefaultRootTag = getDefaultRootTabByResourceType(resourceFolderType); + myDefaultRootTag = getDefaultRootTagByResourceType(resourceFolderType); myValuesResourceFile = valuesResourceFile; myChooseTagName = chooseTagName; } @@ -180,7 +180,7 @@ public class CreateTypedResourceFileAction extends CreateElementActionBase { } @NotNull - public static String getDefaultRootTabByResourceType(@NotNull ResourceFolderType resourceType) { + public static String getDefaultRootTagByResourceType(@NotNull ResourceFolderType resourceType) { switch (resourceType) { case XML: return "PreferenceScreen"; diff --git a/plugins/android/src/org/jetbrains/android/inspections/CreateFileResourceQuickFix.java b/plugins/android/src/org/jetbrains/android/inspections/CreateFileResourceQuickFix.java index 03b559ddf87f..6d0acaae2706 100644 --- a/plugins/android/src/org/jetbrains/android/inspections/CreateFileResourceQuickFix.java +++ b/plugins/android/src/org/jetbrains/android/inspections/CreateFileResourceQuickFix.java @@ -106,7 +106,7 @@ public class CreateFileResourceQuickFix implements LocalQuickFix, IntentionActio } try { - AndroidResourceUtil.createFileResource(myResourceName, resSubdir, CreateTypedResourceFileAction.getDefaultRootTabByResourceType( + AndroidResourceUtil.createFileResource(myResourceName, resSubdir, CreateTypedResourceFileAction.getDefaultRootTagByResourceType( ResourceFolderType.getFolderType(resDirName)), resDirName, false); UndoUtil.markPsiFileForUndo(myFile); } From 70f31396060a8b9fe1cd2eea72041328d38d18db Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 17:27:25 +0400 Subject: [PATCH 02/11] IDEA-87504 create vertical-oriented linear layout by default --- .../fileTemplates/j2ee/layoutResourceFile_vertical.xml.ft | 8 ++++++++ .../j2ee/layoutResourceFile_vertical.xml.html | 5 +++++ .../jetbrains/android/AndroidFileTemplateProvider.java | 2 ++ .../android/actions/CreateTypedResourceFileAction.java | 3 ++- .../org/jetbrains/android/util/AndroidResourceUtil.java | 8 +++++--- .../src/org/jetbrains/android/util/AndroidUtils.java | 6 +++++- 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.ft create mode 100644 plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.html diff --git a/plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.ft b/plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.ft new file mode 100644 index 000000000000..2602d07a51c1 --- /dev/null +++ b/plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.ft @@ -0,0 +1,8 @@ + + +<${ROOT_TAG} xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + \ No newline at end of file diff --git a/plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.html b/plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.html new file mode 100644 index 000000000000..7a1014aaf7d3 --- /dev/null +++ b/plugins/android/resources/fileTemplates/j2ee/layoutResourceFile_vertical.xml.html @@ -0,0 +1,5 @@ + + +

This is a built-in file template used to create vertical-oriented layout xml files in Android applications.

+ + \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/AndroidFileTemplateProvider.java b/plugins/android/src/org/jetbrains/android/AndroidFileTemplateProvider.java index fd3ca5435efd..61f0c9069fe9 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidFileTemplateProvider.java +++ b/plugins/android/src/org/jetbrains/android/AndroidFileTemplateProvider.java @@ -41,6 +41,7 @@ public class AndroidFileTemplateProvider implements FileTemplateGroupDescriptorF @NonNls public static final String VALUE_RESOURCE_FILE_TEMPLATE = "valueResourceFile.xml"; @NonNls public static final String RESOURCE_FILE_TEMPLATE = "resourceFile.xml"; @NonNls public static final String LAYOUT_RESOURCE_FILE_TEMPLATE = "layoutResourceFile.xml"; + @NonNls public static final String LAYOUT_RESOURCE_VERTICAL_FILE_TEMPLATE = "layoutResourceFile_vertical.xml"; @NonNls public static final String ACTIVITY = "Activity.java"; @NonNls public static final String APPLICATION = "Application.java"; @NonNls public static final String SERVICE = "Service.java"; @@ -53,6 +54,7 @@ public class AndroidFileTemplateProvider implements FileTemplateGroupDescriptorF group.addTemplate(new FileTemplateDescriptor(VALUE_RESOURCE_FILE_TEMPLATE, StdFileTypes.XML.getIcon())); group.addTemplate(new FileTemplateDescriptor(RESOURCE_FILE_TEMPLATE, StdFileTypes.XML.getIcon())); group.addTemplate(new FileTemplateDescriptor(LAYOUT_RESOURCE_FILE_TEMPLATE, StdFileTypes.XML.getIcon())); + group.addTemplate(new FileTemplateDescriptor(LAYOUT_RESOURCE_VERTICAL_FILE_TEMPLATE, StdFileTypes.XML.getIcon())); group.addTemplate(new FileTemplateDescriptor(ACTIVITY, StdFileTypes.JAVA.getIcon())); group.addTemplate(new FileTemplateDescriptor(APPLICATION, StdFileTypes.JAVA.getIcon())); group.addTemplate(new FileTemplateDescriptor(SERVICE, StdFileTypes.JAVA.getIcon())); diff --git a/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java b/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java index 17707f18c121..10074fea9763 100644 --- a/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java +++ b/plugins/android/src/org/jetbrains/android/actions/CreateTypedResourceFileAction.java @@ -39,6 +39,7 @@ import com.intellij.xml.refactoring.XmlTagInplaceRenamer; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidResourceUtil; +import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -197,7 +198,7 @@ public class CreateTypedResourceFileAction extends CreateElementActionBase { case ANIMATOR: return "set"; case LAYOUT: - return "LinearLayout"; + return AndroidUtils.TAG_LINEAR_LAYOUT; default: } throw new IllegalArgumentException("Incorrect resource folder type"); diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java b/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java index c554b63945f6..4b957f28f24c 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java @@ -770,7 +770,7 @@ public class AndroidResourceUtil { @NotNull String resourceType, boolean valuesResourceFile) throws Exception { FileTemplateManager manager = FileTemplateManager.getInstance(); - String templateName = getTemplateName(resourceType, valuesResourceFile); + String templateName = getTemplateName(resourceType, valuesResourceFile, rootTagName); FileTemplate template = manager.getJ2eeTemplate(templateName); Properties properties = new Properties(); if (!valuesResourceFile) { @@ -781,12 +781,14 @@ public class AndroidResourceUtil { return (XmlFile)createdElement; } - private static String getTemplateName(String resourceType, boolean valuesResourceFile) { + private static String getTemplateName(String resourceType, boolean valuesResourceFile, String rootTagName) { if (valuesResourceFile) { return AndroidFileTemplateProvider.VALUE_RESOURCE_FILE_TEMPLATE; } if ("layout".equals(resourceType)) { - return AndroidFileTemplateProvider.LAYOUT_RESOURCE_FILE_TEMPLATE; + return AndroidUtils.TAG_LINEAR_LAYOUT.equals(rootTagName) + ? AndroidFileTemplateProvider.LAYOUT_RESOURCE_VERTICAL_FILE_TEMPLATE + : AndroidFileTemplateProvider.LAYOUT_RESOURCE_FILE_TEMPLATE; } return AndroidFileTemplateProvider.RESOURCE_FILE_TEMPLATE; } diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java index d901f36fe38d..02eaf55bc54c 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java @@ -43,7 +43,10 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.DependencyScope; +import com.intellij.openapi.roots.ModuleOrderEntry; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -125,6 +128,7 @@ public class AndroidUtils { @NonNls public static final String ANDROID_LIBRARY_PROPERTY = "android.library"; @NonNls public static final String ANDROID_TARGET_PROPERTY = "target"; @NonNls public static final String ANDROID_LIBRARY_REFERENCE_PROPERTY_PREFIX = "android.library.reference."; + @NonNls public static final String TAG_LINEAR_LAYOUT = "LinearLayout"; private AndroidUtils() { } From 90f753e85110c58d0a3e8b72f2d19b0508eae23b Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 17:55:17 +0400 Subject: [PATCH 03/11] do not add system attribute references into R.attr class --- .../jetbrains/android/util/ValueResourcesFileParser.java | 8 +++++--- .../org/jetbrains/android/AndroidValueResourcesIndex.java | 2 +- .../org/jetbrains/android/util/AndroidResourceUtil.java | 2 +- .../android/testData/dom/resources/JavaHighlighting.java | 3 +++ .../android/testData/dom/resources/value_resources.xml | 6 +++++- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java b/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java index fb260ad45ca3..df61bcc3b2cd 100644 --- a/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java +++ b/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java @@ -75,11 +75,13 @@ public abstract class ValueResourcesFileParser implements IXMLBuilder { @Override public void elementAttributesProcessed(String name, String nsPrefix, String nsURI) throws Exception { if (myLastNameAttr != null && name != null) { - final String resType = "item".equals(name) + final String resTypeStr = "item".equals(name) ? myLastTypeAttr : AndroidCommonUtils.getResourceTypeByTagName(name); - if (resType != null && ResourceType.getEnum(resType) != null) { - process(new ResourceEntry(resType, myLastNameAttr)); + final ResourceType resType = resTypeStr != null ? ResourceType.getEnum(resTypeStr) : null; + if (resType != null && + !(resType == ResourceType.ATTR && myLastNameAttr.startsWith("android:"))) { + process(new ResourceEntry(resTypeStr, myLastNameAttr)); } } } diff --git a/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java b/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java index f40f1a0d024e..427c5ac11a9e 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java +++ b/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java @@ -163,6 +163,6 @@ public class AndroidValueResourcesIndex extends FileBasedIndexExtensionunknown; int n3 = R.styleable.MyStyleable; int[] n4 = R.styleable.MyStyleable; + int n5 = R.attr.myAttr1; + n5 = R.attr.myAttr2; + n5 = R.attr.android_text; } } \ No newline at end of file diff --git a/plugins/android/testData/dom/resources/value_resources.xml b/plugins/android/testData/dom/resources/value_resources.xml index 47a2a3e36ecd..99bc7ef46802 100644 --- a/plugins/android/testData/dom/resources/value_resources.xml +++ b/plugins/android/testData/dom/resources/value_resources.xml @@ -1,5 +1,9 @@ abacaba - + + + + + \ No newline at end of file From cf688716759de7db260731614fa3406ffec4a9f1 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 19:01:51 +0400 Subject: [PATCH 04/11] make R fields final, if possibly. implement computeConstantValue, which is called when smb tries to use element in 'case' --- .../android/augment/AndroidLightField.java | 44 ++++++++++++++++--- .../android/augment/ManifestInnerClass.java | 4 +- .../android/augment/ResourceTypeClass.java | 9 +++- .../dom/resources/JavaHighlighting.java | 10 +++++ .../testData/libModule/JavaHighlighting.java | 16 +++++++ .../dom/AndroidLibraryProjectTest.java | 10 +++++ 6 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 plugins/android/testData/libModule/JavaHighlighting.java diff --git a/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java b/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java index bc8927520257..c8b70c37cf8a 100644 --- a/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java +++ b/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java @@ -1,30 +1,48 @@ package org.jetbrains.android.augment; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.psi.impl.PsiClassImplUtil; +import com.intellij.psi.impl.PsiVariableEx; import com.intellij.psi.impl.light.LightFieldBuilder; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + /** * @author Eugene.Kudelevsky */ -class AndroidLightField extends LightFieldBuilder { +class AndroidLightField extends LightFieldBuilder implements PsiVariableEx { private final PsiClass myContext; private final PsiType myType; + private final Object myConstantValue; + private final boolean myFinal; public AndroidLightField(@NotNull String name, @NotNull PsiClass context, - @NotNull PsiType type) { + @NotNull PsiType type, + boolean isFinal, + @Nullable Object constantValue) { super(name, type, context); myContext = context; myType = type; + myConstantValue = constantValue; + myFinal = isFinal; setContainingClass(context); + + final List modifiers = new ArrayList(); + modifiers.add(PsiModifier.PUBLIC); + modifiers.add(PsiModifier.STATIC); + + if (isFinal) { + modifiers.add(PsiModifier.FINAL); + } + setModifiers(ArrayUtil.toStringArray(modifiers)); } @Override @@ -40,6 +58,18 @@ class AndroidLightField extends LightFieldBuilder { @Override public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { - return new AndroidLightField(name, myContext, myType); + final AndroidLightField field = new AndroidLightField(name, myContext, myType, myFinal, myConstantValue); + field.setInitializer(getInitializer()); + return field; + } + + @Override + public Object computeConstantValue(Set visitedVars) { + return computeConstantValue(); + } + + @Override + public Object computeConstantValue() { + return myConstantValue; } } diff --git a/plugins/android/src/org/jetbrains/android/augment/ManifestInnerClass.java b/plugins/android/src/org/jetbrains/android/augment/ManifestInnerClass.java index fff6efd99239..3aaa8ae48311 100644 --- a/plugins/android/src/org/jetbrains/android/augment/ManifestInnerClass.java +++ b/plugins/android/src/org/jetbrains/android/augment/ManifestInnerClass.java @@ -44,8 +44,8 @@ abstract class ManifestInnerClass extends AndroidLightClass { final PsiElementFactory factory = JavaPsiFacade.getElementFactory(getProject()); int i = 0; for (Pair pair : pairs) { - final AndroidLightField field = new AndroidLightField(pair.getFirst(), ManifestInnerClass.this, stringType); - field.setModifiers(PsiModifier.PUBLIC, PsiModifier.STATIC); + final AndroidLightField field = + new AndroidLightField(pair.getFirst(), ManifestInnerClass.this, stringType, true, pair.getSecond()); field.setInitializer(factory.createExpressionFromText("\"" + pair.getSecond() + "\"", field)); result[i++] = field; } diff --git a/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java b/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java index e4f1eda99bbf..6f1959c706bb 100644 --- a/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java +++ b/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java @@ -1,11 +1,13 @@ package org.jetbrains.android.augment; import com.android.resources.ResourceType; +import com.intellij.openapi.module.Module; import com.intellij.psi.*; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; +import org.jetbrains.android.compiler.AndroidCompileUtil; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.annotations.NotNull; @@ -43,6 +45,9 @@ class ResourceTypeClass extends AndroidLightClass { static PsiField[] buildResourceFields(@NotNull AndroidFacet facet, @NotNull String resClassName, @NotNull final PsiClass context) { + final Module circularDepLibWithSamePackage = AndroidCompileUtil.findCircularDependencyOnLibraryWithSamePackage(facet); + final boolean generateNonFinalFields = facet.getConfiguration().LIBRARY_PROJECT || circularDepLibWithSamePackage != null; + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(facet.getModule().getProject()); final Collection resNames = facet.getLocalResourceManager().getResourceNames(resClassName); final PsiField[] result = new PsiField[resNames.size()]; @@ -51,8 +56,8 @@ class ResourceTypeClass extends AndroidLightClass { final PsiType type = ResourceType.STYLEABLE.getName().equals(resClassName) ? PsiType.INT.createArrayType() : PsiType.INT; - final AndroidLightField field = new AndroidLightField(AndroidResourceUtil.getFieldNameByResourceName(resName), context, type); - field.setModifiers(PsiModifier.PUBLIC, PsiModifier.STATIC); + final AndroidLightField field = new AndroidLightField(AndroidResourceUtil.getFieldNameByResourceName(resName), context, + type, !generateNonFinalFields, generateNonFinalFields ? null : 0); field.setInitializer(factory.createExpressionFromText("0", field)); result[i++] = field; } diff --git a/plugins/android/testData/dom/resources/JavaHighlighting.java b/plugins/android/testData/dom/resources/JavaHighlighting.java index 79b8b63d961e..967ff91ece11 100644 --- a/plugins/android/testData/dom/resources/JavaHighlighting.java +++ b/plugins/android/testData/dom/resources/JavaHighlighting.java @@ -1,5 +1,7 @@ package p1.p2; +import java.lang.System; + public class JavaCompletion1 { public void f() { int n1 = R.string.my_string; @@ -9,5 +11,13 @@ public class JavaCompletion1 { int n5 = R.attr.myAttr1; n5 = R.attr.myAttr2; n5 = R.attr.android_text; + + switch(n1) { + case R.string.my_string: + System.out.println("abacaba"); + break; + default: + break; + } } } \ No newline at end of file diff --git a/plugins/android/testData/libModule/JavaHighlighting.java b/plugins/android/testData/libModule/JavaHighlighting.java new file mode 100644 index 000000000000..0705009aa81e --- /dev/null +++ b/plugins/android/testData/libModule/JavaHighlighting.java @@ -0,0 +1,16 @@ +package p1.p2.lib; + +import java.lang.System; + +public class JavaHighlighting { + public void f(int n) { + int m = R.string.myLibResource; + switch(n) { + case R.string.myLibResource: + System.out.println("aba"); + break; + default: + break; + } + } +} \ No newline at end of file diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java index 6207725f35da..e4b926385c6f 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java @@ -141,6 +141,16 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { myFixture.checkHighlighting(true, true, true); } + public void testJavaHighlighting() { + createInitialStructure(); + myFixture.copyFileToProject(BASE_PATH + "FindUsagesR1.java", "lib/src/p1/p2/lib/R.java"); + String to = "lib/src/p1/p2/lib" + getTestName(true) + ".java"; + VirtualFile file = myFixture.copyFileToProject(BASE_PATH + getTestName(false) + ".java", to); + myFixture.configureFromExistingVirtualFile(file); + myFixture.doHighlighting(); + myFixture.checkHighlighting(true, true, true); + } + private void doRename(final VirtualFile file, final String newName) { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override From f78e9d5eef530eb49c28f12d8293c70a0cc968e3 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 19:04:21 +0400 Subject: [PATCH 05/11] clean up: remove unused code --- .../compiler/AndroidAutogenerator.java | 45 +------------------ 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java index 3f24d7eaf7a4..3c9f25ccfab5 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -187,21 +187,6 @@ public class AndroidAutogenerator { return null; } - final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); - if (platform == null) { - context.addMessage(CompilerMessageCategory.ERROR, - AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1); - return null; - } - - final IAndroidTarget target = platform.getTarget(); - final int platformToolsRevision = platform.getSdkData().getPlatformToolsRevision(); - final String[] resPaths = AndroidCompileUtil.collectResourceDirs(facet, false, context); - - if (resPaths.length == 0) { - return null; - } - final VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet); if (manifestFile == null) { context.addMessage(CompilerMessageCategory.ERROR, @@ -239,18 +224,7 @@ public class AndroidAutogenerator { final String packageDir = packageName.replace('.', '/') + '/'; genFilePath2Package.put(packageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); genFilePath2Package.put(packageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); - - final String manifestFileOsPath = FileUtil.toSystemDependentName(manifestFile.getPath()); - - final Module circularDepLibWithSamePackage = AndroidCompileUtil.findCircularDependencyOnLibraryWithSamePackage(facet); - if (circularDepLibWithSamePackage != null && !facet.getConfiguration().LIBRARY_PROJECT) { - context.addMessage(CompilerMessageCategory.WARNING, AndroidBundle.message("android.compilation.warning.circular.app.dependency", - packageName, module.getName(), - circularDepLibWithSamePackage.getName()), null, -1, -1); - } - final boolean generateNonFinalFields = facet.getConfiguration().LIBRARY_PROJECT || circularDepLibWithSamePackage != null; - return new AptAutogenerationItem(target, platformToolsRevision, manifestFileOsPath, packageName, sourceRootPath, resPaths, - generateNonFinalFields, genFilePath2Package); + return new AptAutogenerationItem(packageName, sourceRootPath, genFilePath2Package); } }); @@ -678,30 +652,15 @@ public class AndroidAutogenerator { } private static class AptAutogenerationItem { - final IAndroidTarget myTarget; - final int myPlatformToolsRevision; - final String myManifestFileOsPath; final String myPackage; final String myOutputDirOsPath; - final String[] myResDirOsPaths; - final boolean myNonConstantFields; final Map myGenFileRelPath2package; - private AptAutogenerationItem(@NotNull IAndroidTarget target, - int platformToolsRevision, - @NotNull String manifestFileOsPath, - @NotNull String aPackage, + private AptAutogenerationItem(@NotNull String aPackage, @NotNull String outputDirOsPath, - @NotNull String[] resDirOsPaths, - boolean nonConstantFields, @NotNull Map genFileRelPath2package) { - myTarget = target; - myPlatformToolsRevision = platformToolsRevision; - myManifestFileOsPath = manifestFileOsPath; myPackage = aPackage; myOutputDirOsPath = outputDirOsPath; - myResDirOsPaths = resDirOsPaths; - myNonConstantFields = nonConstantFields; myGenFileRelPath2package = genFileRelPath2package; } } From 2f228c8f3b1fcb69dab87c8f71dd54fa7f8ed74a Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 19:06:32 +0400 Subject: [PATCH 06/11] clean up: suppress and remove old comments --- .../dom/AndroidLibraryProjectTest.java | 82 +------------------ 1 file changed, 3 insertions(+), 79 deletions(-) diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java index e4b926385c6f..b8bffa5c8bb7 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java @@ -29,6 +29,7 @@ import java.util.List; /** * @author Eugene.Kudelevsky */ +@SuppressWarnings("ResultOfMethodCallIgnored") public class AndroidLibraryProjectTest extends UsefulTestCase { @NonNls private static final String BASE_PATH = "libModule/"; @@ -41,6 +42,7 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { protected JavaCodeInsightTestFixture myFixture; + @SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors") public AndroidLibraryProjectTest() { IdeaTestCase.initPlatformPrefix(); } @@ -109,7 +111,7 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { super.tearDown(); } - private String getTestSdkPath() { + private static String getTestSdkPath() { return AndroidTestCase.getAbsoluteTestDataPath() + "/sdk1.5"; } @@ -182,43 +184,6 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { myFixture.checkResultByFile(BASE_PATH + getTestName(true) + "_after.xml"); } - /*public void testRJavaFileMarkers() throws Exception { - doTestRJavaFilesMarkers("/app/src/p1/p2/R.java"); - } - - public void testRJavaFileMarkers1() throws Exception { - boolean temp = myLibFacet.getConfiguration().LIBRARY_PROJECT; - try { - myLibFacet.getConfiguration().LIBRARY_PROJECT = true; - doTestRJavaFilesMarkers("/app/src/p1/p2/lib/R.java"); - } - finally { - myLibFacet.getConfiguration().LIBRARY_PROJECT = temp; - } - } - - private void doTestRJavaFilesMarkers(String destPath) { - createInitialStructure(); - List markers = - AndroidResourcesLineMarkerTest.collectMarkers(myFixture, BASE_PATH + getTestName(false) + ".java", destPath); - assertEquals(3, markers.size()); - for (LineMarkerInfo marker : markers) { - PsiField field = (PsiField)marker.getElement(); - GutterIconNavigationHandler handler = marker.getNavigationHandler(); - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyNavigationHandler.class); - PsiElement[] targets = ((AndroidResourcesLineMarkerProvider.MyNavigationHandler)handler).getTargets(); - checkTargets(field, targets); - } - } - - public void testJavaFileMarkers() throws Exception { - createInitialStructure(); - myFixture.copyFileToProject(BASE_PATH + "RJavaFileMarkers.java", "app/src/p1/p2/R.java"); - List markers = - AndroidResourcesLineMarkerTest.collectMarkers(myFixture, BASE_PATH + getTestName(false) + ".java", "/app/src/p1/p2/Java.java"); - assertEquals(0, markers.size()); - }*/ - public void testJavaNavigation() throws Exception { createInitialStructure(); myFixture.copyFileToProject(BASE_PATH + "RJavaFileMarkers.java", "app/src/p1/p2/R.java"); @@ -234,47 +199,6 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { assertEquals("main.xml", ((PsiFile)targetElement).getName()); } - /*public void testLayoutFileMarkers() throws Exception { - createInitialStructure(); - myFixture.copyFileToProject(BASE_PATH + "RJavaFileMarkers.java", "app/src/p1/p2/R.java"); - myFixture.copyFileToProject(BASE_PATH + "RJavaFileMarkers.java", "app/src/p1/p2/lib/R.java"); - myFixture.copyFileToProject(BASE_PATH + "RJavaFileMarkers.java", "lib/src/p1/p2/lib/R.java"); - List markers = - AndroidResourcesLineMarkerTest.collectMarkers(myFixture, BASE_PATH + "res/layout/main.xml", "lib/res/layout/main.xml"); - assertEquals(2, markers.size()); - - boolean fileMarker = false; - - for (LineMarkerInfo marker : markers) { - GutterIconNavigationHandler handler = marker.getNavigationHandler(); - PsiElement[] targets; - if (marker.getElement() instanceof XmlFile) { - fileMarker = true; - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyNavigationHandler.class); - targets = ((AndroidResourcesLineMarkerProvider.MyNavigationHandler)handler).getTargets(); - assertNotNull(targets); - } - else { - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler.class); - Computable targetProvider = ((AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler)handler).getTargetProvider(); - targets = targetProvider.compute(); - assertNotNull(targets); - } - assertEquals(3, targets.length); - for (PsiElement target : targets) { - assertInstanceOf(target, PsiField.class); - } - } - - assertTrue("LineMarker for file not found", fileMarker); - } - - public static void checkTargets(PsiField field, PsiElement[] targets) { - assertNotNull(targets); - assertTrue(targets.length > 0); - assertEquals(field.getName(), 1, targets.length); - }*/ - public void testFileResourceFindUsages() throws Throwable { doFindUsagesTest("xml", "lib/res/layout/"); } From e6a7ea4518a89cc08b96d5d774554d6fe10e5870 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 19 Jun 2012 19:35:06 +0400 Subject: [PATCH 07/11] remove duplicating R file from test data --- plugins/android/src/META-INF/plugin.xml | 3 - .../AndroidResourcesLineMarkerProvider.java | 372 ------------------ .../testData/{addStringRes => }/R.java | 0 plugins/android/testData/dom/R.java | 4 - plugins/android/testData/findUsages/R.java | 4 - .../testData/libModule/FindUsagesR.java | 4 - .../{FindUsagesR1.java => LibR.java} | 0 .../testData/libModule/RJavaFileMarkers.java | 15 - .../testData/libModule/RJavaFileMarkers1.java | 15 - plugins/android/testData/rename/R.java | 4 - plugins/android/testData/rename/R1.java | 4 - plugins/android/testData/rename/R2.java | 4 - plugins/android/testData/rename/R5.java | 4 - plugins/android/testData/rename/R6.java | 4 - plugins/android/testData/rename/R8_after.java | 4 - plugins/android/testData/rename/R9.java | 7 - plugins/android/testData/rename/R9_after.java | 4 - .../android/testData/rename/R_file_after.java | 4 - .../android/testData/rename/R_id_after.java | 4 - .../testData/rename/R_value_after.java | 4 - .../ValueResourcesNavigation.xml | 7 - .../testData/resNavigation/src/p1/p2/R.java | 11 - .../src/p1/p2/RJavaFileNavigation1.java | 15 - .../src/p1/p2/RJavaFileNavigation2.java | 14 - .../src/p1/p2/RJavaFileNavigation3.java | 14 - .../src/p1/p2/RJavaFileNavigation4.java | 14 - .../src/p1/p2/RJavaFileNavigation5.java | 14 - .../android/AndroidFindUsagesTest.java | 2 +- .../jetbrains/android/AndroidRenameTest.java | 34 +- .../AndroidResourcesLineMarkerTest.java | 151 +------ .../jetbrains/android/dom/AndroidDomTest.java | 2 +- .../dom/AndroidLibraryProjectTest.java | 10 +- .../AndroidAddStringResourceActionTest.java | 2 +- 33 files changed, 26 insertions(+), 728 deletions(-) delete mode 100644 plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java rename plugins/android/testData/{addStringRes => }/R.java (100%) delete mode 100644 plugins/android/testData/dom/R.java delete mode 100644 plugins/android/testData/findUsages/R.java delete mode 100644 plugins/android/testData/libModule/FindUsagesR.java rename plugins/android/testData/libModule/{FindUsagesR1.java => LibR.java} (100%) delete mode 100644 plugins/android/testData/libModule/RJavaFileMarkers.java delete mode 100644 plugins/android/testData/libModule/RJavaFileMarkers1.java delete mode 100644 plugins/android/testData/rename/R.java delete mode 100644 plugins/android/testData/rename/R1.java delete mode 100644 plugins/android/testData/rename/R2.java delete mode 100644 plugins/android/testData/rename/R5.java delete mode 100644 plugins/android/testData/rename/R6.java delete mode 100644 plugins/android/testData/rename/R8_after.java delete mode 100644 plugins/android/testData/rename/R9.java delete mode 100644 plugins/android/testData/rename/R9_after.java delete mode 100644 plugins/android/testData/rename/R_file_after.java delete mode 100644 plugins/android/testData/rename/R_id_after.java delete mode 100644 plugins/android/testData/rename/R_value_after.java delete mode 100644 plugins/android/testData/resNavigation/ValueResourcesNavigation.xml delete mode 100644 plugins/android/testData/resNavigation/src/p1/p2/R.java delete mode 100644 plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation1.java delete mode 100644 plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation2.java delete mode 100644 plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation3.java delete mode 100644 plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation4.java delete mode 100644 plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation5.java diff --git a/plugins/android/src/META-INF/plugin.xml b/plugins/android/src/META-INF/plugin.xml index 3e202563f1a4..2c61bedaa8a5 100644 --- a/plugins/android/src/META-INF/plugin.xml +++ b/plugins/android/src/META-INF/plugin.xml @@ -147,9 +147,6 @@ - - org.jetbrains.android.intentions.AndroidAddStringResourceAction diff --git a/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java b/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java deleted file mode 100644 index 021fd3e43888..000000000000 --- a/plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright 2000-2010 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -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; -import com.intellij.codeInsight.daemon.LineMarkerProvider; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.IconLoader; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtilCore; -import com.intellij.psi.xml.XmlAttribute; -import com.intellij.psi.xml.XmlAttributeValue; -import com.intellij.psi.xml.XmlTag; -import com.intellij.ui.awt.RelativePoint; -import com.intellij.util.ConstantFunction; -import com.intellij.util.containers.HashMap; -import com.intellij.util.xml.GenericAttributeValue; -import org.jetbrains.android.dom.resources.Attr; -import org.jetbrains.android.dom.resources.DeclareStyleable; -import org.jetbrains.android.dom.resources.ResourceElement; -import org.jetbrains.android.dom.resources.Resources; -import org.jetbrains.android.facet.AndroidFacet; -import org.jetbrains.android.resourceManagers.LocalResourceManager; -import org.jetbrains.android.util.AndroidCommonUtils; -import org.jetbrains.android.util.AndroidResourceUtil; -import org.jetbrains.android.util.AndroidUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * @author coyote - */ -public class AndroidResourcesLineMarkerProvider implements LineMarkerProvider { - private static final Icon ICON = IconLoader.getIcon("/icons/navigate.png"); - - public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement psiElement) { - return null; - } - - public void collectSlowLineMarkers(@NotNull List psiElements, @NotNull Collection lineMarkerInfos) { - //noinspection ForLoopReplaceableByForEach - for (int i = 0; i < psiElements.size(); i++) { - PsiElement element = psiElements.get(i); - addMarkerInfo(element, lineMarkerInfos); - } - } - - @NotNull - private static String getToolTip(@NotNull PsiElement element) { - String s = "Go to "; - if (element instanceof PsiField) { - PsiField field = (PsiField)element; - PsiClass resClass = field.getContainingClass(); - assert resClass != null; - PsiClass rClass = resClass.getContainingClass(); - assert rClass != null; - return s + rClass.getName() + '.' + resClass.getName() + '.' + field.getName(); - } - else { - final PsiFile file = AndroidUtils.getContainingFile(element); - if (file == null) { - return s; - } - final PsiFile originalFile = file.getOriginalFile(); - String name = originalFile.getName(); - PsiDirectory dir = originalFile.getContainingDirectory(); - if (dir == null) return s + name; - return s + dir.getName() + '/' + name; - } - } - - private static LineMarkerInfo createLineMarkerInfo(@NotNull PsiElement element, @NotNull PsiElement... targets) { - final String toolTip = targets.length == 1 ? getToolTip(targets[0]) : "Resource not found"; - return new LineMarkerInfo(element, - element.getTextOffset(), - ICON, - Pass.UPDATE_OVERRIDEN_MARKERS, - new ConstantFunction(toolTip), - new MyNavigationHandler(targets)); - } - - private static LineMarkerInfo createLazyLineMarkerInfo(@NotNull PsiElement element, - @NotNull final Computable targetProvider) { - return new LineMarkerInfo(element, - element.getTextOffset(), - ICON, - Pass.UPDATE_OVERRIDEN_MARKERS, - new ConstantFunction("Go to resource"), - new MyLazyNavigationHandler(targetProvider)); - } - - private static void annotateXmlAttributeValue(@NotNull XmlAttributeValue attrValue, @NotNull Collection result) { - final AndroidFacet facet = AndroidFacet.getInstance(attrValue); - if (facet != null) { - PsiElement parent = attrValue.getParent(); - if (!(parent instanceof XmlAttribute)) return; - final XmlAttribute attr = (XmlAttribute)parent; - if (attr.getLocalName().equals("name")) { - final XmlTag tag = PsiTreeUtil.getParentOfType(attr, XmlTag.class); - if (tag != null) { - String fileResType = facet.getLocalResourceManager().getFileResourceType(tag.getContainingFile()); - final String resType = "values".equals(fileResType) ? AndroidResourceUtil.getResourceTypeByValueResourceTag(tag) : null; - if (resType != null) { - result.add(createLazyLineMarkerInfo(tag, new Computable() { - @Override - public PsiElement[] compute() { - String name = tag.getAttributeValue("name"); - return name != null ? AndroidResourceUtil.findResourceFields(facet, resType, name, false) : PsiElement.EMPTY_ARRAY; - } - })); - } - } - } - else if (AndroidResourceUtil.isIdDeclaration(attrValue)) { - result.add(createLazyLineMarkerInfo(attrValue, new Computable() { - @Override - public PsiElement[] compute() { - return AndroidResourceUtil.findIdFields(attr); - } - })); - } - } - } - - private static void addMarkerInfo(@NotNull final PsiElement element, @NotNull Collection result) { - if (element instanceof PsiFile) { - PsiField[] fields = AndroidResourceUtil.findResourceFieldsForFileResource((PsiFile)element, false); - if (fields.length > 0) result.add(createLineMarkerInfo(element, fields)); - } - else if (element instanceof PsiClass) { - PsiClass c = (PsiClass)element; - if (AndroidUtils.R_CLASS_NAME.equals(c.getName())) { - PsiFile containingFile = element.getContainingFile(); - AndroidFacet facet = AndroidFacet.getInstance(containingFile); - if (facet != null && AndroidResourceUtil.isRJavaFile(facet, containingFile)) { - LocalResourceManager manager = facet.getLocalResourceManager(); - annotateRClass((PsiClass)element, result, manager); - } - } - } - else if (element instanceof XmlAttributeValue) { - annotateXmlAttributeValue((XmlAttributeValue)element, result); - } - } - - @NotNull - private static Map> buildLocalResourceMap(@NotNull Project project, - @NotNull final LocalResourceManager resManager) { - final Map> result = new HashMap>(); - List> resourceFiles = resManager.getResourceElements(); - for (Pair pair : resourceFiles) { - final Resources res = pair.getFirst(); - 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()) { - addResource("attr", attr, result); - } - for (DeclareStyleable styleable : res.getDeclareStyleables()) { - addResource("styleable", styleable, result); - for (Attr attr : styleable.getAttrs()) { - addResource("attr", attr, result); - } - } - } - collectFileResources(project, resManager, result); - return result; - } - - private static void collectFileResources(Project project, - final LocalResourceManager resManager, - final Map> result) { - final PsiManager psiManager = PsiManager.getInstance(project); - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - List resourceSubdirs = resManager.getResourceSubdirs(null); - for (VirtualFile dir : resourceSubdirs) { - String resType = AndroidCommonUtils.getResourceTypeByDirName(dir.getName()); - if (resType != null) { - for (VirtualFile resourceFile : dir.getChildren()) { - if (!resourceFile.isDirectory()) { - PsiFile resourcePsiFile = psiManager.findFile(resourceFile); - if (resourcePsiFile != null) { - String resName = AndroidCommonUtils.getResourceName(resType, resourceFile.getName()); - MyResourceEntry key = new MyResourceEntry(resName, resType); - List list = result.get(key); - if (list == null) { - list = new ArrayList(); - result.put(key, list); - } - list.add(resourcePsiFile); - } - } - } - } - } - } - }); - } - - private static void addResource(String resType, ResourceElement resElement, Map> result) { - GenericAttributeValue nameValue = resElement.getName(); - if (nameValue != null) { - String name = nameValue.getValue(); - if (name != null) { - MyResourceEntry key = new MyResourceEntry(name, resType); - List list = result.get(key); - if (list == null) { - list = new ArrayList(); - result.put(key, list); - } - list.add(nameValue.getXmlAttributeValue()); - } - } - } - - private static void annotateRClass(@NotNull PsiClass rClass, - @NotNull Collection result, - @NotNull LocalResourceManager manager) { - Map> resourceMap = buildLocalResourceMap(rClass.getProject(), manager); - for (PsiClass c : rClass.getInnerClasses()) { - for (PsiField field : c.getFields()) { - annotateElementNavToResource(field, field, manager, result, resourceMap, false); - } - } - } - - private static void annotateElementNavToResource(PsiElement element, - final PsiField resField, - final LocalResourceManager manager, - Collection result, - @Nullable final Map> resourceMap, - boolean lazy) { - final String fieldName = resField.getName(); - if (fieldName != null) { - final String resType = AndroidResourceUtil.getResourceClassName(resField); - if (resType != null) { - Computable targetProvider = new Computable() { - @Override - public PsiElement[] compute() { - final List targets; - if (resourceMap != null) { - targets = new ArrayList(); - if (resType.equals("id")) { - targets.addAll(manager.findIdDeclarations(fieldName)); - } - List resources = resourceMap.get(new MyResourceEntry(fieldName, resType)); - if (resources != null) { - targets.addAll(resources); - } - } - else { - targets = manager.findResourcesByField(resField); - } - return PsiUtilCore.toPsiElementArray(targets); - } - }; - if (lazy) { - result.add(createLazyLineMarkerInfo(element, targetProvider)); - } - else { - PsiElement[] targets = targetProvider.compute(); - if (targets != null && targets.length > 0) { - result.add(createLineMarkerInfo(element, targets)); - } - } - } - } - } - - static class MyResourceEntry { - final String myName; - final String myType; - - private MyResourceEntry(@NotNull String name, @NotNull String type) { - myName = name; - myType = type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MyResourceEntry that = (MyResourceEntry)o; - - if (!AndroidUtils.equal(myName, that.myName, false)) return false; - if (!myType.equals(that.myType)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = 0; - for (int i = 0; i < myName.length(); i++) { - char c = myName.charAt(i); - if (Character.isLetterOrDigit(c)) { - result = 31 * result + (int)c; - } - } - result = 31 * result + myType.hashCode(); - return result; - } - } - - public static class MyNavigationHandler implements GutterIconNavigationHandler { - private final PsiElement[] myTargets; - - private MyNavigationHandler(@NotNull PsiElement[] targets) { - myTargets = targets; - } - - public void navigate(MouseEvent event, PsiElement psiElement) { - AndroidUtils.navigateTo(myTargets, event != null ? new RelativePoint(event) : null); - } - - public PsiElement[] getTargets() { - return myTargets; - } - } - - public static class MyLazyNavigationHandler implements GutterIconNavigationHandler { - private final Computable myTargetProvider; - - private MyLazyNavigationHandler(Computable targetProvider) { - myTargetProvider = targetProvider; - } - - @Override - public void navigate(MouseEvent event, PsiElement psiElement) { - PsiElement[] targets = myTargetProvider.compute(); - if (targets != null && targets.length > 0) { - AndroidUtils.navigateTo(targets, event != null ? new RelativePoint(event) : null); - } - } - - public Computable getTargetProvider() { - return myTargetProvider; - } - } -} diff --git a/plugins/android/testData/addStringRes/R.java b/plugins/android/testData/R.java similarity index 100% rename from plugins/android/testData/addStringRes/R.java rename to plugins/android/testData/R.java diff --git a/plugins/android/testData/dom/R.java b/plugins/android/testData/dom/R.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/dom/R.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/findUsages/R.java b/plugins/android/testData/findUsages/R.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/findUsages/R.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/libModule/FindUsagesR.java b/plugins/android/testData/libModule/FindUsagesR.java deleted file mode 100644 index 4195e3dfbb70..000000000000 --- a/plugins/android/testData/libModule/FindUsagesR.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} \ No newline at end of file diff --git a/plugins/android/testData/libModule/FindUsagesR1.java b/plugins/android/testData/libModule/LibR.java similarity index 100% rename from plugins/android/testData/libModule/FindUsagesR1.java rename to plugins/android/testData/libModule/LibR.java diff --git a/plugins/android/testData/libModule/RJavaFileMarkers.java b/plugins/android/testData/libModule/RJavaFileMarkers.java deleted file mode 100644 index d7a42e355017..000000000000 --- a/plugins/android/testData/libModule/RJavaFileMarkers.java +++ /dev/null @@ -1,15 +0,0 @@ -package p1.p2; - -public final class R { - public static final class layout { - public static final int main = 0x7f040000; - } - - public static final class string { - public static final int myLibResource = 0x7f040001; - } - - public static final class id { - public static final int myButton = 0x7f090002; - } -} \ No newline at end of file diff --git a/plugins/android/testData/libModule/RJavaFileMarkers1.java b/plugins/android/testData/libModule/RJavaFileMarkers1.java deleted file mode 100644 index d7a42e355017..000000000000 --- a/plugins/android/testData/libModule/RJavaFileMarkers1.java +++ /dev/null @@ -1,15 +0,0 @@ -package p1.p2; - -public final class R { - public static final class layout { - public static final int main = 0x7f040000; - } - - public static final class string { - public static final int myLibResource = 0x7f040001; - } - - public static final class id { - public static final int myButton = 0x7f090002; - } -} \ No newline at end of file diff --git a/plugins/android/testData/rename/R.java b/plugins/android/testData/rename/R.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R1.java b/plugins/android/testData/rename/R1.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R1.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R2.java b/plugins/android/testData/rename/R2.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R2.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R5.java b/plugins/android/testData/rename/R5.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R5.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R6.java b/plugins/android/testData/rename/R6.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R6.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R8_after.java b/plugins/android/testData/rename/R8_after.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R8_after.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R9.java b/plugins/android/testData/rename/R9.java deleted file mode 100644 index 7d382dd4b4de..000000000000 --- a/plugins/android/testData/rename/R9.java +++ /dev/null @@ -1,7 +0,0 @@ -package p1.p2; - -public final class R { - public static final class attr { - public static final int attr = 0x7f040002; - } -} diff --git a/plugins/android/testData/rename/R9_after.java b/plugins/android/testData/rename/R9_after.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R9_after.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R_file_after.java b/plugins/android/testData/rename/R_file_after.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R_file_after.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R_id_after.java b/plugins/android/testData/rename/R_id_after.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R_id_after.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/rename/R_value_after.java b/plugins/android/testData/rename/R_value_after.java deleted file mode 100644 index 8dd79eb2cd09..000000000000 --- a/plugins/android/testData/rename/R_value_after.java +++ /dev/null @@ -1,4 +0,0 @@ -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/resNavigation/ValueResourcesNavigation.xml b/plugins/android/testData/resNavigation/ValueResourcesNavigation.xml deleted file mode 100644 index a51190c1db80..000000000000 --- a/plugins/android/testData/resNavigation/ValueResourcesNavigation.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - some text - some text - - diff --git a/plugins/android/testData/resNavigation/src/p1/p2/R.java b/plugins/android/testData/resNavigation/src/p1/p2/R.java deleted file mode 100644 index f47f19860335..000000000000 --- a/plugins/android/testData/resNavigation/src/p1/p2/R.java +++ /dev/null @@ -1,11 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package p1.p2; - -public final class R { -} diff --git a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation1.java b/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation1.java deleted file mode 100644 index 41474efff801..000000000000 --- a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation1.java +++ /dev/null @@ -1,15 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package p1.p2; - -public final class R { - public static final class array { - public static final int colors=0x7f070000; - public static final int planets=0x7f070001; - } -} diff --git a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation2.java b/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation2.java deleted file mode 100644 index 2cc2361059a5..000000000000 --- a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation2.java +++ /dev/null @@ -1,14 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package p1.p2; - -public final class R { - public static final class drawable { - public static final int png=0x7f020000; - } -} diff --git a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation3.java b/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation3.java deleted file mode 100644 index 217bb4cffd43..000000000000 --- a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation3.java +++ /dev/null @@ -1,14 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package p1.p2; - -public final class R { - public static final class id { - public static final int myId1=0x7f090006; - } -} diff --git a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation4.java b/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation4.java deleted file mode 100644 index 6419a712dfa2..000000000000 --- a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation4.java +++ /dev/null @@ -1,14 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package p1.p2; - -public final class R { - public static final class id { - public static final int lunch=0x7f090006; - } -} diff --git a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation5.java b/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation5.java deleted file mode 100644 index a1582eaee0d0..000000000000 --- a/plugins/android/testData/resNavigation/src/p1/p2/RJavaFileNavigation5.java +++ /dev/null @@ -1,14 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package p1.p2; - -public final class R { - public static final class id { - public static final int lunccccch=0x7f090006; - } -} diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidFindUsagesTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidFindUsagesTest.java index 6dd6f4b58898..aeeefd92516e 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidFindUsagesTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidFindUsagesTest.java @@ -42,7 +42,7 @@ public class AndroidFindUsagesTest extends AndroidTestCase { public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject(BASE_PATH + "picture3.gif", "res/drawable/picture3.gif"); - myFixture.copyFileToProject(BASE_PATH + "R.java", "gen/p1/p2/R.java"); + myFixture.copyFileToProject("R.java", "gen/p1/p2/R.java"); } public List findCodeUsages(String path, String pathInProject) throws Throwable { diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java index 77c2c0b168ec..9ecfa303c689 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java @@ -62,10 +62,10 @@ public class AndroidRenameTest extends AndroidTestCase { myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "pic.png", "res/drawable/pic.png"); myFixture.copyFileToProject(BASE_PATH + "styles.xml", "res/values/styles.xml"); - myFixture.copyFileToProject(BASE_PATH + "R1.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); renameElementWithTextOccurences("pic1.png"); myFixture.checkResultByFile(BASE_PATH + "layout_file_after.xml"); - myFixture.checkResultByFile(R_JAVA_PATH, BASE_PATH + "R_file_after.java", true); + myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true); myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + "styles_after.xml", true); assertNotNull(myFixture.findFileInTempDir("res/drawable/pic1.png")); } @@ -76,10 +76,10 @@ public class AndroidRenameTest extends AndroidTestCase { myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "pic.png", "res/drawable/pic.9.png"); myFixture.copyFileToProject(BASE_PATH + "styles.xml", "res/values/styles.xml"); - myFixture.copyFileToProject(BASE_PATH + "R1.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); renameElementWithTextOccurences("pic1.9.png"); myFixture.checkResultByFile(BASE_PATH + "layout_file_after.xml"); - myFixture.checkResultByFile(R_JAVA_PATH, BASE_PATH + "R_file_after.java", true); + myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true); myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + "styles_after.xml", true); assertNotNull(myFixture.findFileInTempDir("res/drawable/pic1.9.png")); } @@ -129,10 +129,10 @@ public class AndroidRenameTest extends AndroidTestCase { VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "layout2.xml", "res/layout/layout2.xml"); myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "strings.xml", "res/values/strings.xml"); - myFixture.copyFileToProject(BASE_PATH + "R2.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.renameElementAtCaret("str1"); myFixture.checkResultByFile(BASE_PATH + "layout_value_after.xml"); - myFixture.checkResultByFile(R_JAVA_PATH, BASE_PATH + "R_value_after.java", true); + myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true); myFixture.checkResultByFile("res/values/strings.xml", BASE_PATH + "strings_after.xml", true); } @@ -158,12 +158,12 @@ public class AndroidRenameTest extends AndroidTestCase { myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "layoutStrUsage.xml", "res/layout/layoutStrUsage.xml"); - myFixture.copyFileToProject(BASE_PATH + "R2.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); findHandlerAndDoRename(); myFixture.checkResultByFile(BASE_PATH + "strings_after.xml"); - myFixture.checkResultByFile(R_JAVA_PATH, BASE_PATH + "R_value_after.java", true); + myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true); myFixture.checkResultByFile("res/layout/layoutStrUsage.xml", BASE_PATH + "layoutStrUsage_after.xml", true); } @@ -187,7 +187,7 @@ public class AndroidRenameTest extends AndroidTestCase { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "RefR3.java", "src/p1/p2/RefR3.java"); myFixture.configureFromExistingVirtualFile(file); - myFixture.copyFileToProject(BASE_PATH + "R.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.copyFileToProject(BASE_PATH + "layout3.xml", "res/layout/layout3.xml"); myFixture.copyFileToProject(BASE_PATH + "pic.png", "res/drawable/pic.png"); myFixture.renameElementAtCaret("pic1"); @@ -200,7 +200,7 @@ public class AndroidRenameTest extends AndroidTestCase { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "RefR4.java", "src/p1/p2/RefR4.java"); myFixture.configureFromExistingVirtualFile(file); - myFixture.copyFileToProject(BASE_PATH + "R.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.copyFileToProject(BASE_PATH + "layout4.xml", "res/layout/layout4.xml"); myFixture.copyFileToProject(BASE_PATH + "strings.xml", "res/values/strings.xml"); myFixture.renameElementAtCaret("str1"); @@ -213,26 +213,26 @@ public class AndroidRenameTest extends AndroidTestCase { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "layout5.xml", "res/layout/layout5.xml"); myFixture.configureFromExistingVirtualFile(file); - myFixture.copyFileToProject(BASE_PATH + "R5.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.renameElementAtCaret("@+id/anchor1"); myFixture.checkResultByFile(BASE_PATH + "layout_id_after.xml"); - myFixture.checkResultByFile(R_JAVA_PATH, BASE_PATH + "R_id_after.java", true); + myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true); } public void testIdDeclaration() throws Throwable { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "layout6.xml", "res/layout/layout6.xml"); myFixture.configureFromExistingVirtualFile(file); - myFixture.copyFileToProject(BASE_PATH + "R6.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.renameElementAtCaret("@+id/anchor1"); myFixture.checkResultByFile(BASE_PATH + "layout_id_after.xml"); - myFixture.checkResultByFile(R_JAVA_PATH, BASE_PATH + "R_id_after.java", true); + myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true); } public void testJavaReferenceToId() throws Throwable { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "RefR7.java", "src/p1/p2/RefR7.java"); - myFixture.copyFileToProject(BASE_PATH + "R.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "layout7.xml", "res/layout/layout7.xml"); myFixture.renameElementAtCaret("anchor1"); @@ -243,7 +243,7 @@ public class AndroidRenameTest extends AndroidTestCase { public void testStyleable() throws Throwable { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "RefR8.java", "src/p1/p2/RefR8.java"); - myFixture.copyFileToProject(BASE_PATH + "R.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "attrs8.xml", "res/values/attrs8.xml"); myFixture.renameElementAtCaret("LabelView1"); @@ -254,7 +254,7 @@ public class AndroidRenameTest extends AndroidTestCase { public void testAttr() throws Throwable { createManifest(); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "RefR9.java", "src/p1/p2/RefR9.java"); - myFixture.copyFileToProject(BASE_PATH + "R.java", R_JAVA_PATH); + myFixture.copyFileToProject("R.java", R_JAVA_PATH); myFixture.configureFromExistingVirtualFile(file); myFixture.copyFileToProject(BASE_PATH + "attrs9.xml", "res/values/attrs9.xml"); myFixture.renameElementAtCaret("attr1"); diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java index d88bc50189c4..10c5a336de88 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidResourcesLineMarkerTest.java @@ -25,83 +25,6 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase { myFixture.copyDirectoryToProject(BASE_PATH + "res", "res"); } - /*public void testRJavaFile() throws Exception { - List markers = collectMarkers("src/p1/p2/R.java"); - assertEquals(26, markers.size()); - for (LineMarkerInfo marker : markers) { - PsiField field = (PsiField)marker.getElement(); - GutterIconNavigationHandler handler = marker.getNavigationHandler(); - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyNavigationHandler.class); - PsiElement[] targets = ((AndroidResourcesLineMarkerProvider.MyNavigationHandler)handler).getTargets(); - checkTargets(field, targets); - } - } - - public void testValueResourcesFile() throws Exception { - copyRJava(); - List markers = collectMarkers("res/values/ids.xml"); - assertEquals(3, markers.size()); - for (LineMarkerInfo marker : markers) { - GutterIconNavigationHandler handler = marker.getNavigationHandler(); - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler.class); - Computable targetProvider = ((AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler)handler).getTargetProvider(); - PsiElement[] targets = targetProvider.compute(); - assertNotNull(targets); - assertEquals(1, targets.length); - for (PsiElement target : targets) { - assertInstanceOf(target, PsiField.class); - } - } - } - - public void testLayoutFile() throws Exception { - copyRJava(); - List markers = collectMarkers("res/layout/layout1.xml"); - assertEquals(5, markers.size()); - - boolean fileMarker = false; - - for (LineMarkerInfo marker : markers) { - GutterIconNavigationHandler handler = marker.getNavigationHandler(); - PsiElement[] targets; - if (marker.getElement() instanceof XmlFile) { - fileMarker = true; - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyNavigationHandler.class); - targets = ((AndroidResourcesLineMarkerProvider.MyNavigationHandler)handler).getTargets(); - } - else { - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler.class); - Computable targetProvider = ((AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler)handler).getTargetProvider(); - targets = targetProvider.compute(); - } - assertNotNull(targets); - assertEquals(1, targets.length); - for (PsiElement target : targets) { - assertInstanceOf(target, PsiField.class); - } - } - - assertTrue("LineMarker for file not found", fileMarker); - } - - public void testJavaFileMarkers() throws Exception { - copyRJava(); - List markers = collectMarkers("src/p1/p2/Java.java"); - - // do not draw line markers on usages of a resource: AndroidGotoDeclarationHandler provides navigation instead - assertEquals(0, markers.size()); - - for (LineMarkerInfo marker : markers) { - PsiReferenceExpression expression = (PsiReferenceExpression)marker.getElement(); - PsiField field = (PsiField)expression.resolve(); - GutterIconNavigationHandler handler = marker.getNavigationHandler(); - assertInstanceOf(handler, AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler.class); - Computable targetProvider = ((AndroidResourcesLineMarkerProvider.MyLazyNavigationHandler)handler).getTargetProvider(); - PsiElement[] targets = targetProvider.compute(); - checkTargets(field, targets); - } - }*/ - public void testJavaFileNavigation1() throws Exception { doJavaFileNavigationTest(1, true); } @@ -130,42 +53,12 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase { doJavaFileNavigationTest(1, true); } - /*public void testRJavaFileNavigation1() throws Exception { - doRJavaFileNavigationTest(1); - } - - public void testRJavaFileNavigation2() throws Exception { - doRJavaFileNavigationTest(2); - } - - public void testRJavaFileNavigation3() throws Exception { - doRJavaFileNavigationTest(3); - } - - public void testRJavaFileNavigation4() throws Exception { - doRJavaFileNavigationTest(1); - } - - public void testRJavaFileNavigation5() throws Exception { - doRJavaFileNavigationTest(0); - }*/ - - /*public void testValueResourcesNavigation() throws Exception { - copyRJava(); - String fileName = getTestName(false) + ".xml"; - doJavaFileNavigationTest(fileName, "res/values/" + fileName, 1, true, false); - }*/ - private void doJavaFileNavigationTest(int expectedTargets, boolean expectedEnabled) throws IOException { copyRJava(); String path = "src/p1/p2/" + getTestName(false) + ".java"; doJavaFileNavigationTest(path, path, expectedTargets, expectedEnabled, true); } - /*private void doRJavaFileNavigationTest(int expectedTargets) throws IOException { - doJavaFileNavigationTest("src/p1/p2/" + getTestName(false) + ".java", "src/p1/p2/R.java", expectedTargets, true, false); - }*/ - private void doJavaFileNavigationTest(String srcPath, String destPath, int expectedTargets, boolean expectedEnabled, boolean testGotoDeclaration) throws IOException { VirtualFile file = myFixture.copyFileToProject(BASE_PATH + srcPath, destPath); @@ -177,51 +70,9 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase { assertNotNull(targets); assertEquals(expectedTargets, targets.length); } - - // test Ctrl+Alt+Shift+R - /*GotoResourceAction action = new GotoResourceAction(); - DataContext dataContext = DataManager.getInstance().getDataContextFromFocus().getResult(); - AnActionEvent event = new AnActionEvent(null, dataContext, "", action.getTemplatePresentation(), ActionManager.getInstance(), 0); - action.update(event); - assertEquals(expectedEnabled, event.getPresentation().isEnabled()); - PsiElement[] targets = GotoResourceAction.findTargets(dataContext); - assertEquals(expectedTargets, targets.length);*/ } - /*private List collectMarkers(String filePath) throws IOException { - return collectMarkers(myFixture, BASE_PATH + filePath, filePath); - } - - public static List collectMarkers(JavaCodeInsightTestFixture fixture, String fromPath, String filePath) { - VirtualFile file = fixture.copyFileToProject(fromPath, filePath); - fixture.configureFromExistingVirtualFile(file); - fixture.doHighlighting(); - List markers = DaemonCodeAnalyzerImpl.getLineMarkers(fixture.getEditor().getDocument(), fixture.getProject()); - assertNotNull(markers); - return markers; - } - - private static void checkTargets(PsiField field, PsiElement[] targets) { - assertNotNull(targets); - assertTrue(targets.length > 0); - int expectedTargetCount = getExpectedTargetCount(field.getName()); - assertEquals(field.getName(), expectedTargetCount, targets.length); - } - - private static int getExpectedTargetCount(String fieldName) { - if ("png".equals(fieldName)) { - return 2; - } - if ("str2".equals(fieldName)) { - return 3; - } - if ("myId1".equals(fieldName)) { - return 3; - } - return 1; - }*/ - private void copyRJava() throws IOException { - myFixture.copyFileToProject(BASE_PATH + "src/p1/p2/R.java", "src/p1/p2/R.java"); + myFixture.copyFileToProject("R.java", "src/p1/p2/R.java"); } } diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java index ac05b5376693..8282071d0961 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java @@ -28,7 +28,7 @@ abstract class AndroidDomTest extends AndroidTestCase { @Override public void setUp() throws Exception { super.setUp(); - myFixture.copyFileToProject("dom/R.java", "gen/p1/p2/R.java"); + myFixture.copyFileToProject("R.java", "gen/p1/p2/R.java"); myFixture.enableInspections(AndroidDomInspection.class, AndroidUnknownAttributeInspection.class, AndroidElementNotAllowedInspection.class); diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java index b8bffa5c8bb7..95081c8af533 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLibraryProjectTest.java @@ -145,7 +145,7 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { public void testJavaHighlighting() { createInitialStructure(); - myFixture.copyFileToProject(BASE_PATH + "FindUsagesR1.java", "lib/src/p1/p2/lib/R.java"); + myFixture.copyFileToProject(BASE_PATH + "LibR.java", "lib/src/p1/p2/lib/R.java"); String to = "lib/src/p1/p2/lib" + getTestName(true) + ".java"; VirtualFile file = myFixture.copyFileToProject(BASE_PATH + getTestName(false) + ".java", to); myFixture.configureFromExistingVirtualFile(file); @@ -186,7 +186,7 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { public void testJavaNavigation() throws Exception { createInitialStructure(); - myFixture.copyFileToProject(BASE_PATH + "RJavaFileMarkers.java", "app/src/p1/p2/R.java"); + myFixture.copyFileToProject("R.java", "app/src/p1/p2/R.java"); VirtualFile file = myFixture.copyFileToProject(BASE_PATH + getTestName(false) + ".java", "/app/src/p1/p2/Java.java"); myFixture.configureFromExistingVirtualFile(file); @@ -242,9 +242,9 @@ public class AndroidLibraryProjectTest extends UsefulTestCase { myFixture.copyFileToProject(BASE_PATH + "FindUsagesStyles.xml", "app/res/values/styles.xml"); myFixture.copyFileToProject(BASE_PATH + "FindUsagesStyles.xml", "lib/res/values/styles.xml"); myFixture.copyFileToProject(BASE_PATH + "picture1.png", "lib/res/drawable/picture1.png"); - myFixture.copyFileToProject(BASE_PATH + "FindUsagesR.java", "app/src/p1/p2/R.java"); - myFixture.copyFileToProject(BASE_PATH + "FindUsagesR1.java", "app/src/p1/p2/lib/R.java"); - myFixture.copyFileToProject(BASE_PATH + "FindUsagesR1.java", "lib/src/p1/p2/lib/R.java"); + myFixture.copyFileToProject("R.java", "app/src/p1/p2/R.java"); + myFixture.copyFileToProject(BASE_PATH + "LibR.java", "app/src/p1/p2/lib/R.java"); + myFixture.copyFileToProject(BASE_PATH + "LibR.java", "lib/src/p1/p2/lib/R.java"); Collection references = findCodeUsages(getTestName(false) + "." + extension, dir); assertEquals(6, references.size()); } diff --git a/plugins/android/testSrc/org/jetbrains/android/intentions/AndroidAddStringResourceActionTest.java b/plugins/android/testSrc/org/jetbrains/android/intentions/AndroidAddStringResourceActionTest.java index c2970ace69c0..64528f23d692 100644 --- a/plugins/android/testSrc/org/jetbrains/android/intentions/AndroidAddStringResourceActionTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/intentions/AndroidAddStringResourceActionTest.java @@ -190,7 +190,7 @@ public class AndroidAddStringResourceActionTest extends AndroidTestCase { if (stringsXml != null) { myFixture.copyFileToProject(BASE_PATH + stringsXml, "res/values/strings.xml"); } - myFixture.copyFileToProject(BASE_PATH + "R.java", "src/p1/p2/R.java"); + myFixture.copyFileToProject("R.java", "src/p1/p2/R.java"); myFixture.configureFromExistingVirtualFile(javaFile); final PsiFile javaPsiFile = myFixture.getFile(); assertTrue(new AndroidAddStringResourceAction().isAvailable(myFixture.getProject(), myFixture.getEditor(), javaPsiFile)); From 23e1bd01399346105a4ee6480f4a3385665df8d1 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 20 Jun 2012 17:55:00 +0400 Subject: [PATCH 08/11] android-augment: provide R.styleable._ fields --- .../jetbrains/android/util/ResourceEntry.java | 26 +++++++----- .../util/ValueResourcesFileParser.java | 17 ++++++-- .../jps/android/AndroidAptValidityState.java | 8 +++- .../AndroidSourceGeneratingBuilder.java | 2 +- .../android/AndroidValueResourcesIndex.java | 42 ++++++++++++------- .../android/augment/ResourceTypeClass.java | 42 ++++++++++++++----- .../compiler/ResourceNamesValidityState.java | 10 +++-- .../resourceManagers/ResourceManager.java | 18 ++++++-- 8 files changed, 115 insertions(+), 50 deletions(-) diff --git a/plugins/android/common/src/org/jetbrains/android/util/ResourceEntry.java b/plugins/android/common/src/org/jetbrains/android/util/ResourceEntry.java index a9580789470e..fd4e73305206 100644 --- a/plugins/android/common/src/org/jetbrains/android/util/ResourceEntry.java +++ b/plugins/android/common/src/org/jetbrains/android/util/ResourceEntry.java @@ -23,15 +23,17 @@ import org.jetbrains.annotations.NotNull; public class ResourceEntry { private final String myType; private final String myName; + private final String myContext; - public ResourceEntry(@NotNull String type, @NotNull String name) { + public ResourceEntry(@NotNull String type, @NotNull String name, @NotNull String context) { myType = type; myName = name; + myContext = context; } @NotNull - public String getType() { - return myType; + public String getContext() { + return myContext; } @NotNull @@ -39,28 +41,30 @@ public class ResourceEntry { return myName; } + @NotNull + public String getType() { + return myType; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - ResourceEntry entry = (ResourceEntry)o; + ResourceEntry that = (ResourceEntry)o; - if (!myName.equals(entry.myName)) return false; - if (!myType.equals(entry.myType)) return false; + if (!myContext.equals(that.myContext)) return false; + if (!myName.equals(that.myName)) return false; + if (!myType.equals(that.myType)) return false; return true; } - @Override - public String toString() { - return "[" + myType + ":" + myName + "]"; - } - @Override public int hashCode() { int result = myType.hashCode(); result = 31 * result + myName.hashCode(); + result = 31 * result + myContext.hashCode(); return result; } } diff --git a/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java b/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java index df61bcc3b2cd..1ab6b3d9b0a2 100644 --- a/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java +++ b/plugins/android/common/src/org/jetbrains/android/util/ValueResourcesFileParser.java @@ -16,6 +16,7 @@ package org.jetbrains.android.util; import com.android.resources.ResourceType; +import com.intellij.util.containers.Stack; import net.n3.nanoxml.IXMLBuilder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,6 +30,7 @@ public abstract class ValueResourcesFileParser implements IXMLBuilder { private boolean mySeenResources; private String myLastTypeAttr; private String myLastNameAttr; + private final Stack myContextNames = new Stack(); public ValueResourcesFileParser() { mySeenResources = false; @@ -79,15 +81,24 @@ public abstract class ValueResourcesFileParser implements IXMLBuilder { ? myLastTypeAttr : AndroidCommonUtils.getResourceTypeByTagName(name); final ResourceType resType = resTypeStr != null ? ResourceType.getEnum(resTypeStr) : null; - if (resType != null && - !(resType == ResourceType.ATTR && myLastNameAttr.startsWith("android:"))) { - process(new ResourceEntry(resTypeStr, myLastNameAttr)); + if (resType != null) { + if (resType == ResourceType.ATTR) { + if (!myLastNameAttr.startsWith("android:")) { + final String contextName = myContextNames.peek(); + process(new ResourceEntry(resTypeStr, myLastNameAttr, contextName)); + } + } + else { + process(new ResourceEntry(resTypeStr, myLastNameAttr, "")); + } } } + myContextNames.push(myLastNameAttr != null ? myLastNameAttr : ""); } @Override public void endElement(String name, String nsPrefix, String nsURI) throws Exception { + myContextNames.pop(); } @Override diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptValidityState.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptValidityState.java index 0fa679fe2506..ccdeae22430b 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptValidityState.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptValidityState.java @@ -46,7 +46,8 @@ public class AndroidAptValidityState implements ValidityState { for (int j = 0; j < entriesCount; j++) { final String resType = in.readUTF(); final String resName = in.readUTF(); - entries.add(new ResourceEntry(resType, resName)); + final String resContext = in.readUTF(); + entries.add(new ResourceEntry(resType, resName, resContext)); } final long timestamp = in.readLong(); myResources.put(filePath, new ResourceFileData(entries, timestamp)); @@ -58,7 +59,8 @@ public class AndroidAptValidityState implements ValidityState { for (int i = 0; i < manifestElementCount; i++) { final String elementType = in.readUTF(); final String elementName = in.readUTF(); - myManifestElements.add(new ResourceEntry(elementType, elementName)); + final String elementContext = in.readUTF(); + myManifestElements.add(new ResourceEntry(elementType, elementName, elementContext)); } final int libPackageCount = in.readInt(); @@ -97,6 +99,7 @@ public class AndroidAptValidityState implements ValidityState { for (ResourceEntry resource : resources) { out.writeUTF(resource.getType()); out.writeUTF(resource.getName()); + out.writeUTF(resource.getContext()); } out.writeLong(fileData.getTimestamp()); } @@ -105,6 +108,7 @@ public class AndroidAptValidityState implements ValidityState { for (ResourceEntry manifestElement : myManifestElements) { out.writeUTF(manifestElement.getType()); out.writeUTF(manifestElement.getName()); + out.writeUTF(manifestElement.getContext()); } out.writeInt(myLibPackages.size()); diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java index 7d1cb001b210..7eba3a900588 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java @@ -855,7 +855,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { public void elementAttributesProcessed(String name, String nsPrefix, String nsURI) throws Exception { if (myLastName != null && PERMISSION_TAG.equals(name) || PERMISSION_GROUP_TAG.equals(name)) { assert myLastName != null; - result.add(new ResourceEntry(name, myLastName)); + result.add(new ResourceEntry(name, myLastName, "")); } } }); diff --git a/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java b/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java index 427c5ac11a9e..f672dfe9be0e 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java +++ b/plugins/android/src/org/jetbrains/android/AndroidValueResourcesIndex.java @@ -57,15 +57,8 @@ public class AndroidValueResourcesIndex extends FileBasedIndexExtensionemptySet()); - - final ResourceEntry typeMarkerEntry = createTypeMarkerEntry(entry.getType()); - Set set = result.get(typeMarkerEntry); - - if (set == null) { - set = new HashSet(); - result.put(typeMarkerEntry, set); - } - set.add(entry); + addEntryToMap(entry, createTypeMarkerEntry(entry.getType()), result); + addEntryToMap(entry, createTypeNameMarkerEntry(entry.getType(), entry.getName()), result); } }); @@ -73,8 +66,22 @@ public class AndroidValueResourcesIndex extends FileBasedIndexExtension> result) { + Set set = result.get(marker); + + if (set == null) { + set = new HashSet(); + result.put(marker, set); + } + set.add(entry); + } + public static ResourceEntry createTypeMarkerEntry(String type) { - return new ResourceEntry(type, "TYPE_MARKER_RESOURCE"); + return new ResourceEntry(type, "TYPE_MARKER_RESOURCE", "TYPE_MARKER_CONTEXT"); + } + + public static ResourceEntry createTypeNameMarkerEntry(String type, String name) { + return new ResourceEntry(type, name, "TYPE_MARKER_CONTEXT"); } private final KeyDescriptor myKeyDescriptor = new KeyDescriptor() { @@ -82,13 +89,15 @@ public class AndroidValueResourcesIndex extends FileBasedIndexExtension result = new HashSet(size); for (int i = 0; i < size; i++) { - result.add(myKeyDescriptor.read(in)); + final String type = in.readUTF(); + final String name = in.readUTF(); + final String context = in.readUTF(); + result.add(new ResourceEntry(type, name, context)); } return result; } @@ -163,6 +177,6 @@ public class AndroidValueResourcesIndex extends FileBasedIndexExtension fieldNames = new HashMap(); + final boolean styleable = ResourceType.STYLEABLE.getName().equals(resClassName); + final PsiType basicType = styleable ? PsiType.INT.createArrayType() : PsiType.INT; + + for (String resName : manager.getResourceNames(resClassName)) { + fieldNames.put(resName, basicType); + } + + if (styleable) { + for (ResourceEntry entry : manager.getValueResourceEntries(ResourceType.ATTR.getName())) { + final String resName = entry.getName(); + final String resContext = entry.getContext(); + + if (resContext.length() > 0) { + fieldNames.put(resContext + '_' + resName, PsiType.INT); + } + } + } + final PsiField[] result = new PsiField[fieldNames.size()]; + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(facet.getModule().getProject()); final Module circularDepLibWithSamePackage = AndroidCompileUtil.findCircularDependencyOnLibraryWithSamePackage(facet); final boolean generateNonFinalFields = facet.getConfiguration().LIBRARY_PROJECT || circularDepLibWithSamePackage != null; - - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(facet.getModule().getProject()); - final Collection resNames = facet.getLocalResourceManager().getResourceNames(resClassName); - final PsiField[] result = new PsiField[resNames.size()]; int i = 0; - for (String resName : resNames) { - final PsiType type = ResourceType.STYLEABLE.getName().equals(resClassName) - ? PsiType.INT.createArrayType() - : PsiType.INT; - final AndroidLightField field = new AndroidLightField(AndroidResourceUtil.getFieldNameByResourceName(resName), context, - type, !generateNonFinalFields, generateNonFinalFields ? null : 0); + + for (Map.Entry entry : fieldNames.entrySet()) { + final String fieldName = AndroidResourceUtil.getFieldNameByResourceName(entry.getKey()); + final PsiType type = entry.getValue(); + final AndroidLightField field = + new AndroidLightField(fieldName, context, type, !generateNonFinalFields, generateNonFinalFields ? null : 0); field.setInitializer(factory.createExpressionFromText("0", field)); result[i++] = field; } diff --git a/plugins/android/src/org/jetbrains/android/compiler/ResourceNamesValidityState.java b/plugins/android/src/org/jetbrains/android/compiler/ResourceNamesValidityState.java index 1be06afcae31..a4622edc6683 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/ResourceNamesValidityState.java +++ b/plugins/android/src/org/jetbrains/android/compiler/ResourceNamesValidityState.java @@ -69,7 +69,7 @@ public class ResourceNamesValidityState implements ValidityState { final String styleableName = styleable.getName().getValue(); if (styleableName != null) { - addValueResources(file, ResourceType.DECLARE_STYLEABLE, styleable.getAttrs(), myResources, styleableName + '_'); + addValueResources(file, ResourceType.DECLARE_STYLEABLE, styleable.getAttrs(), myResources, styleableName); } } } @@ -105,7 +105,7 @@ public class ResourceNamesValidityState implements ValidityState { ResourceType resType, Collection resourceElements, Map result, - String namePrefix) { + String context) { for (ResourceElement element : resourceElements) { final String name = element.getName().getValue(); @@ -115,7 +115,7 @@ public class ResourceNamesValidityState implements ValidityState { data = new ResourceFileData(); result.put(file.getPath(), data); } - data.addValueResource(new ResourceEntry(resType.getName(), namePrefix + name)); + data.addValueResource(new ResourceEntry(resType.getName(), name, context)); } } } @@ -135,7 +135,8 @@ public class ResourceNamesValidityState implements ValidityState { for (int j = 0; j < valueResourcesCount; j++) { final String resType = in.readUTF(); final String resName = in.readUTF(); - valueResources.add(new ResourceEntry(resType, resName)); + final String resContext = in.readUTF(); + valueResources.add(new ResourceEntry(resType, resName, resContext)); } final long fileTimestamp = in.readLong(); myResources.put(filePath, new ResourceFileData(valueResources, fileTimestamp)); @@ -172,6 +173,7 @@ public class ResourceNamesValidityState implements ValidityState { for (ResourceEntry resource : valueResources) { out.writeUTF(resource.getType()); out.writeUTF(resource.getName()); + out.writeUTF(resource.getContext()); } out.writeLong(data.getTimestamp()); } diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java index 98feb277c883..a0e90547857d 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java @@ -221,6 +221,16 @@ public abstract class ResourceManager { @NotNull public Collection getValueResourceNames(@NotNull final String resourceType) { + final Set result = new HashSet(); + + for (ResourceEntry entry : getValueResourceEntries(resourceType)) { + result.add(entry.getName()); + } + return result; + } + + @NotNull + public Collection getValueResourceEntries(@NotNull final String resourceType) { final ResourceType type = ResourceType.getEnum(resourceType); if (type == null) { @@ -232,7 +242,6 @@ public abstract class ResourceManager { final GlobalSearchScope scope = GlobalSearchScope.allScope(myModule.getProject()); final Map> file2resourceSet = new HashMap>(); - for (Set entrySet : index.getValues(AndroidValueResourcesIndex.INDEX_ID, typeMarkerEntry, scope)) { for (ResourceEntry entry : entrySet) { final Collection files = index.getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, entry, scope); @@ -248,14 +257,14 @@ public abstract class ResourceManager { } } } - final Set result = new HashSet(); + final List result = new ArrayList(); for (VirtualFile file : getAllValueResourceFiles()) { final Set entries = file2resourceSet.get(file); if (entries != null) { for (ResourceEntry entry : entries) { - result.add(entry.getName()); + result.add(entry); } } } @@ -371,7 +380,8 @@ public abstract class ResourceManager { } final Collection files = FileBasedIndex.getInstance() - .getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, new ResourceEntry(resourceType, resourceName), + .getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, + AndroidValueResourcesIndex.createTypeNameMarkerEntry(resourceType, resourceName), GlobalSearchScope.allScope(myModule.getProject())); if (files.size() == 0) { From c14fe14cc44a6855570a5f5533396572e0e3a131 Mon Sep 17 00:00:00 2001 From: Danila Ponomarenko Date: Wed, 20 Jun 2012 18:30:22 +0400 Subject: [PATCH 09/11] IDEA-29993 As well as the intension "Cast to String" offer "Call toString()". WrapExpression intention scope widen. --- .../daemon/impl/quickfix/AddTypeCastFix.java | 1 - .../impl/quickfix/WrapExpressionFix.java | 27 ++++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java index 5966fbf38d36..28d0b986e4e7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java @@ -26,7 +26,6 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.daemon.QuickFixBundle; -import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java index e03214da210f..e327a9bb0ab4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java @@ -48,7 +48,7 @@ public class WrapExpressionFix implements IntentionAction { if (type instanceof PsiClassType) { return (PsiClassType)type; } - else if (type instanceof PsiPrimitiveType){ + else if (type instanceof PsiPrimitiveType) { return ((PsiPrimitiveType)type).getBoxedType(place.getManager(), GlobalSearchScope.allScope(place.getProject())); } return null; @@ -73,10 +73,11 @@ public class WrapExpressionFix implements IntentionAction { if (expectedReturnType == null) return null; PsiMethod[] methods = aClass.getMethods(); for (PsiMethod method : methods) { - if (method.hasModifierProperty(PsiModifier.STATIC) && method.getParameterList().getParametersCount() == 1 && - method.getParameterList().getParameters()[0].getType().equals(type) && - method.getReturnType() != null && - expectedReturnType.equals(method.getReturnType())) { + if (method.hasModifierProperty(PsiModifier.STATIC) + && method.getParameterList().getParametersCount() == 1 + && method.getParameterList().getParameters()[0].getType().isAssignableFrom(type) + && method.getReturnType() != null + && expectedReturnType.equals(method.getReturnType())) { return method; } } @@ -108,10 +109,10 @@ public class WrapExpressionFix implements IntentionAction { assert wrapper != null; PsiElementFactory factory = JavaPsiFacade.getInstance(file.getProject()).getElementFactory(); @NonNls String methodCallText = "Foo." + wrapper.getName() + "()"; - PsiMethodCallExpression call = (PsiMethodCallExpression) factory.createExpressionFromText(methodCallText, - null); + PsiMethodCallExpression call = (PsiMethodCallExpression)factory.createExpressionFromText(methodCallText, + null); call.getArgumentList().add(myExpression); - ((PsiReferenceExpression) call.getMethodExpression().getQualifierExpression()).bindToElement( + ((PsiReferenceExpression)call.getMethodExpression().getQualifierExpression()).bindToElement( wrapper.getContainingClass()); myExpression.replace(call); } @@ -121,7 +122,7 @@ public class WrapExpressionFix implements IntentionAction { return true; } - public static void registerWrapAction (JavaResolveResult[] candidates, PsiExpression[] expressions, HighlightInfo highlightInfo) { + public static void registerWrapAction(JavaResolveResult[] candidates, PsiExpression[] expressions, HighlightInfo highlightInfo) { PsiType expectedType = null; PsiExpression expr = null; @@ -138,17 +139,18 @@ public class WrapExpressionFix implements IntentionAction { PsiExpression expression = expressions[j]; final PsiType exprType = expression.getType(); if (exprType != null) { - PsiType paramType = parameters[Math.min(j, parameters.length -1)].getType(); + PsiType paramType = parameters[Math.min(j, parameters.length - 1)].getType(); if (paramType instanceof PsiEllipsisType) { paramType = ((PsiEllipsisType)paramType).getComponentType(); } paramType = substitutor != null ? substitutor.substitute(paramType) : paramType; - if (paramType.isAssignableFrom(exprType)) continue; + //if (paramType.isAssignableFrom(exprType)) continue; final PsiClassType classType = getClassType(paramType, expression); if (expectedType == null && classType != null && findWrapper(exprType, classType, paramType instanceof PsiPrimitiveType) != null) { expectedType = paramType; expr = expression; - } else { + } + else { expectedType = null; expr = null; continue nextMethod; @@ -161,5 +163,4 @@ public class WrapExpressionFix implements IntentionAction { QuickFixAction.registerQuickFixAction(highlightInfo, expr.getTextRange(), new WrapExpressionFix(expectedType, expr)); } } - } From 89d32051d0a60171f713e34ce9f1247b7113119a Mon Sep 17 00:00:00 2001 From: Danila Ponomarenko Date: Wed, 20 Jun 2012 18:37:18 +0400 Subject: [PATCH 10/11] IDEA-29993 tests fixed --- .../codeInsight/daemon/impl/quickfix/WrapExpressionFix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java index e327a9bb0ab4..daedfc3e9c06 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapExpressionFix.java @@ -144,7 +144,7 @@ public class WrapExpressionFix implements IntentionAction { paramType = ((PsiEllipsisType)paramType).getComponentType(); } paramType = substitutor != null ? substitutor.substitute(paramType) : paramType; - //if (paramType.isAssignableFrom(exprType)) continue; + if (paramType.isAssignableFrom(exprType)) continue; final PsiClassType classType = getClassType(paramType, expression); if (expectedType == null && classType != null && findWrapper(exprType, classType, paramType instanceof PsiPrimitiveType) != null) { expectedType = paramType; From 598daec986fb5be95286575d790cde29f0442794 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 20 Jun 2012 18:14:43 +0400 Subject: [PATCH 11/11] test --- plugins/android/testData/dom/resources/JavaHighlighting.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/android/testData/dom/resources/JavaHighlighting.java b/plugins/android/testData/dom/resources/JavaHighlighting.java index 967ff91ece11..e0570eb165ff 100644 --- a/plugins/android/testData/dom/resources/JavaHighlighting.java +++ b/plugins/android/testData/dom/resources/JavaHighlighting.java @@ -1,5 +1,6 @@ package p1.p2; +import java.lang.Readable; import java.lang.System; public class JavaCompletion1 { @@ -11,6 +12,9 @@ public class JavaCompletion1 { int n5 = R.attr.myAttr1; n5 = R.attr.myAttr2; n5 = R.attr.android_text; + n5 = R.styleable.MyStyleable_myAttr1; + n4 = R.styleable.MyStyleable_myAttr1; + n5 = R.styleable.MyStyleable_text; switch(n1) { case R.string.my_string: