From 878732d038ec5aae28429c2753612fdc15e8066f Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 12 Dec 2012 09:55:14 +0100 Subject: [PATCH 01/18] base local quick fix --- .../codeInspection/LocalQuickFixBase.java | 51 +++++++++++++++++++ .../quickfix/ConvertToGayQuickFix.java | 19 ++----- .../ConvertToJBColorConstantQuickFix.java | 17 ++----- .../quickfix/ConvertToJBColorQuickFix.java | 17 ++----- 4 files changed, 61 insertions(+), 43 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java diff --git a/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java new file mode 100644 index 000000000000..1fd364e65060 --- /dev/null +++ b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java @@ -0,0 +1,51 @@ +/* + * 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.intellij.codeInspection; + +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author Konstantin Bulenkov + */ +public abstract class LocalQuickFixBase implements LocalQuickFix { + private final String myName; + private final String myFamilyName; + + public LocalQuickFixBase(String name) { + this(name, name); + } + + public LocalQuickFixBase(String name, String familyName) { + myName = name; + myFamilyName = familyName; + } + + @NotNull + @Override + public String getName() { + return myName; + } + + @NotNull + @Override + public String getFamilyName() { + return myFamilyName; + } + + @Override + public abstract void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor); +} diff --git a/plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java b/plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java index b987c5ae7060..a0b4985eb9d9 100644 --- a/plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java +++ b/plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * 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. @@ -15,7 +15,7 @@ */ package org.jetbrains.idea.devkit.inspections.quickfix; -import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.LocalQuickFixBase; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; @@ -28,25 +28,14 @@ import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov */ -public class ConvertToGayQuickFix implements LocalQuickFix { +public class ConvertToGayQuickFix extends LocalQuickFixBase { private final int myNum; public ConvertToGayQuickFix(int num) { + super("Convert to Gray._" + num, "Convert to Gray"); myNum = num; } - @NotNull - @Override - public String getName() { - return "Convert to Gray._" + myNum; - } - - @NotNull - @Override - public String getFamilyName() { - return "DevKit"; - } - @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); diff --git a/plugins/devkit/src/inspections/quickfix/ConvertToJBColorConstantQuickFix.java b/plugins/devkit/src/inspections/quickfix/ConvertToJBColorConstantQuickFix.java index 402f493feb22..fa65789bc1da 100644 --- a/plugins/devkit/src/inspections/quickfix/ConvertToJBColorConstantQuickFix.java +++ b/plugins/devkit/src/inspections/quickfix/ConvertToJBColorConstantQuickFix.java @@ -15,7 +15,7 @@ */ package org.jetbrains.idea.devkit.inspections.quickfix; -import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.LocalQuickFixBase; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; @@ -29,25 +29,14 @@ import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov */ -public class ConvertToJBColorConstantQuickFix implements LocalQuickFix { +public class ConvertToJBColorConstantQuickFix extends LocalQuickFixBase { private final String myConstantName; public ConvertToJBColorConstantQuickFix(String constantName) { + super("Convert to JBColor." + constantName, "Convert to JBColor"); myConstantName = constantName; } - @NotNull - @Override - public String getName() { - return "Convert to JBColor." + myConstantName; - } - - @NotNull - @Override - public String getFamilyName() { - return "Convert to JBColor"; - } - @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); diff --git a/plugins/devkit/src/inspections/quickfix/ConvertToJBColorQuickFix.java b/plugins/devkit/src/inspections/quickfix/ConvertToJBColorQuickFix.java index 69856ecf688f..2f6187b46278 100644 --- a/plugins/devkit/src/inspections/quickfix/ConvertToJBColorQuickFix.java +++ b/plugins/devkit/src/inspections/quickfix/ConvertToJBColorQuickFix.java @@ -15,7 +15,7 @@ */ package org.jetbrains.idea.devkit.inspections.quickfix; -import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.LocalQuickFixBase; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -31,20 +31,9 @@ import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov */ -public class ConvertToJBColorQuickFix implements LocalQuickFix { +public class ConvertToJBColorQuickFix extends LocalQuickFixBase { public ConvertToJBColorQuickFix() { - } - - @NotNull - @Override - public String getName() { - return "Convert to JBColor"; - } - - @NotNull - @Override - public String getFamilyName() { - return getName(); + super("Convert to JBColor"); } @Override From 015c59264261a1d710680f3348c7af17856b984d Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 12 Dec 2012 10:03:24 +0100 Subject: [PATCH 02/18] cosmetics --- .../codeInspection/LocalQuickFixBase.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java index 1fd364e65060..315957da3238 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java +++ b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixBase.java @@ -25,11 +25,22 @@ public abstract class LocalQuickFixBase implements LocalQuickFix { private final String myName; private final String myFamilyName; - public LocalQuickFixBase(String name) { + /** + * + * @param name the name of the quick fix + */ + protected LocalQuickFixBase(@NotNull String name) { this(name, name); } - public LocalQuickFixBase(String name, String familyName) { + /** + * + * @param name the name of the quick fix + * @param familyName text to appear in "Apply Fix" popup when multiple Quick Fixes exist (in the results of batch code inspection). For example, + * if the name of the quickfix is "Create template <filename>", the return value of getFamilyName() should be "Create template". + * If the name of the quickfix does not depend on a specific element, simply return getName(). + */ + protected LocalQuickFixBase(@NotNull String name, @NotNull String familyName) { myName = name; myFamilyName = familyName; } From 36de07318c890768e91d063060afc356010e70d5 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 12 Dec 2012 10:10:10 +0100 Subject: [PATCH 03/18] I'm sorry. I haven't mean it at all!!! --- plugins/devkit/src/inspections/UseGrayInspection.java | 8 ++++---- ...nvertToGayQuickFix.java => ConvertToGrayQuickFix.java} | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) rename plugins/devkit/src/inspections/quickfix/{ConvertToGayQuickFix.java => ConvertToGrayQuickFix.java} (94%) diff --git a/plugins/devkit/src/inspections/UseGrayInspection.java b/plugins/devkit/src/inspections/UseGrayInspection.java index 08dd1cdc29d1..18326f0b124d 100644 --- a/plugins/devkit/src/inspections/UseGrayInspection.java +++ b/plugins/devkit/src/inspections/UseGrayInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * 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. @@ -28,7 +28,7 @@ import com.intellij.ui.Gray; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.devkit.inspections.quickfix.ConvertToGayQuickFix; +import org.jetbrains.idea.devkit.inspections.quickfix.ConvertToGrayQuickFix; /** * @author Konstantin Bulenkov @@ -75,7 +75,7 @@ public class UseGrayInspection extends DevKitInspectionBase { int gg = Integer.parseInt(green.toString()); int bb = Integer.parseInt(blue.toString()); if (rr == gg && gg == bb && 0 <= rr && rr < 256) { - return manager.createProblemDescriptor(expression, "Convert to Gray._" + rr, new ConvertToGayQuickFix(rr), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); + return manager.createProblemDescriptor(expression, "Convert to Gray._" + rr, new ConvertToGrayQuickFix(rr), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); } } catch (Exception ignore){} } @@ -88,7 +88,7 @@ public class UseGrayInspection extends DevKitInspectionBase { try { int num = Integer.parseInt(literal.toString()); if (0 <= num && num < 256) { - return manager.createProblemDescriptor(expression, "Convert to Gray_" + num, new ConvertToGayQuickFix(num), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); + return manager.createProblemDescriptor(expression, "Convert to Gray_" + num, new ConvertToGrayQuickFix(num), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); } } catch (Exception ignore){} } diff --git a/plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java b/plugins/devkit/src/inspections/quickfix/ConvertToGrayQuickFix.java similarity index 94% rename from plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java rename to plugins/devkit/src/inspections/quickfix/ConvertToGrayQuickFix.java index a0b4985eb9d9..0b9dbb947639 100644 --- a/plugins/devkit/src/inspections/quickfix/ConvertToGayQuickFix.java +++ b/plugins/devkit/src/inspections/quickfix/ConvertToGrayQuickFix.java @@ -28,10 +28,10 @@ import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov */ -public class ConvertToGayQuickFix extends LocalQuickFixBase { +public class ConvertToGrayQuickFix extends LocalQuickFixBase { private final int myNum; - public ConvertToGayQuickFix(int num) { + public ConvertToGrayQuickFix(int num) { super("Convert to Gray._" + num, "Convert to Gray"); myNum = num; } From 6cec6a90780f6215a017ced5383d048f3fa29657 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 12 Dec 2012 10:48:13 +0400 Subject: [PATCH 04/18] IDEA-96860 Improper error reporting with type parameter --- .../plugins/groovy/GroovyBundle.properties | 3 ++- .../groovy/annotator/GroovyAnnotator.java | 24 +++++++++---------- .../plugins/groovy/LightGroovyTestCase.groovy | 11 +++++++++ .../GroovyHighlightingTest.groovy | 23 ++++++++++++++++-- .../VeryLongDfaWithComplexGenerics.groovy | 4 ++-- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties index 844827b8cd85..e56f14b9f4fb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties @@ -338,4 +338,5 @@ java.style.for.each.statement.requires.a.type.declaration=Java-style for-each st enums.may.not.have.extends.clause=Enums may not have 'extends' clause super.cannot.be.used.in.static.context='super' cannot be used in static context qualified.0.is.allowed.only.in.nested.or.inner.classes=Qualified {0} is allowed only in nested/inner classes -groovy.file.0=Groovy file ''{0}'' \ No newline at end of file +groovy.file.0=Groovy file ''{0}'' +type.argument.list.is.not.allowed.here=Type argument list is not allowed here \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index 20d01e2bff60..3a54d61cf4d7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -149,19 +149,16 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { @Override public void visitTypeArgumentList(GrTypeArgumentList typeArgumentList) { PsiElement parent = typeArgumentList.getParent(); - final PsiElement resolved; - if (parent instanceof GrReferenceElement) { - resolved = ((GrReferenceElement)parent).resolve(); - } - else { - resolved = null; - } + if (!(parent instanceof GrReferenceElement)) return; + + final GroovyResolveResult resolveResult = ((GrReferenceElement)parent).advancedResolve(); + final PsiElement resolved = resolveResult.getElement(); + final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); if (resolved == null) return; if (!(resolved instanceof PsiTypeParameterListOwner)) { - //myHolder.createErrorAnnotation(typeArgumentList, GroovyBundle.message("type.argument.list.is.no.a")) - //todo correct error description + myHolder.createWarningAnnotation(typeArgumentList, GroovyBundle.message("type.argument.list.is.not.allowed.here")); return; } @@ -173,8 +170,8 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { final GrTypeElement[] arguments = typeArgumentList.getTypeArgumentElements(); if (arguments.length != parameters.length) { - myHolder.createErrorAnnotation(typeArgumentList, - GroovyBundle.message("wrong.number.of.type.arguments", arguments.length, parameters.length)); + myHolder.createWarningAnnotation(typeArgumentList, + GroovyBundle.message("wrong.number.of.type.arguments", arguments.length, parameters.length)); return; } @@ -183,8 +180,9 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { final PsiClassType[] superTypes = parameter.getExtendsListTypes(); final PsiType argType = arguments[i].getType(); for (PsiClassType superType : superTypes) { - if (!superType.isAssignableFrom(argType)) { - myHolder.createErrorAnnotation(arguments[i], GroovyBundle + final PsiType substitutedSuper = substitutor.substitute(superType); + if (substitutedSuper != null && !substitutedSuper.isAssignableFrom(argType)) { + myHolder.createWarningAnnotation(arguments[i], GroovyBundle .message("type.argument.0.is.not.in.its.bound.should.extend.1", argType.getCanonicalText(), superType.getCanonicalText())); break; } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/LightGroovyTestCase.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/LightGroovyTestCase.groovy index 70a55b2cf674..fbb2719df6de 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/LightGroovyTestCase.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/LightGroovyTestCase.groovy @@ -75,6 +75,17 @@ package java.math; public class BigDecimal extends Number implements Comparable { } +''') + } + + protected void addHashSet() { + myFixture.addClass('''\ +package java.util; + +public class HashSet + extends AbstractSet + implements Set, Cloneable, java.io.Serializable +{} ''') } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy index f5e86e5b2cc9..a7fcc5677c3e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy @@ -408,9 +408,9 @@ private def handleImplicitBind(arg) { public void testIncorrectTypeArguments() { myFixture.configureByText('_.groovy', '''\ class C {} -C<Double> c +C<Double> c C c2 -C c3 +C c3 ''') myFixture.testHighlighting(true, false, true) } @@ -953,6 +953,25 @@ print new Foo() { String toString() {'abc'} } +''') + } + + void testGenerics() { + addHashSet() + testHighlighting(''' + +class NodeInfo{} + +interface NodeEvent {} + +interface TrackerEventsListener> { + void onEvents(Collection events) +} + +class AgentInfo extends NodeInfo {} + +print new HashSet>>() //correct +print new HashSetNodeEvent>>() //incorrect ''') } } \ No newline at end of file diff --git a/plugins/groovy/testdata/highlighting/VeryLongDfaWithComplexGenerics.groovy b/plugins/groovy/testdata/highlighting/VeryLongDfaWithComplexGenerics.groovy index 952de9bdc403..f01763796029 100644 --- a/plugins/groovy/testdata/highlighting/VeryLongDfaWithComplexGenerics.groovy +++ b/plugins/groovy/testdata/highlighting/VeryLongDfaWithComplexGenerics.groovy @@ -28,10 +28,10 @@ class TroubleCase { } public interface Foo {} -public class Bar implements Cloneable, ZooCoo, Woo> {} +public class Bar implements Cloneable, Zoo {} public interface Zoo, FM extends Hoo> {} public interface Hoo {} -public class Baz implements Cloneable, ZooToo,Yoo> {} +public class Baz implements Cloneable, Zoo {} public class Goo {} public class Too implements Hoo {} public class Coo implements Serializable, Cloneable, Hoo {} From 16d0c555224e2a2acb9616e8d41cdd2fc1acb9f1 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 12 Dec 2012 10:18:43 +0100 Subject: [PATCH 05/18] javadoc --- .../src/com/intellij/codeInspection/LocalQuickFix.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFix.java b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFix.java index e2350b20ac85..bd245cba4896 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFix.java +++ b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFix.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -27,6 +27,7 @@ package com.intellij.codeInspection; * to retrieve the PSI context the fix will work on. * * @author max + * @see LocalQuickFixBase * @see com.intellij.codeInspection.ProblemDescriptor * @see com.intellij.openapi.util.Iconable */ From 37189ac0bcffdced82da721fc1f79027409dafb9 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 12 Dec 2012 13:25:01 +0400 Subject: [PATCH 06/18] better diagnostics --- .../codeInspection/ex/InspectionToolWrapper.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java index 5916837c2d01..112bf7a37135 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java @@ -68,7 +68,14 @@ public abstract class InspectionToolWrapper - From eafd53deb33bf01efcca152aed0d54defb17e913 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 11 Dec 2012 21:25:51 +0400 Subject: [PATCH 08/18] [git] IDEA-85684 Better support of commit when CHERRY_PICK_HEAD exists * GitCheckinEnvironment already has support for the case when the MERGE_HEAD file exists. Add support for cherry-pick. * Make better dialog about partial commit: show the files via SelectFilePathsDialog. --- .../vcs/changes/ui/SelectFilePathsDialog.java | 4 +- .../vcs/impl/AbstractVcsHelperImpl.java | 2 +- .../checkin/GitCheckinEnvironment.java | 74 ++++++++++++------- .../src/git4idea/i18n/GitBundle.properties | 4 +- 4 files changed, 54 insertions(+), 30 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilePathsDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilePathsDialog.java index 69d6da0b52a9..b27dc2e64d63 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilePathsDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilePathsDialog.java @@ -36,8 +36,8 @@ public class SelectFilePathsDialog extends AbstractSelectFilesDialog { public SelectFilePathsDialog(final Project project, List originalFiles, final String prompt, final VcsShowConfirmationOption confirmationOption, - @Nullable String okActionName, @Nullable String cancelActionName) { - super(project, false, confirmationOption, prompt, true); + @Nullable String okActionName, @Nullable String cancelActionName, boolean showDoNotAskOption) { + super(project, false, confirmationOption, prompt, showDoNotAskOption); myFileList = new ChangesTreeList(project, originalFiles, true, true, null, null) { protected DefaultTreeModel buildTreeModel(final List changes, ChangeNodeDecorator changeNodeDecorator) { return new TreeModelBuilder(project, false).buildModelFromFilePaths(changes); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/AbstractVcsHelperImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/AbstractVcsHelperImpl.java index 2ee68e92031c..702070d17745 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/AbstractVcsHelperImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/AbstractVcsHelperImpl.java @@ -190,7 +190,7 @@ public class AbstractVcsHelperImpl extends AbstractVcsHelper { } final SelectFilePathsDialog dlg = - new SelectFilePathsDialog(myProject, files, prompt, confirmationOption, okActionName, cancelActionName); + new SelectFilePathsDialog(myProject, files, prompt, confirmationOption, okActionName, cancelActionName, true); dlg.setTitle(title); if (! confirmationOption.isPersistent()) { dlg.setDoNotAskOption(null); diff --git a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java index 3516dd0e4a82..3be534abef2e 100644 --- a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java +++ b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java @@ -15,10 +15,11 @@ */ package git4idea.checkin; +import com.intellij.CommonBundle; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.CheckinProjectPanel; @@ -26,6 +27,7 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.ObjectsConvertor; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.*; +import com.intellij.openapi.vcs.changes.ui.SelectFilePathsDialog; import com.intellij.openapi.vcs.checkin.CheckinChangeListSpecificComponent; import com.intellij.openapi.vcs.checkin.CheckinEnvironment; import com.intellij.openapi.vcs.ui.RefreshableOnComponent; @@ -182,10 +184,11 @@ public class GitCheckinEnvironment implements CheckinEnvironment { commit(myProject, root, files, messageFile, myNextCommitAuthor, myNextCommitAmend, myNextCommitAuthorDate); } catch (VcsException ex) { - if (!isMergeCommit(ex)) { + PartialOperation partialOperation = isMergeCommit(ex); + if (partialOperation == PartialOperation.NONE) { throw ex; } - if (!mergeCommit(myProject, root, added, removed, messageFile, myNextCommitAuthor, exceptions)) { + if (!mergeCommit(myProject, root, added, removed, messageFile, myNextCommitAuthor, exceptions, partialOperation)) { throw ex; } } @@ -223,6 +226,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { /** * Preform a merge commit * + * * @param project a project * @param root a vcs root * @param added added files @@ -230,6 +234,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { * @param messageFile a message file for commit * @param author an author * @param exceptions the list of exceptions to report + * @param partialOperation * @return true if merge commit was successful */ private static boolean mergeCommit(final Project project, @@ -238,7 +243,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { final Set removed, final File messageFile, final String author, - List exceptions) { + List exceptions, @NotNull final PartialOperation partialOperation) { HashSet realAdded = new HashSet(); HashSet realRemoved = new HashSet(); // perform diff @@ -278,26 +283,20 @@ public class GitCheckinEnvironment implements CheckinEnvironment { realAdded.removeAll(added); realRemoved.removeAll(removed); if (realAdded.size() != 0 || realRemoved.size() != 0) { - TreeSet files = new TreeSet(); - for (FilePath f : realAdded) { - files.add(f.getPresentableUrl()); - } - for (FilePath f : realRemoved) { - files.add(f.getPresentableUrl()); - } - final StringBuilder fileList = new StringBuilder(); - for (String f : files) { - //noinspection HardCodedStringLiteral - fileList.append("
  • "); - fileList.append(StringUtil.escapeXml(f)); - fileList.append("
  • "); - } - final int[] rc = new int[1]; + + final List files = new ArrayList(); + files.addAll(realAdded); + files.addAll(realRemoved); + final Ref mergeAll = new Ref(); try { GuiUtils.runOrInvokeAndWait(new Runnable() { public void run() { - rc[0] = Messages.showOkCancelDialog(project, GitBundle.message("commit.partial.merge.message", fileList.toString()), - GitBundle.getString("commit.partial.merge.title"), null); + String message = GitBundle.message("commit.partial.merge.message", partialOperation.getName()); + SelectFilePathsDialog dialog = new SelectFilePathsDialog(project, files, message, + null, "Commit All Files", CommonBundle.getCancelButtonText(), false); + dialog.setTitle(GitBundle.getString("commit.partial.merge.title")); + dialog.show(); + mergeAll.set(dialog.isOK()); } }); } @@ -307,7 +306,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { catch (Exception ex) { throw new RuntimeException("Unable to invoke a message box on AWT thread", ex); } - if (rc[0] != 0) { + if (!mergeAll.get()) { return false; } // update non-indexed files @@ -342,14 +341,21 @@ public class GitCheckinEnvironment implements CheckinEnvironment { } /** - * Check if commit has failed due to unfinished merge + * Check if commit has failed due to unfinished merge or cherry-pick. + * * * @param ex an exception to examine * @return true if exception means that there is a partial commit during merge */ - private static boolean isMergeCommit(final VcsException ex) { - //noinspection HardCodedStringLiteral - return ex.getMessage().contains("fatal: cannot do a partial commit during a merge."); + private static PartialOperation isMergeCommit(final VcsException ex) { + String message = ex.getMessage(); + if (message.contains("fatal: cannot do a partial commit during a merge")) { + return PartialOperation.MERGE; + } + if (message.contains("fatal: cannot do a partial commit during a cherry-pick")) { + return PartialOperation.CHERRY_PICK; + } + return PartialOperation.NONE; } /** @@ -514,6 +520,22 @@ public class GitCheckinEnvironment implements CheckinEnvironment { return rc; } + private enum PartialOperation { + NONE("none"), + MERGE("merge"), + CHERRY_PICK("cherry-pick"); + + private final String myName; + + PartialOperation(String name) { + myName = name; + } + + String getName() { + return myName; + } + } + /** * Sort changes by roots * diff --git a/plugins/git4idea/src/git4idea/i18n/GitBundle.properties b/plugins/git4idea/src/git4idea/i18n/GitBundle.properties index 01b53bab9da6..a99e68d37bd8 100644 --- a/plugins/git4idea/src/git4idea/i18n/GitBundle.properties +++ b/plugins/git4idea/src/git4idea/i18n/GitBundle.properties @@ -62,7 +62,9 @@ commit.author.tooltip=Specify a commit author here if it is different from commit.author=&Author: commit.amend.tooltip=Merge this commit with the previous one commit.amend=Amend commit -commit.partial.merge.message=The following files are not included in commit.
      {0}
    Perform commit with all files included? +commit.partial.merge.message=Partial commit during a {0} is not allowed.\n\ + The following files are not included in commit.\n\ + Perform commit with all files included? commit.partial.merge.title=Partial Merge Commit commit.push.changes.tooltip=When this option is enabled, changes are pushed to the server after commit. commit.push.changes=&Push Changes From 6515685999ed02b7e9b0c4ddf6984256f04d60ac Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 12 Dec 2012 13:44:39 +0400 Subject: [PATCH 09/18] [git] IDEA-97252 Sort the list of remote branches. --- plugins/git4idea/src/git4idea/merge/GitPullDialog.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/merge/GitPullDialog.java b/plugins/git4idea/src/git4idea/merge/GitPullDialog.java index 11fb36fb96ba..0d061c6b03ed 100644 --- a/plugins/git4idea/src/git4idea/merge/GitPullDialog.java +++ b/plugins/git4idea/src/git4idea/merge/GitPullDialog.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ListCellRendererWrapper; import git4idea.GitBranch; +import git4idea.GitRemoteBranch; import git4idea.GitUtil; import git4idea.commands.GitCommand; import git4idea.commands.GitLineHandler; @@ -38,7 +39,9 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -221,7 +224,9 @@ public class GitPullDialog extends DialogWrapper { GitBranchTrackInfo trackInfo = GitUtil.getTrackInfoForCurrentBranch(repository); String currentRemoteBranch = trackInfo == null ? null : trackInfo.getRemoteBranch().getNameForLocalOperations(); - for (GitBranch remoteBranch : repository.getBranches().getRemoteBranches()) { + List remoteBranches = new ArrayList(repository.getBranches().getRemoteBranches()); + Collections.sort(remoteBranches); + for (GitBranch remoteBranch : remoteBranches) { if (belongsToRemote(remoteBranch, selectedRemote)) { myBranchChooser.addElement(remoteBranch.getName(), remoteBranch.getName().equals(currentRemoteBranch)); } From 7ffeca6f80f5cf458fe3d11477f35f1a8b1e7bc9 Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Wed, 12 Dec 2012 13:47:41 +0400 Subject: [PATCH 10/18] http://ea.jetbrains.com/browser/ea_problems/41965 --- .../ui/layout/impl/GridCellImpl.java | 24 ++++--------------- .../ui/layout/impl/RunnerContentUi.java | 2 +- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java index e1d2ccc7042e..2230cc2bb4fc 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java @@ -377,10 +377,6 @@ public class GridCellImpl implements GridCell { } public void saveUiState() { - String key = getDimensionKey(); - if (key == null) - return; - saveProportions(); for (Content each : myContents.getKeys()) { @@ -393,11 +389,11 @@ public class GridCellImpl implements GridCell { final DimensionService service = DimensionService.getInstance(); final Dimension size = myContext.getContentManager().getComponent().getSize(); - service.setSize(key, size, myContext.getProject()); + service.setSize(getDimensionKey(), size, myContext.getProject()); if (myContext.getWindow() != 0) { final Window frame = SwingUtilities.getWindowAncestor(myPlaceholder); if (frame != null) { - service.setLocation(key, frame.getLocationOnScreen()); + service.setLocation(getDimensionKey(), frame.getLocationOnScreen()); } } } @@ -456,26 +452,16 @@ public class GridCellImpl implements GridCell { @Nullable public Point getLocation() { - String key = getDimensionKey(); - if (key == null) - return null; - return DimensionService.getInstance().getLocation(key, myContext.getProject()); + return DimensionService.getInstance().getLocation(getDimensionKey(), myContext.getProject()); } @Nullable public Dimension getSize() { - String key = getDimensionKey(); - if (key == null) - return null; - return DimensionService.getInstance().getSize(key, myContext.getProject()); + return DimensionService.getInstance().getSize(getDimensionKey(), myContext.getProject()); } - @Nullable private String getDimensionKey() { - Tab tab = myContainer.getTab(); - if (tab == null) - return null; - return "GridCell.Tab." + tab.getIndex() + "." + myPlaceInGrid.name(); + return "GridCell.Tab." + myContainer.getTab().getIndex() + "." + myPlaceInGrid.name(); } public boolean isValidForCalculateProportions() { diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index 0a20452ae039..3b2a71ca0b76 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -221,7 +221,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac public void beforeSelectionChanged(TabInfo oldSelection, TabInfo newSelection) { if (oldSelection != null && !isStateBeingRestored()) { final GridImpl grid = getGridFor(oldSelection); - if (grid != null) { + if (grid != null && getTabFor(grid) != null) { grid.saveUiState(); } } From 15708d3bacce224d5ca618890dcf904682fa411a Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 12 Dec 2012 14:42:12 +0400 Subject: [PATCH 11/18] external build: method extracted --- .../jps/builders/DirtyFilesHolder.java | 2 ++ .../jps/builders/impl/DirtyFilesHolderBase.java | 17 +++++++++++++++++ .../jps/android/AndroidDexBuilder.java | 13 +------------ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/DirtyFilesHolder.java b/jps/jps-builders/src/org/jetbrains/jps/builders/DirtyFilesHolder.java index c0c9219b62d6..3a1eaac159a7 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/DirtyFilesHolder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/DirtyFilesHolder.java @@ -26,6 +26,8 @@ import java.util.Collection; public interface DirtyFilesHolder> { void processDirtyFiles(@NotNull FileProcessor processor) throws IOException; + boolean hasDirtyFiles() throws IOException; + boolean hasRemovedFiles(); @NotNull diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/DirtyFilesHolderBase.java b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/DirtyFilesHolderBase.java index e8ee37326e90..b10637a56fce 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/DirtyFilesHolderBase.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/DirtyFilesHolderBase.java @@ -15,13 +15,17 @@ */ package org.jetbrains.jps.builders.impl; +import com.intellij.openapi.util.Ref; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.DirtyFilesHolder; +import org.jetbrains.jps.builders.FileProcessor; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.Utils; +import java.io.File; +import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.Map; @@ -36,6 +40,19 @@ public abstract class DirtyFilesHolderBase hasDirtyFiles = Ref.create(false); + processDirtyFiles(new FileProcessor() { + @Override + public boolean apply(T target, File file, R root) throws IOException { + hasDirtyFiles.set(true); + return false; + } + }); + return hasDirtyFiles.get(); + } + @Override public boolean hasRemovedFiles() { Map, Collection> map = Utils.REMOVED_SOURCES_KEY.get(myContext); diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java index b5a38f26f026..15e620bec038 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java @@ -38,7 +38,6 @@ import org.jetbrains.jps.android.model.JpsAndroidSdkProperties; import org.jetbrains.jps.builders.BuildOutputConsumer; import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.DirtyFilesHolder; -import org.jetbrains.jps.builders.FileProcessor; import org.jetbrains.jps.cmdline.ClasspathBootstrap; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.ExternalProcessUtil; @@ -77,19 +76,9 @@ public class AndroidDexBuilder extends TargetBuilder() { - @Override - public boolean apply(AndroidDexBuildTarget target, File file, BuildRootDescriptor root) throws IOException { - assert target == buildTarget; - hasDirtyFiles[0] = true; - return false; - } - }); try { - if (!doDexBuild(buildTarget, context, hasDirtyFiles[0])) { + if (!doDexBuild(buildTarget, context, holder.hasDirtyFiles())) { throw new ProjectBuildException(); } } From 9236eba3121a71c87de6f428539c6cd9553597ca Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 12 Dec 2012 13:44:53 +0400 Subject: [PATCH 12/18] show task combo if any server configured --- .../com/intellij/tasks/actions/SwitchTaskCombo.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java index 300981ef56ea..5a323982fa8a 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java @@ -87,16 +87,17 @@ public class SwitchTaskCombo extends ComboBoxAction implements DumbAware { presentation.setIcon(null); } else { - LocalTask activeTask = TaskManager.getManager(project).getActiveTask(); + TaskManager taskManager = TaskManager.getManager(project); + LocalTask activeTask = taskManager.getActiveTask(); presentation.setVisible(true); presentation.setEnabled(true); - if (isImplicit(activeTask) && !TaskSettings.getInstance().ALWAYS_DISPLAY_COMBO) { - presentation.setText(""); - presentation.setIcon(null); - presentation.setDescription("Switch Tasks"); + if (isImplicit(activeTask) && + taskManager.getAllRepositories().length == 0 && + !TaskSettings.getInstance().ALWAYS_DISPLAY_COMBO) { presentation.setVisible(false); - } else { + } + else { String s = getText(activeTask); presentation.setText(s); presentation.setIcon(activeTask.getIcon()); From ac74d85b8a4ad07360dfd7198f4721206451c77d Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 12 Dec 2012 12:22:02 +0100 Subject: [PATCH 13/18] IDEA-97354 Show diff appears under main frame --- .../wm/impl/commands/RequestFocusInToolWindowCmd.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInToolWindowCmd.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInToolWindowCmd.java index b6f0251f066c..cf4b6c3fbb5a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInToolWindowCmd.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInToolWindowCmd.java @@ -124,6 +124,11 @@ public final class RequestFocusInToolWindowCmd extends FinalizableCommand { private void bringOwnerToFront() { final Window owner = SwingUtilities.getWindowAncestor(myToolWindow.getComponent()); + //Toolwindow component shouldn't take focus back if new dialog or frame appears + //Example: Ctrl+D on file history brings a diff dialog to front and then hides it by main frame by calling + // toFront on toolwindow window + Window activeFrame = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); + if (activeFrame != null && activeFrame != owner) return; //if (owner == null) { // System.out.println("owner = " + owner); // return; @@ -131,7 +136,7 @@ public final class RequestFocusInToolWindowCmd extends FinalizableCommand { // if owner is active window or it has active child window which isn't floating decorator then // don't bring owner window to font. If we will make toFront every time then it's possible // the following situation: - // 1. user prform refactoring + // 1. user perform refactoring // 2. "Do not show preview" dialog is popping up. // 3. At that time "preview" tool window is being activated and modal "don't show..." dialog // isn't active. From ed058a92e19223be39219dc7b415786deea9ba36 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 12 Dec 2012 15:21:56 +0400 Subject: [PATCH 14/18] EA-40398 fixed class loading order issues that caused NPEs in syntax highlighters due to EditorColorsManager not initialized on time [r=cdr] --- .../editor/colors/TextAttributesKey.java | 8 ++--- .../colors/impl/EditorColorsManagerImpl.java | 19 +++++------- .../TextAttributeKeyDefaultsProviderImpl.java | 30 +++++++++++++++++++ .../src/META-INF/PlatformExtensions.xml | 2 ++ 4 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/TextAttributeKeyDefaultsProviderImpl.java diff --git a/platform/core-api/src/com/intellij/openapi/editor/colors/TextAttributesKey.java b/platform/core-api/src/com/intellij/openapi/editor/colors/TextAttributesKey.java index 11aa05788bf2..55aecc97ed97 100644 --- a/platform/core-api/src/com/intellij/openapi/editor/colors/TextAttributesKey.java +++ b/platform/core-api/src/com/intellij/openapi/editor/colors/TextAttributesKey.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.colors; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; @@ -32,6 +33,7 @@ import org.jetbrains.annotations.NotNull; public final class TextAttributesKey implements Comparable, JDOMExternalizable { private static final TextAttributes NULL_ATTRIBUTES = new TextAttributes(); private static final ConcurrentHashMap ourRegistry = new ConcurrentHashMap(); + private static final TextAttributeKeyDefaultsProvider OUR_DEFAULTS_PROVIDER = ServiceManager.getService(TextAttributeKeyDefaultsProvider.class); public String myExternalName; public TextAttributes myDefaultAttributes = NULL_ATTRIBUTES; @@ -106,8 +108,8 @@ public final class TextAttributesKey implements Comparable, J if (myDefaultAttributes == NULL_ATTRIBUTES) { // E.g. if one text key reuse default attributes of some other predefined key myDefaultAttributes = null; - if (myDefaultsProvider != null) - myDefaultAttributes = myDefaultsProvider.getDefaultAttributes(this); + if (OUR_DEFAULTS_PROVIDER != null) + myDefaultAttributes = OUR_DEFAULTS_PROVIDER.getDefaultAttributes(this); } return myDefaultAttributes; } @@ -147,6 +149,4 @@ public final class TextAttributesKey implements Comparable, J public interface TextAttributeKeyDefaultsProvider { TextAttributes getDefaultAttributes(TextAttributesKey key); } - - public static TextAttributeKeyDefaultsProvider myDefaultsProvider; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java index 48e29b6bd380..d5f2035042bd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java @@ -118,18 +118,15 @@ public class EditorColorsManagerImpl extends EditorColorsManager implements Name loadAllSchemes(); setGlobalScheme(myDefaultColorSchemesManager.getAllSchemes()[0]); + } - TextAttributesKey.myDefaultsProvider = new TextAttributesKey.TextAttributeKeyDefaultsProvider() { - final boolean dark = UIUtil.isUnderDarcula() && getScheme("Darcula") != null; - @Override - public TextAttributes getDefaultAttributes(TextAttributesKey key) { - // It is reasonable to fetch attributes from Default color scheme. Otherwise if we launch IDE and then - // try switch from custom colors scheme (e.g. with dark background) to default one. Editor will show - // incorrect highlighting with "traces" of color scheme which was active during IDE startup. - final EditorColorsScheme defaultColorScheme = getScheme(dark ? "Darcula" : EditorColorsScheme.DEFAULT_SCHEME_NAME); - return defaultColorScheme.getAttributes(key); - } - }; + public TextAttributes getDefaultAttributes(TextAttributesKey key) { + final boolean dark = UIUtil.isUnderDarcula() && getScheme("Darcula") != null; + // It is reasonable to fetch attributes from Default color scheme. Otherwise if we launch IDE and then + // try switch from custom colors scheme (e.g. with dark background) to default one. Editor will show + // incorrect highlighting with "traces" of color scheme which was active during IDE startup. + final EditorColorsScheme defaultColorScheme = getScheme(dark ? "Darcula" : EditorColorsScheme.DEFAULT_SCHEME_NAME); + return defaultColorScheme.getAttributes(key); } private void extendDefaultScheme() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/TextAttributeKeyDefaultsProviderImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/TextAttributeKeyDefaultsProviderImpl.java new file mode 100644 index 000000000000..5cd49f1568eb --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/TextAttributeKeyDefaultsProviderImpl.java @@ -0,0 +1,30 @@ +/* + * 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.intellij.openapi.editor.colors.impl; + +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.editor.markup.TextAttributes; + +/** + * @author Dennis.Ushakov + */ +public class TextAttributeKeyDefaultsProviderImpl implements TextAttributesKey.TextAttributeKeyDefaultsProvider { + @Override + public TextAttributes getDefaultAttributes(TextAttributesKey key) { + return ((EditorColorsManagerImpl)EditorColorsManager.getInstance()).getDefaultAttributes(key); + } +} diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index c2adba48c555..a1b54ee3d271 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -132,6 +132,8 @@ + From db864d1ce0dbc76af05984e441fec416ad5024e5 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 12 Dec 2012 15:30:23 +0400 Subject: [PATCH 15/18] Optimize MavenDomUtil.isFilteredResourceFile() --- .../idea/maven/dom/MavenDomUtil.java | 63 +++++++++++++++---- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java index e2360f823332..e2294f944c6d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java @@ -23,12 +23,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; @@ -49,8 +50,9 @@ import org.jetbrains.idea.maven.model.MavenResource; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenLog; -import org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; @@ -58,6 +60,8 @@ import java.util.regex.Pattern; public class MavenDomUtil { + private static final Key>> FILTERED_RESOURCES_ROOTS_KEY = Key.create("MavenDomUtil.FILTERED_RESOURCES_ROOTS"); + // see http://maven.apache.org/settings.html private static final Set SUBTAGS_IN_SETTINGS_FILE = ContainerUtil.newHashSet("localRepository", "interactiveMode", "usePluginRegistry", "offline", "pluginGroups", @@ -317,21 +321,56 @@ public class MavenDomUtil { return prop == null ? null : prop.getPsiElement().getFirstChild().getNextSibling().getNextSibling(); } - public static boolean isFilteredResourceFile(PsiElement element) { - MavenProject project = findContainingProject(element); - if (project == null) return false; + private static Set getFilteredResourcesRoots(@NotNull MavenProject mavenProject) { + Pair> cachedValue = mavenProject.getCachedValue(FILTERED_RESOURCES_ROOTS_KEY); - VirtualFile file = MavenDomUtil.getVirtualFile(element); + if (cachedValue == null || cachedValue.first != VirtualFileManager.getInstance().getModificationCount()) { + Set set = null; + + for (MavenResource resource : mavenProject.getResources()) { + if (!resource.isFiltered()) continue; + + VirtualFile resourceDir = LocalFileSystem.getInstance().findFileByPath(resource.getDirectory()); + if (resourceDir == null) continue; + + if (set == null) { + set = new HashSet(); + } + + set.add(resourceDir); + } + + if (set == null) { + set = Collections.emptySet(); + } + + cachedValue = Pair.create(VirtualFileManager.getInstance().getModificationCount(), set); + mavenProject.putCachedValue(FILTERED_RESOURCES_ROOTS_KEY, cachedValue); + } + + return cachedValue.second; + } + + public static boolean isFilteredResourceFile(PsiElement element) { + VirtualFile file = getVirtualFile(element); if (file == null) return false; - for (MavenResource each : project.getResources()) { - if (!each.isFiltered()) continue; + MavenProjectsManager manager = MavenProjectsManager.getInstance(element.getProject()); + MavenProject mavenProject = manager.findContainingProject(file); + if (mavenProject == null) return false; - VirtualFile resourceDir = LocalFileSystem.getInstance().findFileByPath(each.getDirectory()); - if (resourceDir == null) continue; - if (!VfsUtil.isAncestor(resourceDir, file, true)) continue; - return true; + System.out.println(VirtualFileManager.getInstance().getModificationCount()); + + Set filteredRoots = getFilteredResourcesRoots(mavenProject); + + if (!filteredRoots.isEmpty()) { + for (VirtualFile f = file.getParent(); f != null; f = f.getParent()) { + if (filteredRoots.contains(f)) { + return true; + } + } } + return false; } From c548e8a9db75f8f551b36af93f70911875825a4b Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 12 Dec 2012 15:31:35 +0400 Subject: [PATCH 16/18] Remove output debug info. --- .../main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java index e2294f944c6d..af2894e6a9ee 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java @@ -359,8 +359,6 @@ public class MavenDomUtil { MavenProject mavenProject = manager.findContainingProject(file); if (mavenProject == null) return false; - System.out.println(VirtualFileManager.getInstance().getModificationCount()); - Set filteredRoots = getFilteredResourcesRoots(mavenProject); if (!filteredRoots.isEmpty()) { From c3eb1d3da1d24e9a569ce275c17323c32f6eaa5b Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 12 Dec 2012 12:38:01 +0100 Subject: [PATCH 17/18] external build: clear fscache on file system events --- .../src/org/jetbrains/jps/cmdline/BuildSession.java | 10 +++++++++- .../org/jetbrains/jps/cmdline/ProjectDescriptor.java | 12 ++++++++++++ .../jetbrains/jps/incremental/CompileContext.java | 2 -- .../jps/incremental/CompileContextImpl.java | 8 -------- .../org/jetbrains/jps/incremental/FSOperations.java | 2 +- .../jetbrains/jps/incremental/IncProjectBuilder.java | 3 +++ 6 files changed, 25 insertions(+), 12 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index 5df8a0bd3fa1..e41a788e44e0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -292,11 +292,15 @@ final class BuildSession implements Runnable, CanceledStatus { } final Timestamps timestamps = pd.timestamps.getStorage(); - + boolean cacheCleared = false; for (String deleted : event.getDeletedPathsList()) { final File file = new File(deleted); Collection descriptor = pd.getBuildRootIndex().findAllParentDescriptors(file, null, null); if (!descriptor.isEmpty()) { + if (!cacheCleared) { + pd.getFSCache().clear(); + cacheCleared = true; + } if (Utils.IS_TEST_MODE) { LOG.info("Applying deleted path from fs event: " + file.getPath()); } @@ -323,6 +327,10 @@ final class BuildSession implements Runnable, CanceledStatus { } long stamp = timestamps.getStamp(file, descriptor.getTarget()); if (stamp != fileStamp) { + if (!cacheCleared) { + pd.getFSCache().clear(); + cacheCleared = true; + } pd.fsState.markDirty(null, file, descriptor, timestamps, saveEventStamp); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/ProjectDescriptor.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/ProjectDescriptor.java index b2efcba7f425..5a71526303c2 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/ProjectDescriptor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/ProjectDescriptor.java @@ -15,10 +15,12 @@ */ package org.jetbrains.jps.cmdline; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildRootIndex; import org.jetbrains.jps.builders.BuildTargetIndex; import org.jetbrains.jps.builders.logging.BuildLoggingManager; import org.jetbrains.jps.incremental.CompilerEncodingConfiguration; +import org.jetbrains.jps.incremental.FSCache; import org.jetbrains.jps.incremental.fs.BuildFSState; import org.jetbrains.jps.incremental.storage.BuildDataManager; import org.jetbrains.jps.incremental.storage.BuildTargetsState; @@ -54,6 +56,7 @@ public final class ProjectDescriptor { private final BuildRootIndex myBuildRootIndex; private final BuildTargetIndex myBuildTargetIndex; private final IgnoredFileIndex myIgnoredFileIndex; + private FSCache myFSCache = FSCache.NO_CACHE; public ProjectDescriptor(JpsModel model, BuildFSState fsState, @@ -84,6 +87,15 @@ public final class ProjectDescriptor { myTargetsState = targetsState; } + @NotNull + public FSCache getFSCache() { + return myFSCache; + } + + public void setFSCache(FSCache cache) { + myFSCache = cache == null? FSCache.NO_CACHE : cache; + } + public BuildRootIndex getBuildRootIndex() { return myBuildRootIndex; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java index 7e73506dd23e..23d081c336d7 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java @@ -69,6 +69,4 @@ public interface CompileContext extends UserDataHolder, MessageHandler { void markNonIncremental(ModuleBuildTarget target); void clearNonIncrementalMark(ModuleBuildTarget target); - - FSCache getFSCache(); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java index 0975ac6ecea0..8b1ae2062ed7 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java @@ -57,7 +57,6 @@ public class CompileContextImpl extends UserDataHolderBase implements CompileCon private volatile float myDone = -1.0f; private EventDispatcher myListeners = EventDispatcher.create(BuildListener.class); private Map myAnnotationProcessingProfileMap; - private final FSCache myFSCache; public CompileContextImpl(CompileScope scope, ProjectDescriptor pd, boolean isMake, @@ -74,9 +73,6 @@ public class CompileContextImpl extends UserDataHolderBase implements CompileCon myIsMake = !isProjectRebuild && isMake; myDelegateMessageHandler = delegateMessageHandler; myProjectPaths = new ProjectPaths(pd.getProject()); - // in project rebuild mode performance gain is hard to observe, so it is better to save memory - // in make mode it is critical to traverse file system as fast as possible, so we choose speed over memory savings - myFSCache = isProjectRebuild? FSCache.NO_CACHE : new FSCache(); } @Override @@ -226,8 +222,4 @@ public class CompileContextImpl extends UserDataHolderBase implements CompileCon public ProjectDescriptor getProjectDescriptor() { return myProjectDescriptor; } - - public FSCache getFSCache() { - return myFSCache; - } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java index 2f0ded176e8c..3fd4fc9d0099 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java @@ -150,7 +150,7 @@ public class FSOperations { if (filter == null) { context.getProjectDescriptor().fsState.clearRecompile(rd); } - final FSCache fsCache = rd.canUseFileCache() ? context.getFSCache() : FSCache.NO_CACHE; + final FSCache fsCache = rd.canUseFileCache() ? context.getProjectDescriptor().getFSCache() : FSCache.NO_CACHE; traverseRecursively(context, rd, rd.getRootFile(), timestamps, forceMarkDirty, currentFiles, filter, fsCache); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 5666321e7d0f..0cd1687453f1 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -320,6 +320,9 @@ public class IncProjectBuilder { final CompileContextImpl context = new CompileContextImpl(scope, myProjectDescriptor, isMake, isProjectRebuild, myMessageDispatcher, myBuilderParams, myCancelStatus ); + // in project rebuild mode performance gain is hard to observe, so it is better to save memory + // in make mode it is critical to traverse file system as fast as possible, so we choose speed over memory savings + myProjectDescriptor.setFSCache(isProjectRebuild? FSCache.NO_CACHE : new FSCache()); JavaBuilderUtil.CONSTANT_SEARCH_SERVICE.set(context, myConstantSearch); return context; } From 8d8a41c133567cd12757847d3cc3fdebf97ca5f7 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 12 Dec 2012 15:49:03 +0400 Subject: [PATCH 18/18] [git] IDEA-78333 Cherry pick: autogenerated commit message contains short or full hash from time to time Don't take the message from COMMIT_MSG (because it contains the full hash), we can make the same message ourselves. --- .../history/browser/GitCherryPicker.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java b/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java index c45839e25092..56bcac419f54 100644 --- a/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java +++ b/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java @@ -22,11 +22,9 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.*; -import com.intellij.openapi.vcs.checkin.CheckinEnvironment; import com.intellij.openapi.vcs.history.VcsRevisionNumber; import com.intellij.openapi.vcs.merge.MergeDialogCustomizer; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ArrayUtil; import com.intellij.util.Consumer; import git4idea.GitPlatformFacade; import git4idea.commands.Git; @@ -195,7 +193,7 @@ public class GitCherryPicker { private CherryPickData updateChangeListManager(@NotNull final GitCommit commit) { final Collection paths = ChangesUtil.getPaths(commit.getChanges()); refreshChangedFiles(paths); - final String commitMessage = createCommitMessage(commit, paths); + final String commitMessage = createCommitMessage(commit); LocalChangeList previouslyDefaultChangeList = myChangeListManager.getDefaultChangeList(); LocalChangeList changeList = createChangeListAfterUpdate(commit, paths, commitMessage); return new CherryPickData(changeList, commitMessage, previouslyDefaultChangeList); @@ -227,11 +225,19 @@ public class GitCherryPicker { } @NotNull - private String createCommitMessage(@NotNull GitCommit commit, @NotNull Collection paths) { - CheckinEnvironment ce = myPlatformFacade.getVcs(myProject).getCheckinEnvironment(); - String message = ce == null ? null : ce.getDefaultMessageFor(ArrayUtil.toObjectArray(paths, FilePath.class)); - message = message == null ? commit.getDescription() + "\n(cherry-picked from " + commit.getShortHash().getString() + ")" : message; - return message; + private static String createCommitMessage(@NotNull GitCommit commit) { + // make sure there is an empty line after description + String spaces; + if (commit.getDescription().endsWith("\n\n")) { + spaces = ""; + } + else if (commit.getDescription().endsWith("\n")) { + spaces = "\n"; + } + else { + spaces = "\n\n"; + } + return commit.getDescription() + spaces + "(cherry-picked from " + commit.getShortHash().getString() + ")"; } private boolean showCommitDialogAndWaitForCommit(@NotNull final GitRepository repository, @NotNull final GitCommitWrapper commit,