diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 94e6eba01b33..5d94112553d4 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -535,7 +535,9 @@ public class AndroidFacet extends Facet { final String sdkHomePath = FileUtil.toSystemIndependentName(platform.getSdkData().getLocation()); final VirtualFile annotationsJar = JarFileSystem.getInstance().findFileByPath( sdkHomePath + AndroidSdkUtils.ANNOTATIONS_JAR_RELATIVE_PATH + JarFileSystem.JAR_SEPARATOR); - filesToAdd.add(annotationsJar); + if (annotationsJar != null) { + filesToAdd.add(annotationsJar); + } } addFilesToSdkIfNecessary(sdk, filesToAdd); diff --git a/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintExternalAnnotator.java b/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintExternalAnnotator.java index 0f42b32e58b4..6a5b179b671b 100644 --- a/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintExternalAnnotator.java +++ b/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintExternalAnnotator.java @@ -9,6 +9,7 @@ import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInsight.intention.HighPriorityAction; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.InspectionProfile; +import com.intellij.codeInspection.SuppressIntentionAction; import com.intellij.codeInspection.ex.CustomEditInspectionToolsSettingsAction; import com.intellij.codeInspection.ex.DisableInspectionToolAction; import com.intellij.lang.annotation.Annotation; @@ -155,8 +156,6 @@ public class AndroidLintExternalAnnotator extends ExternalAnnotator ourIssue2InspectionShortName = new HashMap(); @@ -160,7 +160,7 @@ public abstract class AndroidLintInspectionBase extends GlobalInspectionTool { } } - if (f != null) { + if (f != null && !isSuppressedFor(f)) { result.add(manager.createProblemDescriptor(f, message, false, getLocalQuickFixes(f, f, message), ProblemHighlightType.GENERIC_ERROR_OR_WARNING)); } @@ -169,7 +169,7 @@ public abstract class AndroidLintInspectionBase extends GlobalInspectionTool { final PsiElement startElement = psiFile.findElementAt(range.getStartOffset()); final PsiElement endElement = psiFile.findElementAt(range.getEndOffset() - 1); - if (startElement != null && endElement != null) { + if (startElement != null && endElement != null && !isSuppressedFor(startElement)) { result.add(manager.createProblemDescriptor(startElement, endElement, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, false, getLocalQuickFixes(startElement, endElement, message))); @@ -179,6 +179,29 @@ public abstract class AndroidLintInspectionBase extends GlobalInspectionTool { return result.toArray(new ProblemDescriptor[result.size()]); } + @Override + public SuppressIntentionAction[] getSuppressActions(@Nullable PsiElement element) { + final List result = new ArrayList(); + result.addAll(Arrays.asList(SuppressManager.getInstance().createSuppressActions(HighlightDisplayKey.find(getShortName())))); + result.addAll(Arrays.asList(new XmlSuppressableInspectionTool.SuppressTagStatic(getShortName()), + new XmlSuppressableInspectionTool.SuppressForFile(getShortName()))); + return result.toArray(new SuppressIntentionAction[result.size()]); + } + + @Override + public boolean isSuppressedFor(PsiElement element) { + if (element == null) { + return false; + } + else if (element.getLanguage() == JavaLanguage.INSTANCE) { + return SuppressManager.getInstance().isSuppressedFor(element, getShortName()); + } + else if (element.getLanguage() == XMLLanguage.INSTANCE) { + return XmlSuppressionProvider.isSuppressed(element, getShortName()); + } + return false; + } + private synchronized static void addIssue(@NotNull Issue issue, @NotNull String shortName) { ourIssue2InspectionShortName.put(issue, shortName); } diff --git a/plugins/android/testData/lint/global/lintInJavaFile/MyActivity.java b/plugins/android/testData/lint/global/lintInJavaFile/MyActivity.java new file mode 100644 index 000000000000..54f5219b60bf --- /dev/null +++ b/plugins/android/testData/lint/global/lintInJavaFile/MyActivity.java @@ -0,0 +1,17 @@ +package p1.p2; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.ImageView; + +import java.lang.Integer; + +public class MyActivity extends Activity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Integer n = new Integer(3); + } +} \ No newline at end of file diff --git a/plugins/android/testData/lint/global/lintInJavaFile/expected.xml b/plugins/android/testData/lint/global/lintInJavaFile/expected.xml new file mode 100644 index 000000000000..90ae8bdec38b --- /dev/null +++ b/plugins/android/testData/lint/global/lintInJavaFile/expected.xml @@ -0,0 +1,8 @@ + + + + MyActivity.java + 15 + Use Integer.valueOf(3) instead + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/suppressingInJava/MyActivity.java b/plugins/android/testData/lint/global/suppressingInJava/MyActivity.java new file mode 100644 index 000000000000..f77a11226cf9 --- /dev/null +++ b/plugins/android/testData/lint/global/suppressingInJava/MyActivity.java @@ -0,0 +1,18 @@ +package p1.p2; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.ImageView; + +import java.lang.Integer; + +public class MyActivity extends Activity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + @SuppressWarnings("AndroidLintUseValueOf") + Integer n = new Integer(3); + } +} \ No newline at end of file diff --git a/plugins/android/testData/lint/global/suppressingInJava/expected.xml b/plugins/android/testData/lint/global/suppressingInJava/expected.xml new file mode 100644 index 000000000000..5e933496b9cf --- /dev/null +++ b/plugins/android/testData/lint/global/suppressingInJava/expected.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/suppressingInXml3/expected.xml b/plugins/android/testData/lint/global/suppressingInXml3/expected.xml new file mode 100644 index 000000000000..5e933496b9cf --- /dev/null +++ b/plugins/android/testData/lint/global/suppressingInXml3/expected.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/suppressingInXml3/layout.xml b/plugins/android/testData/lint/global/suppressingInXml3/layout.xml new file mode 100644 index 000000000000..5c34192b9888 --- /dev/null +++ b/plugins/android/testData/lint/global/suppressingInXml3/layout.xml @@ -0,0 +1,12 @@ + + + +ext="Hello World, MyActivity" + /> + \ No newline at end of file diff --git a/plugins/android/testData/lint/suppressingInXml1.xml b/plugins/android/testData/lint/suppressingInXml1.xml new file mode 100644 index 000000000000..5c34192b9888 --- /dev/null +++ b/plugins/android/testData/lint/suppressingInXml1.xml @@ -0,0 +1,12 @@ + + + +ext="Hello World, MyActivity" + /> + \ No newline at end of file diff --git a/plugins/android/testData/lint/suppressingInXml2.xml b/plugins/android/testData/lint/suppressingInXml2.xml new file mode 100644 index 000000000000..cf13ead019f0 --- /dev/null +++ b/plugins/android/testData/lint/suppressingInXml2.xml @@ -0,0 +1,12 @@ + + + +ext="Hello World, MyActivity" + /> + \ No newline at end of file diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java index f850ce2315ec..4c76b9f995d7 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java @@ -195,6 +195,34 @@ public class AndroidLintTest extends AndroidTestCase { doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintIconDuplicatesInspection()); } + public void testSuppressingInXml1() throws Exception { + doTestNoFix(new AndroidLintInspectionToolProvider.AndroidLintHardcodedTextInspection(), + "/res/layout/layout.xml", "xml"); + } + + public void testSuppressingInXml2() throws Exception { + doTestNoFix(new AndroidLintInspectionToolProvider.AndroidLintHardcodedTextInspection(), + "/res/layout/layout.xml", "xml"); + } + + public void testSuppressingInXml3() throws Exception { + createManifest(); + myFixture.copyFileToProject(getGlobalTestDir() + "/layout.xml", "res/layout/layout.xml"); + doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintHardcodedTextInspection()); + } + + public void testSuppressingInJava() throws Exception { + createManifest(); + myFixture.copyFileToProject(getGlobalTestDir() + "/MyActivity.java", "src/p1/p2/MyActivity.java"); + doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintUseValueOfInspection()); + } + + public void testLintInJavaFile() throws Exception { + createManifest(); + myFixture.copyFileToProject(getGlobalTestDir() + "/MyActivity.java", "src/p1/p2/MyActivity.java"); + doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintUseValueOfInspection()); + } + private void doGlobalInspectionTest(@NotNull AndroidLintInspectionBase inspection) { final GlobalInspectionToolWrapper wrapper = new GlobalInspectionToolWrapper(inspection); myFixture.enableInspections(wrapper);