From 3720d9515042e21c77d5975825e44e519f69c0b1 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Aug 2012 13:43:27 +0200 Subject: [PATCH 01/21] unfocus autopopup in gant/gradle --- .../groovy/lang/completion/GroovyCompletionConfidence.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionConfidence.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionConfidence.java index 4df7481c0b13..9d96eb56de04 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionConfidence.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionConfidence.java @@ -20,8 +20,10 @@ import com.intellij.psi.PsiReference; import com.intellij.util.ThreeState; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.console.GroovyShellAction; +import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector; import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrForStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -45,6 +47,11 @@ public class GroovyCompletionConfidence extends CompletionConfidence { public ThreeState shouldFocusLookup(@NotNull CompletionParameters parameters) { final PsiElement position = parameters.getPosition(); + PsiFile file = position.getContainingFile(); + if (file instanceof GroovyFile && GroovyScriptTypeDetector.getScriptType((GroovyFile)file) != GroovyScriptTypeDetector.DEFAULT_TYPE) { + return ThreeState.NO; + } + if (position.getParent() instanceof GrReferenceElement && psiElement().afterLeaf(psiElement().withText("(").withParent(GrForStatement.class)).accepts(position)) { return ThreeState.NO; From 65d9a6224a0917899f78d1f9631aac5d5abc8b72 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Aug 2012 14:00:33 +0200 Subject: [PATCH 02/21] select word: quotes and parentheses in plain text --- .../NaturalLanguageTextSelectioner.java | 123 ++++++++++++------ 1 file changed, 80 insertions(+), 43 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java index 3e9ec968c08b..9506c31d30fc 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPlainText; import com.intellij.util.containers.CollectionFactory; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collections; @@ -38,28 +39,31 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa return e instanceof PsiPlainText || e instanceof PsiComment; } - public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { - final SelectionModel selectionModel = editor.getSelectionModel(); - if (!selectionModel.hasSelection()) { - return Collections.emptyList(); + private static TextRange findParagraphRange(String text, int start, int end) { + int paragraphStart = text.lastIndexOf("\n\n", start); + int paragraphEnd = text.indexOf("\n\n", end); + return new TextRange(Math.max(0, paragraphStart), paragraphEnd < 0 ? text.length() : paragraphEnd); + } + + @Nullable + private static TextRange findCustomRange(String text, int start, int end, char startChar, char endChar) { + int prev = text.lastIndexOf(startChar, start); + int next = text.indexOf(endChar, end); + if (prev < 0 || next < 0) { + return null; + } + if (prev + 1 < start || next > end) { + return new TextRange(prev + 1, next); } - int sentenceStart = selectionModel.getSelectionStart(); - final int elementStart = e.getTextRange().getStartOffset(); - if (sentenceStart <= elementStart) return Collections.emptyList(); + return new TextRange(prev, next + 1); + } - int paragraphStart = editorText.subSequence(elementStart, sentenceStart).toString().lastIndexOf("\n\n"); - if (paragraphStart < 0) paragraphStart = elementStart; - else paragraphStart += 2 + elementStart; - boolean isParagraph = paragraphStart == sentenceStart; + private static TextRange findSentenceRange(String editorText, int start, int end) { + int sentenceStart = start; - while (sentenceStart > paragraphStart) { - final char c = editorText.charAt(sentenceStart - 1); - if (!isNatural(c)) { - return Collections.emptyList(); - } - - if (SENTENCE_END.contains(c)) { + while (sentenceStart > 0) { + if (SENTENCE_END.contains(editorText.charAt(sentenceStart - 1)) || !isNatural(editorText.charAt(sentenceStart - 1))) { break; } sentenceStart--; @@ -68,40 +72,73 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa sentenceStart++; } - int sentenceEnd = selectionModel.getSelectionEnd(); - final int elementEnd = e.getTextRange().getEndOffset(); - if (sentenceEnd > elementEnd) { - return Collections.emptyList(); - } - int paragraphEnd = editorText.subSequence(sentenceEnd, elementEnd).toString().indexOf("\n\n"); - if (paragraphEnd < 0) paragraphEnd = elementEnd; - else paragraphEnd += sentenceEnd; - isParagraph &= paragraphEnd == sentenceEnd; - - if (isParagraph) { - return Collections.emptyList(); //whole text - } - - if (sentenceEnd > elementStart) sentenceEnd--; - while (sentenceEnd < paragraphEnd) { - final char c = editorText.charAt(sentenceEnd); - if (!isNatural(c)) { - return Collections.emptyList(); - } + int sentenceEnd = Math.max(0, end - 1); + while (sentenceEnd < editorText.length()) { sentenceEnd++; - - if (SENTENCE_END.contains(c)) { + if (SENTENCE_END.contains(editorText.charAt(sentenceEnd - 1))) { break; } + } + return new TextRange(sentenceStart, sentenceEnd); + } + private static TextRange findNaturalRange(String editorText, int start, int end) { + while (start > 0) { + if (!isNatural(editorText.charAt(start - 1))) { + break; + } + start--; } - if (sentenceStart == selectionModel.getSelectionStart() && sentenceEnd == selectionModel.getSelectionEnd()) { - return Arrays.asList(new TextRange(paragraphStart, paragraphEnd)); + while (end < editorText.length()) { + final char c = editorText.charAt(end); + if (!isNatural(c)) { + break; + } + end++; + } + return new TextRange(start, end); + } + + public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { + final SelectionModel selectionModel = editor.getSelectionModel(); + if (!selectionModel.hasSelection()) { + return Collections.emptyList(); } - return Arrays.asList(new TextRange(sentenceStart, sentenceEnd)); + TextRange range = e.getTextRange(); + int shift = range.getStartOffset(); + int selStart = selectionModel.getSelectionStart(); + int selEnd = selectionModel.getSelectionEnd(); + if (selStart <= shift || selEnd >= range.getEndOffset()) { + return Collections.emptyList(); + } + + String elementText = editorText.subSequence(shift, range.getEndOffset()).toString(); + int start = selStart - shift; + int end = selEnd - shift; + + TextRange best = findSentenceRange(elementText, start, end); + best = narrowRange(best, best, findCustomRange(elementText, start, end, '\"', '\"')); + best = narrowRange(best, best, findCustomRange(elementText, start, end, '(', ')')); + + TextRange natural = findNaturalRange(elementText, start, end); + if (!natural.contains(best)) { + return Collections.emptyList(); + } + + TextRange paragraph = findParagraphRange(elementText, start, end); + if (best.getStartOffset() == start && best.getEndOffset() == end) { + return Arrays.asList(paragraph.shiftRight(shift)); + } + + + return Arrays.asList(best.shiftRight(shift)); + } + + private static TextRange narrowRange(TextRange sentence, TextRange best, TextRange candidate) { + return candidate != null && best.contains(candidate) ? candidate : best; } private static boolean isNatural(char c) { From 739e29ed0404fcd8372c6419ede9e78a62d95927 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Aug 2012 14:47:27 +0200 Subject: [PATCH 03/21] select word: class qualified names in quotes (IDEA-88718, IDEA-89719) --- .../NaturalLanguageTextSelectioner.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java index 9506c31d30fc..055cdccd27e7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java @@ -42,7 +42,7 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa private static TextRange findParagraphRange(String text, int start, int end) { int paragraphStart = text.lastIndexOf("\n\n", start); int paragraphEnd = text.indexOf("\n\n", end); - return new TextRange(Math.max(0, paragraphStart), paragraphEnd < 0 ? text.length() : paragraphEnd); + return new TextRange(paragraphStart >= 0 ? paragraphStart + 2 : 0, paragraphEnd < 0 ? text.length() : paragraphEnd); } @Nullable @@ -63,7 +63,7 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa int sentenceStart = start; while (sentenceStart > 0) { - if (SENTENCE_END.contains(editorText.charAt(sentenceStart - 1)) || !isNatural(editorText.charAt(sentenceStart - 1))) { + if (isSentenceEnd(editorText, sentenceStart - 1) || !isNatural(editorText.charAt(sentenceStart - 1))) { break; } sentenceStart--; @@ -76,13 +76,17 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa while (sentenceEnd < editorText.length()) { sentenceEnd++; - if (SENTENCE_END.contains(editorText.charAt(sentenceEnd - 1))) { + if (isSentenceEnd(editorText, sentenceEnd - 1)) { break; } } return new TextRange(sentenceStart, sentenceEnd); } + private static boolean isSentenceEnd(String text, final int i) { + return SENTENCE_END.contains(text.charAt(i)) && (i + 1 == text.length() || Character.isWhitespace(text.charAt(i + 1))); + } + private static TextRange findNaturalRange(String editorText, int start, int end) { while (start > 0) { if (!isNatural(editorText.charAt(start - 1))) { @@ -129,7 +133,7 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa } TextRange paragraph = findParagraphRange(elementText, start, end); - if (best.getStartOffset() == start && best.getEndOffset() == end) { + if (best.getStartOffset() == start && best.getEndOffset() == end || !paragraph.contains(best)) { return Arrays.asList(paragraph.shiftRight(shift)); } From 15e8543d4229a87c85190442b2fadb0afab0cc50 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Aug 2012 15:34:41 +0200 Subject: [PATCH 04/21] support unselect word for natural language selectioner --- .../intellij/util/PatchedWeakReference.java | 2 + .../NaturalLanguageTextSelectioner.java | 40 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java b/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java index 9a4fb1792b1f..51a1bae87160 100644 --- a/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java +++ b/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java @@ -45,9 +45,11 @@ public class PatchedWeakReference extends WeakReference{ if(ourRefsList.size() % 100 == 0) { int i = 0; } + /* synchronized(ourQueue) { ourRefsList.add(this); } + */ } /** diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java index 055cdccd27e7..b6acd80a35f1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/wordSelection/NaturalLanguageTextSelectioner.java @@ -18,7 +18,6 @@ package com.intellij.codeInsight.editorActions.wordSelection; import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; @@ -26,7 +25,7 @@ import com.intellij.psi.PsiPlainText; import com.intellij.util.containers.CollectionFactory; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; @@ -106,17 +105,30 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa } public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { - final SelectionModel selectionModel = editor.getSelectionModel(); - if (!selectionModel.hasSelection()) { + TextRange range = expandSelection(e, editorText, cursorOffset, cursorOffset); + if (range == null) { return Collections.emptyList(); } + ArrayList result = new ArrayList(); + result.add(range); + while (true) { + TextRange next = expandSelection(e, editorText, range.getStartOffset(), range.getEndOffset()); + if (next == null || next.equals(range)) { + break; + } + result.add(next); + range = next; + } + return result; + } + + @Nullable + private static TextRange expandSelection(PsiElement e, CharSequence editorText, int selStart, int selEnd) { TextRange range = e.getTextRange(); int shift = range.getStartOffset(); - int selStart = selectionModel.getSelectionStart(); - int selEnd = selectionModel.getSelectionEnd(); if (selStart <= shift || selEnd >= range.getEndOffset()) { - return Collections.emptyList(); + return null; } String elementText = editorText.subSequence(shift, range.getEndOffset()).toString(); @@ -124,24 +136,24 @@ public class NaturalLanguageTextSelectioner extends ExtendWordSelectionHandlerBa int end = selEnd - shift; TextRange best = findSentenceRange(elementText, start, end); - best = narrowRange(best, best, findCustomRange(elementText, start, end, '\"', '\"')); - best = narrowRange(best, best, findCustomRange(elementText, start, end, '(', ')')); + best = narrowRange(best, findCustomRange(elementText, start, end, '\"', '\"')); + best = narrowRange(best, findCustomRange(elementText, start, end, '(', ')')); TextRange natural = findNaturalRange(elementText, start, end); if (!natural.contains(best)) { - return Collections.emptyList(); + return null; } TextRange paragraph = findParagraphRange(elementText, start, end); if (best.getStartOffset() == start && best.getEndOffset() == end || !paragraph.contains(best)) { - return Arrays.asList(paragraph.shiftRight(shift)); + return paragraph.shiftRight(shift); } - return Arrays.asList(best.shiftRight(shift)); - } + return best.shiftRight(shift); + } - private static TextRange narrowRange(TextRange sentence, TextRange best, TextRange candidate) { + private static TextRange narrowRange(TextRange best, TextRange candidate) { return candidate != null && best.contains(candidate) ? candidate : best; } From a34a3047f879a60fbe53ab84450d40c0ce39751f Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Tue, 7 Aug 2012 17:40:08 +0400 Subject: [PATCH 05/21] Show modified expert properties --- .../src/com/intellij/designer/model/Property.java | 4 ++++ .../com/intellij/designer/propertyTable/PropertyTable.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/designer/model/Property.java b/platform/platform-impl/src/com/intellij/designer/model/Property.java index f15ecff33e07..917fa64c1936 100644 --- a/platform/platform-impl/src/com/intellij/designer/model/Property.java +++ b/platform/platform-impl/src/com/intellij/designer/model/Property.java @@ -93,6 +93,10 @@ public abstract class Property { return false; } + public boolean isDefaultValueWithDepth(@NotNull T container) throws Exception { + return isDefaultValue(container); + } + public void setDefaultValue(@NotNull T container) throws Exception { } diff --git a/platform/platform-impl/src/com/intellij/designer/propertyTable/PropertyTable.java b/platform/platform-impl/src/com/intellij/designer/propertyTable/PropertyTable.java index 8a74423f0c20..4fdbe5db5a67 100644 --- a/platform/platform-impl/src/com/intellij/designer/propertyTable/PropertyTable.java +++ b/platform/platform-impl/src/com/intellij/designer/propertyTable/PropertyTable.java @@ -436,7 +436,7 @@ public abstract class PropertyTable extends JBTable { private void addProperty(PropertiesContainer component, Property property, List properties) { if (property.isExpert() && !myShowExpertProperties) { try { - if (property.isDefaultValue(component)) { + if (property.isDefaultValueWithDepth(component)) { return; } } From 7f55456e40ea989cfefe52bbdc24d78fd09bd1a2 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 7 Aug 2012 17:44:34 +0400 Subject: [PATCH 06/21] Fix tests --- .../org/jetbrains/idea/maven/importing/MavenModuleImporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java index c14446f2eda7..4c17940aff71 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java @@ -259,7 +259,7 @@ public class MavenModuleImporter { List processors = myMavenProject.getDeclaredAnnotationProcessors(); - if (processors == null && options.isEmpty() && "target/generated-sources/annotations".equals(annotationProcessorDirectory)) { + if (processors == null && options.isEmpty() && "target/generated-sources/annotations".equals(annotationProcessorDirectory.replace('\\', '/'))) { if (moduleProfile != null) { compilerConfiguration.removeModuleProcessorProfile(moduleProfile); } From 8963694a80c4bd28ae34054b0152040177a9f698 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Tue, 7 Aug 2012 16:54:34 +0400 Subject: [PATCH 07/21] IDEA-89819 undo don't work after 'Convert to GString' --- ...onvertConcatenationToGstringIntention.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/strings/ConvertConcatenationToGstringIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/strings/ConvertConcatenationToGstringIntention.java index d102b6875abb..6fd84ee408ff 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/strings/ConvertConcatenationToGstringIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/strings/ConvertConcatenationToGstringIntention.java @@ -20,6 +20,8 @@ import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pass; @@ -103,18 +105,19 @@ public class ConvertConcatenationToGstringIntention extends Intention { finally { accessToken.finish(); } + final Document document = editor.getDocument(); if (expressions.size() == 1) { - invokeImpl(expressions.get(0)); + invokeImpl(expressions.get(0), document); } else if (expressions.size() > 0) { if (ApplicationManager.getApplication().isUnitTestMode()) { - invokeImpl(expressions.get(expressions.size() - 1)); + invokeImpl(expressions.get(expressions.size() - 1), document); return; } IntroduceTargetChooser.showChooser(editor, expressions, new Pass() { public void pass(final GrExpression selectedValue) { - invokeImpl(selectedValue); + invokeImpl(selectedValue, document); } }, new Function() { @@ -127,7 +130,7 @@ public class ConvertConcatenationToGstringIntention extends Intention { } } - private static void invokeImpl(PsiElement element) { + private static void invokeImpl(final PsiElement element, Document document) { boolean isMultiline = containsMultilineStrings((GrExpression)element); StringBuilder builder = new StringBuilder(element.getTextLength()); @@ -145,16 +148,21 @@ public class ConvertConcatenationToGstringIntention extends Intention { final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(element.getProject()); final GrExpression newExpr = factory.createExpressionFromText(GrStringUtil.addQuotes(text, true)); - final AccessToken accessToken = WriteAction.start(); - try { - final GrExpression expression = ((GrExpression)element).replaceWithExpression(newExpr, true); - if (expression instanceof GrString) { - GrStringUtil.removeUnnecessaryBracesInGString((GrString)expression); + CommandProcessor.getInstance().executeCommand(element.getProject(), new Runnable() { + @Override + public void run() { + final AccessToken accessToken = WriteAction.start(); + try { + final GrExpression expression = ((GrExpression)element).replaceWithExpression(newExpr, true); + if (expression instanceof GrString) { + GrStringUtil.removeUnnecessaryBracesInGString((GrString)expression); + } + } + finally { + accessToken.finish(); + } } - } - finally { - accessToken.finish(); - } + }, null, null, document); } private static boolean containsMultilineStrings(GrExpression expr) { From 97f0a30f9364c0a8cf04fe2c18109732ce87858b Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Tue, 7 Aug 2012 17:40:35 +0400 Subject: [PATCH 08/21] IDEA-89475 Inline method with varargs loses varargs --- .../refactoring/GroovyRefactoringUtil.java | 3 +- .../GrChangeSignatureUsageProcessor.java | 3 + ...ethodTest.java => InlineMethodTest.groovy} | 94 +++++++++---------- .../inlineMethod/inlineVarargs.test | 18 ++++ 4 files changed, 64 insertions(+), 54 deletions(-) rename plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/{InlineMethodTest.java => InlineMethodTest.groovy} (74%) create mode 100644 plugins/groovy/testdata/groovy/refactoring/inlineMethod/inlineVarargs.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java index ade42083d029..43c6e3dfb94f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java @@ -531,7 +531,6 @@ public abstract class GroovyRefactoringUtil { argText.append("["); for (PsiElement argument : arguments) { argText.append(argument.getText()).append(", "); - argument.delete(); } if (arguments.size() > 0) { argText.delete(argText.length() - 2, argText.length()); @@ -547,7 +546,7 @@ public abstract class GroovyRefactoringUtil { } return GroovyPsiElementFactory.getInstance(project).createExpressionFromText(argText.toString()); } - + public static boolean hasSideEffect(@NotNull GroovyPsiElement statement) { final Ref hasSideEffect = new Ref(false); statement.accept(new GroovyRecursiveElementVisitor() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java index fb1a2d0f04c7..45c03785f339 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java @@ -516,6 +516,9 @@ public class GrChangeSignatureUsageProcessor implements ChangeSignatureUsageProc (i != parameters.length - 1 || !parameter.isVarargType())) { final PsiType type = parameter.createType(changeInfo.getMethod().getParameterList(), argumentList.getManager()); final GrExpression arg = GroovyRefactoringUtil.generateArgFromMultiArg(substitutor, arguments, type, element.getProject()); + for (PsiElement argument : arguments) { + argument.delete(); + } anchor = argumentList.addAfter(arg, anchor); GrReferenceAdjuster.shortenReferences(anchor); } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy similarity index 74% rename from plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.java rename to plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy index dd062fd96550..a2a29ecb32a7 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy @@ -13,39 +13,33 @@ * limitations under the License. */ -package org.jetbrains.plugins.groovy.refactoring.inline; - -import com.intellij.lang.ASTNode; -import com.intellij.lang.refactoring.InlineHandler; -import com.intellij.openapi.editor.Editor; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; -import com.intellij.psi.impl.source.tree.TreeElement; -import com.intellij.refactoring.inline.GenericInlineHandler; -import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture; -import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; -import junit.framework.Assert; -import org.jetbrains.plugins.groovy.GroovyFileType; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -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.GrReferenceExpression; -import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; -import org.jetbrains.plugins.groovy.util.TestUtils; - -import java.util.List; +package org.jetbrains.plugins.groovy.refactoring.inline +import com.intellij.lang.ASTNode +import com.intellij.lang.refactoring.InlineHandler +import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.impl.source.codeStyle.CodeEditUtil +import com.intellij.psi.impl.source.tree.TreeElement +import com.intellij.refactoring.inline.GenericInlineHandler +import com.intellij.refactoring.util.CommonRefactoringUtil +import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import junit.framework.Assert +import org.jetbrains.plugins.groovy.GroovyFileType +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement +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.GrReferenceExpression +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil +import org.jetbrains.plugins.groovy.util.TestUtils /** * @author ilyas */ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { - @Override - protected String getBasePath() { - return TestUtils.getTestDataPath() + "groovy/refactoring/inlineMethod/"; - } + final String basePath = TestUtils.testDataPath + "groovy/refactoring/inlineMethod/"; public void testAbstr1() throws Throwable { doTest(); } public void testBlock1() throws Throwable { doTest(); } @@ -105,31 +99,27 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { public void testVarargs() {doTest();} - public void testInlineAll() throws Throwable { + public void testInlineAll() { doTest(new GroovyInlineHandler() { @Override - public Settings prepareInlineElement(PsiElement element, Editor editor, boolean invokedOnReference) { - return new Settings() { + public InlineHandler.Settings prepareInlineElement(PsiElement element, Editor editor, boolean invokedOnReference) { + return new InlineHandler.Settings() { @Override - public boolean isOnlyOneReferenceToInline() { - return false; - } - }; + boolean isOnlyOneReferenceToInline() {false} + } } - }); + }) } - public void testInlineNamedArgs() { - doTest(); - } + public void testInlineNamedArgs() {doTest(); } + public void testInlineVarargs() {doTest()} protected void doTest() { doTest(new GroovyInlineHandler()); - } protected void doTest(InlineHandler handler) { - doInlineTest(myFixture, getTestDataPath() + getTestName(true) + ".test", handler); + doInlineTest(myFixture, testDataPath + getTestName(true) + ".test", handler); } public static void doInlineTest(final JavaCodeInsightTestFixture fixture, @@ -140,32 +130,32 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { fixture.configureByText(GroovyFileType.GROOVY_FILE_TYPE, fileText); - final PsiFile file = fixture.getFile(); - final Editor editor = fixture.getEditor(); - setIndentationToNode(file.getNode()); - int startOffset = editor.getSelectionModel().getSelectionStart(); - int endOffset = editor.getSelectionModel().getSelectionEnd(); - editor.getCaretModel().moveToOffset(endOffset); + final PsiFile file = fixture.file; + final Editor editor = fixture.editor; + indentationToNode = file.node; + int startOffset = editor.selectionModel.selectionStart; + int endOffset = editor.selectionModel.selectionEnd; + editor.caretModel.moveToOffset(endOffset); GroovyPsiElement selectedArea = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrReferenceExpression.class); if (selectedArea == null) { PsiElement identifier = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, PsiElement.class); if (identifier != null){ - Assert.assertTrue("Selected area doesn't point to method", identifier.getParent() instanceof GrVariable); - selectedArea = (GroovyPsiElement)identifier.getParent(); + Assert.assertTrue("Selected area doesn't point to method", identifier.parent instanceof GrVariable); + selectedArea = (GroovyPsiElement)identifier.parent; } } Assert.assertNotNull("Selected area reference points to nothing", selectedArea); - PsiElement element = selectedArea instanceof GrExpression ? selectedArea.getReference().resolve() : selectedArea; + PsiElement element = selectedArea instanceof GrExpression ? selectedArea.reference.resolve() : selectedArea; Assert.assertNotNull("Cannot resolve selected reference expression", element); try { GenericInlineHandler.invoke(element, editor, inlineHandler); - editor.getSelectionModel().removeSelection(); + editor.selectionModel.removeSelection(); fixture.checkResult(data.get(1), true); } catch (CommonRefactoringUtil.RefactoringErrorHintException e) { - assertEquals(data.get(1), "FAIL: " + e.getMessage()); + assertEquals(data.get(1), "FAIL: " + e.message); } } @@ -174,7 +164,7 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { CodeEditUtil.setOldIndentation(((TreeElement) element), 0); } for (ASTNode node : element.getChildren(null)) { - setIndentationToNode(node); + indentationToNode = node; } } diff --git a/plugins/groovy/testdata/groovy/refactoring/inlineMethod/inlineVarargs.test b/plugins/groovy/testdata/groovy/refactoring/inlineMethod/inlineVarargs.test new file mode 100644 index 000000000000..109044728d2d --- /dev/null +++ b/plugins/groovy/testdata/groovy/refactoring/inlineMethod/inlineVarargs.test @@ -0,0 +1,18 @@ +void foo(String... s) { + println 'hello' + bar(s) +} + +void bar(String... s) {} + +foo("foo", "bar") +----- +void foo(String... s) { + println 'hello' + bar(s) +} + +void bar(String... s) {} + +println 'hello' +bar(["foo", "bar"] as java.lang.String[]) \ No newline at end of file From 2701f1ac79fc9f91ca411640bb2e9d22d4928c03 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Aug 2012 15:46:25 +0200 Subject: [PATCH 09/21] oops, enable PatchedWeakReference back --- .../core-impl/src/com/intellij/util/PatchedWeakReference.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java b/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java index 51a1bae87160..9a4fb1792b1f 100644 --- a/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java +++ b/platform/core-impl/src/com/intellij/util/PatchedWeakReference.java @@ -45,11 +45,9 @@ public class PatchedWeakReference extends WeakReference{ if(ourRefsList.size() % 100 == 0) { int i = 0; } - /* synchronized(ourQueue) { ourRefsList.add(this); } - */ } /** From 7ea3125268af2628abd9eeacdef2e5c337c05ed5 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Aug 2012 15:26:13 +0400 Subject: [PATCH 10/21] new project model: save type-specific module properties --- .../JpsModulePropertiesSerializer.java | 3 +++ .../model/serialization/JpsProjectLoader.java | 4 +++ .../JpsPluginSyntheticArtifactProvider.java | 6 +++-- .../model/JpsPluginModuleProperties.java | 16 ++++++++---- .../JpsDevKitModelSerializerExtension.java | 26 ++++++++++++++++--- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java index 278150350bed..50bd56d966f0 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.model.serialization; import org.jdom.Element; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.module.JpsModuleType; @@ -14,4 +15,6 @@ public abstract class JpsModulePropertiesSerializer

extend } public abstract P loadProperties(@Nullable Element moduleRootElement); + + public abstract void saveProperties(@NotNull P properties, @NotNull Element moduleRootElement); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java index 6d7acf03dcae..ff85a2dd92bb 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java @@ -180,6 +180,10 @@ public class JpsProjectLoader extends JpsLoaderBase { public JpsDummyElement loadProperties(@Nullable Element moduleRootElement) { return JpsElementFactory.getInstance().createDummyElement(); } + + @Override + public void saveProperties(@NotNull JpsDummyElement properties, @NotNull Element moduleRootElement) { + } }; } } diff --git a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java index 3f6226b52c0a..b17a712ad23b 100644 --- a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java +++ b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java @@ -61,8 +61,10 @@ public class JpsPluginSyntheticArtifactProvider extends JpsSyntheticArtifactProv for (JpsModule module : model.getProject().getModules()) { JpsElement propertiesElement = module.getProperties(); if (propertiesElement instanceof JpsSimpleElement) { - JpsPluginModuleProperties properties = ((JpsSimpleElement)propertiesElement).getProperties(); - artifacts.add(createArtifact(module, properties)); + Object properties = ((JpsSimpleElement)propertiesElement).getProperties(); + if (properties instanceof JpsPluginModuleProperties) { + artifacts.add(createArtifact(module, (JpsPluginModuleProperties)properties)); + } } } return artifacts; diff --git a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/JpsPluginModuleProperties.java b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/JpsPluginModuleProperties.java index edf0243eeb3d..b70cdf12246c 100644 --- a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/JpsPluginModuleProperties.java +++ b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/JpsPluginModuleProperties.java @@ -15,21 +15,27 @@ */ package org.jetbrains.jps.devkit.model; +import org.jetbrains.annotations.Nullable; + /** * @author nik */ public class JpsPluginModuleProperties { private final String myPluginXmlUrl; + private final String myManifestFileUrl; - public JpsPluginModuleProperties(String pluginXmlUrl) { + public JpsPluginModuleProperties(@Nullable String pluginXmlUrl, @Nullable String manifestFileUrl) { myPluginXmlUrl = pluginXmlUrl; + myManifestFileUrl = manifestFileUrl; } - public JpsPluginModuleProperties(JpsPluginModuleProperties properties) { - myPluginXmlUrl = properties.getPluginXmlUrl(); - } - + @Nullable public String getPluginXmlUrl() { return myPluginXmlUrl; } + + @Nullable + public String getManifestFileUrl() { + return myManifestFileUrl; + } } diff --git a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java index 7eb16728c6a0..a1fe8e9b217a 100644 --- a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java +++ b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java @@ -76,15 +76,35 @@ public class JpsDevKitModelSerializerExtension extends JpsModelSerializerExtensi } private static class JpsPluginModulePropertiesSerializer extends JpsModulePropertiesSerializer> { + private static final String URL_ATTRIBUTE = "url"; + private static final String MANIFEST_ATTRIBUTE = "manifest"; + private static final String COMPONENT_NAME = "DevKit.ModuleBuildProperties"; + private JpsPluginModulePropertiesSerializer() { super(JpsPluginModuleType.INSTANCE, "PLUGIN_MODULE"); } @Override public JpsSimpleElement loadProperties(@Nullable Element moduleRootElement) { - Element component = JpsLoaderBase.findComponent(moduleRootElement, "DevKit.ModuleBuildProperties"); - String pluginXmlUrl = component != null ? component.getAttributeValue("url") : null; - return JpsElementFactory.getInstance().createSimpleElement(new JpsPluginModuleProperties(pluginXmlUrl)); + Element component = JpsLoaderBase.findComponent(moduleRootElement, COMPONENT_NAME); + String pluginXmlUrl = component != null ? component.getAttributeValue(URL_ATTRIBUTE) : null; + String manifestFileUrl = component != null ? component.getAttributeValue(MANIFEST_ATTRIBUTE) : null; + return JpsElementFactory.getInstance().createSimpleElement(new JpsPluginModuleProperties(pluginXmlUrl, manifestFileUrl)); + } + + @Override + public void saveProperties(@NotNull JpsSimpleElement element, @NotNull Element moduleRootElement) { + Element component = JpsLoaderBase.findComponent(moduleRootElement, COMPONENT_NAME); + if (component != null) { + String pluginXmlUrl = element.getProperties().getPluginXmlUrl(); + if (pluginXmlUrl != null) { + component.setAttribute(URL_ATTRIBUTE, pluginXmlUrl); + } + String manifestFileUrl = element.getProperties().getManifestFileUrl(); + if (manifestFileUrl != null) { + component.setAttribute(MANIFEST_ATTRIBUTE, manifestFileUrl); + } + } } } } From f151030289f63a607235d2646ab8902335f171fd Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Aug 2012 15:58:45 +0400 Subject: [PATCH 11/21] new project model: reworked type-specific artifact properties --- .../artifacts/ArtifactBuilderTestCase.java | 4 +- .../model/artifact/DirectoryArtifactType.java | 4 +- .../jps/model/artifact/JarArtifactType.java | 4 +- .../jps/model/artifact/JpsArtifact.java | 5 +- .../model/artifact/JpsArtifactService.java | 11 ++-- .../jps/model/artifact/JpsArtifactType.java | 14 ++--- .../model/artifact/impl/JpsArtifactImpl.java | 29 ++++++----- .../artifact/impl/JpsArtifactServiceImpl.java | 17 ++++-- .../JpsModelSerializerExtension.java | 4 +- .../JpsArtifactDummyPropertiesSerializer.java | 25 +++++++++ .../JpsArtifactPropertiesSerializer.java | 20 +++++++ .../artifact/JpsArtifactSerializer.java | 52 +++++++++++-------- .../artifact/JpsArtifactTypeSerializer.java | 24 --------- .../JpsPluginSyntheticArtifactProvider.java | 3 +- 14 files changed, 136 insertions(+), 80 deletions(-) create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactDummyPropertiesSerializer.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactPropertiesSerializer.java delete mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java index 4128284bfae2..2e800430295d 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java @@ -28,6 +28,7 @@ import org.jetbrains.jps.incremental.BuildLoggingManager; import org.jetbrains.jps.incremental.CompileScope; import org.jetbrains.jps.incremental.IncProjectBuilder; import org.jetbrains.jps.incremental.java.JavaBuilderLoggerImpl; +import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.artifact.DirectoryArtifactType; import org.jetbrains.jps.model.artifact.JpsArtifact; import org.jetbrains.jps.model.artifact.JpsArtifactService; @@ -114,7 +115,8 @@ public abstract class ArtifactBuilderTestCase extends JpsBuildTestCase { protected JpsArtifact addArtifact(String name, LayoutElementTestUtil.LayoutElementCreator root) { assertFalse("JpsArtifact " + name + " already exists", getArtifactNames().contains(name)); - JpsArtifact artifact = JpsArtifactService.getInstance().addArtifact(myJpsProject, name, root.buildElement(), DirectoryArtifactType.INSTANCE); + JpsArtifact artifact = JpsArtifactService.getInstance().addArtifact(myJpsProject, name, root.buildElement(), DirectoryArtifactType.INSTANCE, + JpsElementFactory.getInstance().createDummyElement()); artifact.setOutputPath(getAbsolutePath("out/artifacts/" + name)); return artifact; } diff --git a/jps/model-api/src/org/jetbrains/jps/model/artifact/DirectoryArtifactType.java b/jps/model-api/src/org/jetbrains/jps/model/artifact/DirectoryArtifactType.java index 0a606c3490d5..bceae8bfa3a1 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/artifact/DirectoryArtifactType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/artifact/DirectoryArtifactType.java @@ -1,8 +1,10 @@ package org.jetbrains.jps.model.artifact; +import org.jetbrains.jps.model.JpsDummyElement; + /** * @author nik */ -public class DirectoryArtifactType extends JpsArtifactType { +public class DirectoryArtifactType extends JpsArtifactType { public static final DirectoryArtifactType INSTANCE = new DirectoryArtifactType(); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/artifact/JarArtifactType.java b/jps/model-api/src/org/jetbrains/jps/model/artifact/JarArtifactType.java index 75552f36bf71..00a3a473a23d 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/artifact/JarArtifactType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/artifact/JarArtifactType.java @@ -1,8 +1,10 @@ package org.jetbrains.jps.model.artifact; +import org.jetbrains.jps.model.JpsDummyElement; + /** * @author nik */ -public class JarArtifactType extends JpsArtifactType { +public class JarArtifactType extends JpsArtifactType { public static final JarArtifactType INSTANCE = new JarArtifactType(); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java b/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java index 7a4526b555eb..0081740ce5c8 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java +++ b/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java @@ -3,6 +3,7 @@ package org.jetbrains.jps.model.artifact; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; +import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.JpsNamedElement; import org.jetbrains.jps.model.JpsReferenceableElement; import org.jetbrains.jps.model.artifact.elements.JpsCompositePackagingElement; @@ -12,7 +13,7 @@ import org.jetbrains.jps.model.artifact.elements.JpsCompositePackagingElement; */ public interface JpsArtifact extends JpsNamedElement, JpsReferenceableElement, JpsCompositeElement { @NotNull - JpsArtifactType getArtifactType(); + JpsArtifactType getArtifactType(); @Nullable String getOutputPath(); @@ -31,4 +32,6 @@ public interface JpsArtifact extends JpsNamedElement, JpsReferenceableElement JpsArtifact createArtifact(@NotNull String name, @NotNull JpsCompositePackagingElement rootElement, + @NotNull JpsArtifactType

type, @NotNull P properties); public abstract List getArtifacts(@NotNull JpsProject project); - public abstract JpsArtifact addArtifact(@NotNull JpsProject project, - @NotNull String name, - @NotNull JpsCompositePackagingElement rootElement, - @NotNull JpsArtifactType type); + public abstract

JpsArtifact addArtifact(@NotNull JpsProject project, @NotNull String name, + @NotNull JpsCompositePackagingElement rootElement, + @NotNull JpsArtifactType

type, @NotNull P properties); public abstract JpsArtifactReference createReference(@NotNull String artifactName); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifactType.java b/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifactType.java index 811e1c0156b5..60495e0f42b3 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifactType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifactType.java @@ -1,14 +1,16 @@ package org.jetbrains.jps.model.artifact; -import org.jetbrains.jps.model.DummyJpsElementProperties; -import org.jetbrains.jps.model.JpsElementType; +import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementChildRole; /** * @author nik */ -public abstract class JpsArtifactType extends JpsElementType { - @Override - public DummyJpsElementProperties createCopy(DummyJpsElementProperties properties) { - return DummyJpsElementProperties.INSTANCE; +public abstract class JpsArtifactType

{ + private final JpsElementChildRole

myPropertiesRole = new JpsElementChildRole

(); + + public final JpsElementChildRole

getPropertiesRole() { + return myPropertiesRole; } + } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactImpl.java index cf1708f39b2b..aa35dcfcc607 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactImpl.java @@ -3,42 +3,42 @@ package org.jetbrains.jps.model.artifact.impl; import com.intellij.openapi.util.Comparing; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.DummyJpsElementProperties; +import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.JpsElementChildRole; import org.jetbrains.jps.model.artifact.JpsArtifact; import org.jetbrains.jps.model.artifact.JpsArtifactType; import org.jetbrains.jps.model.artifact.elements.JpsCompositePackagingElement; import org.jetbrains.jps.model.impl.JpsElementChildRoleBase; import org.jetbrains.jps.model.impl.JpsNamedCompositeElementBase; -import org.jetbrains.jps.model.impl.JpsTypedDataImpl; -import org.jetbrains.jps.model.impl.JpsTypedDataRole; /** * @author nik */ -public class JpsArtifactImpl extends JpsNamedCompositeElementBase implements JpsArtifact { +public class JpsArtifactImpl

extends JpsNamedCompositeElementBase> implements JpsArtifact { private static final JpsElementChildRole ROOT_ELEMENT_CHILD_ROLE = JpsElementChildRoleBase.create("root element"); - private static final JpsTypedDataRole TYPED_DATA_ROLE = new JpsTypedDataRole(); + private final JpsArtifactType

myArtifactType; private String myOutputPath; private boolean myBuildOnMake; - public JpsArtifactImpl(@NotNull String name, @NotNull JpsCompositePackagingElement rootElement, @NotNull JpsArtifactType type) { + public JpsArtifactImpl(@NotNull String name, @NotNull JpsCompositePackagingElement rootElement, @NotNull JpsArtifactType

type, @NotNull P properties) { super(name); + myArtifactType = type; myContainer.setChild(ROOT_ELEMENT_CHILD_ROLE, rootElement); - myContainer.setChild(TYPED_DATA_ROLE, new JpsTypedDataImpl(type, DummyJpsElementProperties.INSTANCE)); + myContainer.setChild(type.getPropertiesRole(), properties); } - private JpsArtifactImpl(JpsArtifactImpl original) { + private JpsArtifactImpl(JpsArtifactImpl

original) { super(original); + myArtifactType = original.myArtifactType; myOutputPath = original.myOutputPath; } @NotNull @Override - public JpsArtifactImpl createCopy() { - return new JpsArtifactImpl(this); + public JpsArtifactImpl

createCopy() { + return new JpsArtifactImpl

(this); } public String getOutputPath() { @@ -54,8 +54,8 @@ public class JpsArtifactImpl extends JpsNamedCompositeElementBase getArtifactType() { + return myArtifactType; } @NotNull @@ -75,6 +75,11 @@ public class JpsArtifactImpl extends JpsNamedCompositeElementBase getArtifacts(@NotNull JpsProject project) { JpsElementCollectionImpl collection = project.getContainer().getChild(JpsArtifactRole.ARTIFACT_COLLECTION_ROLE); @@ -23,15 +25,20 @@ public class JpsArtifactServiceImpl extends JpsArtifactService { } @Override - public JpsArtifact addArtifact(@NotNull JpsProject project, @NotNull String name, @NotNull JpsCompositePackagingElement rootElement, - @NotNull JpsArtifactType type) { - JpsArtifact artifact = createArtifact(name, rootElement, type); + public

JpsArtifact addArtifact(@NotNull JpsProject project, + @NotNull String name, + @NotNull JpsCompositePackagingElement rootElement, + @NotNull JpsArtifactType

type, + @NotNull P properties) { + JpsArtifact artifact = createArtifact(name, rootElement, type, properties); return project.getContainer().getOrSetChild(JpsArtifactRole.ARTIFACT_COLLECTION_ROLE).addChild(artifact); } + @Override - public JpsArtifact createArtifact(String name, JpsCompositePackagingElement rootElement, JpsArtifactType type) { - return new JpsArtifactImpl(name, rootElement, type); + public

JpsArtifact createArtifact(@NotNull String name, @NotNull JpsCompositePackagingElement rootElement, + @NotNull JpsArtifactType

type, @NotNull P properties) { + return new JpsArtifactImpl

(name, rootElement, type, properties); } @Override diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java index 3ef2636b0ca3..73067004a957 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java @@ -8,7 +8,7 @@ import org.jetbrains.jps.model.JpsElementReference; import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.module.JpsDependencyElement; import org.jetbrains.jps.model.module.JpsModule; -import org.jetbrains.jps.model.serialization.artifact.JpsArtifactTypeSerializer; +import org.jetbrains.jps.model.serialization.artifact.JpsArtifactPropertiesSerializer; import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementSerializer; import org.jetbrains.jps.model.serialization.facet.JpsModuleExtensionLoader; import org.jetbrains.jps.service.JpsServiceManager; @@ -83,7 +83,7 @@ public abstract class JpsModelSerializerExtension { return Collections.emptyList(); } - public List getArtifactTypeSerializers() { + public List> getArtifactTypePropertiesSerializers() { return Collections.emptyList(); } } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactDummyPropertiesSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactDummyPropertiesSerializer.java new file mode 100644 index 000000000000..36b111a774c4 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactDummyPropertiesSerializer.java @@ -0,0 +1,25 @@ +package org.jetbrains.jps.model.serialization.artifact; + +import org.jetbrains.jps.model.JpsDummyElement; +import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.jps.model.artifact.JpsArtifactType; + +import java.util.List; + +/** + * @author nik + */ +public class JpsArtifactDummyPropertiesSerializer extends JpsArtifactPropertiesSerializer { + public JpsArtifactDummyPropertiesSerializer(String typeId, JpsArtifactType type) { + super(typeId, type); + } + + @Override + public JpsDummyElement loadProperties(List stateList) { + return JpsElementFactory.getInstance().createDummyElement(); + } + + @Override + public void saveProperties(JpsDummyElement properties, List stateList) { + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactPropertiesSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactPropertiesSerializer.java new file mode 100644 index 000000000000..361254ec2017 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactPropertiesSerializer.java @@ -0,0 +1,20 @@ +package org.jetbrains.jps.model.serialization.artifact; + +import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.artifact.JpsArtifactType; +import org.jetbrains.jps.model.serialization.JpsElementPropertiesSerializer; + +import java.util.List; + +/** + * @author nik + */ +public abstract class JpsArtifactPropertiesSerializer

extends JpsElementPropertiesSerializer> { + public JpsArtifactPropertiesSerializer(String typeId, JpsArtifactType

type) { + super(type, typeId); + } + + public abstract P loadProperties(List stateList); + + public abstract void saveProperties(P properties, List stateList); +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java index 45828252b88b..8464e6cd3659 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java @@ -6,10 +6,7 @@ import com.intellij.util.xmlb.XmlSerializer; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsCompositeElement; -import org.jetbrains.jps.model.JpsElementFactory; -import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.JpsProject; +import org.jetbrains.jps.model.*; import org.jetbrains.jps.model.artifact.*; import org.jetbrains.jps.model.artifact.elements.*; import org.jetbrains.jps.model.library.JpsLibraryReference; @@ -31,9 +28,9 @@ public class JpsArtifactSerializer { new LibraryFilesElementSerializer(), new ArtifactOutputElementSerializer() }; - private static final JpsArtifactTypeSerializer[] STANDARD_TYPE_SERIALIZERS = { - new JpsArtifactTypeSerializer("plain", DirectoryArtifactType.INSTANCE), - new JpsArtifactTypeSerializer("jar", JarArtifactType.INSTANCE) + private static final JpsArtifactPropertiesSerializer[] STANDARD_TYPE_SERIALIZERS = { + new JpsArtifactDummyPropertiesSerializer("plain", DirectoryArtifactType.INSTANCE), + new JpsArtifactDummyPropertiesSerializer("jar", JarArtifactType.INSTANCE) }; private static final String ELEMENT_TAG = "element"; private static final String ID_ATTRIBUTE = "id"; @@ -45,13 +42,18 @@ public class JpsArtifactSerializer { for (Element artifactElement : JDOMUtil.getChildren(componentElement, "artifact")) { ArtifactState state = XmlSerializer.deserialize(artifactElement, ArtifactState.class); if (state == null) continue; - JpsArtifactType artifactType = getTypeSerializer(state.getArtifactType()).getType(); - JpsPackagingElement rootElement = loadPackagingElement(state.getRootElement()); - if (rootElement != null) { - JpsArtifact artifact = service.addArtifact(project, state.getName(), (JpsCompositePackagingElement)rootElement, artifactType); - artifact.setBuildOnMake(state.isBuildOnMake()); - artifact.setOutputPath(state.getOutputPath()); - } + JpsArtifactPropertiesSerializer serializer = getTypePropertiesSerializer(state.getArtifactType()); + loadArtifact(project, service, state, serializer); + } + } + + private static

void loadArtifact(JpsProject project, JpsArtifactService service, ArtifactState state, JpsArtifactPropertiesSerializer

serializer) { + JpsPackagingElement rootElement = loadPackagingElement(state.getRootElement()); + if (rootElement != null) { + JpsArtifact artifact = service.addArtifact(project, state.getName(), (JpsCompositePackagingElement)rootElement, + serializer.getType(), serializer.loadProperties(state.getPropertiesList())); + artifact.setBuildOnMake(state.isBuildOnMake()); + artifact.setOutputPath(state.getOutputPath()); } } @@ -60,8 +62,16 @@ public class JpsArtifactSerializer { state.setName(artifact.getName()); state.setBuildOnMake(artifact.isBuildOnMake()); state.setOutputPath(artifact.getOutputPath()); - state.setArtifactType(getTypeSerializer(artifact.getArtifactType()).getTypeId()); + JpsArtifactPropertiesSerializer serializer = getTypePropertiesSerializer(artifact.getArtifactType()); + doSaveArtifact(artifact, componentElement, state, serializer); + } + + private static

void doSaveArtifact(JpsArtifact artifact, Element componentElement, ArtifactState state, + JpsArtifactPropertiesSerializer

serializer) { + state.setArtifactType(serializer.getTypeId()); state.setRootElement(savePackagingElement(artifact.getRootElement())); + //noinspection unchecked + serializer.saveProperties((P)artifact.getProperties(), state.getPropertiesList()); componentElement.addContent(XmlSerializer.serialize(state, SERIALIZATION_FILTERS)); } @@ -138,14 +148,14 @@ public class JpsArtifactSerializer { throw new IllegalArgumentException("Serializer not found for " + elementClass); } - private static JpsArtifactTypeSerializer getTypeSerializer(String typeId) { - for (JpsArtifactTypeSerializer serializer : STANDARD_TYPE_SERIALIZERS) { + private static JpsArtifactPropertiesSerializer getTypePropertiesSerializer(String typeId) { + for (JpsArtifactPropertiesSerializer serializer : STANDARD_TYPE_SERIALIZERS) { if (serializer.getTypeId().equals(typeId)) { return serializer; } } for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { - for (JpsArtifactTypeSerializer serializer : extension.getArtifactTypeSerializers()) { + for (JpsArtifactPropertiesSerializer serializer : extension.getArtifactTypePropertiesSerializers()) { if (serializer.getTypeId().equals(typeId)) { return serializer; } @@ -154,14 +164,14 @@ public class JpsArtifactSerializer { return STANDARD_TYPE_SERIALIZERS[0]; } - private static JpsArtifactTypeSerializer getTypeSerializer(JpsArtifactType type) { - for (JpsArtifactTypeSerializer serializer : STANDARD_TYPE_SERIALIZERS) { + private static JpsArtifactPropertiesSerializer getTypePropertiesSerializer(JpsArtifactType type) { + for (JpsArtifactPropertiesSerializer serializer : STANDARD_TYPE_SERIALIZERS) { if (serializer.getType().equals(type)) { return serializer; } } for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { - for (JpsArtifactTypeSerializer serializer : extension.getArtifactTypeSerializers()) { + for (JpsArtifactPropertiesSerializer serializer : extension.getArtifactTypePropertiesSerializers()) { if (serializer.getType().equals(type)) { return serializer; } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java deleted file mode 100644 index d694b8626190..000000000000 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.jetbrains.jps.model.serialization.artifact; - -import org.jetbrains.jps.model.artifact.JpsArtifactType; - -/** - * @author nik - */ -public class JpsArtifactTypeSerializer { - private final String myTypeId; - private final JpsArtifactType myType; - - public JpsArtifactTypeSerializer(String typeId, JpsArtifactType type) { - myTypeId = typeId; - myType = type; - } - - public String getTypeId() { - return myTypeId; - } - - public JpsArtifactType getType() { - return myType; - } -} diff --git a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java index b17a712ad23b..bbfaa51f3aa3 100644 --- a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java +++ b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/builder/JpsPluginSyntheticArtifactProvider.java @@ -27,6 +27,7 @@ import org.jetbrains.jps.devkit.model.JpsIdeaSdkType; import org.jetbrains.jps.devkit.model.JpsPluginModuleProperties; import org.jetbrains.jps.incremental.artifacts.JpsSyntheticArtifactProvider; import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.artifact.DirectoryArtifactType; @@ -122,7 +123,7 @@ public class JpsPluginSyntheticArtifactProvider extends JpsSyntheticArtifactProv } String name = module.getName() + ":plugin"; - JpsArtifact artifact = JpsArtifactService.getInstance().createArtifact(name, root, DirectoryArtifactType.INSTANCE); + JpsArtifact artifact = JpsArtifactService.getInstance().createArtifact(name, root, DirectoryArtifactType.INSTANCE, JpsElementFactory.getInstance().createDummyElement()); JpsTypedLibrary sdk = module.getSdk(JpsIdeaSdkType.INSTANCE); if (sdk != null) { From 785f5fa031143afc4b5b3358f0d2398cf644ae47 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Aug 2012 18:00:54 +0400 Subject: [PATCH 12/21] logging added --- .../openapi/deployment/DeploymentUtilImpl.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java b/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java index 9968fdbe3fb6..d57d0f3c8d5b 100644 --- a/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java +++ b/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java @@ -50,6 +50,9 @@ public class DeploymentUtilImpl extends DeploymentUtil { @Nullable Set writtenPaths, @Nullable FileFilter fileFilter) throws IOException { if (fileFilter != null && !fileFilter.accept(fromFile)) { + if (LOG.isDebugEnabled()) { + LOG.debug("Skipping " + fromFile.getAbsolutePath() + ": it wasn't accepted by filter " + fileFilter); + } return; } checkPathDoNotNavigatesUpFromFile(fromFile); @@ -69,13 +72,19 @@ public class DeploymentUtilImpl extends DeploymentUtil { } if (fromFile.equals(toFile) || writtenPaths != null && !writtenPaths.add(toFile.getPath())) { + if (LOG.isDebugEnabled()) { + LOG.debug("Skipping " + fromFile.getAbsolutePath() + ": " + toFile.getAbsolutePath() + " is already written"); + } return; } - if (!FileUtil.isFilePathAcceptable(toFile, fileFilter)) return; - if (context.getProgressIndicator() != null) { - context.getProgressIndicator().setText("Copying files"); - context.getProgressIndicator().setText2(fromFile.getPath()); + if (!FileUtil.isFilePathAcceptable(toFile, fileFilter)) { + if (LOG.isDebugEnabled()) { + LOG.debug("Skipping " + fromFile.getAbsolutePath() + ": " + toFile.getAbsolutePath() + " wasn't accepted by filter " + fileFilter); + } + return; } + context.getProgressIndicator().setText("Copying files"); + context.getProgressIndicator().setText2(fromFile.getPath()); try { if (LOG.isDebugEnabled()) { LOG.debug("Copy file '" + fromFile + "' to '"+toFile+"'"); From 1f5f3abb906ced9f68f5bbe00ed17075439d472b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 7 Aug 2012 16:05:13 +0200 Subject: [PATCH 13/21] IDEA-86646 (inspection "size()==0 is replaceable with isEmpty()" triggers for project level 1.5) --- .../siyeh/InspectionGadgetsBundle.properties | 2 + .../SizeReplaceableByIsEmptyInspection.java | 37 ++++++++++++++----- .../SizeReplaceableByIsEmpty.html | 4 ++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 5c766cba8318..fe13cab4ce4d 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1458,6 +1458,8 @@ interface.never.implemented.option=Ignore interfaces which only declare constant size.replaceable.by.isempty.display.name='size() == 0' replaceable with 'isEmpty()' size.replaceable.by.isempty.quickfix=Replace with 'isEmpty()' size.replaceable.by.isempty.negation.ignore.option=Ignore expressions which would be replaced with '!isEmpty()' +ignored.classes.table=Ignored classes +choose.class.type.to.ignore=Choose class type to ignore loop.condition.not.updated.inside.loop.display.name=Loop variable not updated inside loop loop.condition.not.updated.inside.loop.problem.descriptor='#ref' is not updated inside loop #loc utility.class.without.private.constructor.option=Ignore classes with only a main method diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/style/SizeReplaceableByIsEmptyInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/style/SizeReplaceableByIsEmptyInspection.java index 092a2d1eec21..35f57a45f222 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/style/SizeReplaceableByIsEmptyInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/style/SizeReplaceableByIsEmptyInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2011 Bas Leijdekkers + * Copyright 2006-2012 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,15 @@ package com.siyeh.ig.style; import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.codeInspection.ui.ListTable; +import com.intellij.codeInspection.ui.ListWrappingTableModel; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.OrderedSet; +import com.intellij.util.ui.CheckBox; import com.siyeh.HardcodedMethodConstants; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; @@ -28,36 +32,47 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.psiutils.ComparisonUtils; import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.ui.UiUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.*; public class SizeReplaceableByIsEmptyInspection extends BaseInspection { @SuppressWarnings({"PublicField"}) public boolean ignoreNegations = false; + @SuppressWarnings("PublicField") + public OrderedSet ignoredTypes = new OrderedSet(); + @Override @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "size.replaceable.by.isempty.display.name"); + return InspectionGadgetsBundle.message("size.replaceable.by.isempty.display.name"); } @Override @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "expression.can.be.replaced.problem.descriptor", infos[0]); + return InspectionGadgetsBundle.message("expression.can.be.replaced.problem.descriptor", infos[0]); } @Override @Nullable public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( + final JComponent panel = new JPanel(new BorderLayout()); + final ListTable table = + new ListTable(new ListWrappingTableModel(ignoredTypes, InspectionGadgetsBundle.message("ignored.classes.table"))); + JPanel tablePanel = + UiUtils.createAddRemoveTreeClassChooserPanel(table, InspectionGadgetsBundle.message("choose.class.type.to.ignore")); + final CheckBox checkBox = new CheckBox(InspectionGadgetsBundle.message( "size.replaceable.by.isempty.negation.ignore.option"), this, "ignoreNegations"); + panel.add(tablePanel, BorderLayout.CENTER); + panel.add(checkBox, BorderLayout.SOUTH); + return panel; } @Override @@ -71,8 +86,7 @@ public class SizeReplaceableByIsEmptyInspection extends BaseInspection { @NotNull public String getName() { - return InspectionGadgetsBundle.message( - "size.replaceable.by.isempty.quickfix"); + return InspectionGadgetsBundle.message("size.replaceable.by.isempty.quickfix"); } @Override @@ -195,6 +209,11 @@ public class SizeReplaceableByIsEmptyInspection extends BaseInspection { if (aClass == null) { return null; } + for (String ignoredType : ignoredTypes) { + if (InheritanceUtil.isInheritor(aClass, ignoredType)) { + return null; + } + } final PsiMethod[] methods = aClass.findMethodsByName("isEmpty", true); for (PsiMethod method : methods) { final PsiParameterList parameterList = method.getParameterList(); diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/SizeReplaceableByIsEmpty.html b/plugins/InspectionGadgets/src/inspectionDescriptions/SizeReplaceableByIsEmpty.html index 6788578061bd..4f86bb745afc 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/SizeReplaceableByIsEmpty.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/SizeReplaceableByIsEmpty.html @@ -4,6 +4,10 @@ This inspection reports any .size() or .length() comparisons with a 0 literal which can be replaced with a call to .isEmpty().

+Use the table below to add classes for which any .size() or .length() comparisons should not be replaced. +

+Use the checkbox below to ignore any expressions which would be replaced with '!isEmpty()'. +

Powered by InspectionGadgets \ No newline at end of file From 98f74685eac94db2cbcc64f01ca5806117a862f8 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Aug 2012 18:13:53 +0400 Subject: [PATCH 14/21] IDEA-89821 fix "is modified" status updating --- .../android/sdk/AndroidSdkConfigurable.java | 6 +++- .../sdk/AndroidSdkConfigurableForm.java | 32 ++++++++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurable.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurable.java index 19cb6ecf3e13..9a2af1a933b8 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurable.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurable.java @@ -18,6 +18,7 @@ package org.jetbrains.android.sdk; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.projectRoots.*; +import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -77,7 +78,10 @@ public class AndroidSdkConfigurable implements AdditionalDataConfigurable { public boolean isModified() { final AndroidSdkAdditionalData data = (AndroidSdkAdditionalData)mySdk.getSdkAdditionalData(); Sdk javaSdk = data != null ? data.getJavaSdk() : null; - return javaSdk != myForm.getSelectedSdk(); + final String javaSdkHomePath = javaSdk != null ? javaSdk.getHomePath() : null; + final Sdk selectedSdk = myForm.getSelectedSdk(); + final String selectedSdkHomePath = selectedSdk != null ? selectedSdk.getHomePath() : null; + return !FileUtil.pathsEqual(javaSdkHomePath, selectedSdkHomePath); } @Override diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java index d9d8d43f00d7..843436443639 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java @@ -49,6 +49,8 @@ class AndroidSdkConfigurableForm { private final DefaultComboBoxModel myBuildTargetsModel = new DefaultComboBoxModel(); private String mySdkLocation; + private boolean myFreeze = false; + public AndroidSdkConfigurableForm(@NotNull SdkModel sdkModel, @NotNull final SdkModificator sdkModificator) { mySdkModel = sdkModel; myInternalJdkComboBox.setModel(myJdksModel); @@ -76,6 +78,9 @@ class AndroidSdkConfigurableForm { myBuildTargetComboBox.addItemListener(new ItemListener() { public void itemStateChanged(final ItemEvent e) { + if (myFreeze) { + return; + } final IAndroidTarget target = (IAndroidTarget)e.getItem(); List roots = AndroidSdkUtils.getLibraryRootsForTarget(target, mySdkLocation); @@ -138,18 +143,10 @@ class AndroidSdkConfigurableForm { mySdkLocation = androidSdk != null ? androidSdk.getHomePath() : null; AndroidSdkData androidSdkData = mySdkLocation != null ? AndroidSdkData.parse(mySdkLocation, new EmptySdkLog()) : null; - updateBuildTargets(androidSdkData); - if (buildTarget != null) { - for (int i = 0; i < myBuildTargetsModel.getSize(); i++) { - IAndroidTarget target = (IAndroidTarget)myBuildTargetsModel.getElementAt(i); - if (buildTarget.hashString().equals(target.hashString())) { - myBuildTargetComboBox.setSelectedIndex(i); - return; - } - } - } - myBuildTargetComboBox.setSelectedItem(null); + myFreeze = true; + updateBuildTargets(androidSdkData, buildTarget); + myFreeze = false; } private void updateJdks() { @@ -161,7 +158,7 @@ class AndroidSdkConfigurableForm { } } - private void updateBuildTargets(AndroidSdkData androidSdkData) { + private void updateBuildTargets(AndroidSdkData androidSdkData, IAndroidTarget buildTarget) { myBuildTargetsModel.removeAllElements(); if (androidSdkData != null) { @@ -169,6 +166,17 @@ class AndroidSdkConfigurableForm { myBuildTargetsModel.addElement(target); } } + + if (buildTarget != null) { + for (int i = 0; i < myBuildTargetsModel.getSize(); i++) { + IAndroidTarget target = (IAndroidTarget)myBuildTargetsModel.getElementAt(i); + if (buildTarget.hashString().equals(target.hashString())) { + myBuildTargetComboBox.setSelectedIndex(i); + return; + } + } + } + myBuildTargetComboBox.setSelectedItem(null); } public void addJavaSdk(Sdk sdk) { From f9b064317bb84a025419f51528819efa1014bb54 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Aug 2012 18:22:58 +0400 Subject: [PATCH 15/21] clean up --- .../compiler/artifact/AndroidArtifactPropertiesEditor.form | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/artifact/AndroidArtifactPropertiesEditor.form b/plugins/android/src/org/jetbrains/android/compiler/artifact/AndroidArtifactPropertiesEditor.form index 7d095d126721..2553e5d7e187 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/artifact/AndroidArtifactPropertiesEditor.form +++ b/plugins/android/src/org/jetbrains/android/compiler/artifact/AndroidArtifactPropertiesEditor.form @@ -16,7 +16,7 @@ - + From 35238d1b44e4a36f6aa8787b2aca83110d52cc1c Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Tue, 7 Aug 2012 17:55:34 +0400 Subject: [PATCH 16/21] SASS indent-based comments support #RUBY-11475 fixed #RUBY-10900 fixed #RUBY-11751 fixed --- .../codeInsight/editorActions/enter/BaseIndentEnterHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java index 865296f8eb9c..2833e21b9bd7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java @@ -119,7 +119,7 @@ public class BaseIndentEnterHandler extends EnterHandlerDelegateAdapter { final String restString = editorCharSequence.subSequence(caret, document.getLineEndOffset(lineNumber)).toString(); if (!StringUtil.isEmptyOrSpaces(restString)) { EditorModificationUtil.insertStringAtCaret(editor, "\n" + lineIndent + myLineCommentPrefix); - editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(lineNumber + 1, 1)); + editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(lineNumber + 1, myLineCommentPrefix.length())); return Result.Stop; } else if (iterator.getStart() < lineStartOffset) { From 062f2047667b509ca5f2cd2840a8f1565695f1d7 Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Tue, 7 Aug 2012 18:20:15 +0400 Subject: [PATCH 17/21] SASS indent-based comments support. Test added #RUBY-10979 fixed --- .../editorActions/enter/BaseIndentEnterHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java index 2833e21b9bd7..c21b0c903134 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/BaseIndentEnterHandler.java @@ -118,8 +118,9 @@ public class BaseIndentEnterHandler extends EnterHandlerDelegateAdapter { if (type == myLineCommentType) { final String restString = editorCharSequence.subSequence(caret, document.getLineEndOffset(lineNumber)).toString(); if (!StringUtil.isEmptyOrSpaces(restString)) { - EditorModificationUtil.insertStringAtCaret(editor, "\n" + lineIndent + myLineCommentPrefix); - editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(lineNumber + 1, myLineCommentPrefix.length())); + final String linePrefix = lineIndent + myLineCommentPrefix; + EditorModificationUtil.insertStringAtCaret(editor, "\n" + linePrefix); + editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(lineNumber + 1, linePrefix.length())); return Result.Stop; } else if (iterator.getStart() < lineStartOffset) { From 20cc91110ecbe0adea4e37b54ff2a9a09e5c9362 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 7 Aug 2012 16:45:03 +0200 Subject: [PATCH 18/21] remove period at the end of inspection problem descriptor --- .../src/com/siyeh/InspectionGadgetsBundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index fe13cab4ce4d..4869a1f9db93 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -152,7 +152,7 @@ default.tostring.call.problem.descriptor=Call to default 'toString()' on # octal.and.decimal.integers.in.same.array.display.name=Octal and decimal integers in same array octal.and.decimal.integers.in.same.array.problem.descriptor=Octal and decimal integers in the same array initializer #loc result.of.object.allocation.ignored.display.name=Result of object allocation ignored -result.of.object.allocation.ignored.problem.descriptor=Result of new #ref() is ignored. #loc +result.of.object.allocation.ignored.problem.descriptor=Result of new #ref() is ignored #loc use.0index.in.jdbc.resultset.display.name=Use of index 0 in JDBC ResultSet use.0index.in.jdbc.resultset.problem.descriptor=Use of index '0' in JDBC ResultSet #loc use.0index.in.jdbc.prepared.statement.problem.descriptor=Use of index '0' in JDBC PreparedStatement #loc From b49ed13d43066783ce8f58fe600da4aeb6433ceb Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 7 Aug 2012 16:45:46 +0200 Subject: [PATCH 19/21] IDEA-89831 (inspection "Empty class" vs classes like com.google.inject.TypeLiteral) --- .../ig/classlayout/EmptyClassInspection.java | 31 ++++++++++++++----- .../classlayout/emptyclass/EmptyClass.java | 4 +-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java index 7b543f7fb266..469a46e63351 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java @@ -150,12 +150,8 @@ public class EmptyClassInspection extends BaseInspection { if (initializers.length > 0) { return; } - if (ignoreClassWithParameterization) { - final PsiReferenceList extendsList = aClass.getExtendsList(); - final PsiReferenceList implementsList = aClass.getImplementsList(); - if (isSuperParameterization(extendsList) || isSuperParameterization(implementsList)) { - return; - } + if (ignoreClassWithParameterization && isSuperParametrization(aClass)) { + return; } if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { return; @@ -166,7 +162,7 @@ public class EmptyClassInspection extends BaseInspection { registerClassError(aClass, aClass); } - private boolean isSuperParameterization(PsiReferenceList extendsList) { + private boolean hasTypeArguments(PsiReferenceList extendsList) { if (extendsList == null) { return false; } @@ -183,5 +179,26 @@ public class EmptyClassInspection extends BaseInspection { } return false; } + + private boolean isSuperParametrization(PsiClass aClass) { + if (!(aClass instanceof PsiAnonymousClass)) { + final PsiReferenceList extendsList = aClass.getExtendsList(); + final PsiReferenceList implementsList = aClass.getImplementsList(); + return hasTypeArguments(extendsList) || hasTypeArguments(implementsList); + } + final PsiAnonymousClass anonymousClass = (PsiAnonymousClass)aClass; + final PsiJavaCodeReferenceElement reference = anonymousClass.getBaseClassReference(); + final PsiReferenceParameterList parameterList = reference.getParameterList(); + if (parameterList == null) { + return false; + } + final PsiTypeElement[] elements = parameterList.getTypeParameterElements(); + for (PsiTypeElement element : elements) { + if (element != null) { + return true; + } + } + return false; + } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/emptyclass/EmptyClass.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/emptyclass/EmptyClass.java index 8c52556a7922..bd48fce4ff15 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/emptyclass/EmptyClass.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/emptyclass/EmptyClass.java @@ -1,9 +1,9 @@ package com.siyeh.igtest.classlayout.emptyclass; public class EmptyClass { - { - System.out.println(""); + final java.util.ArrayList stringList = new java.util.ArrayList() {}; + System.out.println(""); } } class MyList extends java.util.ArrayList {} From e849bbc1f9ac6d792c1abd2e5d8c6f7bbc608a3b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 7 Aug 2012 16:48:15 +0200 Subject: [PATCH 20/21] two more periods removed --- .../src/com/siyeh/InspectionGadgetsBundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 4869a1f9db93..5ceb7e183173 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -951,8 +951,8 @@ throw.caught.locally.problem.descriptor=#ref caught by containing ' throw.caught.locally.ignore.option=Ignore rethrown exceptions return.from.finally.block.problem.descriptor=#ref inside 'finally' block #loc continue.or.break.from.finally.block.problem.descriptor=#ref inside 'finally' block #loc -bad.exception.declared.problem.descriptor=Prohibited exception #ref declared. #loc -bad.exception.caught.problem.descriptor=Prohibited exception #ref caught. #loc +bad.exception.declared.problem.descriptor=Prohibited exception #ref declared #loc +bad.exception.caught.problem.descriptor=Prohibited exception #ref caught #loc checked.exception.class.problem.descriptor=Checked exception class #ref #loc unchecked.exception.class.problem.descriptor=Unchecked exception class #ref #loc thread.death.rethrown.problem.descriptor=#ref not rethrown #loc From be8620335e4b4d807ac863d9c3034fa5acf7e2a7 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 7 Aug 2012 17:06:17 +0200 Subject: [PATCH 21/21] make model rebuild on pooled threads --- .../intellij/ide/util/FileStructurePopup.java | 62 ++++++++++++------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java index 3693efbc1938..7c6475fc4610 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -33,6 +33,7 @@ import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.Disposable; import com.intellij.openapi.MnemonicHelper; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Editor; @@ -292,21 +293,36 @@ public class FileStructurePopup implements Disposable { } IdeFocusManager.getInstance(myProject).requestFocus(myTree, true); - myFilteringStructure.rebuild(); - myAbstractTreeBuilder.queueUpdate().doWhenDone(new Runnable() { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override public void run() { - myTreeHasBuilt.setDone(); - //noinspection SSBasedInspection - SwingUtilities.invokeLater(new Runnable() { + final AccessToken token = ApplicationManager.getApplication().acquireReadActionLock(); + try { + myFilteringStructure.rebuild(); + } + finally { + token.finish(); + } + + myAbstractTreeBuilder.queueUpdate().doWhenDone(new Runnable() { @Override public void run() { - selectPsiElement(myInitialPsiElement); + myTreeHasBuilt.setDone(); + //noinspection SSBasedInspection + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + selectPsiElement(myInitialPsiElement); + } + }); } }); + installUpdater(); } }); + } + private void installUpdater() { if (!ApplicationManager.getApplication().isUnitTestMode()) { final Alarm alarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD, myPopup); alarm.addRequest(new Runnable() { @@ -330,24 +346,26 @@ public class FileStructurePopup implements Disposable { myAbstractTreeBuilder.refilter(null, false, false).doWhenProcessed(new Runnable() { @Override public void run() { - myTree.repaint(); - if (isBackspace && handleBackspace(filter)) { - return; - } - if (myFilteringStructure.getRootElement().getChildren().length == 0) { - for (JCheckBox box : myCheckBoxes.values()) { - if (!box.isSelected()) { - myAutoClicked.add(box); - myTriggeredCheckboxes.add(0, Pair.create(filter, box)); - box.doClick(); - filter = ""; - break; + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + myTree.repaint(); + if (isBackspace && handleBackspace(filter)) { + return; + } + if (myFilteringStructure.getRootElement().getChildren().length == 0) { + for (JCheckBox box : myCheckBoxes.values()) { + if (!box.isSelected()) { + myAutoClicked.add(box); + myTriggeredCheckboxes.add(0, Pair.create(filter, box)); + box.doClick(); + filter = ""; + break; + } + } } } - } - //if (mySpeedSearch.isPopupActive()) { - // mySpeedSearch.refreshSelection(); - //} + }); } }); }