From 5350e844208c9cb34ed5629f58bfbf87a6b97b7b Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 8 Nov 2010 15:48:04 +0300 Subject: [PATCH 1/2] IDEA-60543 error indication in project file for AndroidManifest.xml and resource files --- plugins/android/src/META-INF/plugin.xml | 1 + .../AndroidProblemFileHighlightingFilter.java | 51 +++++++++++++++++++ .../resourceManagers/ResourceManager.java | 17 +++++-- 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 plugins/android/src/org/jetbrains/android/AndroidProblemFileHighlightingFilter.java diff --git a/plugins/android/src/META-INF/plugin.xml b/plugins/android/src/META-INF/plugin.xml index cf98c409a0bc..d367db87fe0b 100644 --- a/plugins/android/src/META-INF/plugin.xml +++ b/plugins/android/src/META-INF/plugin.xml @@ -137,6 +137,7 @@ + diff --git a/plugins/android/src/org/jetbrains/android/AndroidProblemFileHighlightingFilter.java b/plugins/android/src/org/jetbrains/android/AndroidProblemFileHighlightingFilter.java new file mode 100644 index 000000000000..3711c925ba59 --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/AndroidProblemFileHighlightingFilter.java @@ -0,0 +1,51 @@ +/* + * 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.sdklib.SdkConstants; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.resourceManagers.ResourceManager; + +/** + * @author Eugene.Kudelevsky + */ +public class AndroidProblemFileHighlightingFilter implements Condition { + private final Project myProject; + + public AndroidProblemFileHighlightingFilter(Project project) { + myProject = project; + } + + @Override + public boolean value(VirtualFile file) { + if (file.getFileType() != StdFileTypes.XML) { + return false; + } + if (SdkConstants.FN_ANDROID_MANIFEST_XML.equals(file.getName())) { + Module module = ModuleUtil.findModuleForFile(file, myProject); + return module != null && AndroidFacet.getInstance(module) != null; + } + + VirtualFile parent = file.getParent(); + if (parent == null) return false; + parent = parent.getParent(); + if (parent == null) return false; + return ResourceManager.isResourceDirectory(parent, myProject); + } +} diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java index 32ae1e47a73a..2faaaac0478d 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -332,13 +333,21 @@ public abstract class ResourceManager { return dir != null && isResourceDirectory(dir); } + public static boolean isResourceDirectory(VirtualFile dir, Project project) { + Module module = ModuleUtil.findModuleForFile(dir, project); + if (module != null) { + AndroidFacet facet = AndroidFacet.getInstance(module); + return facet != null && facet.getLocalResourceManager().isResourceDir(dir); + } + return false; + } + public static boolean isResourceDirectory(PsiDirectory dir) { // check facet settings VirtualFile vf = dir.getVirtualFile(); - Module module = ModuleUtil.findModuleForPsiElement(dir); - if (module != null) { - AndroidFacet facet = AndroidFacet.getInstance(module); - return facet != null && facet.getLocalResourceManager().isResourceDir(vf); + + if (isResourceDirectory(vf, dir.getProject())) { + return true; } // method can be invoked for system resource dir, so we should check it From 617546c85a7aac6b361102f17e1385fdafb8fa66 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 8 Nov 2010 16:53:01 +0300 Subject: [PATCH 2/2] IDEA-59209 remove duplicated classes inside "gen" source root only --- .../android/compiler/AndroidAptCompiler.java | 3 ++- .../android/compiler/AndroidCompileUtil.java | 16 +++++++++++----- .../android/compiler/AndroidIdlCompiler.java | 6 +++++- .../compiler/AndroidMavenResourcesCompiler.java | 5 ++++- .../facet/AndroidResourceFilesListener.java | 3 ++- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java index 9c3d3705ed13..f54ecf418262 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java @@ -124,7 +124,8 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { return; } String className = FileUtil.getNameWithoutExtension(aptItem.myGeneratedFile); - AndroidCompileUtil.removeDuplicatingClasses(aptItem.myModule, aptItem.myPackage, className, aptItem.myGeneratedFile); + AndroidCompileUtil.removeDuplicatingClasses(aptItem.myModule, aptItem.myPackage, className, aptItem.myGeneratedFile, + aptItem.mySourceRootPath); } }); } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 3d4facc7a179..e1be4068fbff 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -27,9 +27,7 @@ import com.intellij.openapi.compiler.GeneratingCompiler; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ContentEntry; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.*; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; @@ -187,16 +185,24 @@ public class AndroidCompileUtil { // must be invoked in a read action! public static void removeDuplicatingClasses(final Module module, @NotNull final String packageName, @NotNull String className, - @Nullable final File classFile) { + @Nullable final File classFile, String sourceRootPath) { + if (sourceRootPath == null) { + return; + } + VirtualFile sourceRoot = LocalFileSystem.getInstance().findFileByPath(sourceRootPath); + if (sourceRoot == null) { + return; + } final Project project = module.getProject(); final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); final String interfaceQualifiedName = packageName + '.' + className; PsiClass[] classes = facade.findClasses(interfaceQualifiedName, GlobalSearchScope.moduleScope(module)); + final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); for (PsiClass c : classes) { PsiFile psiFile = c.getContainingFile(); if (className.equals(FileUtil.getNameWithoutExtension(psiFile.getName()))) { VirtualFile virtualFile = psiFile.getVirtualFile(); - if (virtualFile != null) { + if (virtualFile != null && projectFileIndex.getSourceRootForFile(virtualFile) == sourceRoot) { final String path = virtualFile.getPath(); File f = new File(path); if (!f.equals(classFile) && f.exists()) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java index 38486a4395d7..e20427b2ae53 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java @@ -114,6 +114,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { final IAndroidTarget myAndroidTarget; final File myGeneratedFile; final String myPackageName; + final String mySourceRootPath; public IdlGenerationItem(@NotNull Module module, @NotNull VirtualFile file, @@ -126,6 +127,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { myTestSource = testSource; myAndroidTarget = androidTarget; myPackageName = packageName; + mySourceRootPath = sourceRootPath; myGeneratedFile = new File(sourceRootPath, packageName.replace('.', File.separatorChar) + File.separator + file.getNameWithoutExtension() + ".java"); } @@ -222,7 +224,9 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { public void run() { if (idlItem.myModule.getProject().isDisposed()) return; String className = FileUtil.getNameWithoutExtension(idlItem.myGeneratedFile); - AndroidCompileUtil.removeDuplicatingClasses(idlItem.myModule, idlItem.myPackageName, className, idlItem.myGeneratedFile); + AndroidCompileUtil.removeDuplicatingClasses(idlItem.myModule, idlItem.myPackageName, className, + idlItem.myGeneratedFile.exists() ? idlItem.myGeneratedFile : null, + idlItem.mySourceRootPath); } }); } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java index 38b7f9dfeeba..e5eb49cd9069 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java @@ -106,7 +106,8 @@ public class AndroidMavenResourcesCompiler implements SourceGeneratingCompiler { ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { String className = FileUtil.getNameWithoutExtension(genItem.myGeneratedFile); - AndroidCompileUtil.removeDuplicatingClasses(genItem.myModule, genItem.myPackage, className, genItem.myGeneratedFile); + AndroidCompileUtil.removeDuplicatingClasses(genItem.myModule, genItem.myPackage, className, genItem.myGeneratedFile, + genItem.mySourceRootPath); } }); } @@ -132,12 +133,14 @@ public class AndroidMavenResourcesCompiler implements SourceGeneratingCompiler { final Module myModule; final String myPackage; final File myGeneratedFile; + final String mySourceRootPath; private MyGenerationItem(@NotNull Module module, @NotNull String aPackage, @NotNull String sourceRootPath) { myModule = module; myPackage = aPackage; myGeneratedFile = new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidUtils.R_JAVA_FILENAME); + mySourceRootPath = sourceRootPath; } @Nullable diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java index 63c8133334e0..bbb49e855a69 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java @@ -142,7 +142,8 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { Manifest manifest = myFacet.getManifest(); String aPackage = manifest != null ? manifest.getPackage().getValue() : null; if (myCachedPackage != null && !myCachedPackage.equals(aPackage)) { - AndroidCompileUtil.removeDuplicatingClasses(myModule, myCachedPackage, AndroidUtils.R_CLASS_NAME, null); + String aptGenDirPath = myFacet.getAptGenSourceRootPath(); + AndroidCompileUtil.removeDuplicatingClasses(myModule, myCachedPackage, AndroidUtils.R_CLASS_NAME, null, aptGenDirPath); } myCachedPackage = aPackage; myFacet.getLocalResourceManager().invalidateAttributeDefinitions();