From b7b2c779377aa3246abb5d00855ba5e0c52b1a15 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 23 Apr 2012 17:22:46 +0200 Subject: [PATCH 1/5] IDEA-84976 (Create inspection "non final field in enum") --- .../InspectionGadgets/src/META-INF/plugin.xml | 4 ++ .../siyeh/InspectionGadgetsBundle.properties | 4 +- .../NonFinalFieldInEnumInspection.java | 66 +++++++++++++++++++ .../NonFinalFieldInEnum.html | 7 ++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/NonFinalFieldInEnumInspection.java create mode 100644 plugins/InspectionGadgets/src/inspectionDescriptions/NonFinalFieldInEnum.html diff --git a/plugins/InspectionGadgets/src/META-INF/plugin.xml b/plugins/InspectionGadgets/src/META-INF/plugin.xml index cc4fbc49ed02..d90721dcaec5 100644 --- a/plugins/InspectionGadgets/src/META-INF/plugin.xml +++ b/plugins/InspectionGadgets/src/META-INF/plugin.xml @@ -452,6 +452,10 @@ key="multiple.top.level.classes.in.file.display.name" groupBundle="messages.InspectionsBundle" groupKey="group.names.class.structure" enabledByDefault="false" level="WARNING" implementationClass="com.siyeh.ig.classlayout.MultipleTopLevelClassesInFileInspection"/> + #ref fr ambiguous.field.access.quickfix=Qualify field access with 'super.' string.builder.replaceable.by.string.quickfix=Replace 'StringBuilder' with 'String' string.buffer.replaceable.by.string.quickfix=Replace 'StringBuffer' with 'String' -add.0.to.ignore.if.annotated.by.list.quickfix=Add ''{0}'' to ''Ignore if annotated by'' list \ No newline at end of file +add.0.to.ignore.if.annotated.by.list.quickfix=Add ''{0}'' to ''Ignore if annotated by'' list +non.final.field.in.enum.display.name=Non-'final' field in enum +non.final.field.in.enum.problem.descriptor=non-''final'' field #ref in enum ''{0}'' \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/NonFinalFieldInEnumInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/NonFinalFieldInEnumInspection.java new file mode 100644 index 000000000000..967ab5f5c944 --- /dev/null +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/NonFinalFieldInEnumInspection.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2012 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 com.siyeh.ig.classlayout; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiModifier; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +/** + * @author Bas Leijdekkers + */ +public class NonFinalFieldInEnumInspection extends BaseInspection { + + @Nls + @NotNull + @Override + public String getDisplayName() { + return InspectionGadgetsBundle.message("non.final.field.in.enum.display.name"); + } + + @NotNull + @Override + protected String buildErrorString(Object... infos) { + final PsiClass enumClass = (PsiClass)infos[0]; + return InspectionGadgetsBundle.message("non.final.field.in.enum.problem.descriptor", enumClass.getName()); + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new NonFinalFieldInEnumVisitor(); + } + + private static class NonFinalFieldInEnumVisitor extends BaseInspectionVisitor { + + @Override + public void visitField(PsiField field) { + super.visitField(field); + final PsiClass containingClass = field.getContainingClass(); + if (containingClass == null || !containingClass.isEnum()) { + return; + } + if (field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerFieldError(field, containingClass); + } + } +} diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/NonFinalFieldInEnum.html b/plugins/InspectionGadgets/src/inspectionDescriptions/NonFinalFieldInEnum.html new file mode 100644 index 000000000000..b8d4d271100f --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/NonFinalFieldInEnum.html @@ -0,0 +1,7 @@ + + +This inspection reports non-final fields in enumeration types. A non-final field in an enum is rarely needed. +

+New in 12, Powered by InspectionGadgets + + \ No newline at end of file From 9e27f74af9dc89c216a949c9b888c782605dbe5f Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 25 Apr 2012 12:46:20 +0400 Subject: [PATCH 2/5] IDEA-74316 multiple useless keyboard shortcut actions for 'analyze stacktrace' action renamed --- plugins/tasks/tasks-core/src/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tasks/tasks-core/src/META-INF/plugin.xml b/plugins/tasks/tasks-core/src/META-INF/plugin.xml index 5fdb35cd09cb..48e19c22d032 100644 --- a/plugins/tasks/tasks-core/src/META-INF/plugin.xml +++ b/plugins/tasks/tasks-core/src/META-INF/plugin.xml @@ -33,7 +33,7 @@ - + From 6f23091dab328fc55b2971d5ff05a191c8ae1b29 Mon Sep 17 00:00:00 2001 From: Alexander Doroshko Date: Wed, 25 Apr 2012 13:31:03 +0400 Subject: [PATCH 3/5] *.ane (AIR native extension) files have 'archive' file type --- .../openapi/fileTypes/impl/PlatformFileTypeFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/PlatformFileTypeFactory.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/PlatformFileTypeFactory.java index 22923e70a7d2..21aa28b4b20f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/PlatformFileTypeFactory.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/PlatformFileTypeFactory.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull; */ public class PlatformFileTypeFactory extends FileTypeFactory { public void createFileTypes(@NotNull final FileTypeConsumer consumer) { - consumer.consume(new ArchiveFileType(), "zip;jar;war;ear;swc;egg;apk"); + consumer.consume(new ArchiveFileType(), "zip;jar;war;ear;swc;ane;egg;apk"); consumer.consume(PlainTextFileType.INSTANCE, "txt;sh;bat;cmd;policy;log;cgi;MF;jad;jam;htaccess"); consumer.consume(NativeFileType.INSTANCE, "doc;xls;ppt;mdb;vsd;pdf;hlp;chm;odt"); consumer.consume(UnknownFileType.INSTANCE); From 44f6c5dafbb05f95e7494a074814a0b1d7e0b919 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 25 Apr 2012 13:57:03 +0400 Subject: [PATCH 4/5] Remove outdated test --- .../execution/MavenRunnerSettingsTest.java | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsTest.java diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsTest.java deleted file mode 100644 index 7871b33e31e2..000000000000 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2000-2009 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.idea.maven.execution; - -import com.intellij.openapi.command.WriteCommandAction; -import org.jetbrains.idea.maven.MavenImportingTestCase; -import com.intellij.openapi.projectRoots.ProjectJdkTable; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.application.ApplicationManager; - -public class MavenRunnerSettingsTest extends MavenImportingTestCase { - private Sdk[] myOldJdks; - - @Override - protected void setUpInWriteAction() throws Exception { - super.setUpInWriteAction(); - myOldJdks = ProjectJdkTable.getInstance().getAllJdks(); - for (Sdk each : myOldJdks) { - ProjectJdkTable.getInstance().removeJdk(each); - } - } - - @Override - protected void tearDown() throws Exception { - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - for (Sdk each : myOldJdks) { - ProjectJdkTable.getInstance().addJdk(each); - } - } - }); - super.tearDown(); - } - - public void testUsingLatestAvailableJdk() throws Exception { - new WriteCommandAction.Simple(myProject) { - @Override - protected void run() throws Throwable { - Sdk jdk3 = createJdk("Java 1.3"); - Sdk jdk4 = createJdk("Java 1.4"); - Sdk jdk5 = createJdk("Java 1.5"); - ProjectJdkTable.getInstance().addJdk(jdk3); - ProjectJdkTable.getInstance().addJdk(jdk5); - ProjectJdkTable.getInstance().addJdk(jdk4); - - try { - MavenRunnerSettings settings = new MavenRunnerSettings(); - assertEquals("Java 1.5", settings.getJreName()); - } - finally { - ProjectJdkTable.getInstance().removeJdk(jdk3); - ProjectJdkTable.getInstance().removeJdk(jdk4); - ProjectJdkTable.getInstance().removeJdk(jdk5); - } - } - }.execute().throwException(); - } - - public void testUsingInternalJdkIfNoOtherIsDefined() throws Exception { - MavenRunnerSettings settings = new MavenRunnerSettings(); - assertEquals(MavenRunnerSettings.USE_INTERNAL_JAVA, settings.getJreName()); - } -} From d5324592631c26c2542a55e237e27dcf3925fe92 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 25 Apr 2012 11:57:57 +0200 Subject: [PATCH 5/5] better check if class can contain static fields --- .../src/com/siyeh/ig/psiutils/ClassUtils.java | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java index b7239520d5ec..107b3ec5749c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java @@ -170,18 +170,34 @@ public class ClassUtils { @Nullable public static PsiClass getContainingStaticClass(PsiElement element) { - PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); - if (aClass == null) { - return null; - } - PsiClass containingClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class); - while (containingClass != null && !containingClass.hasModifierProperty(PsiModifier.STATIC) && !containingClass.isInterface()) { - aClass = containingClass; - containingClass = aClass.getContainingClass(); + PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class, false, PsiFile.class); + while (isNonStaticClass(aClass)) { + aClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class, true, PsiFile.class); } return aClass; } + public static boolean isNonStaticClass(@Nullable PsiClass aClass) { + if (aClass == null) { + return false; + } + if (aClass.hasModifierProperty(PsiModifier.STATIC) || aClass.isInterface() || aClass.isEnum()) { + return false; + } + if (aClass instanceof PsiAnonymousClass) { + return true; + } + final PsiElement parent = aClass.getParent(); + if (parent == null || parent instanceof PsiFile) { + return false; + } + if (!(parent instanceof PsiClass)) { + return true; + } + final PsiClass parentClass = (PsiClass)parent; + return !parentClass.isInterface(); + } + public static boolean isClassVisibleFromClass(PsiClass baseClass, PsiClass referencedClass) { if (referencedClass.hasModifierProperty(PsiModifier.PUBLIC)) {