From 5b0f10f1a29022e8cf5d1266784223ad55b8fdb8 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 13 May 2015 16:30:59 +0200 Subject: [PATCH 01/16] IDEA-140211 ctrl-k does not work in a lot of inputs --- .../intellij/openapi/editor/actions/CutLineEndAction.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineEndAction.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineEndAction.java index eeb11f747bbd..838567887f25 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineEndAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineEndAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -24,9 +24,7 @@ */ package com.intellij.openapi.editor.actions; -import com.intellij.openapi.editor.actionSystem.EditorAction; - -public class CutLineEndAction extends EditorAction { +public class CutLineEndAction extends TextComponentEditorAction { public CutLineEndAction() { super(new CutLineActionHandler(false, true, true)); } From d5aad3da7f36c701112b4955e6158e0e5fd46c1c Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 12 May 2015 22:57:33 +0200 Subject: [PATCH 02/16] IG: better inspection name --- .../src/com/siyeh/InspectionGadgetsBundle.properties | 2 +- .../src/inspectionDescriptions/ExtendsThread.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 72cfc49ce453..73d9732b2499 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -655,7 +655,7 @@ unsecure.random.number.generation.display.name=Insecure random number generation parameters.per.method.display.name=Method with too many parameters parameters.per.constructor.display.name=Constructor with too many parameters unnecessary.unboxing.display.name=Unnecessary unboxing -extends.thread.display.name=Class explicitly extends 'java.lang.Thread' +extends.thread.display.name=Class directly extends 'java.lang.Thread' misspelled.tear.down.display.name='teardown()' instead of 'tearDown()' test.case.with.constructor.display.name=JUnit TestCase with non-trivial constructors parameter.name.differs.from.overridden.parameter.display.name=Parameter name differs from parameter in overridden method diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThread.html b/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThread.html index 03442273e59e..109ece432a36 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThread.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThread.html @@ -1,6 +1,6 @@ -Reports any clases which extend java.lang.Thread. +Reports any classes which directly extend java.lang.Thread. It is usually thought better practice to delegate to rather than extend java.lang.Thread, so that a thread creator may exert better control over the thread's behavior, and to better localize all concurrency related operations. From 6bbb76cbf328ec33080a8c3b048e8e5d6b9d9c07 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 13:01:41 +0200 Subject: [PATCH 03/16] IG: fix "Unchecked exception class" inspection --- .../UncheckedExceptionClassInspection.java | 14 ++----- .../UncheckedExceptionClass.java | 5 +++ ...UncheckedExceptionClassInspectionTest.java | 37 +++++++++++++++++++ 3 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/unchecked_exception_class/UncheckedExceptionClass.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java index 098ba559e869..6998c06666b9 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,19 +44,11 @@ public class UncheckedExceptionClassInspection extends BaseInspection { return new UncheckedExceptionClassVisitor(); } - private static class UncheckedExceptionClassVisitor - extends BaseInspectionVisitor { + private static class UncheckedExceptionClassVisitor extends BaseInspectionVisitor { @Override public void visitClass(@NotNull PsiClass aClass) { - if (!InheritanceUtil.isInheritor(aClass, - CommonClassNames.JAVA_LANG_THROWABLE)) { - return; - } - if (InheritanceUtil.isInheritor(aClass, - CommonClassNames.JAVA_LANG_EXCEPTION) && - !InheritanceUtil.isInheritor(aClass, - CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { return; } registerClassError(aClass); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/unchecked_exception_class/UncheckedExceptionClass.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/unchecked_exception_class/UncheckedExceptionClass.java new file mode 100644 index 000000000000..abfb775a1533 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/unchecked_exception_class/UncheckedExceptionClass.java @@ -0,0 +1,5 @@ +public class UncheckedExceptionClass extends RuntimeException { + +} +class E1 extends Throwable {} +class E2 extends Exception {} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspectionTest.java new file mode 100644 index 000000000000..c5a7d031c627 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspectionTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2015 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.errorhandling; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import junit.framework.TestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class UncheckedExceptionClassInspectionTest extends LightInspectionTestCase { + + public void testUncheckedExceptionClass() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new UncheckedExceptionClassInspection(); + } +} \ No newline at end of file From 9e77eb68c40724084526a74e810d0b93e52405db Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 13:10:06 +0200 Subject: [PATCH 04/16] IG: fix "Checked exception class" inspection --- .../CheckedExceptionClassInspection.java | 12 +++--- .../CheckedExceptionClass.java | 5 +++ .../CheckedExceptionClassInspectionTest.java | 37 +++++++++++++++++++ 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/checked_exception_class/CheckedExceptionClass.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/CheckedExceptionClassInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java index 0e4ea4686c64..94032f46d75d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,16 +44,14 @@ public class CheckedExceptionClassInspection extends BaseInspection { return new CheckedExceptionClassVisitor(); } - private static class CheckedExceptionClassVisitor - extends BaseInspectionVisitor { + private static class CheckedExceptionClassVisitor extends BaseInspectionVisitor { + @Override public void visitClass(@NotNull PsiClass aClass) { - if (!InheritanceUtil.isInheritor(aClass, - CommonClassNames.JAVA_LANG_THROWABLE)) { + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_EXCEPTION)) { return; } - if (InheritanceUtil.isInheritor(aClass, - CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { return; } registerClassError(aClass); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/checked_exception_class/CheckedExceptionClass.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/checked_exception_class/CheckedExceptionClass.java new file mode 100644 index 000000000000..ab5544f107f3 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/checked_exception_class/CheckedExceptionClass.java @@ -0,0 +1,5 @@ +public class CheckedExceptionClass extends Exception { + +} +class E1 extends RuntimeException {} +class E2 extends Throwable {} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/CheckedExceptionClassInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/CheckedExceptionClassInspectionTest.java new file mode 100644 index 000000000000..2ec0b3164c4e --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/CheckedExceptionClassInspectionTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2015 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.errorhandling; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import junit.framework.TestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class CheckedExceptionClassInspectionTest extends LightInspectionTestCase { + + public void testCheckedExceptionClass() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new CheckedExceptionClassInspection(); + } +} \ No newline at end of file From fa290059d904687db6a19356313ff4a47cc9597f Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 15:01:48 +0200 Subject: [PATCH 05/16] IG: better problem descriptor --- .../src/com/siyeh/InspectionGadgetsBundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 73d9732b2499..31e469248f35 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1005,8 +1005,8 @@ call.to.native.method.while.locked.problem.descriptor=Call to native method #ref should probably be replaced with 'notifyAll()' #loc condition.signal.problem.descriptor=#ref should probably be replaced with 'signalAll()' #loc thread.with.default.run.method.problem.descriptor=Instantiating a #ref with default 'run()' method #loc -extends.thread.problem.descriptor=Class #ref explicitly extends 'java.lang.Thread' #loc -anonymous.extends.thread.problem.descriptor=Anonymous class explicitly extends 'java.lang.Thread' #loc +extends.thread.problem.descriptor=Class #ref directly extends 'java.lang.Thread' #loc +anonymous.extends.thread.problem.descriptor=Anonymous class directly extends 'java.lang.Thread' #loc naked.notify.problem.descriptor=Call to #ref() without corresponding state change #loc unconditional.wait.problem.descriptor=Unconditional call to #ref() #loc system.run.finalizers.on.exit.problem.descriptor=Call to System.#ref() #loc From fc3dfbc7d5ebfc73c3643388b7e4abf6f0be6c17 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 15:34:49 +0200 Subject: [PATCH 06/16] IG: new "Class directly extends 'java.lang.Throwable'" inspection --- .../src/META-INF/InspectionGadgets.xml | 3 + .../siyeh/InspectionGadgetsBundle.properties | 5 +- .../ExtendsThrowableInspection.java | 73 +++++++++++++++++++ .../ExtendsThrowable.html | 12 +++ .../extends_throwable/ExtendsThrowable.java | 9 +++ .../ExtendsThrowableInspectionTest.java | 37 ++++++++++ 6 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/ExtendsThrowableInspection.java create mode 100644 plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThrowable.html create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/extends_throwable/ExtendsThrowable.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/ExtendsThrowableInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml index 72abb63674a9..33526b0c1062 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml @@ -860,6 +860,9 @@ level="WARNING" implementationClass="com.siyeh.ig.encapsulation.UseOfAnotherObjectsPrivateFieldInspection"/> + #ref replacea equals.replaceable.by.objects.call.quickfix=Replace with 'Objects.equals()' expression array.objects.equals.display.name='Objects.equals()' called on arrays array.objects.equals.problem.descriptor=Objects.#ref() on arrays should probably be 'Arrays.equals()' #loc -array.objects.deep.equals.problem.descriptor=Objects.#ref() on arrays should probably be 'Arrays.deepEquals()' #loc \ No newline at end of file +array.objects.deep.equals.problem.descriptor=Objects.#ref() on arrays should probably be 'Arrays.deepEquals()' #loc +extends.throwable.display.name=Class directly extends 'java.lang.Throwable' +anonymous.extends.throwable.problem.descriptor=Anonymous class directly extends 'java.lang.Throwable' \#loc +extends.throwable.problem.descriptor=class \#ref directly extends 'java.lang.Throwable' \#loc \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/ExtendsThrowableInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/ExtendsThrowableInspection.java new file mode 100644 index 000000000000..b352db1a40a6 --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/ExtendsThrowableInspection.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2015 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.errorhandling; + +import com.intellij.psi.CommonClassNames; +import com.intellij.psi.PsiAnonymousClass; +import com.intellij.psi.PsiClass; +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 ExtendsThrowableInspection extends BaseInspection { + + @Nls + @NotNull + @Override + public String getDisplayName() { + return InspectionGadgetsBundle.message("extends.throwable.display.name"); + } + + @NotNull + @Override + protected String buildErrorString(Object... infos) { + final PsiClass aClass = (PsiClass)infos[0]; + if (aClass instanceof PsiAnonymousClass) { + return InspectionGadgetsBundle.message("anonymous.extends.throwable.problem.descriptor"); + } else { + return InspectionGadgetsBundle.message("extends.throwable.problem.descriptor"); + } + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new ExtendsThrowableVisitor(); + } + + private static class ExtendsThrowableVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@NotNull PsiClass aClass) { + if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { + return; + } + final PsiClass superClass = aClass.getSuperClass(); + if (superClass == null) { + return; + } + final String superclassName = superClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_THROWABLE.equals(superclassName)) { + return; + } + registerClassError(aClass, aClass); + } + } +} diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThrowable.html b/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThrowable.html new file mode 100644 index 000000000000..242501c9ff64 --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/ExtendsThrowable.html @@ -0,0 +1,12 @@ + + +Reports any classes which directly extend java.lang.Throwable. +It is generally considered bad practice to extend java.lang.Throwable directly and +it is usually enough to extend either java.lang.RuntimeException or java.lang.Exception or in special +cases java.lang.Error. + +

+New in 15 +

+ + \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/extends_throwable/ExtendsThrowable.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/extends_throwable/ExtendsThrowable.java new file mode 100644 index 000000000000..8497c60f1b9c --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/errorhandling/extends_throwable/ExtendsThrowable.java @@ -0,0 +1,9 @@ +public class ExtendsThrowable extends Throwable { + + void f() { + new Throwable() { + void b() {} + }; + } +} +class E1 extends Exception {} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/ExtendsThrowableInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/ExtendsThrowableInspectionTest.java new file mode 100644 index 000000000000..aa79519ca552 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/errorhandling/ExtendsThrowableInspectionTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2015 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.errorhandling; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import junit.framework.TestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class ExtendsThrowableInspectionTest extends LightInspectionTestCase { + + public void testExtendsThrowable() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new ExtendsThrowableInspection(); + } +} \ No newline at end of file From a3fe6000e825aa4dd6e0110b4101b628ee7df463 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 15:52:39 +0200 Subject: [PATCH 07/16] IG: "Method parameter naming convention" inspection should not warn on lambda parameters --- ...rameterNamingConventionInspectionBase.java | 10 ++--- .../ParameterNamingConvention.java | 14 +++++++ ...rameterNamingConventionInspectionTest.java | 39 +++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/naming/parameter_naming_convention/ParameterNamingConvention.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ParameterNamingConventionInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/ParameterNamingConventionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/ParameterNamingConventionInspectionBase.java index a4f1e11071cf..9f57a0dbce96 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/ParameterNamingConventionInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/ParameterNamingConventionInspectionBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -15,10 +15,7 @@ */ package com.siyeh.ig.naming; -import com.intellij.psi.PsiCatchSection; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiForeachStatement; -import com.intellij.psi.PsiParameter; +import com.intellij.psi.*; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import org.jetbrains.annotations.NotNull; @@ -90,7 +87,8 @@ public class ParameterNamingConventionInspectionBase extends ConventionInspectio public void visitParameter(@NotNull PsiParameter variable) { final PsiElement scope = variable.getDeclarationScope(); if (scope instanceof PsiCatchSection || - scope instanceof PsiForeachStatement) { + scope instanceof PsiForeachStatement || + scope instanceof PsiLambdaExpression) { return; } final String name = variable.getName(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/parameter_naming_convention/ParameterNamingConvention.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/parameter_naming_convention/ParameterNamingConvention.java new file mode 100644 index 000000000000..d359edfc1197 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/parameter_naming_convention/ParameterNamingConvention.java @@ -0,0 +1,14 @@ +package com.siyeh.igtest.naming.parameter_naming_convention; + +public class ParameterNamingConvention { + + void m(int a) {} + void n(int abcd) { + F f = (i) -> 10; + } + + interface F { + int a(int i); + } + +} diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ParameterNamingConventionInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ParameterNamingConventionInspectionTest.java new file mode 100644 index 000000000000..1e6a4c523e42 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ParameterNamingConventionInspectionTest.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2015 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.naming; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class ParameterNamingConventionInspectionTest extends LightInspectionTestCase { + + public void testParameterNamingConvention() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + final ParameterNamingConventionInspection inspection = new ParameterNamingConventionInspection(); + inspection.m_minLength = 3; + inspection.m_maxLength = 5; + return inspection; + } +} \ No newline at end of file From 244f808a8d3a14fddc6e07f856ee1a7286fb5d79 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 16:46:04 +0200 Subject: [PATCH 08/16] IG: new "Lambda parameter naming convention" inspection --- .../siyeh/InspectionGadgetsBundle.properties | 9 +- ...rameterNamingConventionInspectionBase.java | 98 +++++++++++++++++++ ...daParameterNamingConventionInspection.java | 30 ++++++ .../LambdaParameterNamingConvention.html | 13 +++ .../LambdaParameterNamingConvention.java | 12 +++ ...rameterNamingConventionInspectionTest.java | 39 ++++++++ 6 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionBase.java create mode 100644 plugins/InspectionGadgets/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspection.java create mode 100644 plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterNamingConvention.html create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/naming/lambda_parameter_naming_convention/LambdaParameterNamingConvention.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 0053016cc939..dfbdf6054b4e 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -2159,5 +2159,10 @@ array.objects.equals.display.name='Objects.equals()' called on arrays array.objects.equals.problem.descriptor=Objects.#ref() on arrays should probably be 'Arrays.equals()' #loc array.objects.deep.equals.problem.descriptor=Objects.#ref() on arrays should probably be 'Arrays.deepEquals()' #loc extends.throwable.display.name=Class directly extends 'java.lang.Throwable' -anonymous.extends.throwable.problem.descriptor=Anonymous class directly extends 'java.lang.Throwable' \#loc -extends.throwable.problem.descriptor=class \#ref directly extends 'java.lang.Throwable' \#loc \ No newline at end of file +anonymous.extends.throwable.problem.descriptor=Anonymous class directly extends 'java.lang.Throwable' #loc +extends.throwable.problem.descriptor=class #ref directly extends 'java.lang.Throwable' #loc +lambda.parameter.naming.convention.display.name=Lambda parameter naming convention +lambda.parameter.naming.convention.problem.descriptor.short=Lambda parameter name #ref is too short #loc +lambda.parameter.naming.convention.problem.descriptor.long=Lambda parameter name #ref is too long #loc +lambda.parameter.naming.convention.problem.descriptor.regex.mismatch=Lambda parameter name #ref doesn''t match regex ''{0}'' #loc + diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionBase.java new file mode 100644 index 000000000000..6434ba6a21bc --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionBase.java @@ -0,0 +1,98 @@ +/* + * Copyright 2000-2015 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.naming; + +import com.intellij.psi.*; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.BaseInspectionVisitor; +import org.jetbrains.annotations.NotNull; + +/** + * @author Bas Leijdekkers + */ +public class LambdaParameterNamingConventionInspectionBase extends ConventionInspection { + + private static final int DEFAULT_MIN_LENGTH = 1; + private static final int DEFAULT_MAX_LENGTH = 20; + + @Override + @NotNull + public String getID() { + return "LambdaParameterNamingConvention"; + } + + @Override + @NotNull + public String getDisplayName() { + return InspectionGadgetsBundle.message("lambda.parameter.naming.convention.display.name"); + } + + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } + + @Override + @NotNull + public String buildErrorString(Object... infos) { + final String parameterName = (String)infos[0]; + if (parameterName.length() < getMinLength()) { + return InspectionGadgetsBundle.message("lambda.parameter.naming.convention.problem.descriptor.short"); + } + else if (parameterName.length() > getMaxLength()) { + return InspectionGadgetsBundle.message("lambda.parameter.naming.convention.problem.descriptor.long"); + } + else { + return InspectionGadgetsBundle.message("lambda.parameter.naming.convention.problem.descriptor.regex.mismatch", getRegex()); + } + } + + @Override + protected String getDefaultRegex() { + return "[a-z][A-Za-z\\d]*"; + } + + @Override + protected int getDefaultMinLength() { + return DEFAULT_MIN_LENGTH; + } + + @Override + protected int getDefaultMaxLength() { + return DEFAULT_MAX_LENGTH; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new NamingConventionsVisitor(); + } + + private class NamingConventionsVisitor extends BaseInspectionVisitor { + + @Override + public void visitParameter(@NotNull PsiParameter variable) { + final PsiElement scope = variable.getDeclarationScope(); + if (!(scope instanceof PsiLambdaExpression)) { + return; + } + final String name = variable.getName(); + if (name == null || isValid(name)) { + return; + } + registerVariableError(variable, name); + } + } +} diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspection.java new file mode 100644 index 000000000000..036aeda24bb2 --- /dev/null +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/LambdaParameterNamingConventionInspection.java @@ -0,0 +1,30 @@ +/* + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers + * + * 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.naming; + +import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.fixes.RenameFix; + +/** + * @author Bas Leijdekkers + */ +public class LambdaParameterNamingConventionInspection extends LambdaParameterNamingConventionInspectionBase { + + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new RenameFix(); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterNamingConvention.html b/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterNamingConvention.html new file mode 100644 index 000000000000..79adb48a71d9 --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/LambdaParameterNamingConvention.html @@ -0,0 +1,13 @@ + + +Reports lambda parameters whose names are either too short, too long, or do not follow +the specified regular expression pattern. + +

+Use the fields below to specify minimum length, maximum length and regular expression expected for method parameter names. +Specify 0 to not check the length of names. Regular expressions are in standard java.util.regex format. +

+New in 15 +

+ + \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/lambda_parameter_naming_convention/LambdaParameterNamingConvention.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/lambda_parameter_naming_convention/LambdaParameterNamingConvention.java new file mode 100644 index 000000000000..02fd7e3fd974 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/lambda_parameter_naming_convention/LambdaParameterNamingConvention.java @@ -0,0 +1,12 @@ +public class LambdaParameterNamingConvention { + + void m(int a) {} + void n(int abcd) { + F f = (i) -> 10; + F g = abc -> 12; + } + + interface F { + int a(int i); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionTest.java new file mode 100644 index 000000000000..727985fbf22c --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/LambdaParameterNamingConventionInspectionTest.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2015 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.naming; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import junit.framework.TestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class LambdaParameterNamingConventionInspectionTest extends LightInspectionTestCase { + + public void testLambdaParameterNamingConvention() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + final LambdaParameterNamingConventionInspection inspection = new LambdaParameterNamingConventionInspection(); + inspection.m_minLength = 2; + return inspection; + } +} \ No newline at end of file From cd0549d53ff65eb6f784941784595307757c4097 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 May 2015 16:46:55 +0200 Subject: [PATCH 09/16] IG: remove unused telemetry properties --- .../src/com/siyeh/InspectionGadgetsBundle.properties | 8 -------- 1 file changed, 8 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index dfbdf6054b4e..5dd040bb66b2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -192,14 +192,6 @@ non.constant.logger.display.name=Non-constant logger non.constant.logger.problem.descriptor=Non-constant logger field #ref #loc public.method.without.logging.display.name='public' method without logging public.method.without.logging.problem.descriptor='public' method #ref() has no logging call #loc -action.reset.telemetry.description=Reset telemetry data - -telemetry.table.column.inspection.name=Inspection -telemetry.table.column.total.time=Total Run Time (ms) -telemetry.table.column.average.time=Average Run Time (ms) -telemetry.table.column.run.count=Run Count -telemetry.toolwindow.title=IG Telemetry -action.telemetry.refresh.description=Refresh telemetry display finalize.doesnt.call.super.display.name='finalize()' does not call 'super.finalize()' finalize.doesnt.call.super.ignore.option=Ignore for direct subclasses of 'java.lang.Object' ignore.trivial.finalizers.option=Ignore for trivial 'finalize()' implementations From d31a9c70de71fe3e192433457738c2a8664aa1c9 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 13 May 2015 16:50:52 +0200 Subject: [PATCH 10/16] make Cut Line Backward action available in plain text components --- .../openapi/editor/actions/CutLineBackwardAction.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineBackwardAction.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineBackwardAction.java index 47705c4a65b7..dc980b6869f3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineBackwardAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/CutLineBackwardAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -18,9 +18,7 @@ package com.intellij.openapi.editor.actions; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler; -import org.jetbrains.annotations.NotNull; /** * Stands for emacs 'reverse-kill-line' action, i.e. @@ -30,7 +28,7 @@ import org.jetbrains.annotations.NotNull; * @author Denis Zhdanov * @since 4/18/11 1:22 PM */ -public class CutLineBackwardAction extends EditorAction { +public class CutLineBackwardAction extends TextComponentEditorAction { public CutLineBackwardAction() { super(new Handler()); From 2df9e13506d3ccb80404df9c97b4e9d18e82666f Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 13 May 2015 17:56:41 +0300 Subject: [PATCH 11/16] The name of the Vim emulation plugin is "IdeaVim", "IdeaVIM" is the plugin ID --- .../src/com/intellij/ide/customize/PluginGroups.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ide/customize/PluginGroups.java b/platform/platform-impl/src/com/intellij/ide/customize/PluginGroups.java index 63f34be6dca9..e380bca00865 100644 --- a/platform/platform-impl/src/com/intellij/ide/customize/PluginGroups.java +++ b/platform/platform-impl/src/com/intellij/ide/customize/PluginGroups.java @@ -204,7 +204,7 @@ public class PluginGroups { } protected static void addVimPlugin(Map featuredPlugins) { - featuredPlugins.put("IdeaVIM", "Editor:Emulates Vim editor:" + IDEA_VIM_PLUGIN_ID); + featuredPlugins.put("IdeaVim", "Editor:Emulates Vim editor:" + IDEA_VIM_PLUGIN_ID); } protected static void addLuaPlugin(Map featuredPlugins) { From 737faf33e7734b0d1b96d7bca88a1a1b0179f7d0 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Wed, 13 May 2015 19:13:58 +0400 Subject: [PATCH 12/16] IDEA-63779 Keymap shows characters for keys only for english keyboard layout correctly --- .../KeyboardSettingsExternalizable.java | 89 +++++++++++++++++ .../src/com/intellij/ide/IdeEventQueue.java | 5 +- .../openapi/editor/impl/EditorImpl.java | 17 ++-- ...ternationalizationNotificationManager.java | 95 +++++++++++++++++++ .../openapi/keymap/impl/ui/KeymapPanel.java | 57 ++++++----- .../src/messages/KeyMapBundle.properties | 1 + .../src/META-INF/PlatformExtensions.xml | 1 + 7 files changed, 232 insertions(+), 33 deletions(-) create mode 100644 platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java create mode 100644 platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java diff --git a/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java b/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java new file mode 100644 index 000000000000..43f2a8ef7615 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java @@ -0,0 +1,89 @@ +/* + * Copyright 2000-2015 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.intellij.openapi.keymap; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.*; +import com.sun.istack.internal.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.*; + +/** + * @author Denis Fokin + */ + +@State( + name = "KeyboardSettings", + storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/keyboard.xml")} +) +public class KeyboardSettingsExternalizable implements PersistentStateComponent { + + private static final String [] supportedNonEnglishLanguages = {"de", "fr", "it"}; + + public static boolean isSupportedKeyboardLayout(@NotNull Component component) { + String keyboardLayoutLanguage = getLanguageForComponent(component); + for (String language : supportedNonEnglishLanguages) { + if (language.equals(keyboardLayoutLanguage)) { + return true; + } + } + return false; + } + + public static String getLanguageForComponent(@NotNull Component component) { + return component.getInputContext().getLocale().getLanguage(); + } + + public static String getDisplayLanguageNameForComponent(@NotNull Component component) { + return component.getInputContext().getLocale().getDisplayLanguage(); + } + + public static final class OptionSet { + public boolean USE_NON_ENGLISH_KEYBOARD = false; + } + + private OptionSet myOptions = new OptionSet(); + + public static KeyboardSettingsExternalizable getInstance() { + if (ApplicationManager.getApplication().isDisposed()) { + return new KeyboardSettingsExternalizable(); + } + else { + return ServiceManager.getService(KeyboardSettingsExternalizable.class); + } + } + + @Nullable + @Override + public OptionSet getState() { + return myOptions; + } + + @Override + public void loadState(OptionSet state) { + myOptions = state; + } + + public boolean isNonEnglishKeyboardSupportEnabled () { + return myOptions.USE_NON_ENGLISH_KEYBOARD; + } + + public void setNonEnglishKeyboardSupportEnabled (boolean enabled) { + myOptions.USE_NON_ENGLISH_KEYBOARD = enabled; + } + +} diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index a33da1246a02..bfd8fecc4441 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -29,17 +29,16 @@ import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.FrequentEventDetector; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.keymap.KeyboardSettingsExternalizable; import com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher; import com.intellij.openapi.keymap.impl.IdeMouseEventDispatcher; import com.intellij.openapi.keymap.impl.KeyState; -import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.ExpirableRunnable; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeFocusManager; -import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.util.Alarm; import com.intellij.util.ReflectionUtil; @@ -411,7 +410,7 @@ public class IdeEventQueue extends EventQueue { //private static boolean altGrIsPressed = false; private static AWTEvent fixNonEnglishKeyboardLayouts(AWTEvent e) { - if (!Registry.is("ide.non.english.keyboard.layout.fix")) return e; + if (!KeyboardSettingsExternalizable.getInstance().isNonEnglishKeyboardSupportEnabled()) return e; if (e instanceof KeyEvent) { KeyEvent ke = (KeyEvent)e; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 033912f36fc9..c26ebceac9f7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -875,6 +875,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } } + private static boolean firstCharTyped = true; + private void initComponent() { myPanel.setLayout(new BorderLayout()); @@ -930,6 +932,14 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } myEditorComponent.addKeyListener(new KeyListener() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() >= KeyEvent.VK_A && e.getKeyCode() <= KeyEvent.VK_Z) { + myCharKeyPressed = true; + } + KeyboardInternationalizationNotificationManager.showNotification(); + } + @Override public void keyTyped(@NotNull KeyEvent event) { myNeedToSelectPreviousChar = false; @@ -941,13 +951,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } } - @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() >= KeyEvent.VK_A && e.getKeyCode() <= KeyEvent.VK_Z) { - myCharKeyPressed = true; - } - } - @Override public void keyReleased(KeyEvent e) { myCharKeyPressed = false; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java new file mode 100644 index 000000000000..cc251a7be79d --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java @@ -0,0 +1,95 @@ +/* + * Copyright 2000-2015 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.intellij.openapi.editor.impl; + +import com.intellij.notification.*; +import com.intellij.openapi.application.ApplicationNamesInfo; +import com.intellij.openapi.keymap.KeyboardSettingsExternalizable; +import com.intellij.openapi.keymap.impl.ui.KeymapPanel; +import com.intellij.openapi.options.ShowSettingsUtil; +import com.intellij.openapi.wm.IdeFrame; +import com.intellij.openapi.wm.ex.WindowManagerEx; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.event.HyperlinkEvent; +import java.awt.*; + +/** + * @author Denis Fokin + */ +public class KeyboardInternationalizationNotificationManager { + public static final String LOCALIZATION_GROUP_DISPLAY_ID = "Localization and Internationalization"; + public static boolean notificationHasBeenShown; + + private KeyboardInternationalizationNotificationManager() { + } + + public static void showNotification() { + + if (notificationHasBeenShown || !KeyboardSettingsExternalizable.isSupportedKeyboardLayout(WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow())) return; + + MyNotificationListener listener = + new MyNotificationListener(); + + Notifications.Bus.notify(createNotification(LOCALIZATION_GROUP_DISPLAY_ID, listener)); + notificationHasBeenShown = true; + } + + public static Notification createNotification(@NotNull final String groupDisplayId, @Nullable NotificationListener listener) { + + final String productName = ApplicationNamesInfo.getInstance().getProductName(); + + Window recentFocusedWindow = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); + + String text = + "We have found out that you are using a non-english keyboard layout. You can enable smart layout support for " + + KeyboardSettingsExternalizable.getDisplayLanguageNameForComponent(recentFocusedWindow) + " language." + + "You can change this option in the settings of " + productName + " more..."; + + String title = "Enable smart keyboard internalization for " + productName + "."; + + return new Notification(groupDisplayId, title, + text, + NotificationType.INFORMATION, + listener); + } + + private static class MyNotificationListener implements NotificationListener { + + public MyNotificationListener() { + } + + @Override + public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { + if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + final String description = event.getDescription(); + if ("enable".equals(description)) { + KeyboardSettingsExternalizable.getInstance().setNonEnglishKeyboardSupportEnabled(true); + } + else if ("settings".equals(description)) { + final ShowSettingsUtil util = ShowSettingsUtil.getInstance(); + IdeFrame ideFrame = WindowManagerEx.getInstanceEx().findFrameFor(null); + //util.editConfigurable((JFrame)ideFrame, new StatisticsConfigurable(true)); + util.showSettingsDialog(ideFrame.getProject(), KeymapPanel.class); + } + + NotificationsConfiguration.getNotificationsConfiguration().changeSettings(LOCALIZATION_GROUP_DISPLAY_ID, NotificationDisplayType.NONE, false, false); + notification.expire(); + } + } + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java index 582a3ef40a82..b3cb4f4e3417 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java @@ -26,10 +26,7 @@ import com.intellij.openapi.actionSystem.ex.QuickList; import com.intellij.openapi.actionSystem.ex.QuickListsManager; import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.keymap.KeyMapBundle; -import com.intellij.openapi.keymap.Keymap; -import com.intellij.openapi.keymap.KeymapManager; -import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.openapi.keymap.*; import com.intellij.openapi.keymap.ex.KeymapManagerEx; import com.intellij.openapi.keymap.impl.ActionShortcutRestrictions; import com.intellij.openapi.keymap.impl.KeymapImpl; @@ -52,6 +49,9 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.openapi.wm.IdeFrame; +import com.intellij.openapi.wm.impl.IdeFocusManagerImpl; import com.intellij.packageDependencies.ui.TreeExpansionMonitor; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.DoubleClickListener; @@ -91,6 +91,7 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi private JButton myCopyButton; private JButton myDeleteButton; private JButton myResetToDefault; + private JCheckBox myNonEnglishKeyboardSupportOption; private JLabel myBaseKeymapLabel; @@ -233,7 +234,12 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); panel.setLayout(new GridBagLayout()); - myCopyButton = new JButton(KeyMapBundle.message("copy.keymap.button")); + myCopyButton = new JButton(new AbstractAction(KeyMapBundle.message("copy.keymap.button")) { + @Override + public void actionPerformed(ActionEvent e) { + copyKeymap(); + } + }); Insets insets = new Insets(2, 2, 2, 2); myCopyButton.setMargin(insets); final GridBagConstraints gc = new GridBagConstraints(GridBagConstraints.RELATIVE, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 0), 0, 0); @@ -241,19 +247,28 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi myResetToDefault = new JButton(CommonBundle.message("button.reset")); myResetToDefault.setMargin(insets); panel.add(myResetToDefault, gc); - myDeleteButton = new JButton(KeyMapBundle.message("delete.keymap.button")); + myDeleteButton = new JButton(new AbstractAction(KeyMapBundle.message("delete.keymap.button")) { + @Override + public void actionPerformed(ActionEvent e) { + deleteKeymap(); + } + }); myDeleteButton.setMargin(insets); gc.weightx = 1; panel.add(myDeleteButton, gc); - - myCopyButton.addActionListener( - new ActionListener() { + IdeFrame ideFrame = IdeFocusManager.getGlobalInstance().getLastFocusedFrame(); + if (ideFrame != null && KeyboardSettingsExternalizable.isSupportedKeyboardLayout( ideFrame.getComponent())) + { + String displayLanguage = ideFrame.getComponent().getInputContext().getLocale().getDisplayLanguage(); + myNonEnglishKeyboardSupportOption = new JCheckBox(new AbstractAction(displayLanguage + " " + KeyMapBundle.message("use.non.english.keyboard.layout.support")) { @Override - public void actionPerformed(@NotNull ActionEvent e) { - copyKeymap(); + public void actionPerformed(ActionEvent e) { + KeyboardSettingsExternalizable.getInstance().setNonEnglishKeyboardSupportEnabled(myNonEnglishKeyboardSupportOption.isSelected()); } - } - ); + }); + myNonEnglishKeyboardSupportOption.setSelected(KeyboardSettingsExternalizable.getInstance().isNonEnglishKeyboardSupportEnabled()); + panel.add(myNonEnglishKeyboardSupportOption, gc); + } myResetToDefault.addActionListener(new ActionListener() { @Override @@ -262,16 +277,6 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi } }); - - myDeleteButton.addActionListener( - new ActionListener() { - @Override - public void actionPerformed(@NotNull ActionEvent e) { - deleteKeymap(); - } - } - ); - return panel; } @@ -790,6 +795,12 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi @Override public void reset() { + + if (myNonEnglishKeyboardSupportOption != null) { + KeyboardSettingsExternalizable.getInstance().setNonEnglishKeyboardSupportEnabled(false); + myNonEnglishKeyboardSupportOption.setSelected(KeyboardSettingsExternalizable.getInstance().isNonEnglishKeyboardSupportEnabled()); + } + myKeymapListModel.removeAllElements(); KeymapManagerEx keymapManager = KeymapManagerEx.getInstanceEx(); Keymap[] keymaps = keymapManager.getAllKeymaps(); diff --git a/platform/platform-resources-en/src/messages/KeyMapBundle.properties b/platform/platform-resources-en/src/messages/KeyMapBundle.properties index af1b161b85df..9b7101d48621 100644 --- a/platform/platform-resources-en/src/messages/KeyMapBundle.properties +++ b/platform/platform-resources-en/src/messages/KeyMapBundle.properties @@ -46,6 +46,7 @@ remove.keymap.label=Remo&ve unnamed.list.display.name=unnamed copy.keymap.button=&Copy delete.keymap.button=De&lete +use.non.english.keyboard.layout.support=la&yout support parent.keymap.label=Parent keymap: disable.mnemonic.in.menu.check.box=Disable mnemonics in &menu diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index b327ce02bb15..5354e1af2984 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -292,6 +292,7 @@ serviceImplementation="com.intellij.openapi.actionSystem.impl.AbbreviationManagerImpl"/> + From 14b4055579420ad16e8ee32c6fdfd86bc947cd39 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 13 May 2015 18:18:22 +0300 Subject: [PATCH 13/16] gradle tests: locate JDK by env variables if tests are running under JRE --- .../importing/GradleImportingTestCase.java | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java index 4878e88d007f..e58cd161ee4d 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java @@ -25,18 +25,25 @@ import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsListenerAdapter; import com.intellij.openapi.externalSystem.test.ExternalSystemImportingTestCase; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JdkUtil; +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.TestDialog; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PathUtil; +import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import org.gradle.util.GradleVersion; import org.gradle.wrapper.GradleWrapperMain; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.VersionMatcherRule; import org.jetbrains.plugins.gradle.settings.DistributionType; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; @@ -60,6 +67,7 @@ import java.util.Properties; import static org.jetbrains.plugins.gradle.tooling.builder.AbstractModelBuilderTest.DistributionLocator; import static org.jetbrains.plugins.gradle.tooling.builder.AbstractModelBuilderTest.SUPPORTED_GRADLE_VERSIONS; import static org.junit.Assume.assumeThat; +import static org.junit.Assume.assumeTrue; /** * @author Vladislav.Soroka @@ -77,20 +85,58 @@ public abstract class GradleImportingTestCase extends ExternalSystemImportingTes @org.junit.runners.Parameterized.Parameter(0) public String gradleVersion; private GradleProjectSettings myProjectSettings; + private String myGradleJdkName; @Override public void setUp() throws Exception { super.setUp(); assumeThat(gradleVersion, versionMatcherRule.getMatcher()); + final String jdkHome = getJdkHome(); + if (jdkHome != null) { + myGradleJdkName = "Gradle JDK"; + assertNull("JDK " + myGradleJdkName + " already exists", ProjectJdkTable.getInstance().findJdk(myGradleJdkName)); + new WriteAction() { + @Override + protected void run(@NotNull Result result) throws Throwable { + VirtualFile jdkHomeDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(jdkHome)); + Sdk jdk = SdkConfigurationUtil.setupSdk(new Sdk[0], jdkHomeDir, JavaSdk.getInstance(), true, null, myGradleJdkName); + assertNotNull("Cannot create JDK for " + jdkHome, jdk); + SdkConfigurationUtil.addSdk(jdk); + } + }.execute(); + } myProjectSettings = new GradleProjectSettings(); GradleSettings.getInstance(myProject).setGradleVmOptions("-Xmx64m -XX:MaxPermSize=64m"); System.setProperty(ExternalSystemExecutionSettings.REMOTE_PROCESS_IDLE_TTL_IN_MS_KEY, String.valueOf(GRADLE_DAEMON_TTL_MS)); configureWrapper(); } + @Nullable + private static String getJdkHome() { + String javaHome = SystemProperties.getJavaHome(); + List paths = + ContainerUtil.packNullables(javaHome, new File(javaHome).getParent(), System.getenv("JDK_16_x64"), System.getenv("JDK_16")); + for (String path : paths) { + if (JdkUtil.checkForJdk(new File(path))) { + return path; + } + } + assumeTrue("Cannot find JDK, checked paths: " + paths, false); + return null; + } + @Override public void tearDown() throws Exception { try { + new WriteAction() { + @Override + protected void run(@NotNull Result result) throws Throwable { + Sdk old = ProjectJdkTable.getInstance().findJdk(myGradleJdkName); + if (old != null) { + SdkConfigurationUtil.removeSdk(old); + } + } + }.execute(); Messages.setTestDialog(TestDialog.DEFAULT); FileUtil.delete(BuildManager.getInstance().getBuildSystemDirectory()); } @@ -136,7 +182,7 @@ public abstract class GradleImportingTestCase extends ExternalSystemImportingTes public void onProjectsLinked(@NotNull Collection settings) { final Object item = ContainerUtil.getFirstItem(settings); if (item instanceof GradleProjectSettings) { - ((GradleProjectSettings)item).setGradleJvm(null); + ((GradleProjectSettings)item).setGradleJvm(myGradleJdkName); } } }); From e3219677d4530cc36fce45c0914a01347b63c41e Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 13 May 2015 18:27:44 +0300 Subject: [PATCH 14/16] gradle AbstractModelBuilderTests: locate JDK by env variables if tests are running under JRE --- .../plugins/gradle/importing/GradleImportingTestCase.java | 2 +- .../gradle/tooling/builder/AbstractModelBuilderTest.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java index e58cd161ee4d..385584ce1ba0 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java @@ -112,7 +112,7 @@ public abstract class GradleImportingTestCase extends ExternalSystemImportingTes } @Nullable - private static String getJdkHome() { + public static String getJdkHome() { String javaHome = SystemProperties.getJavaHome(); List paths = ContainerUtil.packNullables(javaHome, new File(javaHome).getParent(), System.getenv("JDK_16_x64"), System.getenv("JDK_16")); diff --git a/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java b/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java index f2582ccd954d..7ec617d619d1 100644 --- a/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java +++ b/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java @@ -31,6 +31,7 @@ import org.gradle.tooling.model.idea.IdeaModule; import org.gradle.util.GradleVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.VersionMatcherRule; +import org.jetbrains.plugins.gradle.importing.GradleImportingTestCase; import org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel; import org.jetbrains.plugins.gradle.model.ClasspathEntryModel; import org.jetbrains.plugins.gradle.model.ProjectImportAction; @@ -135,6 +136,10 @@ public abstract class AbstractModelBuilderTest { BuildActionExecuter buildActionExecutor = connection.action(projectImportAction); File initScript = GradleExecutionHelper.generateInitScript(false, getToolingExtensionClasses()); assertNotNull(initScript); + String jdkHome = GradleImportingTestCase.getJdkHome(); + if (jdkHome != null) { + buildActionExecutor.setJavaHome(new File(jdkHome)); + } buildActionExecutor.setJvmArguments("-Xmx64m", "-XX:MaxPermSize=64m"); buildActionExecutor.withArguments("--info", "--recompile-scripts", GradleConstants.INIT_SCRIPT_CMD_OPTION, initScript.getAbsolutePath()); allModels = buildActionExecutor.run(); From 772645e074f718ce7aba8d810bf48f4e66a04e0b Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 13 May 2015 18:35:37 +0300 Subject: [PATCH 15/16] NotNull annotations (EA-44401) --- .../com/intellij/openapi/fileEditor/impl/EditorComposite.java | 2 +- .../openapi/fileEditor/impl/EditorWithProviderComposite.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java index 8c0dcf4df07e..6a343a2049dd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java @@ -456,7 +456,7 @@ public abstract class EditorComposite implements Disposable { myFocusWatcher.deinstall(myFocusWatcher.getTopComponent()); } - void addEditor(FileEditor editor) { + void addEditor(@NotNull FileEditor editor) { ApplicationManager.getApplication().assertIsDispatchThread(); FileEditor[] editors = ArrayUtil.append(myEditors, editor); if (myTabbedPaneWrapper == null) { diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWithProviderComposite.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWithProviderComposite.java index 0d66c13066ac..63677ed684c1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWithProviderComposite.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWithProviderComposite.java @@ -91,7 +91,7 @@ public class EditorWithProviderComposite extends EditorComposite { return new HistoryEntry(getFile(), providers, states, providers[selectedProviderIndex]); } - public void addEditor(FileEditor editor, FileEditorProvider provider) { + public void addEditor(@NotNull FileEditor editor, FileEditorProvider provider) { addEditor(editor); myProviders = ArrayUtil.append(myProviders, provider); } From 4bd7d2e71cb85a174d954ec281928c70fd588171 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 13 May 2015 17:36:05 +0200 Subject: [PATCH 16/16] IDEA-139638 Completion: Live template shouldn't have bigger priority than local variable --- .../completion/normalSorting/LiveTemplateOrdering.java | 5 +++++ .../completion/NormalCompletionOrderingTest.groovy | 7 +++++++ .../template/impl/LiveTemplateCompletionContributor.java | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/LiveTemplateOrdering.java diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/LiveTemplateOrdering.java b/java/java-tests/testData/codeInsight/completion/normalSorting/LiveTemplateOrdering.java new file mode 100644 index 000000000000..152c336a09c5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/LiveTemplateOrdering.java @@ -0,0 +1,5 @@ +class Foo { + public int main() { + r + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy index b472f87f9c8d..5334efaf0893 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -22,6 +22,7 @@ import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementPresentation import com.intellij.codeInsight.lookup.impl.LookupImpl +import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor import com.intellij.ide.ui.UISettings import com.intellij.psi.PsiClass import com.intellij.psi.PsiField @@ -670,4 +671,10 @@ interface TxANotAnno {} assertPreferredItems 0, 'get' } + public void testLiveTemplateOrdering() { + LiveTemplateCompletionContributor.setShowTemplatesInTests(true, getTestRootDisposable()) + checkPreferredItems(0, 'return') + assert lookup.items[-1].lookupString == 'ritar' + } + } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java index 0514a1f8df1a..6c9a8a083615 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java @@ -91,7 +91,9 @@ public class LiveTemplateCompletionContributor extends CompletionContributor { @Override public void consume(CompletionResult completionResult) { finalResult.passResult(completionResult); - ensureTemplatesShown(templatesShown, templates, parameters, finalResult); + if (completionResult.isStartMatch()) { + ensureTemplatesShown(templatesShown, templates, parameters, finalResult); + } } });