From 36b0d52bfe2cb5bc952623db590e8363c5810cca Mon Sep 17 00:00:00 2001 From: medvector Date: Fri, 15 Aug 2014 18:40:46 +0400 Subject: [PATCH 01/12] EDIDE-104 Select first task window on file opening --- .../python/edu/StudyEditorFactoryListener.java | 4 +--- .../python/edu/actions/StudyRefreshTaskAction.java | 8 +++----- .../com/jetbrains/python/edu/course/TaskFile.java | 12 ++++++++++++ .../com/jetbrains/python/edu/editor/StudyEditor.java | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java b/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java index 4557b4f4753b..7565d76b3acf 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java @@ -20,9 +20,6 @@ import org.jetbrains.annotations.NotNull; import java.awt.*; -/** - * User: lia - */ class StudyEditorFactoryListener implements EditorFactoryListener { @@ -73,6 +70,7 @@ class StudyEditorFactoryListener implements EditorFactoryListener { StudyTaskManager taskManager = StudyTaskManager.getInstance(project); TaskFile taskFile = taskManager.getTaskFile(openedFile); if (taskFile != null) { + taskFile.navigateToFirstTaskWindow(editor); editor.addEditorMouseListener(new WindowSelectionListener(taskFile)); StudyDocumentListener listener = new StudyDocumentListener(taskFile); StudyEditor.addDocumentListener(document, listener); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java index 982c8e339803..9001780ff33b 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java @@ -11,9 +11,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.ui.popup.Balloon; -import com.intellij.openapi.ui.popup.BalloonBuilder; -import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.python.edu.StudyDocumentListener; import com.jetbrains.python.edu.StudyTaskManager; @@ -33,7 +31,7 @@ public class StudyRefreshTaskAction extends DumbAwareAction { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { - Editor editor = StudyEditor.getSelectedEditor(project); + final Editor editor = StudyEditor.getSelectedEditor(project); assert editor != null; final Document document = editor.getDocument(); StudyDocumentListener listener = StudyEditor.getListener(document); @@ -57,7 +55,7 @@ public class StudyRefreshTaskAction extends DumbAwareAction { FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); VirtualFile openedFile = fileDocumentManager.getFile(document); assert openedFile != null; - TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); + final TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); assert selectedTaskFile != null; Task currentTask = selectedTaskFile.getTask(); String lessonDir = Lesson.LESSON_DIR + String.valueOf(currentTask.getLesson().getIndex() + 1); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java index df3573d753f4..ed4f2bfe80da 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java @@ -6,6 +6,7 @@ import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.xmlb.annotations.Transient; +import com.jetbrains.python.edu.StudyUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -210,4 +211,15 @@ public class TaskFile implements Stateful{ public boolean isUserCreated() { return myUserCreated; } + + public void navigateToFirstTaskWindow(@NotNull final Editor editor) { + if (!taskWindows.isEmpty()) { + TaskWindow firstTaskWindow = StudyUtils.getFirst(taskWindows); + LogicalPosition taskWindowStart = new LogicalPosition(firstTaskWindow.getLine(), firstTaskWindow.getStart()); + editor.getCaretModel().moveToLogicalPosition(taskWindowStart); + int startOffset = firstTaskWindow.getRealStartOffset(editor.getDocument()); + int endOffset = startOffset + firstTaskWindow.getLength(); + editor.getSelectionModel().setSelection(startOffset, endOffset); + } + } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java b/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java index c1e355e53de5..b318386a8aff 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java @@ -207,7 +207,7 @@ public class StudyEditor implements TextEditor { @Nullable @Override public JComponent getPreferredFocusedComponent() { - return myComponent; + return myDefaultEditor.getPreferredFocusedComponent(); } @NotNull From b6614214aa60642b6ceca1ec1b55bb4ffdf1ad2f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 15 Aug 2014 18:44:07 +0400 Subject: [PATCH 02/12] one more NPE fix [^batrak] --- .../openapi/editor/actionSystem/CaretSpecificDataContext.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/CaretSpecificDataContext.java b/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/CaretSpecificDataContext.java index 7233db741132..e53cc48e4d5a 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/CaretSpecificDataContext.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/CaretSpecificDataContext.java @@ -40,7 +40,8 @@ public class CaretSpecificDataContext extends DataContextWrapper { if (project == null) { return null; } - Object data = FileEditorManager.getInstance(project).getData(dataId, myCaret.getEditor(), myCaret); + FileEditorManager fm = FileEditorManager.getInstance(project); + Object data = fm == null ? null : fm.getData(dataId, myCaret.getEditor(), myCaret); return data == null ? super.getData(dataId) : data; } } From 0e7c48f26510078e8efacff6ef1a29d7d6c1492a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 15 Aug 2014 16:17:48 +0200 Subject: [PATCH 03/12] fix language levels --- .../fixtures/LightCodeInsightFixtureTestCase.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java b/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java index 3699fe36aff5..c6f04dfeb7bf 100644 --- a/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -39,13 +39,13 @@ public abstract class LightCodeInsightFixtureTestCase extends UsefulTestCase{ public static final LightProjectDescriptor JAVA_1_4 = new DefaultLightProjectDescriptor() { @Override public void configureModule(Module module, ModifiableRootModel model, ContentEntry contentEntry) { - model.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(LanguageLevel.JDK_1_6); + model.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(LanguageLevel.JDK_1_4); } }; public static final LightProjectDescriptor JAVA_1_5 = new DefaultLightProjectDescriptor() { @Override public void configureModule(Module module, ModifiableRootModel model, ContentEntry contentEntry) { - model.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(LanguageLevel.JDK_1_6); + model.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(LanguageLevel.JDK_1_5); } }; public static final LightProjectDescriptor JAVA_1_6 = new DefaultLightProjectDescriptor() { From 5a3ae57884f721eafbfa1be1cdad020d1bdea496 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 15 Aug 2014 16:56:17 +0200 Subject: [PATCH 04/12] IDEA-128653 (Inspection "Implicit usage of platform's default charset" incorrectly marks ctr) Also adds java.nio.charset.Charset and friends to mockJDK-1.8 --- java/mockJDK-1.8/jre/lib/rt.jar | Bin 5387286 -> 5403267 bytes ...ImplicitDefaultCharsetUsageInspection.java | 8 +++++--- .../ImplicitDefaultCharsetUsage.java | 11 +++++++++++ ...icitDefaultCharsetUsageInspectionTest.java | 9 +++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/java/mockJDK-1.8/jre/lib/rt.jar b/java/mockJDK-1.8/jre/lib/rt.jar index db566fc4007687a0cdfe061a4ba86a092c12ae28..f3a4f893f3d4e0277f7d7122d88bcad4e34ad3d1 100644 GIT binary patch delta 16027 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 EKLF}U^8f$< delta 211 zcmWN=M@|9(06@`k6tMS>y>}6N7qO!bUWF5w_!8oZohRT3CSE}=!Op}Zuyp>*fBXFj zKmNYMR}Dgqnj|EpG;7hSO}h@Ax^(N&t53fHgN6(nF)D4$xCxV{Oq(%l&b$SSmMmMb zYR$S0n=-a!ZQHSH&%OhPjvPC2>dd(dIhXRTT)T1W&bfy%xn6zv{J@ aQYD>8263fStP%$0Y80e`VlH3EW-|Xemr3#f diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspection.java index a2a3b12bd8de..ef598f5d2216 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspection.java @@ -19,6 +19,7 @@ import com.intellij.psi.*; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -143,9 +144,10 @@ public class ImplicitDefaultCharsetUsageInspection extends BaseInspection { } private static boolean hasCharsetType(PsiVariable variable) { - final PsiType lastType = variable.getType(); - return lastType.equalsToText(CommonClassNames.JAVA_LANG_STRING) || - lastType.equalsToText("java.nio.charset.Charset"); + return TypeUtils.variableHasTypeOrSubtype(variable, CommonClassNames.JAVA_LANG_STRING, + "java.nio.charset.Charset", + "java.nio.charset.CharsetEncoder", + "java.nio.charset.CharsetDecoder"); } } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/internationalization/implicit_default_charset_usage/ImplicitDefaultCharsetUsage.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/internationalization/implicit_default_charset_usage/ImplicitDefaultCharsetUsage.java index 17dd59eadf7a..151042fa3ed9 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/internationalization/implicit_default_charset_usage/ImplicitDefaultCharsetUsage.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/internationalization/implicit_default_charset_usage/ImplicitDefaultCharsetUsage.java @@ -1,6 +1,9 @@ package com.siyeh.igtest.internationalization.implicit_default_charset_usage; import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; import java.util.ArrayList; import java.util.Formatter; import java.util.Locale; @@ -37,4 +40,12 @@ class ImplicitDefaultCharsetUsage { new Scanner("string input"); new ArrayList(10); } + + void charsetEnAndDecoders(InputStream inputStream, OutputStream outputStream) throws IOException { + final Charset cs = Charset.forName("UTF-8"); + CharsetDecoder cd = cs.newDecoder(); + InputStreamReader is = new InputStreamReader(inputStream, cd); + CharsetEncoder ce = cs.newEncoder(); + final OutputStreamWriter ow = new OutputStreamWriter(outputStream, ce); + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspectionTest.java index 78822492b4bc..312e08aebcc3 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/internationalization/ImplicitDefaultCharsetUsageInspectionTest.java @@ -16,13 +16,22 @@ package com.siyeh.ig.internationalization; import com.intellij.codeInspection.InspectionProfileEntry; +import com.intellij.testFramework.LightProjectDescriptor; import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.NotNull; /** * @author Bas Leijdekkers */ public class ImplicitDefaultCharsetUsageInspectionTest extends LightInspectionTestCase { + + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return JAVA_8; + } + @Override protected InspectionProfileEntry getInspection() { return new ImplicitDefaultCharsetUsageInspection(); From 26be69646be1d3aa6ea4ed3653b0e02c3d7f8fa9 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 15 Aug 2014 17:10:37 +0200 Subject: [PATCH 05/12] EA-59436 (IOE: PsiJavaParserFacadeImpl.createExpressionFromText) --- .../impl/BaseMoveInitializerToMethodAction.java | 16 +++------------- .../afterArrayInitializer.java | 8 ++++++++ .../beforeArrayInitializer.java | 7 +++++++ 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/afterArrayInitializer.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/beforeArrayInitializer.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseMoveInitializerToMethodAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseMoveInitializerToMethodAction.java index 4756a5b25a47..5ccdc398684f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseMoveInitializerToMethodAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseMoveInitializerToMethodAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -29,6 +29,7 @@ import com.intellij.psi.*; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.util.RefactoringChangeUtil; +import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -126,9 +127,7 @@ public abstract class BaseMoveInitializerToMethodAction extends PsiElementBaseIn final PsiExpressionStatement statement = (PsiExpressionStatement)factory.createStatementFromText(field.getName() + " = y;", codeBlock); PsiExpression initializer = field.getInitializer(); - if (initializer instanceof PsiArrayInitializerExpression) { - initializer = arrayInitializerToNewExpression((PsiArrayInitializerExpression)initializer, factory, codeBlock); - } + initializer = RefactoringUtil.convertInitializerToNormalExpression(initializer, field.getType()); final PsiAssignmentExpression expression = (PsiAssignmentExpression)statement.getExpression(); expression.getRExpression().replace(initializer); @@ -158,15 +157,6 @@ public abstract class BaseMoveInitializerToMethodAction extends PsiElementBaseIn return false; } - private static PsiExpression arrayInitializerToNewExpression(@NotNull PsiArrayInitializerExpression initializer, - @NotNull PsiElementFactory factory, - @NotNull PsiElement context) { - final PsiType type = initializer.getType(); - final PsiNewExpression newExpression = (PsiNewExpression)factory.createExpressionFromText("new " + type.getCanonicalText() + "{}", context); - newExpression.getArrayInitializer().replace(initializer); - return newExpression; - } - private static boolean containsReference(final @NotNull PsiElement element, final @NotNull PsiField field) { final Ref result = new Ref(Boolean.FALSE); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/afterArrayInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/afterArrayInitializer.java new file mode 100644 index 000000000000..c063aef37715 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/afterArrayInitializer.java @@ -0,0 +1,8 @@ +// "Move initializer to constructor" "true" +class X { + final String s; + + X() { + s = {}; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/beforeArrayInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/beforeArrayInitializer.java new file mode 100644 index 000000000000..fdc8c7b3e22f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/moveInitializerToConstructor/beforeArrayInitializer.java @@ -0,0 +1,7 @@ +// "Move initializer to constructor" "true" +class X { + final String s = {}; + + X() { + } +} \ No newline at end of file From 7ccfd14574ea5994de664d14b7ae2580bacc58b9 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 15 Aug 2014 17:26:12 +0200 Subject: [PATCH 06/12] EA-59437 (IOE: PsiJavaParserFacadeImpl.createStatementFromText) --- ...DeclarationAndInitializationIntention.java | 24 +++--------- .../ipp/initialization/ArrayInitializer.java | 3 ++ .../ArrayInitializer_after.java | 7 ++++ ...arationAndInitializationIntentionTest.java | 38 +++++++++++++++++++ 4 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer_after.java create mode 100644 plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntentionTest.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java index 33778f99d931..3bbc7a63bd65 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package com.siyeh.ipp.initialization; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.util.IncorrectOperationException; +import com.intellij.refactoring.util.RefactoringUtil; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementPredicate; @@ -35,28 +35,14 @@ public class SplitDeclarationAndInitializationIntention extends Intention { } @Override - public void processIntention(@NotNull PsiElement element) - throws IncorrectOperationException { + public void processIntention(@NotNull PsiElement element) { final PsiField field = (PsiField)element.getParent(); field.normalizeDeclaration(); - final PsiExpression initializer = field.getInitializer(); + final PsiExpression initializer = RefactoringUtil.convertInitializerToNormalExpression(field.getInitializer(), field.getType()); if (initializer == null) { return; } - final String initializerText; - if (initializer instanceof PsiArrayInitializerExpression) { - final PsiType type = initializer.getType(); - if (type == null) { - initializerText = initializer.getText(); - } - else { - initializerText = "new " + type.getCanonicalText() + - initializer.getText(); - } - } - else { - initializerText = initializer.getText(); - } + final String initializerText = initializer.getText(); final PsiClass containingClass = field.getContainingClass(); if (containingClass == null) { return; diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer.java new file mode 100644 index 000000000000..54eaa025b8e8 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer.java @@ -0,0 +1,3 @@ +class X { + String s = {}; +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer_after.java new file mode 100644 index 000000000000..08ebd41e6f93 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/initialization/ArrayInitializer_after.java @@ -0,0 +1,7 @@ +class X { + String s; + + { + s = {}; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntentionTest.java new file mode 100644 index 000000000000..63ac3c9acf9f --- /dev/null +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntentionTest.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ipp.initialization; + +import com.siyeh.IntentionPowerPackBundle; +import com.siyeh.ipp.IPPTestCase; + +/** + * @see com.siyeh.ipp.initialization.SplitDeclarationAndInitializationIntention + * @author Bas Leijdekkers + */ +public class SplitDeclarationAndInitializationIntentionTest extends IPPTestCase { + + public void testArrayInitializer() { doTest(); } + + @Override + protected String getRelativePath() { + return "initialization"; + } + + @Override + protected String getIntentionName() { + return IntentionPowerPackBundle.message("split.declaration.and.initialization.intention.name"); + } +} From c74c470a684b765856a58b70ecc975bddd8c54cb Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 15 Aug 2014 19:25:24 +0400 Subject: [PATCH 07/12] preserve mute breakpoints state between debug sessions --- .../com/intellij/xdebugger/impl/ui/XDebugSessionTab.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index 25c00d75f2af..0fd33b5f0a2d 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -63,6 +63,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { @Nullable private XDebugSessionImpl mySession; + private XDebugSessionData mySessionData; @NotNull public static XDebugSessionTab create(@NotNull XDebugSessionImpl session, @@ -126,6 +127,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { } mySession = session; + mySessionData = session.getSessionData(); myConsole = session.getConsoleView(); myRunContentDescriptor = new RunContentDescriptor(myConsole, session.getDebugProcess().getProcessHandler(), myUi.getComponent(), session.getSessionName(), icon); } @@ -139,6 +141,9 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { else if (TAB_KEY.is(dataId)) { return this; } + else if (XDebugSessionData.DATA_KEY.is(dataId)) { + return mySessionData; + } if (mySession != null) { if (SESSION_KEY.is(dataId)) { @@ -147,9 +152,6 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { else if (LangDataKeys.CONSOLE_VIEW.is(dataId)) { return mySession.getConsoleView(); } - else if (XDebugSessionData.DATA_KEY.is(dataId)) { - return mySession.getSessionData(); - } } return super.getData(dataId); From 61dd461e86260e26a4b8eab1e4e5c9fb4b04adef Mon Sep 17 00:00:00 2001 From: medvector Date: Fri, 15 Aug 2014 19:35:21 +0400 Subject: [PATCH 08/12] for task navigation actions all task files will be opened when action performs --- .../actions/StudyTaskNavigationAction.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java index 427313f37b26..2ce200bfc641 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java @@ -12,7 +12,6 @@ import com.intellij.openapi.ui.popup.BalloonBuilder; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; import com.jetbrains.python.edu.course.Lesson; import com.jetbrains.python.edu.course.Task; import com.jetbrains.python.edu.course.TaskFile; @@ -50,23 +49,28 @@ abstract public class StudyTaskNavigationAction extends DumbAwareAction { } int nextTaskIndex = nextTask.getIndex(); int lessonIndex = nextTask.getLesson().getIndex(); - TaskFile nextFile = nextTask.getTaskFiles().values().iterator().next(); - if (nextFile != null) { - VirtualFile projectDir = project.getBaseDir(); - String lessonDirName = Lesson.LESSON_DIR + String.valueOf(lessonIndex + 1); - if (projectDir != null) { - VirtualFile lessonDir = projectDir.findChild(lessonDirName); - if (lessonDir != null) { - String taskDirName = Task.TASK_DIR + String.valueOf(nextTaskIndex + 1); - VirtualFile taskDir = lessonDir.findChild(taskDirName); - if (taskDir != null) { - Map.Entry taskFile = StudyUtils.getFirst(nextTask.getTaskFiles().entrySet()); - VirtualFile virtualFile = taskDir.findChild(taskFile.getKey()); - if (virtualFile != null) { - FileEditorManager.getInstance(project).openFile(virtualFile, true); - } - } - } + Map nextTaskFiles = nextTask.getTaskFiles(); + if (nextTaskFiles.isEmpty()) { + return; + } + VirtualFile projectDir = project.getBaseDir(); + String lessonDirName = Lesson.LESSON_DIR + String.valueOf(lessonIndex + 1); + if (projectDir == null) { + return; + } + VirtualFile lessonDir = projectDir.findChild(lessonDirName); + if (lessonDir == null) { + return; + } + String taskDirName = Task.TASK_DIR + String.valueOf(nextTaskIndex + 1); + VirtualFile taskDir = lessonDir.findChild(taskDirName); + if (taskDir == null) { + return; + } + for (String name : nextTaskFiles.keySet()) { + VirtualFile vf = taskDir.findChild(name); + if (vf != null) { + FileEditorManager.getInstance(project).openFile(vf, true); } } } From 58af58ba53d8c53d6d4fc8d61a209b23ea082913 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 15 Aug 2014 20:54:39 +0400 Subject: [PATCH 09/12] RegExp checker cosmetic --- .../regexp/intention/CheckRegExpForm.form | 8 ++-- .../regexp/intention/CheckRegExpForm.java | 45 ++++++++----------- .../intention/CheckRegExpIntentionAction.java | 6 +-- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form index b04addde5858..9029a33969fc 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form @@ -17,7 +17,9 @@ - + + + @@ -66,14 +68,14 @@ - + - + diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java index ce1047eebc5c..ec8ab5a00333 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java @@ -32,13 +32,14 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.resolve.FileContextUtil; +import com.intellij.psi.PsiLanguageInjectionHost; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.ui.BalloonImpl; import com.intellij.ui.EditorTextField; import com.intellij.ui.Gray; import com.intellij.ui.JBColor; +import com.intellij.ui.components.JBLabel; import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import org.intellij.lang.regexp.RegExpLanguage; @@ -62,6 +63,7 @@ public class CheckRegExpForm { private EditorTextField myRegExp; private JPanel myRootPanel; + private JBLabel myMessage; private Ref myRef; private Project myProject; @@ -77,6 +79,7 @@ public class CheckRegExpForm { Document document = PsiDocumentManager.getInstance(myProject).getDocument(file); myRegExp = new EditorTextField(document, myProject, RegExpLanguage.INSTANCE.getAssociatedFileType()); + myRegExp.setPreferredWidth(Math.max(300, myRegExp.getPreferredSize().width)); final String sampleText = PropertiesComponent.getInstance(myProject).getValue(LAST_EDITED_REGEXP, "Sample Text"); mySampleText = new EditorTextField(sampleText, myProject, PlainTextFileType.INSTANCE); mySampleText.setBorder( @@ -158,35 +161,23 @@ public class CheckRegExpForm { private void updateBalloon() { boolean correct = false; - try { - final PsiFile file = myParams.first; - //todo: unfortunately there is no way to access host element representing regexp - int offset = -1; - try { - final String name = file.getName(); - offset = Integer.parseInt(name.substring(name.lastIndexOf(':') + 1, name.lastIndexOf(')'))); - } catch (Exception ignore) {} - - int flags = 0; - if (offset != -1) { - final PsiFile host = FileContextUtil.getContextFile(file); - if (host != null) { - final PsiElement regexpInHost = host.findElementAt(offset); - if (regexpInHost != null) { - for (RegExpModifierProvider provider : RegExpModifierProvider.EP.getExtensions()) { - final int modifiers = provider.getFlags(regexpInHost, file); - if (modifiers > 0) { - flags = modifiers; - break; - } - } - } - } + PsiFile file = myParams.first; + PsiLanguageInjectionHost host = InjectedLanguageUtil.findInjectionHost(file); + int flags = 0; + if (host != null) { + for (RegExpModifierProvider provider : RegExpModifierProvider.EP.getExtensions()) { + flags = provider.getFlags(host, file); + if (flags > 0) break; } + } + try { correct = Pattern.compile(myRegExp.getText(), flags).matcher(mySampleText.getText()).matches(); } catch (Exception ignore) {} - mySampleText.setBackground(correct ? new JBColor(new Color(231, 250, 219), new Color(68, 85, 66)) : new JBColor(new Color(255, 177, 160), new Color(110, 43, 40))); + JBColor color1 = new JBColor(new Color(231, 250, 219), new Color(68, 85, 66)); + JBColor color2 = new JBColor(new Color(255, 177, 160), new Color(110, 43, 40)); + mySampleText.setBackground(correct ? color1 : color2); + myMessage.setText(correct ? "Matches!" : "no match"); BalloonImpl balloon = (BalloonImpl)myRef.get(); if (balloon != null && balloon.isDisposed()) { balloon.revalidate(); diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java index 6c052461c5b8..09995dcdb0ba 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java @@ -41,12 +41,10 @@ public class CheckRegExpIntentionAction extends QuickEditAction implements Icona @Override public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - final Pair pair = getRangePair(file, editor); - /*super.isAvailable(project, editor, file) && */ + Pair pair = getRangePair(file, editor); if (pair != null && pair.first != null) { Language language = pair.first.getLanguage(); - Language baseLanguage = language.getBaseLanguage(); - return language == RegExpLanguage.INSTANCE || baseLanguage == RegExpLanguage.INSTANCE; + return language.isKindOf(RegExpLanguage.INSTANCE); } return false; } From bf7502ae092817e19fd02b0f998dd50b92dcfbde Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 15 Aug 2014 22:21:07 +0400 Subject: [PATCH 10/12] cleanup --- .../regexp/intention/CheckRegExpForm.java | 88 +++++++------------ .../intention/CheckRegExpIntentionAction.java | 6 +- .../intention/impl/QuickEditAction.java | 7 +- .../intention/impl/QuickEditHandler.java | 41 +++++---- 4 files changed, 61 insertions(+), 81 deletions(-) diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java index ec8ab5a00333..f8269dcd498b 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java @@ -16,26 +16,21 @@ package org.intellij.lang.regexp.intention; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonShortcuts; import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.fileTypes.PlainTextFileType; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.Balloon; -import com.intellij.openapi.ui.popup.JBPopupAdapter; -import com.intellij.openapi.ui.popup.LightweightWindowEvent; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; -import com.intellij.ui.BalloonImpl; import com.intellij.ui.EditorTextField; import com.intellij.ui.Gray; import com.intellij.ui.JBColor; @@ -44,6 +39,7 @@ import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import org.intellij.lang.regexp.RegExpLanguage; import org.intellij.lang.regexp.RegExpModifierProvider; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.border.CompoundBorder; @@ -57,54 +53,40 @@ import java.util.regex.Pattern; */ public class CheckRegExpForm { private static final String LAST_EDITED_REGEXP = "last.edited.regexp"; - private Pair> myParams; + private final PsiFile myRegexpFile; private EditorTextField mySampleText; //TODO[kb]: make it multiline private EditorTextField myRegExp; private JPanel myRootPanel; private JBLabel myMessage; - private Ref myRef; private Project myProject; - public CheckRegExpForm(Pair> params) { - myParams = params; + public CheckRegExpForm(@NotNull PsiFile regexpFile) { + myRegexpFile = regexpFile; } private void createUIComponents() { - PsiFile file = myParams.first; - myProject = file.getProject(); - myRef = myParams.second; - Document document = PsiDocumentManager.getInstance(myProject).getDocument(file); + myProject = myRegexpFile.getProject(); + Document document = PsiDocumentManager.getInstance(myProject).getDocument(myRegexpFile); myRegExp = new EditorTextField(document, myProject, RegExpLanguage.INSTANCE.getAssociatedFileType()); myRegExp.setPreferredWidth(Math.max(300, myRegExp.getPreferredSize().width)); final String sampleText = PropertiesComponent.getInstance(myProject).getValue(LAST_EDITED_REGEXP, "Sample Text"); mySampleText = new EditorTextField(sampleText, myProject, PlainTextFileType.INSTANCE); mySampleText.setBorder( - new CompoundBorder(new EmptyBorder(2, 2, 2, 4), new LineBorder(UIUtil.isUnderDarcula() ? Gray._100 : UIUtil.getBorderColor()))); + new CompoundBorder(new EmptyBorder(2, 2, 2, 4), new LineBorder(UIUtil.isUnderDarcula() ? Gray._100 : JBColor.border()))); mySampleText.setOneLineMode(false); - mySampleText.addDocumentListener(new DocumentAdapter() { - @Override - public void documentChanged(DocumentEvent e) { - //noinspection SSBasedInspection - SwingUtilities.invokeLater(new Runnable() { - public void run() { - myRootPanel.revalidate(); - final Balloon balloon = myRef.get(); - if (balloon != null) { - balloon.revalidate(); - } - } - }); - } - }); myRootPanel = new JPanel(new BorderLayout()) { + Disposable disposable; + @Override public void addNotify() { super.addNotify(); + disposable = Disposer.newDisposable(); + IdeFocusManager.getGlobalInstance().requestFocus(mySampleText, true); new AnAction(){ @@ -112,26 +94,10 @@ public class CheckRegExpForm { public void actionPerformed(AnActionEvent e) { IdeFocusManager.findInstance().requestFocus(myRegExp.getFocusTarget(), true); } - }.registerCustomShortcutSet(CustomShortcutSet.fromString("shift TAB"), mySampleText, myRef.get()); - final AnAction escaper = new AnAction() { - @Override - public void actionPerformed(AnActionEvent e) { - myRef.get().hide(); - } - }; - escaper.registerCustomShortcutSet(CommonShortcuts.ESCAPE, myRegExp.getFocusTarget(), myRef.get()); - escaper.registerCustomShortcutSet(CommonShortcuts.ESCAPE, mySampleText.getFocusTarget(), myRef.get()); + }.registerCustomShortcutSet(CustomShortcutSet.fromString("shift TAB"), mySampleText); - - myRef.get().addListener(new JBPopupAdapter() { - @Override - public void onClosed(LightweightWindowEvent event) { - PropertiesComponent.getInstance(myProject).setValue(LAST_EDITED_REGEXP, mySampleText.getText()); - } - }); - - final Alarm updater = new Alarm(Alarm.ThreadToUse.SWING_THREAD, myRef.get()); - final DocumentAdapter documentListener = new DocumentAdapter() { + final Alarm updater = new Alarm(Alarm.ThreadToUse.SWING_THREAD, disposable); + DocumentAdapter documentListener = new DocumentAdapter() { @Override public void documentChanged(DocumentEvent e) { updater.cancelAllRequests(); @@ -151,22 +117,33 @@ public class CheckRegExpForm { updateBalloon(); mySampleText.selectAll(); } + + @Override + public void removeNotify() { + super.removeNotify(); + Disposer.dispose(disposable); + PropertiesComponent.getInstance(myProject).setValue(LAST_EDITED_REGEXP, mySampleText.getText()); + } }; } + @NotNull + public JComponent getPreferredFocusedComponent() { + return mySampleText; + } + @NotNull public JPanel getRootPanel() { return myRootPanel; } private void updateBalloon() { boolean correct = false; - PsiFile file = myParams.first; - PsiLanguageInjectionHost host = InjectedLanguageUtil.findInjectionHost(file); + PsiLanguageInjectionHost host = InjectedLanguageUtil.findInjectionHost(myRegexpFile); int flags = 0; if (host != null) { for (RegExpModifierProvider provider : RegExpModifierProvider.EP.getExtensions()) { - flags = provider.getFlags(host, file); + flags = provider.getFlags(host, myRegexpFile); if (flags > 0) break; } } @@ -178,9 +155,6 @@ public class CheckRegExpForm { JBColor color2 = new JBColor(new Color(255, 177, 160), new Color(110, 43, 40)); mySampleText.setBackground(correct ? color1 : color2); myMessage.setText(correct ? "Matches!" : "no match"); - BalloonImpl balloon = (BalloonImpl)myRef.get(); - if (balloon != null && balloon.isDisposed()) { - balloon.revalidate(); - } + myRootPanel.revalidate(); } } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java index 09995dcdb0ba..6da84caa56ec 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java @@ -20,10 +20,8 @@ import com.intellij.lang.Language; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; @@ -55,11 +53,11 @@ public class CheckRegExpIntentionAction extends QuickEditAction implements Icona } @Override - protected JComponent createBalloonComponent(PsiFile file, final Ref ref) { + protected JComponent createBalloonComponent(@NotNull PsiFile file) { final Project project = file.getProject(); final Document document = PsiDocumentManager.getInstance(project).getDocument(file); if (document != null) { - return new CheckRegExpForm(Pair.create(file, ref)).getRootPanel(); + return new CheckRegExpForm(file).getRootPanel(); } return null; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java index ee4c91972046..62e3bcba3a22 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java @@ -25,7 +25,10 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.Balloon; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; @@ -138,7 +141,7 @@ public class QuickEditAction implements IntentionAction, LowPriorityAction { } @Nullable - protected JComponent createBalloonComponent(PsiFile file, Ref ref) { + protected JComponent createBalloonComponent(@NotNull PsiFile file) { return null; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java index dc4bc435b0a1..2c5d8642e46d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java @@ -150,22 +150,23 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { if (event.getEditor().getDocument() != myNewDocument) return; myEditorCount ++; final EditorActionHandler editorEscape = EditorActionManager.getInstance().getActionHandler(IdeActions.ACTION_EDITOR_ESCAPE); - new AnAction() { - @Override - public void update(AnActionEvent e) { - Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); - e.getPresentation().setEnabled( - !myAction.isShowInBalloon() && - editor != null && LookupManager.getActiveLookup(editor) == null && - TemplateManager.getInstance(myProject).getActiveTemplate(editor) == null && - (editorEscape == null || !editorEscape.isEnabled(editor, e.getDataContext()))); - } + if (!myAction.isShowInBalloon()) { + new AnAction() { + @Override + public void update(AnActionEvent e) { + Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); + e.getPresentation().setEnabled( + editor != null && LookupManager.getActiveLookup(editor) == null && + TemplateManager.getInstance(myProject).getActiveTemplate(editor) == null && + (editorEscape == null || !editorEscape.isEnabled(editor, e.getDataContext()))); + } - @Override - public void actionPerformed(AnActionEvent e) { - closeEditor(); - } - }.registerCustomShortcutSet(CommonShortcuts.ESCAPE, event.getEditor().getContentComponent()); + @Override + public void actionPerformed(AnActionEvent e) { + closeEditor(); + } + }.registerCustomShortcutSet(CommonShortcuts.ESCAPE, event.getEditor().getContentComponent()); + } } @Override @@ -203,8 +204,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { public void navigate(int injectedOffset) { if (myAction.isShowInBalloon()) { - Ref ref = Ref.create(null); - final JComponent component = myAction.createBalloonComponent(myNewFile, ref); + final JComponent component = myAction.createBalloonComponent(myNewFile); if (component != null) { final Balloon balloon = JBPopupFactory.getInstance().createBalloonBuilder(component) .setShadow(true) @@ -214,7 +214,12 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { .setHideOnAction(false) .setFillColor(UIUtil.getControlColor()) .createBalloon(); - ref.set(balloon); + new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + balloon.hide(); + } + }.registerCustomShortcutSet(CommonShortcuts.ESCAPE, component); Disposer.register(myNewFile.getProject(), balloon); final Balloon.Position position = QuickEditAction.getBalloonPosition(myEditor); RelativePoint point = JBPopupFactory.getInstance().guessBestPopupLocation(myEditor); From cf270853e9f3f829a50f2f07890952cdd721c255 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 15 Aug 2014 22:41:30 +0400 Subject: [PATCH 11/12] fix NotNull assertion on exit --- .../platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java index 347710f50e3a..326192072c4b 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java @@ -2580,6 +2580,7 @@ public class JBTabsImpl extends JComponent } private void updateContainer(boolean forced, final boolean layoutNow) { + if (myProject != null && !myProject.isOpen()) return; for (TabInfo each : new ArrayList(myVisibleInfos)) { final JComponent eachComponent = each.getComponent(); if (getSelectedInfo() == each && getSelectedInfo() != null) { From 310e7766414443e9fa231e85a7d29392840d59fd Mon Sep 17 00:00:00 2001 From: nik Date: Sat, 16 Aug 2014 10:41:41 +0400 Subject: [PATCH 12/12] fixed hanging test: timeout added --- .../com/intellij/psi/impl/DocumentCommitThread.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/DocumentCommitThread.java b/platform/lang-impl/src/com/intellij/psi/impl/DocumentCommitThread.java index 8b57843d6b9f..5176c95c812b 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/DocumentCommitThread.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/DocumentCommitThread.java @@ -556,13 +556,19 @@ public class DocumentCommitThread extends DocumentCommitProcessor implements Run } @TestOnly - public void waitUntilAllCommitted() throws InterruptedException { + public void waitUntilAllCommitted(long timeout) throws InterruptedException { if (!myEnabled) { throw new IllegalStateException("DocumentCommitThread is disabled"); } + int attempts = 0; + int delay = 100; synchronized (documentsToCommit) { while(!documentsToCommit.isEmpty()) { - documentsToCommit.wait(); + documentsToCommit.wait(delay); + if (delay * attempts > timeout) { + throw new RuntimeException("timeout"); + } + attempts++; } } }