From 9f3228520c77e7c96e91284fec2fbb482629e02d Mon Sep 17 00:00:00 2001 From: Sergey Rieder Date: Thu, 31 Oct 2013 17:40:40 +0400 Subject: [PATCH 01/53] IDEA-114988 Hide error panel by escape --- platform/platform-resources/src/META-INF/LangExtensions.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index a232b2858ee0..737fc16383aa 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -663,7 +663,7 @@ + order="after hide-hints" id="hide-search"/> From 22f2bc20089810b1740d0c00839a1d427abc9825 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 31 Oct 2013 18:53:56 +0400 Subject: [PATCH 02/53] IDEA-115729 Removed jna-platform.jar - existing jna-utils.jar should be used (and also for pty4j) --- .idea/libraries/jna.xml | 1 - lib/jna-platform.jar | Bin 1218171 -> 0 bytes lib/required_for_dist.txt | 1 - 3 files changed, 2 deletions(-) delete mode 100644 lib/jna-platform.jar diff --git a/.idea/libraries/jna.xml b/.idea/libraries/jna.xml index 7a9e4319d055..d9fed3852d8f 100644 --- a/.idea/libraries/jna.xml +++ b/.idea/libraries/jna.xml @@ -3,7 +3,6 @@ - diff --git a/lib/jna-platform.jar b/lib/jna-platform.jar deleted file mode 100644 index 4b3d567c62096eb7eac47f41c255720f1e7a7588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218171 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 z ztb5dW&>!IDVn7_jyu)xvH`g&;4YwQ zUdC%HR#-%0^|}a%E<#W#2M>~9-}(hy4A^xzC98p7ts=Vp_>3||Js8F#L1SM|bS?{m<>>}&=JkOsKe0lw8$rC|G_$!> z*~B_9i&a%UDV}t>N7YTfZJ4T<>~3!~LgK(SOjT+Md#s*TGpm21@@Qps&q<7+RQ2|! z%kK4TIV(*$mfS|RkEET#5E);rl0Ngt9UR958N12{ValS{~FMn(A@g5@3=$~Sai7mpsf&J$+ zAoQU$Oz`XVLim(7%A54=&BegUx9H`q`uMgq+}}I!`~ zuPcve{`cYfuj>5w$1l>XxLmw=Q9nP1RjL;C0aqSZ@cU3P%;ASzIZKEt`3?04{je*) zslj7DQX)^tZ|Upb){Gz3$B*gd<0bN>Jf)XUlmPgj)?&`-hiCNitX|H$8aCz$`J^is zh=L^#x$-GjKJCh9#+yY}bIIWFVI0j{h>>9=ug!oWB3bTh+TV0wFHFgdfG-6HD&gpjh?CtCv?(fcY*;S3#wvPi8Vs@YCIGSm+nKw=pr9`*K zMzujGCkE{COjlcn2D55GEZ3uPIzp<`R?>n8V)wr8don%y@>A2+L|4ZUg!i2MT-$iP zW%$SuLd5_=2Mij<*(pDn-vj7Z`s~OkrcomXDQDwr1&7sLi`C!ghj5w>0WXQNQ+`vUAxyc7ZFOb>%r%K4;eLqC&H__sAB4hzy)I<3}0S zExm0^bMvGpEZ*726sf6Kk=+Drmm}Q+gF{P7YcL*MFnr#PEQI zAw?K(N5J4n8*gDMg6F+Qjtpi@QDjY-5Midw)G!P} zHhs2DFq#oZGvPv+)QA~cc>h4=q;1NS!Oo6eBFAO43w#>Yqj5=YoBgetJJU**M0a-3 zs8JHT(&x(OUHO6|*Dt+IvDBnzrWmb|9X|}Z`gG?SPFH~x;K>Z1QaN;xxI9?`MF&6c z(T@unnVVQY<6Y_dh30k`s;-ld@or5L@7DW-j;)<+9MafScjr|&%3$O+W0XXBjTMI|Xc}yl=Lmkx^#~hW;tW5p;`> zZ^B?Y`P*_TiE^4VKL~Q8DMvI{ag_R(4xiZ4VGx)s{Ax=wR*j37L|K0QzduuRCkv~jVwBr={|alc4@mc zg$*RFshT0Rf}$ukZRr2on$3quTxM{KA1sJO#oJr<5zVe``vL7~1Quo4P~&#)GZSbc z$M&Z!!rQi~2ZWecSWu;*e=aR5k{{%0?AS=7a6Y59f{wV|gWFH^Yy3{%3D_O#Gk)Xj zz94`=lt*9YV}j^A=EDYwLSC{8WS zvr_iNSy@f$@-tFTJrzZdN{uE%Of@}7R+%^>sfx<8lB}3PmYGk~#^b>^=Q){mPO7x( z;MIua^e~Rn2L~?0cDKOl*?>e<=-ifL)UXCE=k*vVY(q%C8@*Z^#!$x)bPdRzXgCj} zZ@WuAiuO`RZa;E^-H5t&;`UlZ&ZB5NcN^yMYZ|VD6pS6JCJoG#lrIrWXdly*mgh`p zCe`$PobnGa6CXv8d5|ehQoEoPE&i1{xgH{b$7Vc^_c^Y#$1Wm-D{|#lS8lVP^sU5Q zndLYasbS=|g!$(DLJ}7R7qh&)v&P7aBaY3>dH_+{^$>ppY%t0?=g0+_jVy7_hQyOH zcSExFGjn^^6~$GBI`=WTctPg16M5ztS+D^uYGu)}b;YrD>G-;m%96^W$K->RB}MnF z^J*)LD@*QNy>3e7l!xW&%JjSCl~t(=Qr(VD)vfd@(_M*YWZ`*Pgie+0XXR++lybTF zsFYTw-y^qHdit&{zHVye)UwoL(oB}A53DP#obseBuAI6Yb*)KQS6QkFYqWv|kqY>j zTfu`>0hddYP)1((|$`iBdNif8y-LuP0P&lrU@cF(b}C z#a!Hj;O8`I&3ob2UxYyR#cR&^OhtLSW zp1U{8ThSyx%=JU)g+GGM`AJ.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%0AGyKH3eUB9lERS|lTGpy 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⋙YJxuSl-oy00)_qLhXT6{4{ni6aAGAKe^n=zz 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
JX$tHLXPXKW_U(yJ=t#+eD9(3yYz0|w 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 L+XbAF^Td9fpxKM=> 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

;-BXK%8J&uy2ag3Y+ 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


f?IcUBhwmioxx0A* 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 O2?ySQc Date: Mon, 28 Oct 2013 16:22:25 +0400 Subject: [PATCH 03/53] fix CCE in introduce field to script --- .../introduce/field/GrIntroduceFieldHandler.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index 0211ee378a4c..dad877d0da96 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -140,17 +140,16 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase result = EnumSet.of(GrIntroduceFieldSettings.Init.FIELD_DECLARATION, GrIntroduceFieldSettings.Init.CONSTRUCTOR); - - GrTypeDefinition clazz = (GrTypeDefinition)context.getScope(); + PsiElement scope = context.getScope(); if (replaceAll) { - PsiElement anchor = GrIntroduceHandlerBase.findAnchor(context.getOccurrences(), clazz); + PsiElement anchor = GrIntroduceHandlerBase.findAnchor(context.getOccurrences(), scope); if (anchor != null) { result.add(GrIntroduceFieldSettings.Init.CUR_METHOD); } } - if (TestFrameworks.getInstance().isTestClass(clazz)) { + if (scope instanceof GrTypeDefinition && TestFrameworks.getInstance().isTestClass((PsiClass)scope)) { result.add(GrIntroduceFieldSettings.Init.SETUP_METHOD); } From 28533327badb1ae195cfc04bc2255b293a2233d9 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Tue, 29 Oct 2013 18:20:24 +0400 Subject: [PATCH 04/53] unnecessary 'static' --- .../refactoring/introduce/inplace/OccurrencesChooser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java index 04a67b29b829..444bc492aa81 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -44,7 +44,7 @@ import java.util.List; // This prevents languages with polyadic expressions or sequences // from reusing it, use simpleChooser instead. public abstract class OccurrencesChooser { - public static enum ReplaceChoice { + public enum ReplaceChoice { NO("Replace this occurrence only"), NO_WRITE("Replace all occurrences but write"), ALL("Replace all {0} occurrences"); private final String myDescription; From 12d0c6400b7b3db466d63eb3355716815f15c8a4 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 30 Oct 2013 18:36:21 +0400 Subject: [PATCH 05/53] shorten reference --- .../refactoring/rename/inplace/InplaceRefactoring.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java index 33f23494b341..fc7335595a10 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -30,6 +30,7 @@ import com.intellij.lang.refactoring.NamesValidator; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.Result; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.impl.FinishMarkAction; @@ -327,7 +328,7 @@ public abstract class InplaceRefactoring { new WriteCommandAction(myProject, getCommandName()) { @Override - protected void run(com.intellij.openapi.application.Result result) throws Throwable { + protected void run(Result result) throws Throwable { startTemplate(builder); } }.execute(); From 4c1e69746ac8dc4dbad8a04de62dd30e35569139 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 30 Oct 2013 18:41:51 +0400 Subject: [PATCH 06/53] canceling introduce variable --- .../GrAbstractInplaceIntroducer.java | 246 ++++++ .../introduce/GrNewIntroduceHandlerBase.java | 765 ++++++++++++++++++ .../variable/GrInplaceVariableIntroducer.java | 158 +++- .../GrIntroduceLocalVariableProcessor.java | 14 +- .../variable/GrIntroduceVariableHandler.java | 107 +-- 5 files changed, 1167 insertions(+), 123 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java new file mode 100644 index 000000000000..c8c52d3f60d4 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -0,0 +1,246 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.refactoring.introduce; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Computable; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtilCore; +import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; + +import java.util.List; + + +/** + * Created by Max Medvedev on 10/28/13 + */ +public abstract class GrAbstractInplaceIntroducer extends AbstractInplaceIntroducer { + + private OccurrencesChooser.ReplaceChoice myReplaceChoice; + + private RangeMarker myVarMarker; + private final PsiFile myFile; + + private final GrIntroduceContext myContext; + + public GrAbstractInplaceIntroducer(String title, + OccurrencesChooser.ReplaceChoice replaceChoice, + GrIntroduceContext context) { + super(context.getProject(), context.getEditor(), context.getExpression(), context.getVar(), context.getOccurrences(), title, GroovyFileType.GROOVY_FILE_TYPE); + myReplaceChoice = replaceChoice; + myContext = context; + myFile = context.getPlace().getContainingFile(); + } + + public GrIntroduceContext getContext() { + return myContext; + } + + @Override + public void setReplaceAllOccurrences(boolean allOccurrences) { + throw new IncorrectOperationException("don't invoke this method"); + } + + @Override + public GrExpression restoreExpression(PsiFile containingFile, GrVariable variable, RangeMarker marker, String exprText) { + if (exprText == null) return null; + if (variable == null || !variable.isValid()) return null; + final PsiElement refVariableElement = containingFile.findElementAt(marker.getStartOffset()); + final PsiElement refVariableElementParent = refVariableElement != null ? refVariableElement.getParent() : null; + GrExpression expression = + refVariableElementParent instanceof GrNewExpression && refVariableElement.getNode().getElementType() == GroovyTokenTypes.kNEW + ? (GrNewExpression)refVariableElementParent + : PsiTreeUtil.getParentOfType(refVariableElement, GrReferenceExpression.class); + if (expression instanceof GrReferenceExpression && !(expression.getParent() instanceof GrMethodCall)) { + final String referenceName = ((GrReferenceExpression)expression).getReferenceName(); + if (((GrReferenceExpression)expression).resolve() == variable || + Comparing.strEqual(variable.getName(), referenceName) || + Comparing.strEqual(exprText, referenceName)) { + return (GrExpression)expression + .replace(GroovyPsiElementFactory.getInstance(myProject).createExpressionFromText(exprText, variable)); + } + } + if (expression == null) { + expression = PsiTreeUtil.getParentOfType(refVariableElement, GrExpression.class); + } + while (expression instanceof GrReferenceExpression) { + final PsiElement parent = expression.getParent(); + if (parent instanceof GrMethodCallExpression) { + if (parent.getText().equals(exprText)) return (GrExpression)parent; + } + if (parent instanceof GrExpression) { + expression = (GrExpression)parent; + if (expression.getText().equals(exprText)) { + return expression; + } + } + else { + return null; + } + } + if (expression != null && expression.isValid() && expression.getText().equals(exprText)) { + return expression; + } + + if (refVariableElementParent instanceof GrExpression && refVariableElementParent.getText().equals(exprText)) { + return (GrExpression)refVariableElementParent; + } + + return null; + } + + @Nullable + @Override + protected PsiElement getNameIdentifier() { + return ((GrVariable)myElementToRename).getNameIdentifierGroovy(); + } + + @Override + protected GrVariable getVariable() { + if (myVarMarker == null) return null; + + int offset = myVarMarker.getStartOffset(); + PsiElement at = myFile.findElementAt(offset); + GrVariable var = PsiTreeUtil.getParentOfType(at, GrVariable.class); + return var; + } + + @Override + protected void performIntroduce() { + final List markers = getOccurrenceMarkers(); + GrIntroduceContext context = new GrIntroduceContext() { + @NotNull + @Override + public Project getProject() { + return myProject; + } + + @Override + public Editor getEditor() { + return myEditor; + } + + @Nullable + @Override + public GrExpression getExpression() { + return (GrExpression)getExpr(); + } + + @Nullable + @Override + public GrVariable getVar() { + return getLocalVariable(); + } + + @Nullable + @Override + public StringPartInfo getStringPart() { + return null; + } + + @NotNull + @Override + public PsiElement[] getOccurrences() { + List result = ContainerUtil.map(markers, new Function() { + @Override + public PsiElement fun(RangeMarker marker) { + return GroovyRefactoringUtil.findElementInRange(myFile, marker.getStartOffset(), marker.getEndOffset(), GrExpression.class); + } + }); + return PsiUtilCore.toPsiElementArray(result); + } + + @Override + public PsiElement getScope() { + return myScope; + } + + @NotNull + @Override + public PsiElement getPlace() { + GrExpression expression = getExpression(); + return expression != null ? expression : getLocalVariable(); + } + }; + runRefactoring(context, getSettings(), true); + } + + @Nullable + @Override + protected GrVariable createFieldToStartTemplateOn(boolean replaceAll, String[] names) { + + final Settings settings = getInitialSettingsForInplace(myContext, myReplaceChoice, names); + if (settings == null) return null; + + SmartPsiElementPointer pointer = ApplicationManager.getApplication().runWriteAction(new Computable>() { + @Override + public SmartPsiElementPointer compute() { + GrVariable var = runRefactoring(myContext, settings, false); + return var != null ? SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(var) : null; + } + }); + + if (pointer != null) { + GrVariable var = pointer.getElement(); + if (var != null) { + myVarMarker = myContext.getEditor().getDocument().createRangeMarker(var.getTextRange()); + } + return var; + } + else { + return null; + } + } + + protected abstract GrVariable runRefactoring(GrIntroduceContext context, Settings settings, boolean processUsages); + + @Nullable + protected abstract Settings getInitialSettingsForInplace(@NotNull GrIntroduceContext context, + @NotNull OccurrencesChooser.ReplaceChoice choice, + String[] names); + + @Override + public boolean isReplaceAllOccurrences() { + return myReplaceChoice != OccurrencesChooser.ReplaceChoice.NO || myContext.getOccurrences().length == 1; + } + + protected abstract Settings getSettings(); + +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java new file mode 100644 index 000000000000..3be3b0ac7740 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java @@ -0,0 +1,765 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.refactoring.introduce; + +import com.intellij.codeInsight.highlighting.HighlightManager; +import com.intellij.diagnostic.LogMessageEx; +import com.intellij.lang.LanguageRefactoringSupport; +import com.intellij.lang.refactoring.RefactoringSupportProvider; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.editor.SelectionModel; +import com.intellij.openapi.editor.colors.EditorColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.markup.RangeHighlighter; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pass; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.psi.*; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.refactoring.IntroduceTargetChooser; +import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseLabel; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; +import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; +import org.jetbrains.plugins.groovy.refactoring.NameValidator; + +import java.util.*; + +import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipParentheses; + +/** + * Created by Max Medvedev on 10/29/13 + */ +public abstract class GrNewIntroduceHandlerBase implements RefactoringActionHandler { + private static final Logger LOG = Logger.getInstance(GrIntroduceHandlerBase.class); + + public static final Function GR_EXPRESSION_RENDERER = new Function() { + @Override + public String fun(@NotNull GrExpression expr) { + return expr.getText(); + } + }; + + public static GrExpression insertExplicitCastIfNeeded(GrVariable variable, GrExpression initializer) { + PsiType ltype = findLValueType(initializer); + PsiType rtype = initializer.getType(); + + GrExpression rawExpr = (GrExpression)skipParentheses(initializer, false); + + if (ltype == null || TypesUtil.isAssignableWithoutConversions(ltype, rtype, initializer) || !TypesUtil.isAssignable(ltype, rtype, initializer)) { + return rawExpr; + } + else { // implicit coercion should be replaced with explicit cast + GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(variable.getProject()); + GrSafeCastExpression cast = + (GrSafeCastExpression)factory.createExpressionFromText("a as B"); + cast.getOperand().replaceWithExpression(rawExpr, false); + cast.getCastTypeElement().replace(factory.createTypeElement(ltype)); + return cast; + } + } + + @Nullable + private static PsiType findLValueType(GrExpression initializer) { + if (initializer.getParent() instanceof GrAssignmentExpression && ((GrAssignmentExpression)initializer.getParent()).getRValue() == initializer) { + return ((GrAssignmentExpression)initializer.getParent()).getLValue().getNominalType(); + } + else if (initializer.getParent() instanceof GrVariable) { + return ((GrVariable)initializer.getParent()).getDeclaredType(); + } + else { + return null; + } + } + + @NotNull + protected abstract String getRefactoringName(); + + @NotNull + protected abstract String getHelpID(); + + @NotNull + protected abstract Scope[] findPossibleScopes(GrExpression expression, GrVariable variable, StringPartInfo stringPart, Editor editor); + + protected abstract void checkExpression(@NotNull GrExpression selectedExpr) throws GrRefactoringError; + + protected abstract void checkVariable(@NotNull GrVariable variable) throws GrRefactoringError; + + protected abstract void checkStringLiteral(@NotNull StringPartInfo info) throws GrRefactoringError; + + protected abstract void checkOccurrences(@NotNull PsiElement[] occurrences); + + @NotNull + protected abstract GrIntroduceDialog getDialog(@NotNull GrIntroduceContext context); + + @Nullable + public abstract GrVariable runRefactoring(@NotNull GrIntroduceContext context, @NotNull Settings settings); + + protected abstract GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice); + + protected abstract Settings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); + + public static Map> fillChoice(GrIntroduceContext context) { + HashMap> map = ContainerUtil.newLinkedHashMap(); + + if (context.getExpression() != null) { + map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getExpression())); + } + else if (context.getStringPart() != null) { + map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getStringPart())); + } + + PsiElement[] occurrences = context.getOccurrences(); + if (occurrences.length > 1) { + map.put(OccurrencesChooser.ReplaceChoice.ALL, Arrays.asList(occurrences)); + } + return map; + } + + @NotNull + public static List collectExpressions(final PsiFile file, final Editor editor, final int offset, boolean acceptVoidCalls) { + int correctedOffset = correctOffset(editor, offset); + final PsiElement elementAtCaret = file.findElementAt(correctedOffset); + final List expressions = new ArrayList(); + + for (GrExpression expression = PsiTreeUtil.getParentOfType(elementAtCaret, GrExpression.class); + expression != null; + expression = PsiTreeUtil.getParentOfType(expression, GrExpression.class)) { + if (expressions.contains(expression)) continue; + if (expression instanceof GrParenthesizedExpression && !expressions.contains(((GrParenthesizedExpression)expression).getOperand())) { + expressions.add(((GrParenthesizedExpression)expression).getOperand()); + } + if (expressionIsIncorrect(expression, acceptVoidCalls)) continue; + + expressions.add(expression); + } + return expressions; + } + + public static boolean expressionIsIncorrect(@Nullable GrExpression expression, boolean acceptVoidCalls) { + if (expression instanceof GrParenthesizedExpression) return true; + if (PsiUtil.isSuperReference(expression)) return true; + if (expression instanceof GrAssignmentExpression) return true; + if (expression instanceof GrReferenceExpression && expression.getParent() instanceof GrCall) { + final GroovyResolveResult resolveResult = ((GrReferenceExpression)expression).advancedResolve(); + final PsiElement resolved = resolveResult.getElement(); + return resolved instanceof PsiMethod && !resolveResult.isInvokedOnProperty() || resolved instanceof PsiClass; + } + + if (expression instanceof GrClosableBlock && expression.getParent() instanceof GrStringInjection) return true; + if (!acceptVoidCalls && expression instanceof GrMethodCall && PsiType.VOID == expression.getType()) return true; + + return false; + } + + public static int correctOffset(Editor editor, int offset) { + Document document = editor.getDocument(); + CharSequence text = document.getCharsSequence(); + int correctedOffset = offset; + int textLength = document.getTextLength(); + if (offset >= textLength) { + correctedOffset = textLength - 1; + } + else if (!Character.isJavaIdentifierPart(text.charAt(offset))) { + correctedOffset--; + } + + if (correctedOffset < 0) { + correctedOffset = offset; + } + else { + char c = text.charAt(correctedOffset); + if (c == ';' && correctedOffset != 0) {//initially caret on the end of line + correctedOffset--; + } + else if (!Character.isJavaIdentifierPart(c) && c != ')' && c != ']' && c != '}' && c != '\'' && c != '"' && c != '/') { + correctedOffset = offset; + } + } + return correctedOffset; + } + + @Nullable + public static GrVariable findVariableAtCaret(final PsiFile file, final Editor editor, final int offset) { + final int correctOffset = correctOffset(editor, offset); + final PsiElement elementAtCaret = file.findElementAt(correctOffset); + final GrVariable variable = PsiTreeUtil.getParentOfType(elementAtCaret, GrVariable.class); + if (variable != null && variable.getNameIdentifierGroovy().getTextRange().contains(correctOffset)) return variable; + return null; + } + + public void invoke(final @NotNull Project project, final Editor editor, final PsiFile file, final @Nullable DataContext dataContext) { + final SelectionModel selectionModel = editor.getSelectionModel(); + if (!selectionModel.hasSelection()) { + final int offset = editor.getCaretModel().getOffset(); + + final List expressions = collectExpressions(file, editor, offset, false); + if (expressions.isEmpty()) { + final GrVariable variable = findVariableAtCaret(file, editor, offset); + if (variable == null || variable instanceof GrField || variable instanceof GrParameter) { + selectionModel.selectLineAtCaret(); + } + else { + final TextRange textRange = variable.getTextRange(); + selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); + } + } + else if (expressions.size() == 1) { + final TextRange textRange = expressions.get(0).getTextRange(); + selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); + } + else { + IntroduceTargetChooser.showChooser(editor, expressions, new Pass() { + public void pass(final GrExpression selectedValue) { + invoke(project, editor, file, selectedValue.getTextRange().getStartOffset(), selectedValue.getTextRange().getEndOffset()); + } + }, GR_EXPRESSION_RENDERER); + return; + } + } + invoke(project, editor, file, selectionModel.getSelectionStart(), selectionModel.getSelectionEnd()); + } + + @Override + public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) { + // Does nothing + } + + public void getContextAndInvoke(@NotNull final Project project, + @NotNull final Editor editor, + @Nullable final GrExpression expression, + @Nullable final GrVariable variable, + @Nullable final StringPartInfo stringPart) { + final Scope[] scopes = findPossibleScopes(expression, variable, stringPart, editor); + + Pass callback = new Pass() { + @Override + public void pass(Scope scope) { + GrIntroduceContext context = getContext(project, editor, expression, variable, stringPart, scope); + invokeImpl(project, context, editor); + } + }; + + if (scopes.length == 0) { + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle + .getCannotRefactorMessage(getRefactoringName() + "is not available in current scope"), + getRefactoringName(), getHelpID()); + } + else if (scopes.length == 1) { + callback.pass(scopes[0]); + } + else { + showScopeChooser(scopes, callback, editor); + } + } + + protected abstract void showScopeChooser(Scope[] scopes, Pass callback, Editor editor); + + public GrIntroduceContext getContext(@NotNull Project project, + @NotNull Editor editor, + @Nullable GrExpression expression, + @Nullable GrVariable variable, + @Nullable StringPartInfo stringPart, + @NotNull PsiElement scope) { + if (variable != null) { + final List list = Collections.synchronizedList(new ArrayList()); + ReferencesSearch.search(variable, new LocalSearchScope(scope)).forEach(new Processor() { + @Override + public boolean process(PsiReference psiReference) { + final PsiElement element = psiReference.getElement(); + if (element != null) { + list.add(element); + } + return true; + } + }); + final PsiElement[] occurrences = list.toArray(new PsiElement[list.size()]); + return new GrIntroduceContextImpl(project, editor, variable.getInitializerGroovy(), variable, stringPart, occurrences, scope); + } + else if (expression != null ) { + final PsiElement[] occurrences = findOccurrences(expression, scope); + return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, occurrences, scope); + } + else { + assert stringPart != null; + return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, new PsiElement[]{stringPart.getLiteral()}, scope); + } + } + + private boolean invokeImpl(final Project project, final GrIntroduceContext context, final Editor editor) { + try { + if (!CommonRefactoringUtil.checkReadOnlyStatus(project, context.getOccurrences())) { + return false; + } + checkOccurrences(context.getOccurrences()); + + + if (isInplace(context.getEditor(), context.getPlace())) { + Map> occurrencesMap = fillChoice(context); + new OccurrencesChooser(editor) { + @Override + protected TextRange getOccurrenceRange(Object occurrence) { + if (occurrence instanceof PsiElement) { + return ((PsiElement)occurrence).getTextRange(); + } + else if (occurrence instanceof StringPartInfo) { + return ((StringPartInfo)occurrence).getRange(); + } + else { + return null; + } + } + }.showChooser(new Pass() { + @Override + public void pass(final OccurrencesChooser.ReplaceChoice choice) { + getIntroducer(context, choice).startInplaceIntroduceTemplate(); + } + }, occurrencesMap); + } + else { + final Settings settings = showDialog(context); + if (settings == null) return false; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + runRefactoring(context, settings); + } + }); + } + + return true; + } + catch (GrRefactoringError e) { + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); + return false; + } + } + + @NotNull + protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { + final PsiElement[] occurrences = GroovyRefactoringUtil.getExpressionOccurrences(skipParentheses(expression, false), scope); + if (occurrences == null || occurrences.length == 0) { + throw new GrRefactoringError(GroovyRefactoringBundle.message("no.occurrences.found")); + } + return occurrences; + } + + private void invoke(@NotNull final Project project, + @NotNull final Editor editor, + @NotNull PsiFile file, + int startOffset, + int endOffset) throws GrRefactoringError { + try { + PsiDocumentManager.getInstance(project).commitAllDocuments(); + if (!(file instanceof GroovyFileBase)) { + throw new GrRefactoringError(GroovyRefactoringBundle.message("only.in.groovy.files")); + } + if (!CommonRefactoringUtil.checkReadOnlyStatus(project, file)) { + throw new GrRefactoringError(RefactoringBundle.message("readonly.occurences.found")); + } + + GrExpression selectedExpr = findExpression(file, startOffset, endOffset); + final GrVariable variable = findVariable(file, startOffset, endOffset); + final StringPartInfo stringPart = StringPartInfo.findStringPart(file, startOffset, endOffset); + if (variable != null) { + checkVariable(variable); + } + else if (selectedExpr != null) { + checkExpression(selectedExpr); + } + else if (stringPart != null) { + checkStringLiteral(stringPart); + } + else { + throw new GrRefactoringError(null); + } + + getContextAndInvoke(project, editor, selectedExpr, variable, stringPart); + } + catch (GrRefactoringError e) { + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); + } + } + + public static RangeMarker createRange(Document document, StringPartInfo part) { + if (part == null) { + return null; + } + TextRange range = part.getRange().shiftRight(part.getLiteral().getTextRange().getStartOffset()); + return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), true); + + } + + @Nullable + public static RangeMarker createRange(@NotNull Document document, @Nullable PsiElement expression) { + if (expression == null) { + return null; + } + TextRange range = expression.getTextRange(); + return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), false); + } + + + public static boolean isInplace(@NotNull Editor editor, @NotNull PsiElement place) { + final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forLanguage(place.getLanguage()); + return supportProvider != null && + editor.getSettings().isVariableInplaceRenameEnabled() && + supportProvider.isInplaceIntroduceAvailable(place, place) && + !ApplicationManager.getApplication().isUnitTestMode(); + } + + @Nullable + public static GrVariable findVariable(@NotNull PsiFile file, int startOffset, int endOffset) { + GrVariable var = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariable.class); + if (var == null) { + final GrVariableDeclaration variableDeclaration = + GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariableDeclaration.class); + if (variableDeclaration == null) return null; + final GrVariable[] variables = variableDeclaration.getVariables(); + if (variables.length == 1) { + var = variables[0]; + } + } + if (var instanceof GrParameter || var instanceof GrField) { + return null; + } + return var; + } + + @Nullable + public static GrVariable findVariable(@NotNull GrStatement statement) { + if (!(statement instanceof GrVariableDeclaration)) return null; + final GrVariableDeclaration variableDeclaration = (GrVariableDeclaration)statement; + final GrVariable[] variables = variableDeclaration.getVariables(); + + GrVariable var = null; + if (variables.length == 1) { + var = variables[0]; + } + if (var instanceof GrParameter || var instanceof GrField) { + return null; + } + return var; + } + + + @Nullable + public static GrExpression findExpression(PsiFile file, int startOffset, int endOffset) { + GrExpression selectedExpr = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrExpression.class); + return findExpression(selectedExpr); + } + + @Nullable + public static GrExpression findExpression(GrStatement selectedExpr) { + if (!(selectedExpr instanceof GrExpression)) return null; + + GrExpression selected = (GrExpression)selectedExpr; + while (selected instanceof GrParenthesizedExpression) selected = ((GrParenthesizedExpression)selected).getOperand(); + if (selected == null) return null; + PsiType type = selected.getType(); + if (type != null) type = TypeConversionUtil.erasure(type); + + if (PsiType.VOID.equals(type)) { + return null; + } + + return selected; + } + + @Nullable + private Settings showDialog(@NotNull GrIntroduceContext context) { + + // Add occurrences highlighting + ArrayList highlighters = new ArrayList(); + HighlightManager highlightManager = null; + if (context.getEditor() != null) { + highlightManager = HighlightManager.getInstance(context.getProject()); + EditorColorsManager colorsManager = EditorColorsManager.getInstance(); + TextAttributes attributes = colorsManager.getGlobalScheme().getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES); + if (context.getOccurrences().length > 1) { + highlightManager.addOccurrenceHighlights(context.getEditor(), context.getOccurrences(), attributes, true, highlighters); + } + } + + GrIntroduceDialog dialog = getDialog(context); + + dialog.show(); + if (dialog.isOK()) { + if (context.getEditor() != null) { + for (RangeHighlighter highlighter : highlighters) { + highlightManager.removeSegmentHighlighter(context.getEditor(), highlighter); + } + } + return dialog.getSettings(); + } + else { + if (context.getOccurrences().length > 1) { + WindowManager.getInstance().getStatusBar(context.getProject()) + .setInfo(GroovyRefactoringBundle.message("press.escape.to.remove.the.highlighting")); + } + } + return null; + } + + @Nullable + public static PsiElement findAnchor(@NotNull PsiElement[] occurrences, + @NotNull PsiElement container) { + if (occurrences.length == 0) return null; + + PsiElement candidate; + if (occurrences.length == 1) { + candidate = occurrences[0]; + candidate = findContainingStatement(candidate); + } + else { + candidate = occurrences[0]; + while (candidate != null && candidate.getParent() != container) { + candidate = candidate.getParent(); + } + } + + final GrStringInjection injection = PsiTreeUtil.getParentOfType(candidate, GrStringInjection.class); + if (injection != null && !injection.getText().contains("\n")) { + candidate = findContainingStatement(injection); + } + + if (candidate == null) return null; + + if ((container instanceof GrWhileStatement) && + candidate.equals(((GrWhileStatement)container).getCondition())) { + return container; + } + if ((container instanceof GrIfStatement) && + candidate.equals(((GrIfStatement)container).getCondition())) { + return container; + } + if ((container instanceof GrForStatement) && + candidate.equals(((GrForStatement)container).getClause())) { + return container; + } + + while (candidate instanceof GrIfStatement && + candidate.getParent() instanceof GrIfStatement && + ((GrIfStatement)candidate.getParent()).getElseBranch() == candidate) { + candidate = candidate.getParent(); + } + return candidate; + } + + public static void assertStatement(PsiElement anchor, PsiElement[] occurrences, PsiElement scope) { + if (!(anchor instanceof GrStatement)) { + StringBuilder error = new StringBuilder("scope:"); + error.append(scope.getText()); + error.append("\n---------------------------------------\n\n"); + error.append("occurrences: "); + for (PsiElement occurrence : occurrences) { + error.append(occurrence.getText()); + error.append("\n------------------\n"); + } + + LogMessageEx.error(LOG, "cannot find anchor for variable", error.toString()); + } + } + + + @Nullable + private static PsiElement findContainingStatement(@Nullable PsiElement candidate) { + while (candidate != null && !PsiUtil.isExpressionStatement(candidate)) { + candidate = candidate.getParent(); + if (candidate instanceof GrCaseLabel) candidate = candidate.getParent(); + } + return candidate; + } + + public static void deleteLocalVar(@NotNull GrIntroduceContext context) { + final GrVariable resolved = resolveLocalVar(context); + + final PsiElement parent = resolved.getParent(); + if (((GrVariableDeclaration)parent).getVariables().length == 1) { + parent.delete(); + } + else { + GrExpression initializer = resolved.getInitializerGroovy(); + if (initializer != null) initializer.delete(); //don't special check for tuple, but this line is for the tuple case + resolved.delete(); + } + } + + @NotNull + public static GrVariable resolveLocalVar(@NotNull GrIntroduceContext context) { + final GrVariable var = context.getVar(); + if (var != null) { + return var; + } + + final GrReferenceExpression expression = (GrReferenceExpression)context.getExpression(); + assert expression != null; + + final PsiElement resolved = expression.resolve(); + assert resolved instanceof GrVariable; + return (GrVariable)resolved; + } + + public static boolean hasLhs(@NotNull final PsiElement[] occurrences) { + for (PsiElement element : occurrences) { + if (element instanceof GrReferenceExpression) { + if (PsiUtil.isLValue((GroovyPsiElement)element)) return true; + if (ControlFlowUtils.isIncOrDecOperand((GrReferenceExpression)element)) return true; + } + } + return false; + } + + @NotNull + public static PsiElement getCurrentPlace(@Nullable GrExpression expr, + @Nullable GrVariable var, + @Nullable StringPartInfo stringPartInfo) { + if (var != null) return var; + if (expr != null) return expr; + if (stringPartInfo != null) return stringPartInfo.getLiteral(); + + throw new IncorrectOperationException(); + } + + @NotNull + public static GrExpression generateExpressionFromStringPart(final StringPartInfo stringPart, final Project project) { + Data data = new Data(stringPart); + String startQuote = data.getStartQuote(); + TextRange range = data.getRange(); + String literalText = data.getText(); + String endQuote = data.getEndQuote(); + + final String substringLiteral = startQuote + range.substring(literalText) + endQuote; + return GroovyPsiElementFactory.getInstance(project).createExpressionFromText(substringLiteral); + } + + @NotNull + public static GrExpression processLiteral(final String varName, final StringPartInfo stringPart, final Project project) { + Data data = new Data(stringPart); + String startQuote = data.getStartQuote(); + TextRange range = data.getRange(); + String literalText = data.getText(); + String endQuote = data.getEndQuote(); + + String prefix = literalText.substring(0, range.getStartOffset()) ; + String suffix = literalText.substring(range.getEndOffset()); + + StringBuilder buffer = new StringBuilder(); + if (!prefix.equals(startQuote)) { + buffer.append(prefix).append(endQuote).append('+'); + } + buffer.append(varName); + if (!suffix.equals(endQuote)) { + buffer.append('+').append(startQuote).append(suffix); + } + + final GrExpression concatenation = GroovyPsiElementFactory.getInstance(project).createExpressionFromText(buffer); + + final GrExpression concat = stringPart.getLiteral().replaceWithExpression(concatenation, false); + if (concat instanceof GrReferenceExpression) { + return concat; + } + else { + assert concat instanceof GrBinaryExpression; + final GrExpression left = ((GrBinaryExpression)concat).getLeftOperand(); + if (left instanceof GrReferenceExpression) { + return left; + } + else { + assert left instanceof GrBinaryExpression; + final GrExpression right = ((GrBinaryExpression)left).getRightOperand(); + assert right != null; + return right; + } + } + } + + public interface Validator extends NameValidator { + boolean isOK(GrIntroduceDialog dialog); + } + + private static class Data { + private String myText; + private String myStartQuote; + private String myEndQuote; + private TextRange myRange; + + public Data(final StringPartInfo stringPartInfo) { + assert stringPartInfo != null; + + final GrLiteral literal = stringPartInfo.getLiteral(); + + myText = literal.getText(); + + myStartQuote = GrStringUtil.getStartQuote(myText); + myEndQuote = GrStringUtil.getEndQuote(myText); + final TextRange dataRange = new TextRange(myStartQuote.length(), myText.length() - myEndQuote.length()); + + myRange = stringPartInfo.getRange().intersection(dataRange); + } + + public String getText() { + return myText; + } + + public String getStartQuote() { + return myStartQuote; + } + + public String getEndQuote() { + return myEndQuote; + } + + public TextRange getRange() { + return myRange; + } + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java index eb19b097c90f..d7d3fb7c33cc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java @@ -16,25 +16,29 @@ package org.jetbrains.plugins.groovy.refactoring.introduce.variable; import com.intellij.codeInsight.template.TemplateBuilderImpl; +import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; +import com.intellij.openapi.keymap.Keymap; +import com.intellij.openapi.keymap.KeymapManager; +import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.psi.*; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.ui.NonFocusableCheckBox; -import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SupertypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrFinalListener; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; +import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; import org.jetbrains.plugins.groovy.settings.GroovyApplicationSettings; import org.jetbrains.plugins.groovy.template.expressions.ChooseTypeExpression; @@ -42,30 +46,41 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.LinkedHashSet; -import java.util.List; /** - * @author Max Medvedev + * Created by Max Medvedev on 10/29/13 */ -public class GrInplaceVariableIntroducer extends GrInplaceIntroducer { +public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntroducer { private JCheckBox myCanBeFinalCb; + private SmartTypePointer myTypePointer; - public GrInplaceVariableIntroducer(GrVariable elementToRename, - Editor editor, - Project project, - String title, - List occurrences, - @Nullable PsiElement elementToIntroduce) { - super(elementToRename, editor, project, title, occurrences, elementToIntroduce); - } - - @Override - public LinkedHashSet suggestNames(GrIntroduceContext context) { - return ContainerUtil.newLinkedHashSet(GroovyNameSuggestionUtil.suggestVariableNames(getVariable().getInitializerGroovy(), new GroovyVariableValidator(context))); + public GrInplaceVariableIntroducer(String title, + OccurrencesChooser.ReplaceChoice replaceChoice, + GrIntroduceContext context) { + super(title, replaceChoice, context); + setAdvertisementText(getAdvertisementText()); } @Nullable + private static String getAdvertisementText() { + final Keymap keymap = KeymapManager.getInstance().getActiveKeymap(); + final Shortcut[] shortcuts = keymap.getShortcuts("PreviousTemplateVariable"); + if (shortcuts.length > 0) { + return "Press " + KeymapUtil.getShortcutText(shortcuts[0]) + " to change type"; + } + return null; + } + + @Override + protected String getActionName() { + return GrIntroduceVariableHandler.REFACTORING_NAME; + } + + @Override + protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) { + return GroovyNameSuggestionUtil.suggestVariableNames(getContext().getExpression(), new GroovyVariableValidator(getContext())); + } + @Override protected JComponent getComponent() { myCanBeFinalCb = new NonFocusableCheckBox("Declare final"); @@ -91,22 +106,58 @@ public class GrInplaceVariableIntroducer extends GrInplaceIntroducer { panel.setBorder(null); if (myCanBeFinalCb != null) { - panel.add(myCanBeFinalCb, new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + panel.add(myCanBeFinalCb, new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, + new Insets(5, 5, 5, 5), 0, 0)); } - panel.add(Box.createVerticalBox(), new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0)); + panel.add(Box.createVerticalBox(), + new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); return panel; - } + @Nullable @Override - public void finish(boolean success) { - super.finish(success); + protected GroovyIntroduceVariableSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, + @NotNull final OccurrencesChooser.ReplaceChoice choice, + final String[] names) { + return new GroovyIntroduceVariableSettings() { + private final CanonicalTypes.Type myType; - if (success) { - GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF = getVariable().getDeclaredType() == null; - } + { + GrExpression expression = context.getExpression(); + StringPartInfo stringPart = context.getStringPart(); + GrVariable var = context.getVar(); + PsiType type = expression != null ? expression.getType() : + var != null ? var.getType() : + stringPart != null ? stringPart.getLiteral().getType() : + null; + myType = type != null ? CanonicalTypes.createTypeWrapper(type) : null; + } + + + @Override + public boolean isDeclareFinal() { + return myCanBeFinalCb != null ? myCanBeFinalCb.isSelected() : false; + } + + @Nullable + @Override + public String getName() { + return names[0]; + } + + @Override + public boolean replaceAllOccurrences() { + return choice == OccurrencesChooser.ReplaceChoice.ALL; + } + + @Nullable + @Override + public PsiType getSelectedType() { + return myType != null ? myType.getType(context.getPlace(), context.getPlace().getManager()) : null; + } + }; } @Override @@ -119,4 +170,47 @@ public class GrInplaceVariableIntroducer extends GrInplaceIntroducer { : PsiUtil.findModifierInList(variable.getModifierList(), GrModifier.DEF); builder.replaceElement(element, "Variable_type", typeExpression, true, true); } -} + + protected GroovyIntroduceVariableSettings getSettings() { + return new GroovyIntroduceVariableSettings() { + @Override + public boolean isDeclareFinal() { + return myCanBeFinalCb.isSelected(); + } + + @Nullable + @Override + public String getName() { + return GrInplaceVariableIntroducer.this.getInputName(); + } + + @Override + public boolean replaceAllOccurrences() { + return isReplaceAllOccurrences(); + } + + @Nullable + @Override + public PsiType getSelectedType() { + return myTypePointer != null ? myTypePointer.getType() : null; + } + }; + } + + @Override + protected void saveSettings(@NotNull GrVariable variable) { + GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF = variable.getDeclaredType() == null; + } + + @Override + protected int getCaretOffset() { + return getVariable().getNameIdentifierGroovy().getTextRange().getEndOffset(); + } + + @Override + protected void restoreState(GrVariable psiField) { + PsiType declaredType = getVariable().getDeclaredType(); + myTypePointer = declaredType != null ? SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(declaredType) : null; + super.restoreState(psiField); + } +} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java index 3d01195b1c4b..9546a20a24a4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java @@ -46,26 +46,26 @@ import java.util.List; /** * @author Max Medvedev */ -public class GrIntroduceLocalVariableProcessor { +public abstract class GrIntroduceLocalVariableProcessor { private static final Logger LOG = Logger.getInstance(GrIntroduceLocalVariableProcessor.class); private final GrIntroduceContext myContext; private final GroovyIntroduceVariableSettings mySettings; + private final boolean myProcessUsages; private final PsiElement[] myOccurrences; private GrExpression myExpression; - private final GrIntroduceVariableHandler myHandler; public GrIntroduceLocalVariableProcessor(@NotNull GrIntroduceContext context, @NotNull GroovyIntroduceVariableSettings settings, @NotNull PsiElement[] occurrences, @NotNull GrExpression expression, - @NotNull GrIntroduceVariableHandler handler) { + boolean processUsages) { myContext = context; mySettings = settings; + myProcessUsages = processUsages; myOccurrences = settings.replaceAllOccurrences() ? occurrences : new PsiElement[]{expression}; myExpression = expression; - myHandler = handler; } @NotNull @@ -75,7 +75,7 @@ public class GrIntroduceLocalVariableProcessor { preprocessOccurrences(); int expressionIndex = ArrayUtilRt.find(myOccurrences, myExpression); - final PsiElement[] replaced = processOccurrences(); + final PsiElement[] replaced = myProcessUsages ? processOccurrences() : myOccurrences; PsiElement replacedExpression = replaced[expressionIndex]; GrStatement anchor = getAnchor(replaced); @@ -84,9 +84,7 @@ public class GrIntroduceLocalVariableProcessor { return insertVariableDefinition(declaration, anchor, replacedExpression); } - private void refreshPositionMarker(PsiElement e) { - myHandler.refreshPositionMarker(myContext.getEditor().getDocument().createRangeMarker(e.getTextRange())); - } + protected abstract void refreshPositionMarker(PsiElement e); private static boolean isControlStatementBranch(GrStatement statement) { return statement.getParent() instanceof GrLoopStatement && statement == ((GrLoopStatement)statement.getParent()).getBody() || diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index cd2d27b5bdbc..6f4c0ccca064 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -13,24 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.jetbrains.plugins.groovy.refactoring.introduce.variable; -import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.keymap.Keymap; -import com.intellij.openapi.keymap.KeymapManager; -import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.util.Pass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiType; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; -import com.intellij.refactoring.util.CanonicalTypes; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GrControlFlowOwner; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; @@ -46,14 +38,13 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceHandlerBase; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrNewIntroduceHandlerBase; import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; -import java.util.List; - /** - * @author ilyas + * Created by Max Medvedev on 10/29/13 */ -public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase { +public class GrIntroduceVariableHandler extends GrNewIntroduceHandlerBase { public static final String DUMMY_NAME = "________________xxx_________________"; protected static final String REFACTORING_NAME = GroovyRefactoringBundle.message("introduce.variable.title"); private RangeMarker myPosition = null; @@ -130,7 +121,7 @@ public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase occurrenceMarkers, - RangeMarker varRangeMarker, RangeMarker expressionRangeMarker, - RangeMarker stringPartRangeMarker) { - context.getEditor().getCaretModel().moveToOffset(var.getTextOffset()); - GrInplaceVariableIntroducer introducer = new GrInplaceVariableIntroducer(var, context.getEditor(), context.getProject(), REFACTORING_NAME, occurrenceMarkers, var); - introducer.setAdvertisementText(getAdvertisementText(var.getDeclaredType() != null)); - - return introducer; - } - - @Nullable - private static String getAdvertisementText(final boolean hasTypeSuggestion) { - final Keymap keymap = KeymapManager.getInstance().getActiveKeymap(); - if (hasTypeSuggestion) { - final Shortcut[] shortcuts = keymap.getShortcuts("PreviousTemplateVariable"); - if (shortcuts.length > 0) { - return "Press " + KeymapUtil.getShortcutText(shortcuts[0]) + " to change type"; + protected GrInplaceVariableIntroducer getIntroducer(@NotNull GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + return new GrInplaceVariableIntroducer(getRefactoringName(), choice, context) { + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GroovyIntroduceVariableSettings settings, boolean processUsages) { + final GrVariableDeclaration varDecl = generateDeclaration(context, settings); + return processExpression(context, settings, varDecl, processUsages); } - } - return null; + }; } @Override - protected GroovyIntroduceVariableSettings getSettingsForInplace(final GrIntroduceContext context, final OccurrencesChooser.ReplaceChoice choice) { - return new GroovyIntroduceVariableSettings() { - private final CanonicalTypes.Type myType; - private final String myName; - - - { - GrExpression expression = context.getExpression(); - StringPartInfo stringPart = context.getStringPart(); - GrVariable var = context.getVar(); - PsiType type = expression != null ? expression.getType() : - var != null ? var.getType() : - stringPart != null ? stringPart.getLiteral().getType() : - null; - myType = type != null ?CanonicalTypes.createTypeWrapper(type) : null; - - myName = new GrVariableNameSuggester(context, new GroovyVariableValidator(context)).suggestNames().iterator().next(); - } - - - @Override - public boolean isDeclareFinal() { - return false; - } - - @Nullable - @Override - public String getName() { - return myName; - } - - @Override - public boolean replaceAllOccurrences() { - return choice == OccurrencesChooser.ReplaceChoice.ALL; - } - - @Nullable - @Override - public PsiType getSelectedType() { - return myType != null ? myType.getType(context.getPlace(), context.getPlace().getManager()) : null; - } - }; + protected GroovyIntroduceVariableSettings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + return null; } @Override @@ -231,24 +167,29 @@ public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase Date: Thu, 31 Oct 2013 16:09:47 +0400 Subject: [PATCH 07/53] canceling introduce field --- .../GrAbstractInplaceIntroducer.java | 17 +- .../GrNewIntroduceFieldHandlerBase.java | 81 +++++++ .../introduce/GrNewIntroduceHandlerBase.java | 2 - .../field/GrInplaceFieldIntroducer.java | 220 +++++++++--------- .../field/GrIntroduceFieldHandler.java | 133 ++--------- .../field/GrIntroduceFieldProcessor.java | 25 +- .../variable/GrInplaceVariableIntroducer.java | 14 +- .../variable/GrIntroduceVariableHandler.java | 5 - 8 files changed, 247 insertions(+), 250 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java index c8c52d3f60d4..42aba9b55d30 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -21,10 +21,7 @@ import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.SmartPointerManager; -import com.intellij.psi.SmartPsiElementPointer; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer; @@ -53,6 +50,7 @@ import java.util.List; */ public abstract class GrAbstractInplaceIntroducer extends AbstractInplaceIntroducer { + private SmartTypePointer myTypePointer; private OccurrencesChooser.ReplaceChoice myReplaceChoice; private RangeMarker myVarMarker; @@ -243,4 +241,15 @@ public abstract class GrAbstractInplaceIntroducer extends GrNewIntroduceHandlerBase { + @NotNull + @Override + protected PsiClass[] findPossibleScopes(GrExpression expression, + GrVariable variable, + StringPartInfo partInfo, + Editor editor) { + PsiElement place = getCurrentPlace(expression, variable, partInfo); + PsiClass aClass = PsiUtil.getContextClass(place); + if (aClass instanceof GroovyScriptClass) { + return new PsiClass[]{aClass}; + } + else { + List result = ContainerUtil.newArrayList(aClass); + while (aClass != null) { + aClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class); + ContainerUtil.addIfNotNull(result, aClass); + } + return result.toArray(new PsiClass[result.size()]); + } + } + + @Override + protected void showScopeChooser(PsiClass[] scopes, final Pass callback, Editor editor) { + PsiElementProcessor processor = new PsiElementProcessor() { + @Override + public boolean execute(@NotNull PsiClass element) { + callback.pass(element); + return false; + } + }; + + NavigationUtil.getPsiElementPopup(scopes, new PsiClassListCellRenderer(), "Choose class to introduce field", processor).showInBestPositionFor(editor); + } + + @NotNull + @Override + protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { + if (scope instanceof GroovyScriptClass) { + scope = scope.getContainingFile(); + } + return super.findOccurrences(expression, scope); + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java index 3be3b0ac7740..fc05ece3b41f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java @@ -145,8 +145,6 @@ public abstract class GrNewIntroduceHandlerBase getIntroducer(@NotNull GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); - protected abstract Settings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); - public static Map> fillChoice(GrIntroduceContext context) { HashMap> map = ContainerUtil.newLinkedHashMap(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java index c37d13ddd471..2f924f9e947a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java @@ -17,46 +17,36 @@ package org.jetbrains.plugins.groovy.refactoring.introduce.field; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.introduce.inplace.KeyboardComboSwitcher; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import com.intellij.ui.NonFocusableCheckBox; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrFinalListener; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContextImpl; +import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EnumSet; -import java.util.LinkedHashSet; -import java.util.List; /** * @author Max Medvedev */ -public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { +public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer { private final GrInplaceIntroduceFieldPanel myPanel; - private final GrIntroduceContext myContext; - private final RangeMarker myExpressionRangeMarker; - private final RangeMarker myStringPartRangeMarker; - private final GrExpression myInitializer; private final GrFinalListener finalListener; - private final boolean myReplaceAll; + private String[] mySuggestedNames; + private boolean myIsStatic; @Nullable @Override @@ -64,93 +54,91 @@ public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { return getVariable().getContainingFile(); } - public GrInplaceFieldIntroducer(GrVariable var, - GrIntroduceContext context, - List occurrences, - boolean replaceAll, - @Nullable RangeMarker expressionRangeMarker, - @Nullable RangeMarker stringPartRangeMarker, - GrExpression initializer) { - super(var, context.getEditor(), context.getProject(), IntroduceFieldHandler.REFACTORING_NAME, occurrences, context.getPlace()); + public GrInplaceFieldIntroducer(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + super(IntroduceFieldHandler.REFACTORING_NAME, choice, context); - myContext = context; - myReplaceAll = replaceAll; - myExpressionRangeMarker = expressionRangeMarker; - myStringPartRangeMarker = stringPartRangeMarker; - myInitializer = initializer; - - myPanel = new GrInplaceIntroduceFieldPanel(context.getProject(), - GrIntroduceFieldHandler.getApplicableInitPlaces(context, replaceAll)); + myPanel = new GrInplaceIntroduceFieldPanel(context.getProject(), GrIntroduceFieldHandler.getApplicableInitPlaces(context, choice == OccurrencesChooser.ReplaceChoice.ALL)); finalListener = new GrFinalListener(myEditor); + + mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(context.getExpression(), new GroovyInplaceFieldValidator(getContext()), false); + } + + @Nullable + @Override + protected GrIntroduceFieldSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, + @NotNull final OccurrencesChooser.ReplaceChoice choice, + String[] names) { + return new GrIntroduceFieldSettings() { + @Override + public boolean declareFinal() { + return false; + } + + @Override + public Init initializeIn() { + return Init.FIELD_DECLARATION; + } + + @Override + public String getVisibilityModifier() { + return PsiModifier.PRIVATE; + } + + @Override + public boolean isStatic() { + boolean hasInstanceInScope = true; + PsiClass clazz = (PsiClass)context.getScope(); + if (replaceAllOccurrences()) { + for (PsiElement occurrence : context.getOccurrences()) { + if (!PsiUtil.hasEnclosingInstanceInScope(clazz, occurrence, false)) { + hasInstanceInScope = false; + break; + } + } + } + else if (context.getExpression() != null) { + hasInstanceInScope = PsiUtil.hasEnclosingInstanceInScope(clazz, context.getExpression(), false); + } + else if (context.getStringPart() != null) { + hasInstanceInScope = PsiUtil.hasEnclosingInstanceInScope(clazz, context.getStringPart().getLiteral(), false); + } + + return !hasInstanceInScope; + } + + @Override + public boolean removeLocalVar() { + return context.getVar() != null; + } + + @Nullable + @Override + public String getName() { + return new GrFieldNameSuggester(context, new GroovyInplaceFieldValidator(context), false).suggestNames().iterator().next(); + } + + @Override + public boolean replaceAllOccurrences() { + return context.getVar() != null || choice == OccurrencesChooser.ReplaceChoice.ALL; + } + + @Nullable + @Override + public PsiType getSelectedType() { + GrExpression expression = context.getExpression(); + GrVariable var = context.getVar(); + StringPartInfo stringPart = context.getStringPart(); + return var != null ? var.getDeclaredType() : + expression != null ? expression.getType() : + stringPart != null ? stringPart.getLiteral().getType() : + null; + } + }; } @Override - protected void moveOffsetAfter(boolean success) { - if (success) { - final GrVariable field = getVariable(); - assert field != null; - GrIntroduceFieldProcessor processor = new GrIntroduceFieldProcessor(generateContext(), generateSettings(), false) { - @NotNull - @Override - protected GrExpression getInitializer() { - return myInitializer; - } - - @NotNull - @Override - protected GrVariableDeclaration insertField(@NotNull PsiClass targetClass, @NotNull GrVariableDeclaration declaration) { - return (GrVariableDeclaration)field.getParent(); - } - }; - processor.run(); - } - super.moveOffsetAfter(success); - } - - private GrIntroduceContext generateContext() { - final List occurrenceMarkers = getOccurrenceMarkers(); - - List occurrences = ContainerUtil.newArrayList(); - for (RangeMarker marker : occurrenceMarkers) { - ContainerUtil.addIfNotNull(occurrences, findExpression(marker)); - } - - GrExpression expr = null; - if (myExpressionRangeMarker != null) expr = findExpression(myExpressionRangeMarker); - if (myStringPartRangeMarker != null) { - expr = findExpressionFromStringPartMarker(myStringPartRangeMarker); - occurrences.add(expr); - } - - return new GrIntroduceContextImpl(myContext.getProject(), myContext.getEditor(), expr, null, null, PsiUtilCore.toPsiElementArray( - occurrences), myContext.getScope()); - } - - @Nullable - private GrExpression findExpressionFromStringPartMarker(RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - GrBinaryExpression binary = PsiTreeUtil.getParentOfType(leaf, GrBinaryExpression.class); - if (binary != null) { - return binary.getRightOperand(); - } - return null; - } - - @Nullable - private GrExpression findExpression(@NotNull RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - if (leaf != null && leaf.getParent() instanceof GrReferenceExpression) { - return (GrExpression)leaf.getParent(); - } - return null; - } - - private GrIntroduceFieldSettings generateSettings() { + protected GrIntroduceFieldSettings getSettings() { return new GrIntroduceFieldSettings() { @Override public boolean declareFinal() { @@ -169,7 +157,7 @@ public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { @Override public boolean isStatic() { - return getVariable().hasModifierProperty(PsiModifier.STATIC); + return myIsStatic; } @Override @@ -180,34 +168,50 @@ public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { @Nullable @Override public String getName() { - return getVariable().getName(); + return getInputName(); } @Override public boolean replaceAllOccurrences() { - return myReplaceAll; + return isReplaceAllOccurrences(); } @Nullable @Override public PsiType getSelectedType() { - return getVariable().getDeclaredType(); + return GrInplaceFieldIntroducer.this.getSelectedType(); } }; } + @Override + protected String getActionName() { + return IntroduceFieldHandler.REFACTORING_NAME; + } + + @Override + protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) { + return mySuggestedNames; + } + + @Override + protected void saveSettings(@NotNull GrVariable variable) { + + } + + @Override + protected void restoreState(GrVariable psiField) { + myIsStatic = psiField.hasModifierProperty(PsiModifier.STATIC); + + super.restoreState(psiField); + } + @Nullable @Override protected JComponent getComponent() { return myPanel.getRootPane(); } - @Override - public LinkedHashSet suggestNames(GrIntroduceContext context) { - return ContainerUtil.newLinkedHashSet( - GroovyNameSuggestionUtil.suggestVariableNames(myInitializer, new GroovyInplaceFieldValidator(context), false)); - } - public class GrInplaceIntroduceFieldPanel { private final Project myProject; private JPanel myRootPane; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index dad877d0da96..1279f74003ce 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -16,25 +16,21 @@ package org.jetbrains.plugins.groovy.refactoring.introduce.field; import com.intellij.codeInsight.TestFrameworks; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.editor.RangeMarker; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiType; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; +import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; @@ -47,7 +43,7 @@ import java.util.List; /** * @author Maxim.Medvedev */ -public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase { +public class GrIntroduceFieldHandler extends GrNewIntroduceFieldHandlerBase { @NotNull @Override @@ -100,45 +96,32 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase occurrenceMarkers, - @Nullable RangeMarker varRangeMarker, - @Nullable RangeMarker expressionRangeMarker, - @Nullable RangeMarker stringPartRangeMarker) { - if (varRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(var.getNameIdentifierGroovy().getTextRange().getStartOffset()); - } - else if (expressionRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(expressionRangeMarker.getStartOffset()); - } - else if (stringPartRangeMarker != null) { - int offset = stringPartRangeMarker.getStartOffset(); - PsiElement at = var.getContainingFile().findElementAt(offset); - GrExpression ref = PsiTreeUtil.getParentOfType(at, GrBinaryExpression.class).getRightOperand(); - context.getEditor().getCaretModel().moveToOffset(ref.getTextRange().getStartOffset()); - } - GrExpression initializer = - GroovyPsiElementFactory.getInstance(context.getProject()).createExpressionFromText(var.getInitializerGroovy().getText()); - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - var.setInitializerGroovy(null); - } - }); - return new GrInplaceFieldIntroducer(var, context, occurrenceMarkers, settings.replaceAllOccurrences(), expressionRangeMarker, - stringPartRangeMarker, initializer); + @Override + protected GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice) { + return new GrInplaceFieldIntroducer(context, choice) { + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceFieldSettings settings, boolean processUsages) { + if (processUsages) { + return GrIntroduceFieldHandler.this.runRefactoring(context, settings); + } + else { + return new GrIntroduceFieldProcessor(context, settings).insertField( (PsiClass)context.getScope()).getVariables()[0]; + } + } + }; } static EnumSet getApplicableInitPlaces(GrIntroduceContext context, boolean replaceAll) { - EnumSet result = EnumSet.of(GrIntroduceFieldSettings.Init.FIELD_DECLARATION, - GrIntroduceFieldSettings.Init.CONSTRUCTOR); + EnumSet result = EnumSet.of(GrIntroduceFieldSettings.Init.FIELD_DECLARATION); + + if (!(context.getScope() instanceof GroovyScriptClass || context.getScope() instanceof GroovyFileBase)) { + result.add(GrIntroduceFieldSettings.Init.CONSTRUCTOR); + } PsiElement scope = context.getScope(); @@ -156,76 +139,6 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase) { - org.jetbrains.plugins.groovy.codeStyle.GrReferenceAdjuster.shortenReference((GrQualifiedReference)replaced); + GrReferenceAdjuster.shortenReference((GrQualifiedReference)replaced); } if (isOriginal) { updateCaretPosition(replaced); @@ -326,13 +329,13 @@ public class GrIntroduceFieldProcessor { return GroovyPsiElementFactory.getInstance(place.getProject()).createReferenceExpressionFromText(refText, place); } - private GrVariableDeclaration createField() { + private GrVariableDeclaration createField(PsiClass targetClass) { final String name = settings.getName(); final PsiType type = settings.getSelectedType(); final String modifier = settings.getVisibilityModifier(); List modifiers = new ArrayList(); - if (context.getScope() instanceof GroovyScriptClass) { + if (targetClass instanceof GroovyScriptClass) { modifiers.add("@" + GroovyCommonClassNames.GROOVY_TRANSFORM_FIELD); } if (settings.isStatic()) modifiers.add(PsiModifier.STATIC); @@ -341,7 +344,7 @@ public class GrIntroduceFieldProcessor { final String[] arr_modifiers = ArrayUtil.toStringArray(modifiers); final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(context.getProject()); - if (context.getScope() instanceof GroovyScriptClass) { + if (targetClass instanceof GroovyScriptClass) { return factory.createVariableDeclaration(arr_modifiers, ((GrExpression)null), type, name); } else { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java index d7d3fb7c33cc..a8732988a2c8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java @@ -22,7 +22,9 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; -import com.intellij.psi.*; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiType; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.ui.NonFocusableCheckBox; @@ -52,7 +54,6 @@ import java.awt.event.ActionListener; */ public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntroducer { private JCheckBox myCanBeFinalCb; - private SmartTypePointer myTypePointer; public GrInplaceVariableIntroducer(String title, OccurrencesChooser.ReplaceChoice replaceChoice, @@ -192,7 +193,7 @@ public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntro @Nullable @Override public PsiType getSelectedType() { - return myTypePointer != null ? myTypePointer.getType() : null; + return GrInplaceVariableIntroducer.this.getSelectedType(); } }; } @@ -206,11 +207,4 @@ public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntro protected int getCaretOffset() { return getVariable().getNameIdentifierGroovy().getTextRange().getEndOffset(); } - - @Override - protected void restoreState(GrVariable psiField) { - PsiType declaredType = getVariable().getDeclaredType(); - myTypePointer = declaredType != null ? SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(declaredType) : null; - super.restoreState(psiField); - } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index 6f4c0ccca064..463db253b406 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -141,11 +141,6 @@ public class GrIntroduceVariableHandler extends GrNewIntroduceHandlerBase callback, Editor editor) { //todo do nothing right now From 0f4872fcf430ff46420487cef2cca73adc4b5cc2 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 31 Oct 2013 17:26:41 +0400 Subject: [PATCH 08/53] canceling introduce constant --- .../introduce/GrIntroduceHandlerBase.java | 89 +- .../GrNewIntroduceFieldHandlerBase.java | 81 -- .../introduce/GrNewIntroduceHandlerBase.java | 763 ------------------ .../constant/GrInplaceConstantIntroducer.java | 178 ++-- .../GrInplaceIntroduceConstantPanel.form | 2 + .../constant/GrIntroduceConstantHandler.java | 68 +- .../GrIntroduceConstantProcessor.java | 6 +- .../field/GrInplaceFieldIntroducer.java | 4 +- .../field/GrIntroduceFieldHandler.java | 2 +- .../variable/GrIntroduceVariableHandler.java | 3 +- 10 files changed, 119 insertions(+), 1077 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java index ec3aefa1c717..6e147414b669 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java @@ -21,7 +21,6 @@ import com.intellij.lang.LanguageRefactoringSupport; import com.intellij.lang.refactoring.RefactoringSupportProvider; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -32,7 +31,6 @@ import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pass; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.wm.WindowManager; @@ -77,7 +75,7 @@ import java.util.*; import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipParentheses; /** - * @author Maxim.Medvedev + * Created by Max Medvedev on 10/29/13 */ public abstract class GrIntroduceHandlerBase implements RefactoringActionHandler { private static final Logger LOG = Logger.getInstance(GrIntroduceHandlerBase.class); @@ -144,15 +142,8 @@ public abstract class GrIntroduceHandlerBase occurrenceMarkers, - RangeMarker varRangeMarker, - @Nullable RangeMarker expressionRangeMarker, - @Nullable RangeMarker stringPartRangeMarker); - - protected abstract Settings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); + protected abstract GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice); public static Map> fillChoice(GrIntroduceContext context) { HashMap> map = ContainerUtil.newLinkedHashMap(); @@ -296,7 +287,8 @@ public abstract class GrIntroduceHandlerBase callback, Editor editor); public GrIntroduceContext getContext(@NotNull Project project, - @NotNull Editor editor, - @Nullable GrExpression expression, - @Nullable GrVariable variable, - @Nullable StringPartInfo stringPart, - @NotNull PsiElement scope) { + @NotNull Editor editor, + @Nullable GrExpression expression, + @Nullable GrVariable variable, + @Nullable StringPartInfo stringPart, + @NotNull PsiElement scope) { if (variable != null) { final List list = Collections.synchronizedList(new ArrayList()); ReferencesSearch.search(variable, new LocalSearchScope(scope)).forEach(new Processor() { @@ -348,48 +340,6 @@ public abstract class GrIntroduceHandlerBase callback = new Pass() { - @Override - public void pass(final OccurrencesChooser.ReplaceChoice choice) { - - final Settings settings = isInplace ? getSettingsForInplace(context, choice) : showDialog(context); - if (settings == null) return; - - CommandProcessor.getInstance().executeCommand(project, new Runnable() { - public void run() { - List occurrences = ContainerUtil.newArrayList(); - Document document = editor.getDocument(); - for (PsiElement element : context.getOccurrences()) { - occurrences.add(createRange(document, element)); - } - RangeMarker expressionRangeMarker = createRange(document, context.getExpression()); - RangeMarker stringPartRangeMarker = createRange(document, context.getStringPart()); - RangeMarker varRangeMarker = createRange(document, context.getVar()); - - SmartPsiElementPointer pointer = - ApplicationManager.getApplication().runWriteAction(new Computable>() { - @Override - public SmartPsiElementPointer compute() { - GrVariable var = runRefactoring(context, settings); - return var != null - ? SmartPointerManager.getInstance(context.getProject()).createSmartPsiElementPointer(var) - : null; - } - }); - GrVariable var = pointer != null ? pointer.getElement() : null; - - if (isInplace && var != null) { - GrInplaceIntroducer introducer = getIntroducer(var, context, settings, occurrences, varRangeMarker, expressionRangeMarker, stringPartRangeMarker); - LinkedHashSet suggestions = introducer.suggestNames(context); - PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); - introducer.performInplaceRefactoring(suggestions); - } - } - }, getRefactoringName(), getRefactoringName()); - } - }; - if (isInplace(context.getEditor(), context.getPlace())) { Map> occurrencesMap = fillChoice(context); new OccurrencesChooser(editor) { @@ -405,17 +355,28 @@ public abstract class GrIntroduceHandlerBase() { + @Override + public void pass(final OccurrencesChooser.ReplaceChoice choice) { + getIntroducer(context, choice).startInplaceIntroduceTemplate(); + } + }, occurrencesMap); } else { - callback.pass(null); + final Settings settings = showDialog(context); + if (settings == null) return false; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + runRefactoring(context, settings); + } + }); } return true; } catch (GrRefactoringError e) { - CommonRefactoringUtil - .showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); return false; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java deleted file mode 100644 index 7ac5353d99f1..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.refactoring.introduce; - -import com.intellij.codeInsight.navigation.NavigationUtil; -import com.intellij.ide.util.PsiClassListCellRenderer; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.util.Pass; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.search.PsiElementProcessor; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; - -import java.util.List; - -/** - * Created by Max Medvedev on 10/31/13 - */ -public abstract class GrNewIntroduceFieldHandlerBase extends GrNewIntroduceHandlerBase { - @NotNull - @Override - protected PsiClass[] findPossibleScopes(GrExpression expression, - GrVariable variable, - StringPartInfo partInfo, - Editor editor) { - PsiElement place = getCurrentPlace(expression, variable, partInfo); - PsiClass aClass = PsiUtil.getContextClass(place); - if (aClass instanceof GroovyScriptClass) { - return new PsiClass[]{aClass}; - } - else { - List result = ContainerUtil.newArrayList(aClass); - while (aClass != null) { - aClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class); - ContainerUtil.addIfNotNull(result, aClass); - } - return result.toArray(new PsiClass[result.size()]); - } - } - - @Override - protected void showScopeChooser(PsiClass[] scopes, final Pass callback, Editor editor) { - PsiElementProcessor processor = new PsiElementProcessor() { - @Override - public boolean execute(@NotNull PsiClass element) { - callback.pass(element); - return false; - } - }; - - NavigationUtil.getPsiElementPopup(scopes, new PsiClassListCellRenderer(), "Choose class to introduce field", processor).showInBestPositionFor(editor); - } - - @NotNull - @Override - protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { - if (scope instanceof GroovyScriptClass) { - scope = scope.getContainingFile(); - } - return super.findOccurrences(expression, scope); - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java deleted file mode 100644 index fc05ece3b41f..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java +++ /dev/null @@ -1,763 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.refactoring.introduce; - -import com.intellij.codeInsight.highlighting.HighlightManager; -import com.intellij.diagnostic.LogMessageEx; -import com.intellij.lang.LanguageRefactoringSupport; -import com.intellij.lang.refactoring.RefactoringSupportProvider; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.editor.SelectionModel; -import com.intellij.openapi.editor.colors.EditorColors; -import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.markup.RangeHighlighter; -import com.intellij.openapi.editor.markup.TextAttributes; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Pass; -import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.wm.WindowManager; -import com.intellij.psi.*; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.refactoring.IntroduceTargetChooser; -import com.intellij.refactoring.RefactoringActionHandler; -import com.intellij.refactoring.RefactoringBundle; -import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; -import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.util.Function; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseLabel; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; -import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; -import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; -import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; -import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; -import org.jetbrains.plugins.groovy.refactoring.NameValidator; - -import java.util.*; - -import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipParentheses; - -/** - * Created by Max Medvedev on 10/29/13 - */ -public abstract class GrNewIntroduceHandlerBase implements RefactoringActionHandler { - private static final Logger LOG = Logger.getInstance(GrIntroduceHandlerBase.class); - - public static final Function GR_EXPRESSION_RENDERER = new Function() { - @Override - public String fun(@NotNull GrExpression expr) { - return expr.getText(); - } - }; - - public static GrExpression insertExplicitCastIfNeeded(GrVariable variable, GrExpression initializer) { - PsiType ltype = findLValueType(initializer); - PsiType rtype = initializer.getType(); - - GrExpression rawExpr = (GrExpression)skipParentheses(initializer, false); - - if (ltype == null || TypesUtil.isAssignableWithoutConversions(ltype, rtype, initializer) || !TypesUtil.isAssignable(ltype, rtype, initializer)) { - return rawExpr; - } - else { // implicit coercion should be replaced with explicit cast - GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(variable.getProject()); - GrSafeCastExpression cast = - (GrSafeCastExpression)factory.createExpressionFromText("a as B"); - cast.getOperand().replaceWithExpression(rawExpr, false); - cast.getCastTypeElement().replace(factory.createTypeElement(ltype)); - return cast; - } - } - - @Nullable - private static PsiType findLValueType(GrExpression initializer) { - if (initializer.getParent() instanceof GrAssignmentExpression && ((GrAssignmentExpression)initializer.getParent()).getRValue() == initializer) { - return ((GrAssignmentExpression)initializer.getParent()).getLValue().getNominalType(); - } - else if (initializer.getParent() instanceof GrVariable) { - return ((GrVariable)initializer.getParent()).getDeclaredType(); - } - else { - return null; - } - } - - @NotNull - protected abstract String getRefactoringName(); - - @NotNull - protected abstract String getHelpID(); - - @NotNull - protected abstract Scope[] findPossibleScopes(GrExpression expression, GrVariable variable, StringPartInfo stringPart, Editor editor); - - protected abstract void checkExpression(@NotNull GrExpression selectedExpr) throws GrRefactoringError; - - protected abstract void checkVariable(@NotNull GrVariable variable) throws GrRefactoringError; - - protected abstract void checkStringLiteral(@NotNull StringPartInfo info) throws GrRefactoringError; - - protected abstract void checkOccurrences(@NotNull PsiElement[] occurrences); - - @NotNull - protected abstract GrIntroduceDialog getDialog(@NotNull GrIntroduceContext context); - - @Nullable - public abstract GrVariable runRefactoring(@NotNull GrIntroduceContext context, @NotNull Settings settings); - - protected abstract GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, - OccurrencesChooser.ReplaceChoice choice); - - public static Map> fillChoice(GrIntroduceContext context) { - HashMap> map = ContainerUtil.newLinkedHashMap(); - - if (context.getExpression() != null) { - map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getExpression())); - } - else if (context.getStringPart() != null) { - map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getStringPart())); - } - - PsiElement[] occurrences = context.getOccurrences(); - if (occurrences.length > 1) { - map.put(OccurrencesChooser.ReplaceChoice.ALL, Arrays.asList(occurrences)); - } - return map; - } - - @NotNull - public static List collectExpressions(final PsiFile file, final Editor editor, final int offset, boolean acceptVoidCalls) { - int correctedOffset = correctOffset(editor, offset); - final PsiElement elementAtCaret = file.findElementAt(correctedOffset); - final List expressions = new ArrayList(); - - for (GrExpression expression = PsiTreeUtil.getParentOfType(elementAtCaret, GrExpression.class); - expression != null; - expression = PsiTreeUtil.getParentOfType(expression, GrExpression.class)) { - if (expressions.contains(expression)) continue; - if (expression instanceof GrParenthesizedExpression && !expressions.contains(((GrParenthesizedExpression)expression).getOperand())) { - expressions.add(((GrParenthesizedExpression)expression).getOperand()); - } - if (expressionIsIncorrect(expression, acceptVoidCalls)) continue; - - expressions.add(expression); - } - return expressions; - } - - public static boolean expressionIsIncorrect(@Nullable GrExpression expression, boolean acceptVoidCalls) { - if (expression instanceof GrParenthesizedExpression) return true; - if (PsiUtil.isSuperReference(expression)) return true; - if (expression instanceof GrAssignmentExpression) return true; - if (expression instanceof GrReferenceExpression && expression.getParent() instanceof GrCall) { - final GroovyResolveResult resolveResult = ((GrReferenceExpression)expression).advancedResolve(); - final PsiElement resolved = resolveResult.getElement(); - return resolved instanceof PsiMethod && !resolveResult.isInvokedOnProperty() || resolved instanceof PsiClass; - } - - if (expression instanceof GrClosableBlock && expression.getParent() instanceof GrStringInjection) return true; - if (!acceptVoidCalls && expression instanceof GrMethodCall && PsiType.VOID == expression.getType()) return true; - - return false; - } - - public static int correctOffset(Editor editor, int offset) { - Document document = editor.getDocument(); - CharSequence text = document.getCharsSequence(); - int correctedOffset = offset; - int textLength = document.getTextLength(); - if (offset >= textLength) { - correctedOffset = textLength - 1; - } - else if (!Character.isJavaIdentifierPart(text.charAt(offset))) { - correctedOffset--; - } - - if (correctedOffset < 0) { - correctedOffset = offset; - } - else { - char c = text.charAt(correctedOffset); - if (c == ';' && correctedOffset != 0) {//initially caret on the end of line - correctedOffset--; - } - else if (!Character.isJavaIdentifierPart(c) && c != ')' && c != ']' && c != '}' && c != '\'' && c != '"' && c != '/') { - correctedOffset = offset; - } - } - return correctedOffset; - } - - @Nullable - public static GrVariable findVariableAtCaret(final PsiFile file, final Editor editor, final int offset) { - final int correctOffset = correctOffset(editor, offset); - final PsiElement elementAtCaret = file.findElementAt(correctOffset); - final GrVariable variable = PsiTreeUtil.getParentOfType(elementAtCaret, GrVariable.class); - if (variable != null && variable.getNameIdentifierGroovy().getTextRange().contains(correctOffset)) return variable; - return null; - } - - public void invoke(final @NotNull Project project, final Editor editor, final PsiFile file, final @Nullable DataContext dataContext) { - final SelectionModel selectionModel = editor.getSelectionModel(); - if (!selectionModel.hasSelection()) { - final int offset = editor.getCaretModel().getOffset(); - - final List expressions = collectExpressions(file, editor, offset, false); - if (expressions.isEmpty()) { - final GrVariable variable = findVariableAtCaret(file, editor, offset); - if (variable == null || variable instanceof GrField || variable instanceof GrParameter) { - selectionModel.selectLineAtCaret(); - } - else { - final TextRange textRange = variable.getTextRange(); - selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); - } - } - else if (expressions.size() == 1) { - final TextRange textRange = expressions.get(0).getTextRange(); - selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); - } - else { - IntroduceTargetChooser.showChooser(editor, expressions, new Pass() { - public void pass(final GrExpression selectedValue) { - invoke(project, editor, file, selectedValue.getTextRange().getStartOffset(), selectedValue.getTextRange().getEndOffset()); - } - }, GR_EXPRESSION_RENDERER); - return; - } - } - invoke(project, editor, file, selectionModel.getSelectionStart(), selectionModel.getSelectionEnd()); - } - - @Override - public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) { - // Does nothing - } - - public void getContextAndInvoke(@NotNull final Project project, - @NotNull final Editor editor, - @Nullable final GrExpression expression, - @Nullable final GrVariable variable, - @Nullable final StringPartInfo stringPart) { - final Scope[] scopes = findPossibleScopes(expression, variable, stringPart, editor); - - Pass callback = new Pass() { - @Override - public void pass(Scope scope) { - GrIntroduceContext context = getContext(project, editor, expression, variable, stringPart, scope); - invokeImpl(project, context, editor); - } - }; - - if (scopes.length == 0) { - CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle - .getCannotRefactorMessage(getRefactoringName() + "is not available in current scope"), - getRefactoringName(), getHelpID()); - } - else if (scopes.length == 1) { - callback.pass(scopes[0]); - } - else { - showScopeChooser(scopes, callback, editor); - } - } - - protected abstract void showScopeChooser(Scope[] scopes, Pass callback, Editor editor); - - public GrIntroduceContext getContext(@NotNull Project project, - @NotNull Editor editor, - @Nullable GrExpression expression, - @Nullable GrVariable variable, - @Nullable StringPartInfo stringPart, - @NotNull PsiElement scope) { - if (variable != null) { - final List list = Collections.synchronizedList(new ArrayList()); - ReferencesSearch.search(variable, new LocalSearchScope(scope)).forEach(new Processor() { - @Override - public boolean process(PsiReference psiReference) { - final PsiElement element = psiReference.getElement(); - if (element != null) { - list.add(element); - } - return true; - } - }); - final PsiElement[] occurrences = list.toArray(new PsiElement[list.size()]); - return new GrIntroduceContextImpl(project, editor, variable.getInitializerGroovy(), variable, stringPart, occurrences, scope); - } - else if (expression != null ) { - final PsiElement[] occurrences = findOccurrences(expression, scope); - return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, occurrences, scope); - } - else { - assert stringPart != null; - return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, new PsiElement[]{stringPart.getLiteral()}, scope); - } - } - - private boolean invokeImpl(final Project project, final GrIntroduceContext context, final Editor editor) { - try { - if (!CommonRefactoringUtil.checkReadOnlyStatus(project, context.getOccurrences())) { - return false; - } - checkOccurrences(context.getOccurrences()); - - - if (isInplace(context.getEditor(), context.getPlace())) { - Map> occurrencesMap = fillChoice(context); - new OccurrencesChooser(editor) { - @Override - protected TextRange getOccurrenceRange(Object occurrence) { - if (occurrence instanceof PsiElement) { - return ((PsiElement)occurrence).getTextRange(); - } - else if (occurrence instanceof StringPartInfo) { - return ((StringPartInfo)occurrence).getRange(); - } - else { - return null; - } - } - }.showChooser(new Pass() { - @Override - public void pass(final OccurrencesChooser.ReplaceChoice choice) { - getIntroducer(context, choice).startInplaceIntroduceTemplate(); - } - }, occurrencesMap); - } - else { - final Settings settings = showDialog(context); - if (settings == null) return false; - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - runRefactoring(context, settings); - } - }); - } - - return true; - } - catch (GrRefactoringError e) { - CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); - return false; - } - } - - @NotNull - protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { - final PsiElement[] occurrences = GroovyRefactoringUtil.getExpressionOccurrences(skipParentheses(expression, false), scope); - if (occurrences == null || occurrences.length == 0) { - throw new GrRefactoringError(GroovyRefactoringBundle.message("no.occurrences.found")); - } - return occurrences; - } - - private void invoke(@NotNull final Project project, - @NotNull final Editor editor, - @NotNull PsiFile file, - int startOffset, - int endOffset) throws GrRefactoringError { - try { - PsiDocumentManager.getInstance(project).commitAllDocuments(); - if (!(file instanceof GroovyFileBase)) { - throw new GrRefactoringError(GroovyRefactoringBundle.message("only.in.groovy.files")); - } - if (!CommonRefactoringUtil.checkReadOnlyStatus(project, file)) { - throw new GrRefactoringError(RefactoringBundle.message("readonly.occurences.found")); - } - - GrExpression selectedExpr = findExpression(file, startOffset, endOffset); - final GrVariable variable = findVariable(file, startOffset, endOffset); - final StringPartInfo stringPart = StringPartInfo.findStringPart(file, startOffset, endOffset); - if (variable != null) { - checkVariable(variable); - } - else if (selectedExpr != null) { - checkExpression(selectedExpr); - } - else if (stringPart != null) { - checkStringLiteral(stringPart); - } - else { - throw new GrRefactoringError(null); - } - - getContextAndInvoke(project, editor, selectedExpr, variable, stringPart); - } - catch (GrRefactoringError e) { - CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); - } - } - - public static RangeMarker createRange(Document document, StringPartInfo part) { - if (part == null) { - return null; - } - TextRange range = part.getRange().shiftRight(part.getLiteral().getTextRange().getStartOffset()); - return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), true); - - } - - @Nullable - public static RangeMarker createRange(@NotNull Document document, @Nullable PsiElement expression) { - if (expression == null) { - return null; - } - TextRange range = expression.getTextRange(); - return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), false); - } - - - public static boolean isInplace(@NotNull Editor editor, @NotNull PsiElement place) { - final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forLanguage(place.getLanguage()); - return supportProvider != null && - editor.getSettings().isVariableInplaceRenameEnabled() && - supportProvider.isInplaceIntroduceAvailable(place, place) && - !ApplicationManager.getApplication().isUnitTestMode(); - } - - @Nullable - public static GrVariable findVariable(@NotNull PsiFile file, int startOffset, int endOffset) { - GrVariable var = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariable.class); - if (var == null) { - final GrVariableDeclaration variableDeclaration = - GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariableDeclaration.class); - if (variableDeclaration == null) return null; - final GrVariable[] variables = variableDeclaration.getVariables(); - if (variables.length == 1) { - var = variables[0]; - } - } - if (var instanceof GrParameter || var instanceof GrField) { - return null; - } - return var; - } - - @Nullable - public static GrVariable findVariable(@NotNull GrStatement statement) { - if (!(statement instanceof GrVariableDeclaration)) return null; - final GrVariableDeclaration variableDeclaration = (GrVariableDeclaration)statement; - final GrVariable[] variables = variableDeclaration.getVariables(); - - GrVariable var = null; - if (variables.length == 1) { - var = variables[0]; - } - if (var instanceof GrParameter || var instanceof GrField) { - return null; - } - return var; - } - - - @Nullable - public static GrExpression findExpression(PsiFile file, int startOffset, int endOffset) { - GrExpression selectedExpr = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrExpression.class); - return findExpression(selectedExpr); - } - - @Nullable - public static GrExpression findExpression(GrStatement selectedExpr) { - if (!(selectedExpr instanceof GrExpression)) return null; - - GrExpression selected = (GrExpression)selectedExpr; - while (selected instanceof GrParenthesizedExpression) selected = ((GrParenthesizedExpression)selected).getOperand(); - if (selected == null) return null; - PsiType type = selected.getType(); - if (type != null) type = TypeConversionUtil.erasure(type); - - if (PsiType.VOID.equals(type)) { - return null; - } - - return selected; - } - - @Nullable - private Settings showDialog(@NotNull GrIntroduceContext context) { - - // Add occurrences highlighting - ArrayList highlighters = new ArrayList(); - HighlightManager highlightManager = null; - if (context.getEditor() != null) { - highlightManager = HighlightManager.getInstance(context.getProject()); - EditorColorsManager colorsManager = EditorColorsManager.getInstance(); - TextAttributes attributes = colorsManager.getGlobalScheme().getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES); - if (context.getOccurrences().length > 1) { - highlightManager.addOccurrenceHighlights(context.getEditor(), context.getOccurrences(), attributes, true, highlighters); - } - } - - GrIntroduceDialog dialog = getDialog(context); - - dialog.show(); - if (dialog.isOK()) { - if (context.getEditor() != null) { - for (RangeHighlighter highlighter : highlighters) { - highlightManager.removeSegmentHighlighter(context.getEditor(), highlighter); - } - } - return dialog.getSettings(); - } - else { - if (context.getOccurrences().length > 1) { - WindowManager.getInstance().getStatusBar(context.getProject()) - .setInfo(GroovyRefactoringBundle.message("press.escape.to.remove.the.highlighting")); - } - } - return null; - } - - @Nullable - public static PsiElement findAnchor(@NotNull PsiElement[] occurrences, - @NotNull PsiElement container) { - if (occurrences.length == 0) return null; - - PsiElement candidate; - if (occurrences.length == 1) { - candidate = occurrences[0]; - candidate = findContainingStatement(candidate); - } - else { - candidate = occurrences[0]; - while (candidate != null && candidate.getParent() != container) { - candidate = candidate.getParent(); - } - } - - final GrStringInjection injection = PsiTreeUtil.getParentOfType(candidate, GrStringInjection.class); - if (injection != null && !injection.getText().contains("\n")) { - candidate = findContainingStatement(injection); - } - - if (candidate == null) return null; - - if ((container instanceof GrWhileStatement) && - candidate.equals(((GrWhileStatement)container).getCondition())) { - return container; - } - if ((container instanceof GrIfStatement) && - candidate.equals(((GrIfStatement)container).getCondition())) { - return container; - } - if ((container instanceof GrForStatement) && - candidate.equals(((GrForStatement)container).getClause())) { - return container; - } - - while (candidate instanceof GrIfStatement && - candidate.getParent() instanceof GrIfStatement && - ((GrIfStatement)candidate.getParent()).getElseBranch() == candidate) { - candidate = candidate.getParent(); - } - return candidate; - } - - public static void assertStatement(PsiElement anchor, PsiElement[] occurrences, PsiElement scope) { - if (!(anchor instanceof GrStatement)) { - StringBuilder error = new StringBuilder("scope:"); - error.append(scope.getText()); - error.append("\n---------------------------------------\n\n"); - error.append("occurrences: "); - for (PsiElement occurrence : occurrences) { - error.append(occurrence.getText()); - error.append("\n------------------\n"); - } - - LogMessageEx.error(LOG, "cannot find anchor for variable", error.toString()); - } - } - - - @Nullable - private static PsiElement findContainingStatement(@Nullable PsiElement candidate) { - while (candidate != null && !PsiUtil.isExpressionStatement(candidate)) { - candidate = candidate.getParent(); - if (candidate instanceof GrCaseLabel) candidate = candidate.getParent(); - } - return candidate; - } - - public static void deleteLocalVar(@NotNull GrIntroduceContext context) { - final GrVariable resolved = resolveLocalVar(context); - - final PsiElement parent = resolved.getParent(); - if (((GrVariableDeclaration)parent).getVariables().length == 1) { - parent.delete(); - } - else { - GrExpression initializer = resolved.getInitializerGroovy(); - if (initializer != null) initializer.delete(); //don't special check for tuple, but this line is for the tuple case - resolved.delete(); - } - } - - @NotNull - public static GrVariable resolveLocalVar(@NotNull GrIntroduceContext context) { - final GrVariable var = context.getVar(); - if (var != null) { - return var; - } - - final GrReferenceExpression expression = (GrReferenceExpression)context.getExpression(); - assert expression != null; - - final PsiElement resolved = expression.resolve(); - assert resolved instanceof GrVariable; - return (GrVariable)resolved; - } - - public static boolean hasLhs(@NotNull final PsiElement[] occurrences) { - for (PsiElement element : occurrences) { - if (element instanceof GrReferenceExpression) { - if (PsiUtil.isLValue((GroovyPsiElement)element)) return true; - if (ControlFlowUtils.isIncOrDecOperand((GrReferenceExpression)element)) return true; - } - } - return false; - } - - @NotNull - public static PsiElement getCurrentPlace(@Nullable GrExpression expr, - @Nullable GrVariable var, - @Nullable StringPartInfo stringPartInfo) { - if (var != null) return var; - if (expr != null) return expr; - if (stringPartInfo != null) return stringPartInfo.getLiteral(); - - throw new IncorrectOperationException(); - } - - @NotNull - public static GrExpression generateExpressionFromStringPart(final StringPartInfo stringPart, final Project project) { - Data data = new Data(stringPart); - String startQuote = data.getStartQuote(); - TextRange range = data.getRange(); - String literalText = data.getText(); - String endQuote = data.getEndQuote(); - - final String substringLiteral = startQuote + range.substring(literalText) + endQuote; - return GroovyPsiElementFactory.getInstance(project).createExpressionFromText(substringLiteral); - } - - @NotNull - public static GrExpression processLiteral(final String varName, final StringPartInfo stringPart, final Project project) { - Data data = new Data(stringPart); - String startQuote = data.getStartQuote(); - TextRange range = data.getRange(); - String literalText = data.getText(); - String endQuote = data.getEndQuote(); - - String prefix = literalText.substring(0, range.getStartOffset()) ; - String suffix = literalText.substring(range.getEndOffset()); - - StringBuilder buffer = new StringBuilder(); - if (!prefix.equals(startQuote)) { - buffer.append(prefix).append(endQuote).append('+'); - } - buffer.append(varName); - if (!suffix.equals(endQuote)) { - buffer.append('+').append(startQuote).append(suffix); - } - - final GrExpression concatenation = GroovyPsiElementFactory.getInstance(project).createExpressionFromText(buffer); - - final GrExpression concat = stringPart.getLiteral().replaceWithExpression(concatenation, false); - if (concat instanceof GrReferenceExpression) { - return concat; - } - else { - assert concat instanceof GrBinaryExpression; - final GrExpression left = ((GrBinaryExpression)concat).getLeftOperand(); - if (left instanceof GrReferenceExpression) { - return left; - } - else { - assert left instanceof GrBinaryExpression; - final GrExpression right = ((GrBinaryExpression)left).getRightOperand(); - assert right != null; - return right; - } - } - } - - public interface Validator extends NameValidator { - boolean isOK(GrIntroduceDialog dialog); - } - - private static class Data { - private String myText; - private String myStartQuote; - private String myEndQuote; - private TextRange myRange; - - public Data(final StringPartInfo stringPartInfo) { - assert stringPartInfo != null; - - final GrLiteral literal = stringPartInfo.getLiteral(); - - myText = literal.getText(); - - myStartQuote = GrStringUtil.getStartQuote(myText); - myEndQuote = GrStringUtil.getEndQuote(myText); - final TextRange dataRange = new TextRange(myStartQuote.length(), myText.length() - myEndQuote.length()); - - myRange = stringPartInfo.getRange().intersection(dataRange); - } - - public String getText() { - return myText; - } - - public String getStartQuote() { - return myStartQuote; - } - - public String getEndQuote() { - return myEndQuote; - } - - public TextRange getRange() { - return myRange; - } - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java index ff5a264036fb..55d65de67fd5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java @@ -15,127 +15,120 @@ */ package org.jetbrains.plugins.groovy.refactoring.introduce.constant; -import com.intellij.openapi.editor.RangeMarker; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtilCore; -import com.intellij.util.containers.ContainerUtil; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiType; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.refactoring.introduceField.IntroduceConstantHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrInplaceIntroducer; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContextImpl; +import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; import org.jetbrains.plugins.groovy.refactoring.introduce.field.GroovyInplaceFieldValidator; import javax.swing.*; -import java.util.LinkedHashSet; -import java.util.List; /** * Created by Max Medvedev on 8/29/13 */ -public class GrInplaceConstantIntroducer extends GrInplaceIntroducer { +public class GrInplaceConstantIntroducer extends GrAbstractInplaceIntroducer { private final GrInplaceIntroduceConstantPanel myPanel; private final GrIntroduceContext myContext; - private final RangeMarker myExpressionRangeMarker; - private final RangeMarker myStringPartRangeMarker; - private final boolean myReplaceAll; + private String[] mySuggestedNames; - public GrInplaceConstantIntroducer(GrVariable var, - GrIntroduceContext context, - List occurrences, - boolean replaceAllOccurrences, - RangeMarker expressionRangeMarker, - RangeMarker stringPartRangeMarker) { - super(var, context.getEditor(), context.getProject(), GrIntroduceConstantHandler.REFACTORING_NAME, occurrences, context.getPlace()); + public GrInplaceConstantIntroducer(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + super(IntroduceConstantHandler.REFACTORING_NAME, choice, context); myContext = context; - myReplaceAll = replaceAllOccurrences; - myExpressionRangeMarker = expressionRangeMarker; - myStringPartRangeMarker = stringPartRangeMarker; myPanel = new GrInplaceIntroduceConstantPanel(); + + mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(context.getExpression(), new GroovyInplaceFieldValidator(context), + true); } @Override - public LinkedHashSet suggestNames(GrIntroduceContext context) { - return ContainerUtil.newLinkedHashSet(GroovyNameSuggestionUtil.suggestVariableNames( - context.getExpression(), - new GroovyInplaceFieldValidator(context), - getVariable().hasModifierProperty(PsiModifier.STATIC)) - ); + protected String getActionName() { + return null; } @Override - protected void moveOffsetAfter(boolean success) { - if (success) { - final GrVariable field = getVariable(); - assert field != null; - GrIntroduceConstantProcessor processor = new GrIntroduceConstantProcessor(generateContext(), generateSettings()) { - @Override - protected GrVariableDeclaration addDeclaration(PsiClass targetClass, GrVariableDeclaration declaration) { - return (GrVariableDeclaration)field.getParent(); - } - - @Override - protected boolean checkErrors(@NotNull PsiClass targetClass) { - return false; - } - }; - processor.run(); - } - super.moveOffsetAfter(success); - } - - private GrIntroduceContext generateContext() { - final List occurrenceMarkers = getOccurrenceMarkers(); - - List occurrences = ContainerUtil.newArrayList(); - for (RangeMarker marker : occurrenceMarkers) { - ContainerUtil.addIfNotNull(occurrences, findExpression(marker)); - } - - GrExpression expr = null; - if (myExpressionRangeMarker != null) expr = findExpression(myExpressionRangeMarker); - if (myStringPartRangeMarker != null) { - expr = findExpressionFromStringPartMarker(myStringPartRangeMarker); - occurrences.add(expr); - } - - return new GrIntroduceContextImpl(myContext.getProject(), myContext.getEditor(), expr, null, null, PsiUtilCore.toPsiElementArray( - occurrences), myContext.getScope()); + protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) { + return mySuggestedNames; } @Nullable - private GrExpression findExpressionFromStringPartMarker(RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - GrBinaryExpression binary = PsiTreeUtil.getParentOfType(leaf, GrBinaryExpression.class); - if (binary != null) { - return binary.getRightOperand(); + @Override + protected JComponent getComponent() { + return myPanel.getRootPane(); + } + + @Override + protected void saveSettings(@NotNull GrVariable variable) { + + } + + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceConstantSettings settings, boolean processUsages) { + if (processUsages) { + return new GrIntroduceConstantProcessor(context, settings).run(); + } + else { + PsiElement scope = context.getScope(); + return new GrIntroduceConstantProcessor(context, settings).addDeclaration(scope instanceof GroovyFileBase ? ((GroovyFileBase)scope).getScriptClass() : (PsiClass)scope).getVariables()[0]; } - return null; } @Nullable - private GrExpression findExpression(@NotNull RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - if (leaf != null && leaf.getParent() instanceof GrReferenceExpression) { - return (GrExpression)leaf.getParent(); - } - return null; + @Override + protected GrIntroduceConstantSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, + @NotNull final OccurrencesChooser.ReplaceChoice choice, + final String[] names) { + return new GrIntroduceConstantSettings() { + @Override + public String getVisibilityModifier() { + return PsiModifier.PUBLIC; + } + + @Nullable + @Override + public PsiClass getTargetClass() { + return (PsiClass)context.getScope(); + } + + @Nullable + @Override + public String getName() { + return names[0]; + } + + @Override + public boolean replaceAllOccurrences() { + return isReplaceAllOccurrences(); + } + + @Nullable + @Override + public PsiType getSelectedType() { + GrExpression expression = context.getExpression(); + GrVariable var = context.getVar(); + StringPartInfo stringPart = context.getStringPart(); + return var != null ? var.getDeclaredType() : + expression != null ? expression.getType() : + stringPart != null ? stringPart.getLiteral().getType() : + null; + } + }; } - private GrIntroduceConstantSettings generateSettings() { + @Override + protected GrIntroduceConstantSettings getSettings() { return new GrIntroduceConstantSettings() { @Override public String getVisibilityModifier() { @@ -145,18 +138,18 @@ public class GrInplaceConstantIntroducer extends GrInplaceIntroducer { @Nullable @Override public String getName() { - return getVariable().getName(); + return getInputName(); } @Override public boolean replaceAllOccurrences() { - return myReplaceAll; + return isReplaceAllOccurrences(); } @Nullable @Override public PsiType getSelectedType() { - return getVariable().getDeclaredType(); + return GrInplaceConstantIntroducer.this.getSelectedType(); } @Nullable @@ -167,13 +160,6 @@ public class GrInplaceConstantIntroducer extends GrInplaceIntroducer { }; } - @Nullable - @Override - protected JComponent getComponent() { - //return myPanel.getRootPane(); - return null; - } - @Nullable @Override protected PsiElement checkLocalScope() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form index da9c8bc90939..9d495a7b2e90 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form @@ -18,6 +18,8 @@ + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java index 926c51eb5b77..9d03af8b5a78 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java @@ -15,7 +15,6 @@ */ package org.jetbrains.plugins.groovy.refactoring.introduce.constant; -import com.intellij.openapi.editor.RangeMarker; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; @@ -27,16 +26,11 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.introduce.*; -import org.jetbrains.plugins.groovy.refactoring.introduce.field.GrFieldNameSuggester; -import org.jetbrains.plugins.groovy.refactoring.introduce.field.GroovyInplaceFieldValidator; - -import java.util.List; /** * @author Maxim.Medvedev @@ -99,65 +93,9 @@ public class GrIntroduceConstantHandler extends GrIntroduceFieldHandlerBase occurrenceMarkers, - RangeMarker varRangeMarker, RangeMarker expressionRangeMarker, - RangeMarker stringPartRangeMarker) { - if (varRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(var.getNameIdentifierGroovy().getTextRange().getStartOffset()); - } - else if (expressionRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(expressionRangeMarker.getStartOffset()); - } - else if (stringPartRangeMarker != null) { - int offset = stringPartRangeMarker.getStartOffset(); - PsiElement at = var.getContainingFile().findElementAt(offset); - GrExpression ref = PsiTreeUtil.getParentOfType(at, GrBinaryExpression.class).getRightOperand(); - context.getEditor().getCaretModel().moveToOffset(ref.getTextRange().getStartOffset()); - } - - return new GrInplaceConstantIntroducer(var, context, occurrenceMarkers, settings.replaceAllOccurrences(), expressionRangeMarker, stringPartRangeMarker); - } - - @Override - protected GrIntroduceConstantSettings getSettingsForInplace(final GrIntroduceContext context, final OccurrencesChooser.ReplaceChoice choice) { - return new GrIntroduceConstantSettings() { - @Override - public String getVisibilityModifier() { - return PsiModifier.PUBLIC; - } - - @Nullable - @Override - public PsiClass getTargetClass() { - return (PsiClass)context.getScope(); - } - - @Nullable - @Override - public String getName() { - return new GrFieldNameSuggester(context, new GroovyInplaceFieldValidator(context), false).suggestNames().iterator().next(); - } - - @Override - public boolean replaceAllOccurrences() { - return choice == OccurrencesChooser.ReplaceChoice.ALL; - } - - @Nullable - @Override - public PsiType getSelectedType() { - GrExpression expression = context.getExpression(); - GrVariable var = context.getVar(); - StringPartInfo stringPart = context.getStringPart(); - return var != null ? var.getDeclaredType() : - expression != null ? expression.getType() : - stringPart != null ? stringPart.getLiteral().getType() : - null; - } - }; + protected GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice) { + return new GrInplaceConstantIntroducer(context, choice); } private static class ConstantChecker extends GroovyRecursiveElementVisitor { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java index 2e2f0007350f..bb13241a8d9e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java @@ -69,8 +69,7 @@ public class GrIntroduceConstantProcessor { return null; } - final GrVariableDeclaration rawDeclaration = createField(targetClass); - final GrVariableDeclaration declaration = addDeclaration(targetClass, rawDeclaration); + final GrVariableDeclaration declaration = addDeclaration(targetClass); final GrField field = (GrField)declaration.getVariables()[0]; if (context.getVar() != null) { @@ -102,7 +101,8 @@ public class GrIntroduceConstantProcessor { context.getEditor().getSelectionModel().removeSelection(); } - protected GrVariableDeclaration addDeclaration(PsiClass targetClass, GrVariableDeclaration declaration) { + protected GrVariableDeclaration addDeclaration(PsiClass targetClass) { + GrVariableDeclaration declaration = createField(targetClass); final GrVariableDeclaration added; if (targetClass instanceof GrEnumTypeDefinition) { final GrEnumConstantList enumConstants = ((GrEnumTypeDefinition)targetClass).getEnumConstantList(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java index 2f924f9e947a..0eb81b51075d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java @@ -68,7 +68,7 @@ public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroduc @Override protected GrIntroduceFieldSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, @NotNull final OccurrencesChooser.ReplaceChoice choice, - String[] names) { + final String[] names) { return new GrIntroduceFieldSettings() { @Override public boolean declareFinal() { @@ -115,7 +115,7 @@ public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroduc @Nullable @Override public String getName() { - return new GrFieldNameSuggester(context, new GroovyInplaceFieldValidator(context), false).suggestNames().iterator().next(); + return names[0]; } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index 1279f74003ce..eea2625282f9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -43,7 +43,7 @@ import java.util.List; /** * @author Maxim.Medvedev */ -public class GrIntroduceFieldHandler extends GrNewIntroduceFieldHandlerBase { +public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase { @NotNull @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index 463db253b406..ba48be41d77f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -38,13 +38,12 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceHandlerBase; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrNewIntroduceHandlerBase; import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; /** * Created by Max Medvedev on 10/29/13 */ -public class GrIntroduceVariableHandler extends GrNewIntroduceHandlerBase { +public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase { public static final String DUMMY_NAME = "________________xxx_________________"; protected static final String REFACTORING_NAME = GroovyRefactoringBundle.message("introduce.variable.title"); private RangeMarker myPosition = null; From f382bd4d8a2ceac10cba77d2b3da378685275bc3 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 31 Oct 2013 17:56:48 +0400 Subject: [PATCH 09/53] simplifying --- .../introduce/field/GrInplaceFieldIntroducer.java | 9 ++++++++- .../introduce/field/GrIntroduceFieldHandler.java | 12 +----------- .../variable/GrIntroduceVariableHandler.java | 10 +++++----- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java index 0eb81b51075d..d1df3fefa1da 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java @@ -42,7 +42,7 @@ import java.util.EnumSet; /** * @author Max Medvedev */ -public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer { +public class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer { private final GrInplaceIntroduceFieldPanel myPanel; private final GrFinalListener finalListener; private String[] mySuggestedNames; @@ -64,6 +64,13 @@ public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroduc mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(context.getExpression(), new GroovyInplaceFieldValidator(getContext()), false); } + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceFieldSettings settings, boolean processUsages) { + GrIntroduceFieldProcessor processor = new GrIntroduceFieldProcessor(context, settings); + return processUsages ? processor.run() + : processor.insertField((PsiClass)context.getScope()).getVariables()[0]; + } + @Nullable @Override protected GrIntroduceFieldSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index eea2625282f9..a21dbe17f654 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -103,17 +103,7 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase getIntroducer(@NotNull GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { - return new GrInplaceFieldIntroducer(context, choice) { - @Override - protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceFieldSettings settings, boolean processUsages) { - if (processUsages) { - return GrIntroduceFieldHandler.this.runRefactoring(context, settings); - } - else { - return new GrIntroduceFieldProcessor(context, settings).insertField( (PsiClass)context.getScope()).getVariables()[0]; - } - } - }; + return new GrInplaceFieldIntroducer(context, choice); } static EnumSet getApplicableInitPlaces(GrIntroduceContext context, boolean replaceAll) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index ba48be41d77f..39fac55e7348 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -119,8 +119,7 @@ public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase Date: Thu, 31 Oct 2013 17:55:21 +0200 Subject: [PATCH 10/53] preview for introduce field --- .../GrAbstractInplaceIntroducer.java | 22 +++++++++++++++++++ .../field/GrInplaceFieldIntroducer.java | 12 ++++++---- .../field/GrInplaceIntroduceFieldPanel.form | 13 +++++++---- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java index 42aba9b55d30..32004067b0ca 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -124,6 +124,28 @@ public abstract class GrAbstractInplaceIntroducer { - private final GrInplaceIntroduceFieldPanel myPanel; + private GrInplaceIntroduceFieldPanel myPanel; private final GrFinalListener finalListener; private String[] mySuggestedNames; private boolean myIsStatic; @@ -51,14 +51,12 @@ public class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer initPlaces) { myProject = project; @@ -262,5 +262,9 @@ public class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer
- + - + @@ -11,7 +11,7 @@ - + @@ -35,13 +35,18 @@ - + + + + + + From b5a9cef9d47f36bddc8b9f3e6b21b7f69df55140 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 31 Oct 2013 17:55:40 +0200 Subject: [PATCH 11/53] preview for introduce constant --- .../constant/GrInplaceConstantIntroducer.java | 28 ++++++++++++--- .../GrInplaceIntroduceConstantPanel.form | 13 ++++--- .../GrInplaceIntroduceConstantPanel.java | 36 ------------------- 3 files changed, 32 insertions(+), 45 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java index 55d65de67fd5..df6623b42a88 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java @@ -15,12 +15,10 @@ */ package org.jetbrains.plugins.groovy.refactoring.introduce.constant; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduceField.IntroduceConstantHandler; +import com.intellij.ui.components.JBCheckBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; @@ -163,7 +161,27 @@ public class GrInplaceConstantIntroducer extends GrAbstractInplaceIntroducer -
- + + @@ -10,12 +10,12 @@ - + - + @@ -23,6 +23,11 @@ + + + + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java deleted file mode 100644 index 5bd7e5bf48df..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.refactoring.introduce.constant; - -import com.intellij.ui.components.JBCheckBox; - -import javax.swing.*; - -/** - * Created by Max Medvedev on 8/29/13 - */ -public class GrInplaceIntroduceConstantPanel { - private JBCheckBox myMoveToAnotherClassJBCheckBox; - private JPanel myRootPane; - - public boolean isMoveToAnotherClass() { - return myMoveToAnotherClassJBCheckBox.isSelected(); - } - - public JComponent getRootPane() { - return myRootPane; - } -} From df823d606fc631ecd87871c6aefbf2947d738b8d Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Thu, 31 Oct 2013 20:21:42 +0400 Subject: [PATCH 12/53] IDEA-115756 Caret is moved on the start of line after formatting, if positioned not on the end of line [CR-IC-2978] --- .../java/JavaFormatterInEditorTest.java | 61 +++++++++++++++++-- .../codeStyle/CodeStyleManagerImpl.java | 14 ++--- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java index de3e88e4e6c1..169e7657a329 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java @@ -23,13 +23,13 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; /** - * Is intended to test formatting in editor behavior, i.e. check how formatting affects things like caret position, selection etc. - * + * Is intended to test formatting in editor behavior, i.e. check how formatting affects things like caret position, selection etc. + * * @author Denis Zhdanov * @since 6/1/11 6:17 PM */ public class JavaFormatterInEditorTest extends LightPlatformCodeInsightTestCase { - + public void testCaretPositionOnLongLineWrapping() throws IOException { // Inspired by IDEA-70242 getCurrentCodeStyleSettings().getCommonSettings(JavaLanguage.INSTANCE).WRAP_LONG_LINES = true; @@ -39,7 +39,7 @@ public class JavaFormatterInEditorTest extends LightPlatformCodeInsightTestCase "\n" + "class Test {\n" + "}", - + "import static java.util.concurrent\n" + " .atomic.AtomicInteger.*;\n" + "\n" + @@ -47,10 +47,59 @@ public class JavaFormatterInEditorTest extends LightPlatformCodeInsightTestCase "}" ); } - + + public void testCaretPositionPreserved_WhenOnSameLineWithWhiteSpacesOnly() throws IOException { + String text = "class Test {\n" + + " void test() {\n" + + " \n" + + " }\n" + + "}"; + doTest(text, text); + + String after = "class Test {\n" + + " void test() {\n" + + " \n" + + " }\n" + + "}"; + doTest(text, after); + } + + public void testCaretPositionPreserved_WhenSomeFormattingNeeded() throws IOException { + String before = "public class Test {\n" + + " int a;\n" + + " \n" + + " public static void main(String[] args) {\n" + + " \n" + + " }\n" + + "\n" + + " static final long j = 2;\n" + + "}"; + String after = "public class Test {\n" + + " int a;\n" + + "\n" + + " public static void main(String[] args) {\n" + + " \n" + + " }\n" + + "\n" + + " static final long j = 2;\n" + + "}"; + doTest(before, after); + + before = "public class Test {\n" + + " int a;\n" + + " \n" + + " public static void main(String[] args) {\n" + + " \n" + + " }\n" + + "\n" + + " static final long j = 2;\n" + + "}"; + doTest(before, after); + } + public void doTest(@NotNull String before, @NotNull String after) throws IOException { configureFromFileText(getTestName(false) + ".java", before); CodeStyleManager.getInstance(getProject()).reformatText(getFile(), 0, getEditor().getDocument().getTextLength()); checkResultByText(after); } -} +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java index 87a489b2e1df..92eaec73b035 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java @@ -181,7 +181,7 @@ public class CodeStyleManagerImpl extends CodeStyleManager { // So, if 'virtual space in editor' is enabled, we save target visual column. Caret indent is ensured otherwise int visualColumnToRestore = -1; String caretIndentToRestore = null; - RangeMarker caretRangeMarker = null; + RangeMarker beforeCaretRangeMarker = null; if (editor != null) { Document document = editor.getDocument(); @@ -202,7 +202,7 @@ public class CodeStyleManagerImpl extends CodeStyleManager { if (fixCaretPosition) { visualColumnToRestore = editor.getCaretModel().getVisualPosition().column; caretIndentToRestore = document.getText(TextRange.create(lineStartOffset, caretOffset)); - caretRangeMarker = document.createRangeMarker(lineStartOffset, caretOffset); + beforeCaretRangeMarker = document.createRangeMarker(0, lineStartOffset); } } @@ -261,11 +261,11 @@ public class CodeStyleManagerImpl extends CodeStyleManager { } } else { - if (caretRangeMarker == null || !caretRangeMarker.isValid() || caretIndentToRestore == null) { + if (beforeCaretRangeMarker == null || !beforeCaretRangeMarker.isValid() || caretIndentToRestore == null) { return; } - int offset = caretRangeMarker.getStartOffset(); - caretRangeMarker.dispose(); + int offset = beforeCaretRangeMarker.getEndOffset(); + beforeCaretRangeMarker.dispose(); if (editor.getCaretModel().getVisualPosition().column == visualColumnToRestore) { return; } @@ -484,10 +484,10 @@ public class CodeStyleManagerImpl extends CodeStyleManager { * * *

- * This method inserts that dummy comment (fallback to identifier xxx, see {@link CodeStyleManagerImpl#createDummy(PsiFile)}) + * This method inserts that dummy comment (fallback to identifier xxx, see {@link CodeStyleManagerImpl#createDummy(PsiFile)}) * if necessary (if target line contains white space symbols only). *

- + * Note: it's expected that the whole white space region that contains given offset is processed in a way that all * {@link RangeMarker range markers} registered for the given offset are expanded to the whole white space region. * E.g. there is a possible case that particular range marker serves for defining formatting range, hence, its start/end offsets From 2f15377c29b150a2e7cce4bc35b13d267871e6b2 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Thu, 31 Oct 2013 20:02:04 +0400 Subject: [PATCH 13/53] Tags and local tags references added to new log and repository reader *tags read from appropriate file *tests added *references and colors for tags added to log --- .../org/zmlx/hg4idea/log/HgLogProvider.java | 17 ++++----- .../org/zmlx/hg4idea/log/HgRefManager.java | 3 +- .../src/org/zmlx/hg4idea/repo/HgRepoInfo.java | 22 ++++++++++-- .../org/zmlx/hg4idea/repo/HgRepository.java | 6 ++++ .../zmlx/hg4idea/repo/HgRepositoryImpl.java | 14 +++++++- .../zmlx/hg4idea/repo/HgRepositoryReader.java | 35 ++++++++++++++----- plugins/hg4idea/testData/repo/.hgtags | 2 ++ .../hg4idea/testData/repo/dot_hg/localtags | 1 + .../test/repo/HgRealRepositoryReaderTest.java | 17 +++++++-- .../test/repo/HgRepositoryReaderTest.java | 33 ++++++++++++----- 10 files changed, 120 insertions(+), 30 deletions(-) create mode 100644 plugins/hg4idea/testData/repo/.hgtags create mode 100644 plugins/hg4idea/testData/repo/dot_hg/localtags diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java index 6f1edf3dce90..e8f170bba3c4 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java @@ -109,6 +109,8 @@ public class HgLogProvider implements VcsLogProvider { repository.update(); Collection branches = repository.getBranches(); Collection bookmarks = repository.getBookmarks(); + Collection tags = repository.getTags(); + Collection localTags = repository.getLocalTags(); Collection refs = new ArrayList(branches.size() + bookmarks.size()); @@ -123,17 +125,16 @@ public class HgLogProvider implements VcsLogProvider { if (currentRevision != null) { // null => fresh repository refs.add(new VcsRefImpl(myVcsObjectsFactory.createHash(currentRevision), "HEAD", HgRefManager.HEAD, root)); } - - //refs.addAll(readTags(root)); + for (HgNameWithHashInfo tagInfo : tags) { + refs.add(new VcsRefImpl(myVcsObjectsFactory.createHash(tagInfo.getHash()), tagInfo.getName(), HgRefManager.TAG, root)); + } + for (HgNameWithHashInfo localTagInfo : localTags) { + refs.add(new VcsRefImpl(myVcsObjectsFactory.createHash(localTagInfo.getHash()), localTagInfo.getName(), + HgRefManager.LOCAL_TAG, root)); + } return refs; } - //todo implement - /* @NotNull - private Collection readTags(@NotNull VirtualFile root) throws VcsException { - return Collections.emptyList(); - }*/ - @NotNull @Override public VcsKey getSupportedVcs() { diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java index c963c267dba0..1a52c2b49e22 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgRefManager.java @@ -38,11 +38,13 @@ public class HgRefManager implements VcsLogRefManager { private static final Color BRANCH_COLOR = new JBColor(new Color(0x75eec7), new Color(0x0D6D4F)); private static final Color BOOKMARK_COLOR = new JBColor(new Color(0xbcbcfc), new Color(0xbcbcfc).darker().darker()); private static final Color TAG_COLOR = JBColor.WHITE; + private static final Color LOCAL_TAG_COLOR = JBColor.CYAN; public static final VcsRefType HEAD = new SimpleRefType(true, HEAD_COLOR); public static final VcsRefType BRANCH = new SimpleRefType(true, BRANCH_COLOR); public static final VcsRefType BOOKMARK = new SimpleRefType(true, BOOKMARK_COLOR); public static final VcsRefType TAG = new SimpleRefType(false, TAG_COLOR); + public static final VcsRefType LOCAL_TAG = new SimpleRefType(false, LOCAL_TAG_COLOR); // first has the highest priority private static final List REF_TYPE_PRIORITIES = Arrays.asList(HEAD, BRANCH, BOOKMARK, TAG); @@ -103,7 +105,6 @@ public class HgRefManager implements VcsLogRefManager { @NotNull @Override public List group(Collection refs) { - // TODO group non-tracking refs into remotes return ContainerUtil.map(sort(refs), new Function() { @Override public RefGroup fun(final VcsRef ref) { diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepoInfo.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepoInfo.java index d16dc7dd2dd4..90c59372dc8e 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepoInfo.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepoInfo.java @@ -36,19 +36,25 @@ public class HgRepoInfo { @Nullable private String myCurrentBookmark = null; @NotNull private Set myBranches = Collections.emptySet(); @NotNull private Set myBookmarks = Collections.emptySet(); + @NotNull private Set myTags = Collections.emptySet(); + @NotNull private Set myLocalTags = Collections.emptySet(); public HgRepoInfo(@NotNull String currentBranch, @Nullable String currentRevision, @NotNull Repository.State state, @NotNull Collection branches, @NotNull Collection bookmarks, - @Nullable String currentBookmark) { + @Nullable String currentBookmark, + @NotNull Collection tags, + @NotNull Collection localTags) { myCurrentBranch = currentBranch; myCurrentRevision = currentRevision; myState = state; myBranches = new LinkedHashSet(branches); myBookmarks = new LinkedHashSet(bookmarks); myCurrentBookmark = currentBookmark; + myTags = new LinkedHashSet(tags); + myLocalTags = new LinkedHashSet(localTags); } @NotNull @@ -66,6 +72,16 @@ public class HgRepoInfo { return myBookmarks; } + @NotNull + public Collection getTags() { + return myTags; + } + + @NotNull + public Collection getLocalTags() { + return myLocalTags; + } + @Nullable public String getCurrentRevision() { return myCurrentRevision; @@ -94,13 +110,15 @@ public class HgRepoInfo { if (myCurrentBookmark != null ? !myCurrentBookmark.equals(info.myCurrentBookmark) : info.myCurrentBookmark != null) return false; if (!myBranches.equals(info.myBranches)) return false; if (!myBookmarks.equals(info.myBookmarks)) return false; + if (!myTags.equals(info.myTags)) return false; + if (!myLocalTags.equals(info.myLocalTags)) return false; return true; } @Override public int hashCode() { - return Objects.hashCode(myCurrentBranch, myCurrentRevision, myCurrentBookmark, myState, myBranches, myBookmarks); + return Objects.hashCode(myCurrentBranch, myCurrentRevision, myCurrentBookmark, myState, myBranches, myBookmarks, myTags, myLocalTags); } @Override diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepository.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepository.java index 572b4a9589ce..fbaaa4f14a94 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepository.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepository.java @@ -44,6 +44,12 @@ public interface HgRepository extends Repository { @NotNull Collection getBookmarks(); + @NotNull + Collection getTags(); + + @NotNull + Collection getLocalTags(); + @Nullable String getCurrentBookmark(); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java index 0ee790df1838..c3d9bc4e63ae 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java @@ -105,6 +105,18 @@ public class HgRepositoryImpl extends RepositoryImpl implements HgRepository { return myInfo.getCurrentBookmark(); } + @NotNull + @Override + public Collection getTags() { + return myInfo.getTags(); + } + + @NotNull + @Override + public Collection getLocalTags() { + return myInfo.getLocalTags(); + } + @NotNull @Override public HgConfig getRepositoryConfig() { @@ -142,7 +154,7 @@ public class HgRepositoryImpl extends RepositoryImpl implements HgRepository { //in GitRepositoryImpl there are temporary state object for reader fields storing! Todo Check; return new HgRepoInfo(myReader.readCurrentBranch(), myReader.readCurrentRevision(), myReader.readState(), myReader.readBranches(), - myReader.readBookmarks(), myReader.readCurrentBookmark()); + myReader.readBookmarks(), myReader.readCurrentBookmark(), myReader.readTags(), myReader.readLocalTags()); } public void updateConfig() { diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryReader.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryReader.java index e7bf3780ef63..39524ad46e28 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryReader.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryReader.java @@ -45,6 +45,8 @@ public class HgRepositoryReader { @NotNull private final File myCurrentBranch; // .hg/branch @NotNull private final File myBookmarksFile; //.hg/bookmarks @NotNull private final File myCurrentBookmark; //.hg/bookmarks.current + @NotNull private final File myTagsFile; //.hgtags - not in .hg directory!!! + @NotNull private final File myLocalTagsFile; // .hg/localtags @NotNull private final VcsLogObjectsFactory myVcsObjectsFactory; public HgRepositoryReader(@NotNull File hgDir) { @@ -56,6 +58,8 @@ public class HgRepositoryReader { myCurrentBranch = new File(myHgDir, "branch"); myBookmarksFile = new File(myHgDir, "bookmarks"); myCurrentBookmark = new File(myHgDir, "bookmarks.current"); + myLocalTagsFile = new File(myHgDir, "localtags"); + myTagsFile = new File(myHgDir.getParentFile(), ".hgtags"); myVcsObjectsFactory = ServiceManager.getService(VcsLogObjectsFactory.class); } @@ -123,19 +127,34 @@ public class HgRepositoryReader { @NotNull public Collection readBookmarks() { - // .hg/bookmarks contains hash + name, f.e. 25e44c95b2612e3cdf29a704dabf82c77066cb67 A_BookMark - Set bookmarks = new HashSet(); - if (!myBookmarksFile.exists()) { - return bookmarks; + return readReference(myBookmarksFile); + } + + @NotNull + public Collection readTags() { + return readReference(myTagsFile); + } + + @NotNull + public Collection readLocalTags() { + return readReference(myLocalTagsFile); + } + + @NotNull + private Collection readReference(@NotNull File fileWithReferences) { + // files like .hg/bookmarks which contains hash + name, f.e. 25e44c95b2612e3cdf29a704dabf82c77066cb67 A_BookMark + Set refs = new HashSet(); + if (!fileWithReferences.exists()) { + return refs; } - String[] bookmarksWithHeads = RepositoryUtil.tryLoadFile(myBookmarksFile).split("\n"); - for (String str : bookmarksWithHeads) { + String[] namesWithHashes = RepositoryUtil.tryLoadFile(fileWithReferences).split("\n"); + for (String str : namesWithHashes) { Matcher matcher = HASH_NAME.matcher(str); if (matcher.matches()) { - bookmarks.add(new HgNameWithHashInfo(matcher.group(2), myVcsObjectsFactory.createHash(matcher.group(1)))); + refs.add(new HgNameWithHashInfo(matcher.group(2), myVcsObjectsFactory.createHash(matcher.group(1)))); } } - return bookmarks; + return refs; } @Nullable diff --git a/plugins/hg4idea/testData/repo/.hgtags b/plugins/hg4idea/testData/repo/.hgtags new file mode 100644 index 000000000000..3feb1e05c09d --- /dev/null +++ b/plugins/hg4idea/testData/repo/.hgtags @@ -0,0 +1,2 @@ +25e44c95b2612e3cdf29a704dabf82c77066cb67 tag1 +c4e6b94abdf018515b2300698e3eb9b441d53619 tag2 \ No newline at end of file diff --git a/plugins/hg4idea/testData/repo/dot_hg/localtags b/plugins/hg4idea/testData/repo/dot_hg/localtags new file mode 100644 index 000000000000..7c4415461832 --- /dev/null +++ b/plugins/hg4idea/testData/repo/dot_hg/localtags @@ -0,0 +1 @@ +25e44c95b2612e3cdf29a704dabf82c77066cb67 localTag \ No newline at end of file diff --git a/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRealRepositoryReaderTest.java b/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRealRepositoryReaderTest.java index cdaaefec81cb..642e125f1f11 100644 --- a/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRealRepositoryReaderTest.java +++ b/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRealRepositoryReaderTest.java @@ -40,7 +40,7 @@ public class HgRealRepositoryReaderTest extends HgPlatformTest { super.setUp(); File hgDir = new File(myRepository.getPath(), ".hg"); assertTrue(hgDir.exists()); - createBranches(); + createBranchesAndTags(); myRepositoryReader = new HgRepositoryReader(hgDir); } @@ -62,6 +62,16 @@ public class HgRealRepositoryReaderTest extends HgPlatformTest { Arrays.asList("default", "branchA", "branchB")); } + public void testTags() { + TestRepositoryUtil.assertEqualCollections(HgUtil.getNamesWithoutHashes(myRepositoryReader.readTags()), + Arrays.asList("tag1", "tag2")); + } + + public void testLocalTags() { + TestRepositoryUtil.assertEqualCollections(HgUtil.getNamesWithoutHashes(myRepositoryReader.readLocalTags()), + Arrays.asList("localTag")); + } + public void testCurrentBookmark() { hg("update B_BookMark"); assertEquals(myRepositoryReader.readCurrentBookmark(), "B_BookMark"); @@ -72,19 +82,22 @@ public class HgRealRepositoryReaderTest extends HgPlatformTest { Arrays.asList("A_BookMark", "B_BookMark", "C_BookMark")); } - private void createBranches() { + private void createBranchesAndTags() { cd(myRepository); hg("bookmark A_BookMark"); + hg("tag tag1"); String aFile = "A.txt"; touch(aFile, "base"); hg("add " + aFile); hg("commit -m 'create file'"); hg("bookmark B_BookMark"); hg("branch branchA"); + hg("tag tag2"); echo(aFile, " modify with a"); hg("commit -m 'create branchA'"); hg("up default"); hg("branch branchB"); + hg("tag -l localTag"); echo(aFile, " modify with b"); hg("commit -m 'modify file in branchB'"); hg("bookmark C_BookMark"); diff --git a/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRepositoryReaderTest.java b/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRepositoryReaderTest.java index 045e66516e3e..872951ca5be8 100644 --- a/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRepositoryReaderTest.java +++ b/plugins/hg4idea/testSrc/hg4idea/test/repo/HgRepositoryReaderTest.java @@ -37,6 +37,8 @@ public class HgRepositoryReaderTest extends HgPlatformTest { @NotNull private File myHgDir; @NotNull private Collection myBranches; @NotNull private Collection myBookmarks; + @NotNull private Collection myTags; + @NotNull private Collection myLocalTags; @Override public void setUp() throws Exception { @@ -52,14 +54,20 @@ public class HgRepositoryReaderTest extends HgPlatformTest { File testBranchFile = new File(testHgDir, "branch"); File testBookmarkFile = new File(testHgDir, "bookmarks"); File testCurrentBookmarkFile = new File(testHgDir, "bookmarks.current"); + File testTagFile = new File(testHgDir.getParentFile(), ".hgtags"); + File testLocalTagFile = new File(testHgDir, "localtags"); FileUtil.copyDir(cacheDir, new File(myHgDir, "cache")); FileUtil.copy(testBranchFile, new File(myHgDir, "branch")); FileUtil.copy(testBookmarkFile, new File(myHgDir, "bookmarks")); FileUtil.copy(testCurrentBookmarkFile, new File(myHgDir, "bookmarks.current")); + FileUtil.copy(testTagFile, new File(myHgDir.getParentFile(), ".hgtags")); + FileUtil.copy(testLocalTagFile, new File(myHgDir, "localtags")); myRepositoryReader = new HgRepositoryReader(myHgDir); myBranches = readBranches(); - myBookmarks = readBookmarks(); + myBookmarks = readRefs(testBookmarkFile); + myTags = readRefs(testTagFile); + myLocalTags = readRefs(testLocalTagFile); } public void testHEAD() { @@ -81,6 +89,16 @@ public class HgRepositoryReaderTest extends HgPlatformTest { TestRepositoryUtil.assertEqualCollections(bookmarks, myBookmarks); } + public void testTags() { + Collection tags = HgUtil.getNamesWithoutHashes(myRepositoryReader.readTags()); + TestRepositoryUtil.assertEqualCollections(tags, myTags); + } + + public void testLocalTags() { + Collection localTags = HgUtil.getNamesWithoutHashes(myRepositoryReader.readLocalTags()); + TestRepositoryUtil.assertEqualCollections(localTags, myLocalTags); + } + @NotNull private Collection readBranches() throws IOException { Collection branches = new HashSet(); @@ -100,15 +118,14 @@ public class HgRepositoryReaderTest extends HgPlatformTest { } @NotNull - private Collection readBookmarks() throws IOException { - Collection bookmarks = new HashSet(); - File bookmarksFile = new File(myHgDir, "bookmarks"); - String[] bookmarksWithHashes = FileUtil.loadFile(bookmarksFile).split("\n"); - for (String str : bookmarksWithHashes) { + private static Collection readRefs(@NotNull File refFile) throws IOException { + Collection refs = new HashSet(); + String[] refsWithHashes = FileUtil.loadFile(refFile).split("\n"); + for (String str : refsWithHashes) { String[] refAndName = str.trim().split(" "); assertEquals(2, refAndName.length); - bookmarks.add(refAndName[1]); + refs.add(refAndName[1]); } - return bookmarks; + return refs; } } From b067500493776756c43e0c28df229c999c063e96 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Thu, 31 Oct 2013 20:19:20 +0400 Subject: [PATCH 14/53] Tags added to HgRepositoryUpdater *update repository information if tag files changed --- .../org/zmlx/hg4idea/repo/HgRepositoryFiles.java | 14 ++++++++++++++ .../zmlx/hg4idea/repo/HgRepositoryUpdater.java | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryFiles.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryFiles.java index 16cc5e2fb5a3..57870f11dff5 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryFiles.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryFiles.java @@ -36,6 +36,8 @@ public class HgRepositoryFiles { public static final String MERGE = "merge"; public static final String BRANCH = "branch"; public static final String BOOKMARKS = "bookmarks"; + public static final String LOCAL_TAGS = "localtags"; + public static final String TAGS = ".hgtags"; public static final String CURRENT_BOOKMARK = "bookmarks.current"; public static final String CONFIG_HGRC = "hgrc"; @@ -45,6 +47,8 @@ public class HgRepositoryFiles { @NotNull private final String myMergePath; @NotNull private final String myBranchPath; @NotNull private final String myBookmarksPath; + @NotNull private final String myTagsPath; + @NotNull private final String myLocalTagsPath; @NotNull private final String myCurrentBookmarkPath; @NotNull private final String myConfigHgrcPath; @@ -59,6 +63,8 @@ public class HgRepositoryFiles { myBranchPath = hgDir.getPath() + slash(BRANCH); myMergePath = hgDir.getPath() + slash(MERGE); myBookmarksPath = hgDir.getPath() + slash(BOOKMARKS); + myTagsPath = hgDir.getParent().getPath() + slash(TAGS); + myLocalTagsPath = hgDir.getPath() + slash(LOCAL_TAGS); myCurrentBookmarkPath = hgDir.getPath() + slash(CURRENT_BOOKMARK); myConfigHgrcPath = hgDir.getPath() + slash(CONFIG_HGRC); } @@ -104,4 +110,12 @@ public class HgRepositoryFiles { public boolean isConfigHgrcFile(String filePath) { return filePath.equals(myConfigHgrcPath); } + + public boolean isTagsFile(String filePath) { + return filePath.equals(myTagsPath); + } + + public boolean isLocalTagsFile(String filePath) { + return filePath.equals(myLocalTagsPath); + } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryUpdater.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryUpdater.java index 64a2b47e20d0..1b53bdcd5e58 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryUpdater.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryUpdater.java @@ -92,6 +92,8 @@ final class HgRepositoryUpdater implements Disposable, BulkFileListener { boolean branchFileChanged = false; boolean mergeFileChanged = false; boolean bookmarksFileChanged = false; + boolean tagsFileChanged = false; + boolean localTagsFileChanged = false; boolean currentBookmarkFileChanged = false; boolean configHgrcChanged = false; for (VFileEvent event : events) { @@ -112,6 +114,12 @@ final class HgRepositoryUpdater implements Disposable, BulkFileListener { else if (myRepositoryFiles.isBookmarksFile(filePath)) { bookmarksFileChanged = true; } + else if (myRepositoryFiles.isTagsFile(filePath)) { + tagsFileChanged = true; + } + else if (myRepositoryFiles.isLocalTagsFile(filePath)) { + localTagsFileChanged = true; + } else if (myRepositoryFiles.isCurrentBookmarksFile(filePath)) { currentBookmarkFileChanged = true; } @@ -121,7 +129,13 @@ final class HgRepositoryUpdater implements Disposable, BulkFileListener { } } - if (branchHeadsChanged || branchFileChanged || mergeFileChanged || bookmarksFileChanged || currentBookmarkFileChanged) { + if (branchHeadsChanged || + branchFileChanged || + mergeFileChanged || + bookmarksFileChanged || + currentBookmarkFileChanged || + tagsFileChanged || + localTagsFileChanged) { myUpdateQueue.add(Void.TYPE); } if (configHgrcChanged) { From 804b35ab80e2d4bc4705b559456463d19a4736b3 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Thu, 31 Oct 2013 20:28:58 +0400 Subject: [PATCH 15/53] test fix, wrong test data params order --- .../psi/formatter/java/JavaFormatterInEditorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java index 169e7657a329..7355feba87e3 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterInEditorTest.java @@ -56,12 +56,12 @@ public class JavaFormatterInEditorTest extends LightPlatformCodeInsightTestCase "}"; doTest(text, text); - String after = "class Test {\n" + + String before = "class Test {\n" + " void test() {\n" + " \n" + " }\n" + "}"; - doTest(text, after); + doTest(before, text); } public void testCaretPositionPreserved_WhenSomeFormattingNeeded() throws IOException { From 22393787b9ae55e5394c737ff16a6638296a6eda Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 31 Oct 2013 17:26:47 +0100 Subject: [PATCH 16/53] set "scan required" flag in DebugSession if hotswap was cancelled --- .../intellij/debugger/impl/HotSwapManager.java | 16 +++++++++++++++- .../debugger/impl/MultiProcessCommand.java | 9 ++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java index b7cd3f9ef9a1..bf0569b4755b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -155,6 +155,10 @@ public class HotSwapManager extends AbstractProjectComponent { } private void reloadClasses(DebuggerSession session, Map classesToReload, HotSwapProgress progress) { + if (progress.isCancelled()) { + session.setModifiedClassesScanRequired(true); + return; + } final long newSwapTime = System.currentTimeMillis(); new ReloadClassesWorker(session, progress).reloadClasses(classesToReload); setTimeStamp(session, newSwapTime); @@ -220,7 +224,13 @@ public class HotSwapManager extends AbstractProjectComponent { swapProgress.setTitle(DebuggerBundle.message("progress.hotswap.scanning.classes")); scanClassesCommand.run(); - return swapProgress.isCancelled() ? new HashMap>() : modifiedClasses; + if (swapProgress.isCancelled()) { + for (DebuggerSession session : sessions) { + session.setModifiedClassesScanRequired(true); + } + return new HashMap>(); + } + return modifiedClasses; } public static void reloadModifiedClasses(final Map> modifiedClasses, final HotSwapProgress reloadClassesProgress) { @@ -240,6 +250,10 @@ public class HotSwapManager extends AbstractProjectComponent { debuggerSession, modifiedClasses.get(debuggerSession), reloadClassesProgress ); } + + protected void commandCancelled() { + debuggerSession.setModifiedClassesScanRequired(true); + } }); } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/MultiProcessCommand.java b/java/debugger/impl/src/com/intellij/debugger/impl/MultiProcessCommand.java index db146c9aabf6..9fe6b8c390ff 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/MultiProcessCommand.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/MultiProcessCommand.java @@ -19,11 +19,11 @@ import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.openapi.util.Pair; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; public class MultiProcessCommand implements Runnable{ - private final List> myCommands = new ArrayList>(); + private final List> myCommands = new LinkedList>(); public void run() { while(true) { @@ -40,7 +40,10 @@ public class MultiProcessCommand implements Runnable{ public void cancel() { synchronized(myCommands) { - myCommands.clear(); + while (!myCommands.isEmpty()) { + Pair pair = myCommands.remove(0); + pair.getSecond().notifyCancelled(); + } } } From b590707fd30a704f12bb0a97be1a497392c1b102 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Thu, 31 Oct 2013 20:43:06 +0400 Subject: [PATCH 17/53] fix backspace. again --- .../ui/EditorTextFieldActionPromoter.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ui/EditorTextFieldActionPromoter.java b/platform/lang-impl/src/com/intellij/ui/EditorTextFieldActionPromoter.java index 3199328d847b..f7ae9d6e0a83 100644 --- a/platform/lang-impl/src/com/intellij/ui/EditorTextFieldActionPromoter.java +++ b/platform/lang-impl/src/com/intellij/ui/EditorTextFieldActionPromoter.java @@ -44,21 +44,12 @@ public class EditorTextFieldActionPromoter implements ActionPromoter { private static final Comparator ACTIONS_COMPARATOR = new Comparator() { @Override public int compare(AnAction o1, AnAction o2) { - if (o1 instanceof EditorAction && o2 instanceof EditorAction) { - return 0; - } - if (o1 instanceof TextComponentEditorAction) { - return -1; - } - if (o2 instanceof TextComponentEditorAction) { - return 1; - } - if (o1 instanceof EditorAction) { - return 1; - } - if (o2 instanceof EditorAction) { - return -1; - } + boolean textFieldAction1 = o1 instanceof TextComponentEditorAction; + boolean textFieldAction2 = o2 instanceof TextComponentEditorAction; + boolean plainEditorAction1 = o1 instanceof EditorAction && !textFieldAction1; + boolean plainEditorAction2 = o2 instanceof EditorAction && !textFieldAction2; + if (textFieldAction1 && plainEditorAction2) return -1; + if (textFieldAction2 && plainEditorAction1) return 1; return 0; } }; From 0e38755c483f6382f9a9f732fd9b76194df6eaf8 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Thu, 31 Oct 2013 21:04:35 +0400 Subject: [PATCH 18/53] Override getState method for HgRepository --- .../src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java index c3d9bc4e63ae..740df7d22b62 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java @@ -75,6 +75,13 @@ public class HgRepositoryImpl extends RepositoryImpl implements HgRepository { return myHgDir; } + + @NotNull + @Override + public State getState() { + return myInfo.getState(); + } + @Override @NotNull public String getCurrentBranch() { From f5b0d17657324603874e4a12de8833b54625092d Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Thu, 31 Oct 2013 21:05:36 +0400 Subject: [PATCH 19/53] disable double shift by adding dedicated shortcut --- .../ide/actions/SearchEverywhereAction.java | 24 +++++++++++++------ .../openapi/actionSystem/IdeActions.java | 3 ++- .../fileEditor/impl/EditorsSplitters.java | 11 +++++---- .../src/misc/registry.properties | 1 - 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java index 2c01b0480bad..dc02b9e6642b 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java @@ -38,6 +38,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.actions.TextComponentEditorAction; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.fileEditor.impl.EditorHistoryManager; +import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.keymap.MacKeymapUtil; import com.intellij.openapi.options.Configurable; @@ -217,8 +218,10 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA private void run(KeyEvent event) { final ActionManager actionManager = ActionManager.getInstance(); - final AnAction action = actionManager.getAction("SearchEverywhere"); - + final AnAction action = actionManager.getAction(IdeActions.ACTION_SEARCH_EVERYWHERE); + if (KeymapManager.getInstance().getActiveKeymap().getShortcuts(IdeActions.ACTION_SEARCH_EVERYWHERE).length > 0) { + return; + } final AnActionEvent anActionEvent = new AnActionEvent(event, DataManager.getInstance().getDataContext(IdeFocusManager.findInstance().getFocusOwner()), ActionPlaces.UNKNOWN, @@ -314,10 +317,17 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA } private void initTooltip(JLabel label) { - label.setToolTipText("Search Everywhere
Press " + - "Double " + - (SystemInfo.isMac ? MacKeymapUtil.SHIFT : "Shift") + - " to access
- Classes
- Files
- Tool Windows
- Actions
- Settings"); + final Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts(IdeActions.ACTION_SEARCH_EVERYWHERE); + final String shortcutText; + if (shortcuts.length == 0) { + shortcutText = "Double " + (SystemInfo.isMac ? MacKeymapUtil.SHIFT : "Shift"); + } else { + shortcutText = KeymapUtil.getShortcutsText(shortcuts); + } + + label.setToolTipText("Search Everywhere
Press " + + shortcutText + + " to access
- Classes
- Files
- Tool Windows
- Actions
- Settings"); } @@ -589,7 +599,7 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA initSearchActions(myBalloon, myPopupField); IdeFocusManager focusManager = IdeFocusManager.getInstance(e.getProject()); focusManager.requestFocus(myPopupField.getTextEditor(), true); -// FeatureUsageTracker.getInstance().triggerFeatureUsed("SearchEverywhere"); +// FeatureUsageTracker.getInstance().triggerFeatureUsed(IdeActions.ACTION_SEARCH_EVERYWHERE); } private void initSearchActions(JBPopup balloon, MySearchTextField searchTextField) { diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java index 26daca8b29c5..568abafab1cc 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/IdeActions.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -267,4 +267,5 @@ public interface IdeActions { String MOVE_TO_ANOTHER_CHANGE_LIST = "ChangesView.Move"; String ACTION_RECENT_FILES = "RecentFiles"; + String ACTION_SEARCH_EVERYWHERE = "SearchEverywhere"; } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java index 8ae71c56629f..06a8f792b4ce 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java @@ -31,7 +31,6 @@ import com.intellij.openapi.keymap.MacKeymapUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.util.*; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.*; @@ -170,10 +169,14 @@ public class EditorsSplitters extends IdePanePanel { painter.appendLine("No files are open").underlined(new JBColor(isDarkBackground ? Gray._210 : Gray._150, Gray._100)); - if (Registry.is("search.everywhere.enabled")) { - painter.appendLine("Search Everywhere with Double " + (SystemInfo.isMac ? MacKeymapUtil.SHIFT : "Shift")) - .smaller().withBullet(); + final Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts(IdeActions.ACTION_SEARCH_EVERYWHERE); + final String everywhere; + if (shortcuts.length == 0) { + everywhere = "Search Everywhere with Double " + (SystemInfo.isMac ? MacKeymapUtil.SHIFT : "Shift"); + } else { + everywhere = "Search Everywhere " + KeymapUtil.getShortcutsText(shortcuts); } + painter.appendLine(everywhere).smaller().withBullet(); if (!isProjectViewVisible()) { painter.appendLine("Open Project View with " + KeymapUtil.getShortcutText(new KeyboardShortcut( diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index e3581ee694ec..c2a3376be978 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -298,7 +298,6 @@ enable.graph.inference=false comment.by.line.bulk.lines.trigger=100 scene.builder.start.executable=true -search.everywhere.enabled=true junit_sm_runner=false testng_sm_runner=false show.flex.debug.design.view=false From 364a57e811ce671b545146dba86fd9deb5eb3d81 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 31 Oct 2013 18:03:48 +0100 Subject: [PATCH 20/53] TreeElementPattern.withSuperParent returned true if there was no parent of that level gradle completion contributor should only work in .gradle files --- .../patterns/VirtualFilePatternsTest.groovy | 31 +++++++++++++++++++ .../intellij/patterns/TreeElementPattern.java | 2 +- ...pendenciesGradleCompletionContributor.java | 6 ++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testSrc/com/intellij/patterns/VirtualFilePatternsTest.groovy diff --git a/java/java-tests/testSrc/com/intellij/patterns/VirtualFilePatternsTest.groovy b/java/java-tests/testSrc/com/intellij/patterns/VirtualFilePatternsTest.groovy new file mode 100644 index 000000000000..18d5622132b6 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/patterns/VirtualFilePatternsTest.groovy @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2013 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.patterns +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +/** + * @author peter + */ +public class VirtualFilePatternsTest extends LightCodeInsightFixtureTestCase { + + public void testWithSuperParent() { + def file = myFixture.addFileToProject("foo/bar.txt", "").virtualFile + assert PlatformPatterns.virtualFile().withSuperParent(1, PlatformPatterns.virtualFile().withName("foo")).accepts(file) + assert !PlatformPatterns.virtualFile().withSuperParent(1, PlatformPatterns.virtualFile().withName("bar")).accepts(file) + assert !PlatformPatterns.virtualFile().withSuperParent(2, PlatformPatterns.virtualFile().withName("bar")).accepts(file) + assert !PlatformPatterns.virtualFile().withSuperParent(10, PlatformPatterns.virtualFile().withName("bar")).accepts(file) + assert !PlatformPatterns.virtualFile().withSuperParent(10, PlatformPatterns.virtualFile().withName("foo")).accepts(file) + } +} diff --git a/platform/core-api/src/com/intellij/patterns/TreeElementPattern.java b/platform/core-api/src/com/intellij/patterns/TreeElementPattern.java index 9f843d7cb88c..084be74c0031 100644 --- a/platform/core-api/src/com/intellij/patterns/TreeElementPattern.java +++ b/platform/core-api/src/com/intellij/patterns/TreeElementPattern.java @@ -118,7 +118,7 @@ public abstract class TreeElementPattern processor) { ParentType parent = t; for (int i = 0; i < level; i++) { - if (parent == null) return false; + if (parent == null) return true; parent = getParent(parent); } return processor.process(parent, context); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/completion/MavenDependenciesGradleCompletionContributor.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/completion/MavenDependenciesGradleCompletionContributor.java index c269c9e1da83..33d99a247874 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/completion/MavenDependenciesGradleCompletionContributor.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/completion/MavenDependenciesGradleCompletionContributor.java @@ -22,6 +22,7 @@ import com.intellij.icons.AllIcons; import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PatternCondition; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,6 +54,11 @@ public class MavenDependenciesGradleCompletionContributor extends CompletionCont new PatternCondition("withInvokedExpressionText") { @Override public boolean accepts(@NotNull GrMethodCallExpression expression, ProcessingContext context) { + PsiFile file = expression.getContainingFile(); + if (!file.getName().endsWith(".gradle")) { + return false; + } + GrExpression grExpression = expression.getInvokedExpression(); return grExpression != null && "dependencies".equals(grExpression.getText()); } From cbb010adae9d63c1a2859582382e058db6e46b99 Mon Sep 17 00:00:00 2001 From: Vassiliy Date: Thu, 31 Oct 2013 21:54:52 +0400 Subject: [PATCH 21/53] Improve "Editor Font Settings" usability --- .../options/colors/FontOptions.java | 396 ++++++++---------- .../src/messages/ApplicationBundle.properties | 6 +- 2 files changed, 186 insertions(+), 216 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java index 3d19b28fd8f9..e35b042c8afc 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java @@ -27,24 +27,26 @@ import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.IdeBorderFactory; -import com.intellij.ui.ListSpeedSearch; import com.intellij.ui.components.JBCheckBox; -import com.intellij.ui.components.JBList; -import com.intellij.ui.components.JBMovePanel; import com.intellij.util.EventDispatcher; -import com.intellij.util.containers.ContainerUtilRt; -import com.intellij.util.ui.GridBag; +import com.intellij.util.ReflectionUtil; import com.intellij.util.ui.UIUtil; +import net.miginfocom.swing.MigLayout; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.event.*; +import javax.swing.event.DocumentEvent; +import javax.swing.plaf.basic.ComboPopup; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class FontOptions extends JPanel implements OptionsPanel{ @@ -55,141 +57,84 @@ public class FontOptions extends JPanel implements OptionsPanel{ @NotNull private final ColorAndFontOptions myOptions; - @NotNull private final DefaultListModel myAllFontsModel = new DefaultListModel(); - @NotNull private final JBList myAllFontsList = new JBList(myAllFontsModel); - @NotNull private final DefaultListModel mySelectedFontsModel = new DefaultListModel(); - @NotNull private final JBList mySelectedFontsList = new JBList(mySelectedFontsModel); - @NotNull private final JBMovePanel myFontsControl = new JBMovePanel(myAllFontsList, mySelectedFontsList) { - @SuppressWarnings("SSBasedInspection") - @Override - public void paint(Graphics g) { - super.paint(g); - if (myFontNames == null) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - initFontTables(); - } - }); - } - } - }; - - @NotNull private final JTextField myEditorFontSizeField = new MyTextField(4); - @NotNull private final JTextField myLineSpacingField = new MyTextField(4); + @NotNull private final JTextField myEditorFontSizeField = new JTextField(4); + @NotNull private final JTextField myLineSpacingField = new JTextField(4); + private final FontNameCombo myPrimaryCombo = new FontNameCombo(null); + private final JCheckBox myUseSecondaryFontCheckbox = new JCheckBox(ApplicationBundle.message("secondary.font")); + private final FontNameCombo mySecondaryCombo = new FontNameCombo(null); @NotNull private final JBCheckBox myOnlyMonospacedCheckBox = new JBCheckBox(ApplicationBundle.message("checkbox.show.only.monospaced.fonts")); - @Nullable private final Dimension myPreferredSize; private boolean myIsInSchemeChange; - private final String myTitle; + public FontOptions(ColorAndFontOptions options) { this(options, ApplicationBundle.message("group.editor.font")); } protected FontOptions(@NotNull ColorAndFontOptions options, final String title) { - super(new GridBagLayout()); + setLayout(new MigLayout("ins 0, gap 5, flowx")); + Insets borderInsets = new Insets(IdeBorderFactory.TITLED_BORDER_TOP_INSET, + IdeBorderFactory.TITLED_BORDER_LEFT_INSET, + 0, + IdeBorderFactory.TITLED_BORDER_RIGHT_INSET); + setBorder(IdeBorderFactory.createTitledBorder(title, false, borderInsets)); myOptions = options; - myTitle = title; - add(createEditorFontPanel(), new GridBag().weightx(1).weighty(1).fillCell().coverLine()); + add(myOnlyMonospacedCheckBox, "sgx b, sx 2"); + + add(new JLabel(ApplicationBundle.message("primary.font")), "newline, ax right"); + add(myPrimaryCombo, "sgx b"); + add(new JLabel(ApplicationBundle.message("editbox.font.size")), "gapleft 20"); + add(myEditorFontSizeField); + add(new JLabel(ApplicationBundle.message("editbox.line.spacing")), "gapleft 20"); + add(myLineSpacingField); + add(new JLabel(ApplicationBundle.message("label.fallback.fonts.list.description"), MessageType.INFO.getDefaultIcon(), - SwingConstants.LEFT), - new GridBag().anchor(GridBagConstraints.WEST)); - myFontsControl.setShowButtons(JBMovePanel.ButtonType.LEFT, JBMovePanel.ButtonType.RIGHT); - myFontsControl.setListLabels(ApplicationBundle.message("title.font.available"), ApplicationBundle.message("title.font.selected")); - myFontsControl.setEnabled(false); // Disable the controls until fonts are loaded. - myFontsControl.setLeftInsertionStrategy(JBMovePanel.NATURAL_ORDER); + SwingConstants.LEFT), "newline, sx 5"); + add(myUseSecondaryFontCheckbox, "newline, ax right"); + add(mySecondaryCombo, "sgx b"); + + myOnlyMonospacedCheckBox.setBorder(null); + myUseSecondaryFontCheckbox.setBorder(null); + mySecondaryCombo.setEnabled(false); + myOnlyMonospacedCheckBox.setSelected(EditorColorsManager.getInstance().isUseOnlyMonospacedFonts()); - new ListSpeedSearch(myAllFontsList); - new ListSpeedSearch(mySelectedFontsList); - - // Almost all other color scheme pages use the following pattern: - // - // __________________________________________ - // | color keys | color and font settings | - // - // Here page's height is calculated on the 'color and font settings' preferred height (debugged a lot to ensure that). - // The idea is to configure current page to use the same height as other pages. That's why we set it up to use the same preferred - // size as 'color and font settings' control. - myPreferredSize = new ColorAndFontDescriptionPanel().getPreferredSize(); - if (myFontNames != null) { - onFontsInit(); - } - initListeners(); - } - - @Override - public Dimension getMinimumSize() { - return getPreferredSize(); - } - - @Override - public Dimension getPreferredSize() { - return myPreferredSize == null ? super.getPreferredSize() : myPreferredSize; - } - - private void initListeners() { myOnlyMonospacedCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - boolean onlyMonospaced = myOnlyMonospacedCheckBox.isSelected(); - EditorColorsManager.getInstance().setUseOnlyMonospacedFonts(onlyMonospaced); - onFontsInit(); + EditorColorsManager.getInstance().setUseOnlyMonospacedFonts(myOnlyMonospacedCheckBox.isSelected()); + myPrimaryCombo.updateModel(); + mySecondaryCombo.updateModel(); } }); - - mySelectedFontsModel.addListDataListener(new ListDataListener() { + myUseSecondaryFontCheckbox.addActionListener(new ActionListener() { @Override - public void intervalAdded(ListDataEvent e) { + public void actionPerformed(ActionEvent e) { + mySecondaryCombo.setEnabled(myUseSecondaryFontCheckbox.isSelected()); syncFontFamilies(); } - - @Override - public void intervalRemoved(ListDataEvent e) { - syncFontFamilies(); - } - - @Override - public void contentsChanged(ListDataEvent e) { - syncFontFamilies(); - } - - private void syncFontFamilies() { - if (myIsInSchemeChange) { - return; - } - FontPreferences fontPreferences = getFontPreferences(); - fontPreferences.clearFonts(); - Enumeration elements = mySelectedFontsModel.elements(); - while (elements.hasMoreElements()) { - String fontFamily = (String)elements.nextElement(); - // Don't save a single 'default' font family at the font preferences. - if (mySelectedFontsModel.getSize() > 1 || !FontPreferences.DEFAULT_FONT_NAME.equals(fontFamily)) { - fontPreferences.addFontFamily(fontFamily); - } - } - } }); - - mySelectedFontsList.addListSelectionListener(new ListSelectionListener() { + ItemListener itemListener = new ItemListener() { @Override - public void valueChanged(ListSelectionEvent e) { - Object value = mySelectedFontsList.getSelectedValue(); - if (value != null) { - boolean toRestore = myIsInSchemeChange; - myIsInSchemeChange = true; - try { - myEditorFontSizeField.setText(String.valueOf(getFontPreferences().getSize((String)value))); - } - finally { - myIsInSchemeChange = toRestore; - } + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + syncFontFamilies(); } } - }); + }; + myPrimaryCombo.addItemListener(itemListener); + mySecondaryCombo.addItemListener(itemListener); + + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + syncFontFamilies(); + } + }; + myPrimaryCombo.addActionListener(actionListener); + mySecondaryCombo.addActionListener(actionListener); myEditorFontSizeField.getDocument().addDocumentListener(new DocumentAdapter() { @Override @@ -199,8 +144,8 @@ public class FontOptions extends JPanel implements OptionsPanel{ int fontSize = Integer.parseInt(myEditorFontSizeField.getText()); if (fontSize < 1) fontSize = 1; if (fontSize > OptionsConstants.MAX_EDITOR_FONT_SIZE) fontSize = OptionsConstants.MAX_EDITOR_FONT_SIZE; - Object selectedFont = mySelectedFontsList.getSelectedValue(); - if (selectedFont != null) { + Object selectedFont = myPrimaryCombo.getSelectedItem(); + if (selectedFont instanceof String) { FontPreferences fontPreferences = getFontPreferences(); fontPreferences.register((String)selectedFont, fontSize); } @@ -237,6 +182,23 @@ public class FontOptions extends JPanel implements OptionsPanel{ }); } + private void syncFontFamilies() { + if (myIsInSchemeChange) { + return; + } + FontPreferences fontPreferences = getFontPreferences(); + fontPreferences.clearFonts(); + String primaryFontFamily = (String)myPrimaryCombo.getSelectedItem(); + String secondaryFontFamily = mySecondaryCombo.isEnabled() ? (String)mySecondaryCombo.getSelectedItem() : null; + if (primaryFontFamily != null && !FontPreferences.DEFAULT_FONT_NAME.equals(primaryFontFamily)) { + fontPreferences.addFontFamily(primaryFontFamily); + } + if (secondaryFontFamily != null && !FontPreferences.DEFAULT_FONT_NAME.equals(secondaryFontFamily)) { + fontPreferences.addFontFamily(secondaryFontFamily); + } + updateDescription(true); + } + public static void showReadOnlyMessage(JComponent parent, final boolean sharedScheme) { if (!sharedScheme) { @@ -262,65 +224,25 @@ public class FontOptions extends JPanel implements OptionsPanel{ myIsInSchemeChange = true; myLineSpacingField.setText(Float.toString(getLineSpacing())); - mySelectedFontsModel.clear(); FontPreferences fontPreferences = getFontPreferences(); List fontFamilies = fontPreferences.getEffectiveFontFamilies(); - Set selectedFonts = ContainerUtilRt.newHashSet(); - Object selectedValue = mySelectedFontsList.getSelectedValue(); - mySelectedFontsModel.clear(); - if (fontFamilies.isEmpty()) { - // Add default font. - mySelectedFontsModel.addElement(fontPreferences.getFontFamily()); - selectedFonts.add(fontPreferences.getFontFamily()); - } - else { - for (String fontFamily : fontFamilies) { - mySelectedFontsModel.addElement(fontFamily); - selectedFonts.add(fontFamily); - } - } - - int newSelectionIndex = 0; - if (selectedValue != null) { - newSelectionIndex = Math.max(0, mySelectedFontsModel.indexOf(selectedValue)); - } - mySelectedFontsList.setSelectedIndex(newSelectionIndex); - - for (int i = myAllFontsModel.size() - 1; i >= 0; i--) { - if (selectedFonts.contains(myAllFontsModel.getElementAt(i))) { - myAllFontsModel.remove(i); - } - } + myPrimaryCombo.setSelectedItem(fontPreferences.getFontFamily()); + boolean isThereSecondaryFont = fontFamilies.size() > 1; + myUseSecondaryFontCheckbox.setSelected(isThereSecondaryFont); + mySecondaryCombo.setSelectedItem(isThereSecondaryFont ? fontFamilies.get(1) : null); myEditorFontSizeField.setText(String.valueOf(fontPreferences.getSize(fontPreferences.getFontFamily()))); - boolean enabled = !ColorAndFontOptions.isReadOnly(myOptions.getSelectedScheme()); - myOnlyMonospacedCheckBox.setEnabled(enabled); - myLineSpacingField.setEnabled(enabled); - myEditorFontSizeField.setEditable(enabled); - myFontsControl.setEnabled(enabled); + boolean readOnly = ColorAndFontOptions.isReadOnly(myOptions.getSelectedScheme()); + myPrimaryCombo.setEnabled(!readOnly); + mySecondaryCombo.setEnabled(isThereSecondaryFont && !readOnly); + myOnlyMonospacedCheckBox.setEnabled(!readOnly); + myLineSpacingField.setEnabled(!readOnly); + myEditorFontSizeField.setEditable(!readOnly); + myUseSecondaryFontCheckbox.setEnabled(!readOnly); myIsInSchemeChange = false; } - private void onFontsInit() { - assert myFontNames != null; - Object selectedValue = myAllFontsList.getSelectedValue(); - myAllFontsModel.clear(); - List availableFonts = myOnlyMonospacedCheckBox.isSelected() ? myMonospacedFontNames : myFontNames; - int newSelectionIndex = 0; - int i = 0; - for (String name : availableFonts) { - if (!mySelectedFontsModel.contains(name)) { // Don't bother with performance here in assumption that fallback fonts sequence is short - myAllFontsModel.addElement(name); - if (name.equals(selectedValue)) { - newSelectionIndex = i; - } - i++; - } - } - myAllFontsList.setSelectedIndex(newSelectionIndex); - } - @NotNull protected FontPreferences getFontPreferences() { return getCurrentScheme().getFontPreferences(); @@ -352,44 +274,13 @@ public class FontOptions extends JPanel implements OptionsPanel{ return myOptions.getSelectedScheme(); } - private JPanel createEditorFontPanel() { - JPanel editorFontPanel = new JPanel(new GridBagLayout()); - Insets borderInsets = new Insets(IdeBorderFactory.TITLED_BORDER_TOP_INSET, - IdeBorderFactory.TITLED_BORDER_LEFT_INSET, - 0, - IdeBorderFactory.TITLED_BORDER_RIGHT_INSET); - editorFontPanel.setBorder(IdeBorderFactory.createTitledBorder(myTitle, false, borderInsets)); - - Insets insets = new Insets(0, 0, 5, 0); - GridBag constraints = new GridBag().insets(insets); - editorFontPanel.add(myOnlyMonospacedCheckBox, constraints); - - insets.left = 8; - editorFontPanel.add(new JLabel(ApplicationBundle.message("editbox.font.size")), constraints); - - insets.left = 2; - editorFontPanel.add(myEditorFontSizeField, constraints); - - insets.left = 8; - editorFontPanel.add(new JLabel(ApplicationBundle.message("editbox.line.spacing")), constraints); - - insets.left = 2; - editorFontPanel.add(myLineSpacingField, constraints); - - editorFontPanel.add(new JLabel(""), new GridBag().insets(insets).weightx(1).fillCellHorizontally().coverLine()); - - editorFontPanel.add(myFontsControl, new GridBag().weightx(1).weighty(1).fillCell().coverLine().insets(insets)); - - return editorFontPanel; - } - @SuppressWarnings({"AssignmentToStaticFieldFromInstanceMethod"}) - private void initFontTables() { + private void initFontTables(FontNameCombo popupCallback) { if (myFontNames == null) { myFontNames = new ArrayList(); myMonospacedFontNames = new ArrayList(); - ProgressManager.getInstance().runProcessWithProgressSynchronously(new InitFontsRunnable(), ApplicationBundle.message("progress.analyzing.fonts"), false, null); + ProgressManager.getInstance().runProcessWithProgressSynchronously(new InitFontsRunnable(popupCallback), ApplicationBundle.message("progress.analyzing.fonts"), false, null); } } @@ -421,18 +312,13 @@ public class FontOptions extends JPanel implements OptionsPanel{ return new HashSet(); } - private static class MyTextField extends JTextField { - private MyTextField(int size) { - super(size); - } - - @Override - public Dimension getMinimumSize() { - return getPreferredSize(); - } - } - private class InitFontsRunnable implements Runnable { + private final FontNameCombo myPopupCallback; + + private InitFontsRunnable(FontNameCombo popupCallback) { + myPopupCallback = popupCallback; + } + @Override public void run() { ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); @@ -482,9 +368,93 @@ public class FontOptions extends JPanel implements OptionsPanel{ UIUtil.invokeLaterIfNeeded(new Runnable() { @Override public void run() { - onFontsInit(); + myPrimaryCombo.updateModel(); + mySecondaryCombo.updateModel(); + myPopupCallback.showPopup(); } }); } } + + private class FontNameCombo extends JComboBox { + private final DefaultComboBoxModel myModel; + private Boolean myMonospacedOnly = null; + + private FontNameCombo(String selectedName) { + setModel(myModel = new DefaultComboBoxModel()); + updateModel(); + setSelectedItem(selectedName); + } + + private void updateModel() { + if (myFontNames == null || myMonospacedFontNames == null) return; + + if (myMonospacedOnly == null || myMonospacedOnly.booleanValue() != EditorColorsManager.getInstance().isUseOnlyMonospacedFonts()) { + myMonospacedOnly = EditorColorsManager.getInstance().isUseOnlyMonospacedFonts(); + + Object tmp = getSelectedItem(); + myModel.removeAllElements(); + List toAdd = myMonospacedOnly ? myMonospacedFontNames : myFontNames; + for (Object o : toAdd) { + myModel.addElement(o); + } + if (myModel.getIndexOf(tmp) != -1) { + setSelectedItem(tmp); + } else { + setSelectedItem(FontPreferences.DEFAULT_FONT_NAME); + } + + fireActionEvent(); + revalidate(); + repaint(); + } + } + + @Override + public void setSelectedItem(Object anObject) { + if (myModel.getSize() == 0 && anObject != null) { + myModel.addElement(anObject); + } + super.setSelectedItem(anObject); + } + + + @Nullable + private JList getPopupList() { + ComboPopup popup = ReflectionUtil.getField(getUI().getClass(), getUI(), ComboPopup.class, "popup"); + return (popup != null) ? popup.getList() : null; + } + + @Override + public void firePopupMenuWillBecomeVisible() { + super.firePopupMenuWillBecomeVisible(); + if (myFontNames == null) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + initFontTables(FontNameCombo.this); + } + }); + } + final JList list = getPopupList(); + if (list != null && !(list.getCellRenderer() instanceof MyListCellRenderer)) { + list.setCellRenderer(new MyListCellRenderer()); + } + } + } + + private static class MyListCellRenderer extends DefaultListCellRenderer { + public Component getListCellRendererComponent( + JList list, + Object value, + int index, + boolean isSelected, + boolean cellHasFocus) { + Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof String) { + c.setFont(new Font((String) value, Font.PLAIN, 14)); + } + return c; + } + } } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index fd0bdd300faa..577a0766460c 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -475,6 +475,8 @@ error.illegal.scheme.name=Illegal scheme name error.a.scheme.with.this.name.already.exists.or.was.deleted.without.applying.the.changes=A scheme with this name already exists or was deleted without applying the changes title.select.font=Select Font checkbox.show.only.monospaced.fonts=Show only monospaced fonts +primary.font=Primary font: +secondary.font=Secondary font: editbox.enter.tag.name=Enter tag name: title.tag.name=Tag Name title.xml=XML @@ -503,9 +505,7 @@ title.colors.and.fonts=Colors \\& Fonts progress.analysing.font=Analysing font: {0} button.edit.scopes=Edit Scopes... group.editor.font=Editor Font -title.font.available=Available fonts: -title.font.selected=Selected fonts: -label.fallback.fonts.list.description=The ide tries to use the next font from 'Selected fonts' list for displaying a symbol if the current font fails to do that +label.fallback.fonts.list.description=If primary font fails IDE tries to use the secondary one quickdoc.tooltip.font.size.by.wheel=Slider or Ctrl+Wheel change font size label.font.size=Font size: label.font.name=Name: From 7445e7fdc2ad98686d2753775a1abd8b668fdeaf Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 17:55:41 +0100 Subject: [PATCH 22/53] accept intersection types in javadoc --- .../codeInsight/javadoc/JavaDocInfoGenerator.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index 0591b8f27d47..ea5a668221af 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -1661,7 +1661,7 @@ public class JavaDocInfoGenerator { return length; } - if (type instanceof PsiDisjunctionType) { + if (type instanceof PsiDisjunctionType || type instanceof PsiIntersectionType) { if (!generateLink) { final String text = StringUtil.escapeXml(type.getCanonicalText()); buffer.append(text); @@ -1669,9 +1669,17 @@ public class JavaDocInfoGenerator { } else { int length = 0; - for (PsiType psiType : ((PsiDisjunctionType)type).getDisjunctions()) { + final String separator = type instanceof PsiDisjunctionType ? " | " : " & "; + final List componentTypes; + if (type instanceof PsiIntersectionType) { + componentTypes = Arrays.asList(((PsiIntersectionType)type).getConjuncts()); + } + else { + componentTypes = ((PsiDisjunctionType)type).getDisjunctions(); + } + for (PsiType psiType : componentTypes) { if (length > 0) { - buffer.append(" | "); + buffer.append(separator); length += 3; } length += generateType(buffer, psiType, context, generateLink); From 7168a92d3be8c9b4d2b2814e66a797f6c40e0be5 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 18:53:48 +0100 Subject: [PATCH 23/53] new inference: clear initial instantiations before resulted one is performed to avoid skip of non-proper types of the first run which become proper on the second one --- .../impl/source/resolve/graphInference/InferenceSession.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index de5d470e8e69..7ff660151a47 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -219,6 +219,9 @@ public class InferenceSession { } } + for (InferenceVariable inferenceVariable : myInferenceVariables.values()) { + inferenceVariable.ignoreInstantiation(); + } mySiteSubstitutor = resolveBounds(myInferenceVariables.values(), mySiteSubstitutor, true); for (InferenceVariable inferenceVariable : myInferenceVariables.values()) { From 11b281c2fc2539cf2186cd990d630c00c6dc0722 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 19:09:48 +0100 Subject: [PATCH 24/53] compilation fix for 1.6 --- .../com/intellij/application/options/colors/FontOptions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java index e35b042c8afc..c627dd91682c 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java @@ -420,7 +420,7 @@ public class FontOptions extends JPanel implements OptionsPanel{ @Nullable - private JList getPopupList() { + private JList getPopupList() { ComboPopup popup = ReflectionUtil.getField(getUI().getClass(), getUI(), ComboPopup.class, "popup"); return (popup != null) ? popup.getList() : null; } @@ -436,7 +436,7 @@ public class FontOptions extends JPanel implements OptionsPanel{ } }); } - final JList list = getPopupList(); + final JList list = getPopupList(); if (list != null && !(list.getCellRenderer() instanceof MyListCellRenderer)) { list.setCellRenderer(new MyListCellRenderer()); } From 322e9f389e7164ef378a3526c937f0ad2e099fe4 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 19:13:56 +0100 Subject: [PATCH 25/53] remove unknown property --- .../intellij/openapi/actionSystem/impl/ActionToolbarImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java index 31d14f5bb13e..f3abedcf7bc1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java @@ -300,7 +300,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { add(mySecondaryActionsButton); } - if (Registry.is("search.everywhere.enabled") && (ActionPlaces.MAIN_TOOLBAR.equals(myPlace) || ActionPlaces.NAVIGATION_BAR.equals(myPlace))) { + if ((ActionPlaces.MAIN_TOOLBAR.equals(myPlace) || ActionPlaces.NAVIGATION_BAR.equals(myPlace))) { final AnAction searchEverywhereAction = ActionManager.getInstance().getAction("SearchEverywhere"); if (searchEverywhereAction != null) { try { From 32e25e521756b72376570194207fe40a7200bee1 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 19:17:07 +0100 Subject: [PATCH 26/53] more strict check for flattened intersection type --- .../codeInsight/daemon/impl/analysis/HighlightUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 15bb4fe3bd4c..6cf4070150cb 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -324,7 +324,7 @@ public class HighlightUtil extends HighlightUtilBase { static boolean isIntersection(PsiTypeElement castTypeElement, PsiType castType) { if (castType instanceof PsiIntersectionType) return true; - return PsiTreeUtil.getChildrenOfType(castTypeElement, PsiTypeElement.class) != null; + return castType instanceof PsiClassType && PsiTreeUtil.getChildrenOfType(castTypeElement, PsiTypeElement.class) != null; } @Nullable From 5ad289fdff2fa96462df233d800ea301d440b64d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 31 Oct 2013 19:08:23 +0100 Subject: [PATCH 27/53] load file content for hotswap only if corresponding class is loaded in VM --- .../src/com/intellij/debugger/impl/HotSwapFile.java | 5 ++++- .../intellij/debugger/impl/ReloadClassesWorker.java | 13 +++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapFile.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapFile.java index db0a0fbba311..da6bdbcc6fa7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapFile.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapFile.java @@ -15,6 +15,8 @@ */ package com.intellij.debugger.impl; +import org.jetbrains.annotations.NotNull; + import java.io.File; /** @@ -23,9 +25,10 @@ import java.io.File; * Time: 2:23:38 PM */ public class HotSwapFile { + @NotNull final File file; - public HotSwapFile(File file) { + public HotSwapFile(@NotNull File file) { this.file = file; } } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java index d8d8dd469c43..9a43bfbcc881 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java @@ -31,6 +31,7 @@ import com.intellij.util.ui.UIUtil; import com.sun.jdi.ReferenceType; import org.jetbrains.annotations.Nullable; +import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.HashMap; @@ -121,15 +122,12 @@ class ReloadClassesWorker { myProgress.setFraction(processedClassesCount / (double)modifiedClasses.size()); } final HotSwapFile fileDescr = modifiedClasses.get(qualifiedName); - final byte[] content; try { - content = FileUtil.loadFileBytes(fileDescr.file); + redefineProcessor.processClass(qualifiedName, fileDescr.file); } catch (IOException e) { reportProblem(qualifiedName, e); - continue; } - redefineProcessor.processClass(qualifiedName, content); } redefineProcessor.processPending(); myProgress.setFraction(1); @@ -233,10 +231,13 @@ class ReloadClassesWorker { myVirtualMachineProxy = virtualMachineProxy; } - public void processClass(String qualifiedName, byte[] content) throws Throwable { + public void processClass(String qualifiedName, File file) throws Throwable { final List vmClasses = myVirtualMachineProxy.classesByName(qualifiedName); - if (vmClasses.isEmpty()) return; + if (vmClasses.isEmpty()) { + return; + } + final byte[] content = FileUtil.loadFileBytes(file); if (vmClasses.size() == 1) { myRedefineMap.put(vmClasses.get(0), content); if (myRedefineMap.size() >= CLASSES_CHUNK_SIZE) { From adb59547a8e76c2d34d078eb307bd3800667ac01 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Thu, 31 Oct 2013 22:29:56 +0400 Subject: [PATCH 28/53] fix missing property --- .../intellij/openapi/actionSystem/impl/ActionToolbarImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java index 31d14f5bb13e..f3abedcf7bc1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java @@ -300,7 +300,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { add(mySecondaryActionsButton); } - if (Registry.is("search.everywhere.enabled") && (ActionPlaces.MAIN_TOOLBAR.equals(myPlace) || ActionPlaces.NAVIGATION_BAR.equals(myPlace))) { + if ((ActionPlaces.MAIN_TOOLBAR.equals(myPlace) || ActionPlaces.NAVIGATION_BAR.equals(myPlace))) { final AnAction searchEverywhereAction = ActionManager.getInstance().getAction("SearchEverywhere"); if (searchEverywhereAction != null) { try { From 17a014e70ef7ff8769ee783cf3c75a0402087c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Thu, 31 Oct 2013 19:44:20 +0100 Subject: [PATCH 29/53] IDEA-94376 Icons: web.xml --- platform/icons/src/javaee/web_xml.png | Bin 703 -> 571 bytes platform/icons/src/javaee/web_xml@2x.png | Bin 0 -> 1138 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 platform/icons/src/javaee/web_xml@2x.png diff --git a/platform/icons/src/javaee/web_xml.png b/platform/icons/src/javaee/web_xml.png index 760533d662db895bc4a02ec5deff26822ac7d21a..ac51ed31cff823848e5da53b7d00209b22698c39 100644 GIT binary patch delta 557 zcmV+|0@D4z1-k^08Gi-<001BJ|6u?C02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00G@eL_t(|+G70w|33o=%$++I!oUq0fVdIHNls1%(@YG+gD4=bM;Bzl zqL2}b7|3;wK)e^qhr5Ik-3uZ7n=lMm^U)8*doVTpAsbO#5Pt$9{HA`v;(%pf4RJA1 z!5Gekx!~g(|Nji60Y;DuumGAuv!i(ykX53=ynIdNROXB_-_=h=sUucQQ+#DHQdSff!_nwcTe zl#L-}(KiO5CV#MIAYPhs)z4X0@k4z3J8{OZ4}bp`<7Ygo-wV!Zz7hh_O8$;AvlDzR7t5o8F+??78SXPGGyGxy{2fYHDbv{vzWl=i{LgOu=d1kaul(t?{ka4E%wqlKr2Xcn{q)uT&0zk|0RGSb{?G*e z+K&F^pZ}}||9`Iz|FReVxFi3&E&s<)|H@eZ(H8&HD*w}Y|I{`A)*k8Uv+Jn^?ad|h z*;Dq|kN4Jy_|$&**Ma!gi23}v`pf|O(RTXlzgS>oSy@t9TUJ?IS}9eND@=7mlj2xj zV9dOe+uxr5)=mG|SpV5x|JjTG+HU{fGXLL&|KOqj;(w0+;->%Or~l+E|Kykd<)#1T zK>z5q|LKJP>YD%VX#eoU|M7AE_kI8SjsO0u|No#Mha_JB000?uQchCR_xSw&4uV5t0002DNkla;)wtP@gA@){(~OG+UE{O%5}9vYI`RYApI0akG} zWd+^*EUk*bLXZHna8yTojf!G*rdfCdNPyEKxwEazPQK14L$e7aAX3oUTpwd9R}|py z=LHfF(uiReEog1QO{ilB4U5BxEwKjw-cW&1TZ$d5TUi-S=e zll|Dl+WN7@GPAA`Yrk@n+~j`cUe8VK`mr>-=~8{+Np4QgdEe)K&U?;#iD{ZxZ2kTH zO9v{qy%g`3`lGwM`-U+Gs&Bm%@7SHZ76i;nNUQ~co=QkCHXM=)GPmp?MS-I4UlLfU zCe}&;%RZxc!HyDZRRb12U!-2|f31LRyJ-zXg%fstEvc25_=LIKj~JWtB}Bh0OQ5ex z$=UKlmfwV8>`8NtRVRxT_}^=wVgg@}5bQqUq~8lmPYpYYV*@{v>KEbC;Ep1J9a{~G zg`Mi!W)yR=hyVs2+hSIqz)Hbyl>}3b;I~48sa9~iB;NAu2TqRS)5ka3BQSqTiM{$d zOEE-7CP19Or2IxnaqK%@xVg+oyx+5zaCniFG*mTdmy0 zWqy4=bnc7$*!a+@YTza$tl)<}oQ_8Fa+4&jv7&;5Px;d6Iw z|Hc=Mp=p(;pbUxQA529zOS$n~slW~#88@&#prd2mAa*u?Pp2vr3^sO+k^^VNT_cIj zdp3k?-&@r^P=dtS3sm+qV+}n`Ev<+&y6}|mBqGgDxLt0T8cX}KjJ(W1U^VnSIE%zr z-}YW(A2~)H#49E+Poitv^`AqBr`n(P2Yo~c2ngwy5UxvOV7LX1z8r#_6Lnq(GLjpd zUx(lAz;kU^$lI4PpIEM{(F+oZjIWjBJ>X~KcqMWIwKWnR-gK1)Pa!Soa61(+L`6JV zgF=BoaJrEmpXgk13uqtjTh_;4E)}_Wo~h-v@%{CT6U@wCw6$9MZGv~J-~$A@P(X5; zpw?|*-{ptU>KViE)H)c#ZJu&9@X|6uB?-W@@K`7q5IyUm$qq2AOz#YJ&N(sQAs!t1 zVLOui7F^4RVGt3->8Pk1nx$~h#CH~6Wf>wXiiWKJc06|nJBwB6559hGIxkR+uTAgdBg&w2sHg|x`x519tn3($1~bRMW$2FJ5+REt1+ zqf=~-1oc>IMnX0#7fF0P+K!n+a literal 0 HcmV?d00001 From 6df23a1974795923188fd37437e132baf3f96dd2 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 31 Oct 2013 20:32:27 +0100 Subject: [PATCH 30/53] hotswap: allow class reload task cancelling as long as no classes are actually reloaded --- .../debugger/impl/HotSwapManager.java | 11 ++++--- .../debugger/impl/ReloadClassesWorker.java | 32 +++++++++++++------ .../intellij/debugger/ui/HotSwapUIImpl.java | 3 +- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java index bf0569b4755b..7347b430cacd 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -155,13 +155,14 @@ public class HotSwapManager extends AbstractProjectComponent { } private void reloadClasses(DebuggerSession session, Map classesToReload, HotSwapProgress progress) { - if (progress.isCancelled()) { - session.setModifiedClassesScanRequired(true); - return; - } final long newSwapTime = System.currentTimeMillis(); new ReloadClassesWorker(session, progress).reloadClasses(classesToReload); - setTimeStamp(session, newSwapTime); + if (progress.isCancelled()) { + session.setModifiedClassesScanRequired(true); + } + else { + setTimeStamp(session, newSwapTime); + } } public static Map> findModifiedClasses(List sessions, Map> generatedPaths) { diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java index 9a43bfbcc881..2898e3f10dd9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java @@ -114,32 +114,44 @@ class ReloadClassesWorker { try { RedefineProcessor redefineProcessor = new RedefineProcessor(virtualMachineProxy); - int processedClassesCount = 0; - for (final String qualifiedName : modifiedClasses.keySet()) { - processedClassesCount++; + int processedEntriesCount = 0; + for (final Map.Entry entry : modifiedClasses.entrySet()) { + if (redefineProcessor.getProcessedClassesCount() == 0 && myProgress.isCancelled()) { + // once at least one class has been actually reloaded, do not interrupt the whole process + break; + } + processedEntriesCount++; + final String qualifiedName = entry.getKey(); if (qualifiedName != null) { myProgress.setText(qualifiedName); - myProgress.setFraction(processedClassesCount / (double)modifiedClasses.size()); + myProgress.setFraction(processedEntriesCount / (double)modifiedClasses.size()); } - final HotSwapFile fileDescr = modifiedClasses.get(qualifiedName); try { - redefineProcessor.processClass(qualifiedName, fileDescr.file); + redefineProcessor.processClass(qualifiedName, entry.getValue().file); } catch (IOException e) { reportProblem(qualifiedName, e); } } + + if (redefineProcessor.getProcessedClassesCount() == 0 && myProgress.isCancelled()) { + // once at least one class has been actually reloaded, do not interrupt the whole process + return; + } + redefineProcessor.processPending(); myProgress.setFraction(1); final int partiallyRedefinedClassesCount = redefineProcessor.getPartiallyRedefinedClassesCount(); if (partiallyRedefinedClassesCount == 0) { - myProgress.addMessage(myDebuggerSession, MessageCategory.INFORMATION, - DebuggerBundle.message("status.classes.reloaded", redefineProcessor.getProcessedClassesCount())); + myProgress.addMessage( + myDebuggerSession, MessageCategory.INFORMATION, DebuggerBundle.message("status.classes.reloaded", redefineProcessor.getProcessedClassesCount()) + ); } else { - final String message = DebuggerBundle.message("status.classes.not.all.versions.reloaded", partiallyRedefinedClassesCount, - redefineProcessor.getProcessedClassesCount()); + final String message = DebuggerBundle.message( + "status.classes.not.all.versions.reloaded", partiallyRedefinedClassesCount, redefineProcessor.getProcessedClassesCount() + ); myProgress.addMessage(myDebuggerSession, MessageCategory.WARNING, message); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java index 9c61c8c73fe5..19f94cbe8658 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java @@ -269,8 +269,7 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent { return result.get(); } - private static void reloadModifiedClasses(final Map> modifiedClasses, - final HotSwapProgressImpl progress) { + private static void reloadModifiedClasses(final Map> modifiedClasses, final HotSwapProgressImpl progress) { ProgressManager.getInstance().runProcess(new Runnable() { public void run() { HotSwapManager.reloadModifiedClasses(modifiedClasses, progress); From 134b317bc41fc097a1b00680f3e0860cf2160db9 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Thu, 31 Oct 2013 23:35:41 +0400 Subject: [PATCH 31/53] fix yellow code --- .../actionSystem/impl/ActionToolbarImpl.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java index f3abedcf7bc1..a5fce164751f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java @@ -37,7 +37,6 @@ import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IdRunnable; -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; @@ -80,9 +79,9 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { /** * This array contains Rectangles which define bounds of the corresponding - * components in the toolbar. This list can be considerer as a cache of the + * components in the toolbar. This list can be consider as a cache of the * Rectangle objects that are used in calculation of preferred sizes and - * layouting of components. + * components layout. */ private final List myComponentBounds = new ArrayList(); @@ -123,7 +122,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { private ActionButton mySecondaryActionsButton; private final KeymapManagerEx myKeymapManager; - private int myFirstOusideIndex = -1; + private int myFirstOutsideIndex = -1; private JBPopup myPopup; private JComponent myTargetComponent; @@ -183,7 +182,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { myTimerListener = new MyTimerListener(); myWeakTimerListener = new WeakTimerListener(actionManager, myTimerListener); // If the panel doesn't handle mouse event then it will be passed to its parent. - // It means that if the panel is in slidindg mode then the focus goes to the editor + // It means that if the panel is in sliding mode then the focus goes to the editor // and panel will be automatically hidden. enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK); setMiniMode(false); @@ -520,7 +519,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { if (full) { if (myAutoPopupRec == null) { myAutoPopupRec = new Rectangle(eachX, eachY, sizeToFit.width - eachX - 1, sizeToFit.height - 1); - myFirstOusideIndex = i; + myFirstOutsideIndex = i; } eachBound.x = Integer.MAX_VALUE; eachBound.y = Integer.MAX_VALUE; @@ -562,7 +561,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { if (full) { if (myAutoPopupRec == null) { myAutoPopupRec = new Rectangle(eachX, eachY, sizeToFit.width - 1, sizeToFit.height - eachY - 1); - myFirstOusideIndex = i; + myFirstOutsideIndex = i; } eachBound.x = Integer.MAX_VALUE; eachBound.y = Integer.MAX_VALUE; @@ -575,7 +574,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } private void calculateBoundsWrapImpl(Dimension sizeToFit, List bounds) { - // We have to gracefull handle case when toolbar was not layed out yet. + // We have to graceful handle case when toolbar was not laid out yet. // In this case we calculate bounds as it is a NOWRAP toolbar. if (getWidth() == 0 || getHeight() == 0) { try { @@ -611,7 +610,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } final Rectangle each = bounds.get(i); - each.setBounds(xOffset, maxWidth, yOffset, maxHeight); + each.setBounds(xOffset, yOffset, maxWidth, maxHeight); xOffset += maxWidth; } @@ -632,7 +631,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } final Rectangle each = bounds.get(i); - each.setBounds(xOffset, maxWidth, yOffset, maxHeight); + each.setBounds(xOffset, yOffset, maxWidth, maxHeight); yOffset += maxHeight; } @@ -642,7 +641,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { if (myOrientation == SwingConstants.HORIZONTAL) { // Calculate row height int rowHeight = 0; - final Dimension[] dims = new Dimension[componentCount]; // we will use this dimesions later + final Dimension[] dims = new Dimension[componentCount]; // we will use this dimensions later for (int i = 0; i < componentCount; i++) { dims[i] = getChildPreferredSize(i); final int height = dims[i].height; @@ -670,7 +669,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { else { // Calculate row width int rowWidth = 0; - final Dimension[] dims = new Dimension[componentCount]; // we will use this dimesions later + final Dimension[] dims = new Dimension[componentCount]; // we will use this dimensions later for (int i = 0; i < componentCount; i++) { dims[i] = getChildPreferredSize(i); final int width = dims[i].width; @@ -717,13 +716,12 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { calculateBoundsAutoImp(size2Fit, bounds); } else { - throw new IllegalStateException("unknonw layoutPolicy: " + myLayoutPolicy); + throw new IllegalStateException("unknown layoutPolicy: " + myLayoutPolicy); } if (getComponentCount() > 0 && size2Fit.width < Integer.MAX_VALUE) { final Component component = getComponent(getComponentCount() - 1); if (component instanceof JComponent && ((JComponent)component).getClientProperty("SEARCH_EVERYWHERE") == Boolean.TRUE) { - final Rectangle rect = bounds.get(bounds.size() - 1); int max = 0; for (int i = 0; i < bounds.size() - 2; i++) { max = Math.max(max, bounds.get(i).height); @@ -799,7 +797,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { final Insets i = getInsets(); if (UIUtil.isUnderAquaBasedLookAndFeel() || UIUtil.isUnderDarcula()) { if (getParent() != null) { - final JBColor col = new JBColor(Color.GRAY, Gray._111); + final JBColor col = new JBColor(Gray._128, Gray._111); final Graphics2D g2 = (Graphics2D)g; if (myOrientation == SwingConstants.HORIZONTAL) { UIUtil.drawDoubleSpaceDottedLine(g2, i.top + 2, getParent().getSize().height - 2 - i.top - i.bottom, 3, col, false); @@ -1029,7 +1027,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } else { final DefaultActionGroup outside = new DefaultActionGroup(); - for (int i = myFirstOusideIndex; i < myVisibleActions.size(); i++) { + for (int i = myFirstOutsideIndex; i < myVisibleActions.size(); i++) { outside.add(myVisibleActions.get(i)); } group = outside; From eafc40eb89069a06bb09db9806514849144f71f8 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 15:59:33 +0100 Subject: [PATCH 32/53] expand ~ in file chooser path (PY-3138) --- .../src/com/intellij/openapi/fileChooser/ex/LocalFsFinder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/LocalFsFinder.java b/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/LocalFsFinder.java index ec12a86d2667..c02c77b83469 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/LocalFsFinder.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/LocalFsFinder.java @@ -64,7 +64,8 @@ public class LocalFsFinder implements FileLookup.Finder, FileLookup { return null; } - public String normalize(@NotNull final String path) { + public String normalize(@NotNull String path) { + path = FileUtil.expandUserHome(path); final File file = new File(path); if (file.isAbsolute()) return file.getAbsolutePath(); From a867f5eab8c07174a8b038bab4b9fca03e5828cf Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 16:27:28 +0100 Subject: [PATCH 33/53] check for disposed project in invalid SDK notification (PY-7570) --- .../src/com/jetbrains/python/sdk/PythonSdkType.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index 9b65dca3c70b..0e64b29b374d 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -25,7 +25,6 @@ import com.intellij.notification.Notification; import com.intellij.notification.NotificationListener; import com.intellij.notification.NotificationType; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -556,16 +555,22 @@ public class PythonSdkType extends SdkType { @NotNull public static Notification createInvalidSdkNotification(@Nullable final Project project) { + String message = "Cannot run the project interpreter."; + if (project != null && !project.isDisposed()) { + message += " Configure..."; + } return new Notification("xxx", "Invalid Project Interpreter", - "Cannot run the project interpreter. Configure...", + message, NotificationType.ERROR, new NotificationListener() { @Override public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { - final ShowSettingsUtil settings = ShowSettingsUtil.getInstance(); - settings.showSettingsDialog(project, "Project Interpreter"); + if (project != null && !project.isDisposed()) { + final ShowSettingsUtil settings = ShowSettingsUtil.getInstance(); + settings.showSettingsDialog(project, "Project Interpreter"); + } notification.expire(); } }); From 997bc544830fdfe65128f6a6d5b8711befab4c14 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 16:35:04 +0100 Subject: [PATCH 34/53] allow "create class" fix for names which start with multiple uppercase characters but aren't entirely uppercase (PY-7423) --- .../python/inspections/PyUnresolvedReferencesInspection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index cd8241015855..514bc9d563ce 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -835,7 +835,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { } private void addCreateClassFix(String refText, PsiElement element, List actions) { - if (refText.length() > 2 && Character.isUpperCase(refText.charAt(0)) && !Character.isUpperCase(refText.charAt(1)) && + if (refText.length() > 2 && Character.isUpperCase(refText.charAt(0)) && !refText.toUpperCase().equals(refText) && PsiTreeUtil.getParentOfType(element, PyImportStatementBase.class) == null) { PsiElement anchor = element; if (element instanceof PyQualifiedExpression) { From d4fc857429e3125d27cf98b5a36dbba934aa0072 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 17:20:44 +0100 Subject: [PATCH 35/53] PyStringLiteralLexer doesn't handle escape sequences in raw strings (PY-10322) --- .../jetbrains/python/lexer/PyStringLiteralLexer.java | 5 +++-- .../testData/selectWord/escapeSequenceRaw/after1.py | 1 + .../testData/selectWord/escapeSequenceRaw/before.py | 1 + .../com/jetbrains/python/PySelectWordTest.java | 4 ++++ .../jetbrains/python/PyStringLiteralLexerTest.java | 5 +++++ .../jetbrains/python/fixtures/PyLexerTestCase.java | 11 +++++++++-- 6 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 python/testData/selectWord/escapeSequenceRaw/after1.py create mode 100644 python/testData/selectWord/escapeSequenceRaw/before.py diff --git a/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java b/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java index 6cfeac5af1cb..10c8c9be41cb 100644 --- a/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java +++ b/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java @@ -221,6 +221,7 @@ public class PyStringLiteralLexer extends LexerBase { if (myBuffer.charAt(i) == '\\') { LOG.assertTrue(myState == AFTER_FIRST_QUOTE); i++; + if (myIsRaw) return i; if (i == myBufferEnd) { myState = AFTER_LAST_QUOTE; return i; @@ -282,7 +283,7 @@ public class PyStringLiteralLexer extends LexerBase { final int quote_limit = myIsTriple ? 3 : 1; int qcnt = 0; // count consequent quotes while (i < myBufferEnd) { // scan to next \something - if (myBuffer.charAt(i) == '\\') { + if (myBuffer.charAt(i) == '\\' && !myIsRaw) { return i; } if (myState == BEFORE_FIRST_QUOTE && myBuffer.charAt(i) == myQuoteChar) { @@ -292,7 +293,7 @@ public class PyStringLiteralLexer extends LexerBase { qcnt = 0; // for last quote detection in the same pass } } - else if (myState == AFTER_FIRST_QUOTE && myBuffer.charAt(i) == myQuoteChar) { // done? + else if (myState == AFTER_FIRST_QUOTE && myBuffer.charAt(i) == myQuoteChar && (!myIsRaw || myBuffer.charAt(i-1) != '\\')) { // done? qcnt += 1; if (qcnt == quote_limit) { myState = AFTER_LAST_QUOTE; diff --git a/python/testData/selectWord/escapeSequenceRaw/after1.py b/python/testData/selectWord/escapeSequenceRaw/after1.py new file mode 100644 index 000000000000..cc34c2e72f4e --- /dev/null +++ b/python/testData/selectWord/escapeSequenceRaw/after1.py @@ -0,0 +1 @@ +s = r'Hello\nWorld!' \ No newline at end of file diff --git a/python/testData/selectWord/escapeSequenceRaw/before.py b/python/testData/selectWord/escapeSequenceRaw/before.py new file mode 100644 index 000000000000..7de388ad5996 --- /dev/null +++ b/python/testData/selectWord/escapeSequenceRaw/before.py @@ -0,0 +1 @@ +s = r'Hello\nWorld!' \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PySelectWordTest.java b/python/testSrc/com/jetbrains/python/PySelectWordTest.java index 9321d576a925..0d043332488b 100644 --- a/python/testSrc/com/jetbrains/python/PySelectWordTest.java +++ b/python/testSrc/com/jetbrains/python/PySelectWordTest.java @@ -46,6 +46,10 @@ public class PySelectWordTest extends PyTestCase { doTest(); } + public void testEscapeSequenceRaw() { // PY-10322 + doTest(); + } + private void doTest() { CodeInsightTestUtil.doWordSelectionTestOnDirectory(myFixture, "selectWord/" + getTestName(true), "py"); } diff --git a/python/testSrc/com/jetbrains/python/PyStringLiteralLexerTest.java b/python/testSrc/com/jetbrains/python/PyStringLiteralLexerTest.java index 037eef11427e..100f84988709 100644 --- a/python/testSrc/com/jetbrains/python/PyStringLiteralLexerTest.java +++ b/python/testSrc/com/jetbrains/python/PyStringLiteralLexerTest.java @@ -26,4 +26,9 @@ public class PyStringLiteralLexerTest extends PyLexerTestCase { PyLexerTestCase.doLexerTest("u\"\\N{LATIN SMALL LETTER B}\"", new PyStringLiteralLexer(PyTokenTypes.SINGLE_QUOTED_UNICODE), "Py:SINGLE_QUOTED_UNICODE", "VALID_STRING_ESCAPE_TOKEN", "Py:SINGLE_QUOTED_UNICODE"); } + + public void testRawBackslashN() { + PyLexerTestCase.doLexerTest("r'[\\w\\']'", new PyStringLiteralLexer(PyTokenTypes.SINGLE_QUOTED_STRING), true, + "r'[\\w\\']'"); + } } diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java index 4ce5e3516364..aa6fc8af0ab4 100644 --- a/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java +++ b/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java @@ -35,6 +35,13 @@ public abstract class PyLexerTestCase extends PlatformLiteFixture { } public static void doLexerTest(String text, Lexer lexer, String... expectedTokens) { + doLexerTest(text, lexer, false, expectedTokens); + } + + public static void doLexerTest(String text, + Lexer lexer, + boolean checkTokenText, + String... expectedTokens) { lexer.start(text); int idx = 0; int tokenPos = 0; @@ -44,13 +51,13 @@ public abstract class PyLexerTestCase extends PlatformLiteFixture { lexer.advance(); while (lexer.getTokenType() != null) { remainingTokens.append(","); - remainingTokens.append(" \"").append(lexer.getTokenType().toString()).append("\""); + remainingTokens.append(" \"").append(checkTokenText ? lexer.getTokenText() : lexer.getTokenType().toString()).append("\""); lexer.advance(); } fail("Too many tokens. Following tokens: " + remainingTokens.toString()); } assertEquals("Token offset mismatch at position " + idx, tokenPos, lexer.getTokenStart()); - String tokenName = lexer.getTokenType().toString(); + String tokenName = checkTokenText ? lexer.getTokenText() : lexer.getTokenType().toString(); assertEquals("Token mismatch at position " + idx, expectedTokens[idx], tokenName); idx++; tokenPos = lexer.getTokenEnd(); From 2067b87220922d5c5c23191bba1db12064e3560f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 17:27:25 +0100 Subject: [PATCH 36/53] help for Python language injection settings (PY-10753) --- .../python/intelliLang/PyLanguageInjectionSupport.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java index 8065e1f686f7..5a91db5ce994 100644 --- a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java +++ b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java @@ -27,6 +27,7 @@ import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -79,4 +80,10 @@ public class PyLanguageInjectionSupport extends AbstractLanguageInjectionSupport // with multiple injection text ranges (PY-10691) return true; } + + @Nullable + @Override + public String getHelpId() { + return "reference.settings.language.injection.generic.python"; + } } From 09b25c16d195806725b62e0d9d7a167bddc4cd91 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 17:40:05 +0100 Subject: [PATCH 37/53] from __future__ import is moved after module docstring (PY-10080) --- .../quickfix/MoveFromFutureImportQuickFix.java | 15 ++++++++++----- .../inspections/MoveFromFutureImportDocString.py | 10 ++++++++++ .../MoveFromFutureImportDocString_after.py | 10 ++++++++++ .../com/jetbrains/python/PyQuickFixTest.java | 9 ++++++--- 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 python/testData/inspections/MoveFromFutureImportDocString.py create mode 100644 python/testData/inspections/MoveFromFutureImportDocString_after.py diff --git a/python/src/com/jetbrains/python/inspections/quickfix/MoveFromFutureImportQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/MoveFromFutureImportQuickFix.java index 74b54e245fc3..7b3b235ffd73 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/MoveFromFutureImportQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/MoveFromFutureImportQuickFix.java @@ -21,14 +21,13 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.python.PyBundle; +import com.jetbrains.python.documentation.DocStringUtil; import com.jetbrains.python.psi.PyFile; +import com.jetbrains.python.psi.PyStringLiteralExpression; import org.jetbrains.annotations.NotNull; /** - * Created by IntelliJ IDEA. - * Author: Alexey.Ivanov - * Date: 24.03.2010 - * Time: 20:15:23 + * @author Alexey.Ivanov */ public class MoveFromFutureImportQuickFix implements LocalQuickFix { @NotNull @@ -46,7 +45,13 @@ public class MoveFromFutureImportQuickFix implements LocalQuickFix { PsiFile psiFile = problemElement.getContainingFile(); if (psiFile instanceof PyFile) { PyFile file = (PyFile)psiFile; - file.addBefore(problemElement, file.getStatements().get(0)); + PyStringLiteralExpression docString = DocStringUtil.findDocStringExpression(file); + if (docString != null) { + file.addAfter(problemElement, docString.getParent() /* PyExpressionStatement */); + } + else { + file.addBefore(problemElement, file.getStatements().get(0)); + } problemElement.delete(); } } diff --git a/python/testData/inspections/MoveFromFutureImportDocString.py b/python/testData/inspections/MoveFromFutureImportDocString.py new file mode 100644 index 000000000000..8d7212411954 --- /dev/null +++ b/python/testData/inspections/MoveFromFutureImportDocString.py @@ -0,0 +1,10 @@ +"""This is a docstring.""" + +from __future__ import print_function +#comment +from __future__ import absolute_import + +class A: + pass + +from __future__ import with_statement diff --git a/python/testData/inspections/MoveFromFutureImportDocString_after.py b/python/testData/inspections/MoveFromFutureImportDocString_after.py new file mode 100644 index 000000000000..86ac79b6053e --- /dev/null +++ b/python/testData/inspections/MoveFromFutureImportDocString_after.py @@ -0,0 +1,10 @@ +"""This is a docstring.""" +from __future__ import with_statement + +from __future__ import print_function +#comment +from __future__ import absolute_import + +class A: + pass + diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java index a4ef43bbf8d4..9f5dcccf4b8c 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java @@ -27,9 +27,7 @@ import com.jetbrains.python.psi.LanguageLevel; import org.jetbrains.annotations.NonNls; /** - * Test actions that various inspections add. - * User: dcheryasov - * Date: Nov 29, 2008 12:47:08 AM + * @author dcheryasov */ @TestDataPath("$CONTENT_ROOT/../testData/inspections/") public class PyQuickFixTest extends PyTestCase { @@ -161,6 +159,11 @@ public class PyQuickFixTest extends PyTestCase { PyBundle.message("QFIX.move.from.future.import"), true, true); } + public void testFromFutureImportQuickFixDocString() { // PY-10080 + doInspectionTest("MoveFromFutureImportDocString.py", PyFromFutureImportInspection.class, + PyBundle.message("QFIX.move.from.future.import"), true, true); + } + public void testComparisonWithNoneQuickFix() { doInspectionTest("ComparisonWithNone.py", PyComparisonWithNoneInspection.class, PyBundle.message("QFIX.replace.equality"), true, true); From 421644134010d413a623bd3f30c59f0cc1ba76dc Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 17:49:34 +0100 Subject: [PATCH 38/53] import sorter skips from __future__ imports (PY-10022) --- .../codeInsight/imports/PyImportOptimizer.java | 18 +++++++++++++++--- python/testData/optimizeImports/order.after.py | 1 + python/testData/optimizeImports/order.py | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java index fee8c8518ce7..6d5e3c850de2 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java @@ -85,6 +85,9 @@ public class PyImportOptimizer implements ImportOptimizer { } LanguageLevel langLevel = LanguageLevel.forElement(myFile); for (PyImportStatementBase importStatement : myImportBlock) { + if (importStatement instanceof PyFromImportStatement && ((PyFromImportStatement)importStatement).isFromFuture()) { + continue; + } if (importStatement instanceof PyImportStatement && importStatement.getImportElements().length > 1) { for (PyImportElement importElement : importStatement.getImportElements()) { myMissorted = true; @@ -96,7 +99,7 @@ public class PyImportOptimizer implements ImportOptimizer { else { PsiElement toImport; if (importStatement instanceof PyFromImportStatement) { - toImport = ((PyFromImportStatement) importStatement).resolveImportSource(); + toImport = ((PyFromImportStatement)importStatement).resolveImportSource(); } else { toImport = importStatement.getImportElements()[0].resolve(); @@ -140,12 +143,21 @@ public class PyImportOptimizer implements ImportOptimizer { addImports(myThirdPartyImports); addImports(myProjectImports); PsiElement lastElement = myImportBlock.get(myImportBlock.size()-1); - myFile.deleteChildRange(myImportBlock.get(0), lastElement); + myFile.deleteChildRange(findFirstNonFutureImport(), lastElement); for (PyImportStatementBase anImport : myBuiltinImports) { anImport.putCopyableUserData(PyBlock.IMPORT_GROUP_BEGIN, null); } } + private PyImportStatementBase findFirstNonFutureImport() { + for (PyImportStatementBase importStatement: myImportBlock) { + if (!(importStatement instanceof PyFromImportStatement && ((PyFromImportStatement)importStatement).isFromFuture())) { + return importStatement; + } + } + return myImportBlock.get(0); + } + private static void markGroupBegin(List imports) { if (imports.size() > 0) { imports.get(0).putCopyableUserData(PyBlock.IMPORT_GROUP_BEGIN, true); @@ -154,7 +166,7 @@ public class PyImportOptimizer implements ImportOptimizer { private void addImports(final List imports) { for (PyImportStatementBase newImport: imports) { - myFile.addBefore(newImport, myImportBlock.get(0)); + myFile.addBefore(newImport, findFirstNonFutureImport()); } } } diff --git a/python/testData/optimizeImports/order.after.py b/python/testData/optimizeImports/order.after.py index e89fc2619475..e3719e04dcc0 100644 --- a/python/testData/optimizeImports/order.after.py +++ b/python/testData/optimizeImports/order.after.py @@ -1,3 +1,4 @@ +from __future__ import with_statement import sys import datetime diff --git a/python/testData/optimizeImports/order.py b/python/testData/optimizeImports/order.py index 4232fbd83ed6..ad3147aef522 100644 --- a/python/testData/optimizeImports/order.py +++ b/python/testData/optimizeImports/order.py @@ -1,3 +1,4 @@ +from __future__ import with_statement import foo import sys from bar import * From 9c4cb80d869fe9cd0d20941fb3d6774471c61969 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 17:56:44 +0100 Subject: [PATCH 39/53] snakeCase() macro for live templates (PY-9989) --- .../macro/CapitalizeAndUnderscoreMacro.java | 12 ++++++-- .../template/macro/SnakeCaseMacro.java | 30 +++++++++++++++++++ .../src/META-INF/LangExtensions.xml | 1 + 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java index 8ae675bf464e..f7e134f41f0a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java @@ -32,23 +32,31 @@ public class CapitalizeAndUnderscoreMacro extends MacroBase { super("capitalizeAndUnderscore", CodeInsightBundle.message("macro.capitalizeAndUnderscore.string")); } + protected CapitalizeAndUnderscoreMacro(String name, String description) { + super(name, description); + } + @Override protected Result calculateResult(@NotNull Expression[] params, ExpressionContext context, boolean quick) { String text = getTextResult(params, context, true); if (text != null && text.length() > 0) { final String[] words = NameUtil.nameToWords(text); boolean insertUnderscore = false; - final StringBuffer buf = new StringBuffer(); + final StringBuilder buf = new StringBuilder(); for (String word : words) { if (insertUnderscore) { buf.append("_"); } else { insertUnderscore = true; } - buf.append(StringUtil.toUpperCase(word)); + buf.append(convertCase(word)); } return new TextResult(buf.toString()); } return null; } + + protected String convertCase(String word) { + return StringUtil.toUpperCase(word); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java new file mode 100644 index 000000000000..9e5d8ac25106 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2013 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.codeInsight.template.macro; + +/** + * @author yole + */ +public class SnakeCaseMacro extends CapitalizeAndUnderscoreMacro { + public SnakeCaseMacro() { + super("snakeCase", "snakeCase(String)"); + } + + @Override + protected String convertCase(String word) { + return word.toLowerCase(); + } +} diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 737fc16383aa..99595f0058b8 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -432,6 +432,7 @@ + From 39bdf7e68f929fa359d1ca3df500d4c84b04bf18 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 18:42:11 +0100 Subject: [PATCH 40/53] external tool macro for directory containing Python interpreter (PY-6533) --- .../application/options/PathMacrosImpl.java | 3 +- python/src/META-INF/python-core.xml | 3 +- .../python/sdk/InterpreterDirectoryMacro.java | 73 +++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 python/src/com/jetbrains/python/sdk/InterpreterDirectoryMacro.java diff --git a/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java b/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java index 715834f27595..493b21d85306 100644 --- a/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java +++ b/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java @@ -129,7 +129,8 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, "SelectionStartLine", "SelectionEndLine", "SelectionStartColumn", - "SelectionEndColumn" + "SelectionEndColumn", + "PyInterpreterDirectory" ); public PathMacrosImpl() { diff --git a/python/src/META-INF/python-core.xml b/python/src/META-INF/python-core.xml index a426b2433c60..35255369d2ed 100644 --- a/python/src/META-INF/python-core.xml +++ b/python/src/META-INF/python-core.xml @@ -473,6 +473,8 @@ + + @@ -504,7 +506,6 @@ - diff --git a/python/src/com/jetbrains/python/sdk/InterpreterDirectoryMacro.java b/python/src/com/jetbrains/python/sdk/InterpreterDirectoryMacro.java new file mode 100644 index 000000000000..a601aeb8dc6a --- /dev/null +++ b/python/src/com/jetbrains/python/sdk/InterpreterDirectoryMacro.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2013 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.jetbrains.python.sdk; + +import com.intellij.ide.macro.Macro; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.PathUtil; +import org.jetbrains.annotations.Nullable; + +/** + * @author yole + */ +public class InterpreterDirectoryMacro extends Macro { + @Override + public String getName() { + return "PyInterpreterDirectory"; + } + + @Override + public String getDescription() { + return "The directory containing the Python interpreter selected for the project"; + } + + @Nullable + @Override + public String expand(DataContext dataContext) throws ExecutionCancelledException { + Module module = LangDataKeys.MODULE.getData(dataContext); + if (module == null) { + Project project = CommonDataKeys.PROJECT.getData(dataContext); + if (project == null) { + return null; + } + Module[] modules = ModuleManager.getInstance(project).getModules(); + if (modules.length == 0) { + return null; + } + module = modules[0]; + } + Sdk sdk = PythonSdkType.findPythonSdk(module); + if (sdk != null) { + VirtualFile homeDir = sdk.getHomeDirectory(); + if (homeDir == null) { + return null; + } + String path = PathUtil.getLocalPath(homeDir.getParent()); + if (path != null) { + return FileUtil.toSystemDependentName(path); + } + } + return null; + } +} From c61eb4b007d058e776c2836ee9eef3deb3bb4a03 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 19:33:50 +0100 Subject: [PATCH 41/53] default color for builtin names under darcula (PY-9529) --- colorSchemes/src/colorSchemes/Darcula.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/colorSchemes/src/colorSchemes/Darcula.xml b/colorSchemes/src/colorSchemes/Darcula.xml index 8356b0f6137a..bd7b3ac8efd0 100644 --- a/colorSchemes/src/colorSchemes/Darcula.xml +++ b/colorSchemes/src/colorSchemes/Darcula.xml @@ -1113,6 +1113,11 @@ +