From f144e4ddf2aba58e43b9e15615309656a97b34db Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Fri, 3 Jun 2016 16:32:14 +0300 Subject: [PATCH 01/16] check exact facet match --- .../com/jetbrains/python/facet/LibraryContributingFacet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/facet/LibraryContributingFacet.java b/python/src/com/jetbrains/python/facet/LibraryContributingFacet.java index 918439ebb4b9..57e3673ee312 100644 --- a/python/src/com/jetbrains/python/facet/LibraryContributingFacet.java +++ b/python/src/com/jetbrains/python/facet/LibraryContributingFacet.java @@ -36,14 +36,14 @@ public abstract class LibraryContributingFacet ext connection.subscribe(FacetManager.FACETS_TOPIC, new FacetManagerAdapter() { @Override public void beforeFacetRemoved(@NotNull Facet facet) { - if (facet instanceof LibraryContributingFacet) { + if (facet == LibraryContributingFacet.this) { ((LibraryContributingFacet) facet).removeLibrary(); } } @Override public void facetConfigurationChanged(@NotNull Facet facet) { - if (facet instanceof LibraryContributingFacet) { + if (facet == LibraryContributingFacet.this) { ((LibraryContributingFacet) facet).updateLibrary(); } } From 09ec544535b1fd9f0259a764d2546a98aac63d8d Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 3 Jun 2016 15:37:40 +0200 Subject: [PATCH 02/16] fix PsiFileImpl.switchFromStubToAst too eager assertion --- .../src/com/intellij/psi/impl/source/PsiFileImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java index 437e5a41b9ad..8cfb8bb0f2ce 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java @@ -259,8 +259,8 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF } private void switchFromStubToAst(List> bindings) { - if (!bindings.isEmpty()) { - LOG.assertTrue(!myUseStrongRefs, this + " of " + getClass() + "; " + bindings); + if (!bindings.isEmpty() && myUseStrongRefs) { + LOG.error(this + " of " + getClass() + "; " + bindings); } for (Pair pair : bindings) { From 93db0303139853133b23ae3dbeb71556f74ce212 Mon Sep 17 00:00:00 2001 From: Alexander Kass Date: Fri, 3 Jun 2016 16:17:46 +0300 Subject: [PATCH 03/16] DBE: CheckRegExp is now available not only in injections + works in modal dialogs + beautification --- .../regexp/intention/CheckRegExpForm.form | 129 +++++++----------- .../regexp/intention/CheckRegExpForm.java | 28 ++-- .../intention/CheckRegExpIntentionAction.java | 17 ++- .../intention/impl/QuickEditHandler.java | 50 +++---- .../src/com/intellij/ui/EditorTextField.java | 42 +++--- 5 files changed, 130 insertions(+), 136 deletions(-) diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form index 9029a33969fc..e0196cb1b26c 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.form @@ -1,92 +1,57 @@
- + + - + - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java index 925d37ba3d59..51fc45789200 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpForm.java @@ -21,14 +21,17 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.fileTypes.PlainTextFileType; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.popup.Balloon; +import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; @@ -37,7 +40,6 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; 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; @@ -49,8 +51,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; import javax.swing.*; -import javax.swing.border.CompoundBorder; -import javax.swing.border.LineBorder; import java.awt.*; import java.util.regex.Pattern; @@ -82,12 +82,17 @@ public class CheckRegExpForm { Document document = PsiDocumentManager.getInstance(myProject).getDocument(myRegexpFile); myRegExp = new EditorTextField(document, myProject, RegExpLanguage.INSTANCE.getAssociatedFileType()); - myRegExp.setPreferredWidth(Math.max(JBUI.scale(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(JBUI.Borders.empty(2, 2, 2, 4), new LineBorder(UIUtil.isUnderDarcula() ? Gray._100 : JBColor.border()))); + mySampleText = new EditorTextField(sampleText, myProject, PlainTextFileType.INSTANCE) { + @Override + protected void updateBorder(@NotNull EditorEx editor) { + setupBorder(editor); + } + }; mySampleText.setOneLineMode(false); + int preferredWidth = Math.max(JBUI.scale(250), myRegExp.getPreferredSize().width); + myRegExp.setPreferredWidth(preferredWidth); + mySampleText.setPreferredWidth(preferredWidth); myRootPanel = new JPanel(new BorderLayout()) { Disposable disposable; @@ -112,7 +117,7 @@ public class CheckRegExpForm { public void documentChanged(DocumentEvent e) { updater.cancelAllRequests(); if (!updater.isDisposed()) { - updater.addRequest(() -> updateBalloon(), 200); + updater.addRequest(CheckRegExpForm.this::updateBalloon, 200); } } }; @@ -130,6 +135,7 @@ public class CheckRegExpForm { PropertiesComponent.getInstance(myProject).setValue(LAST_EDITED_REGEXP, mySampleText.getText()); } }; + myRootPanel.setBorder(JBUI.Borders.empty(UIUtil.DEFAULT_VGAP, UIUtil.DEFAULT_HGAP)); } @NotNull @@ -149,7 +155,9 @@ public class CheckRegExpForm { mySampleText.setBackground(correct != null && correct ? BACKGROUND_COLOR_MATCH : BACKGROUND_COLOR_NOMATCH); myMessage.setText(correct == null ? "Pattern is too complex" : correct ? "Matches!" : "No match"); myRootPanel.revalidate(); - }, o -> false); + Balloon balloon = JBPopupFactory.getInstance().getParentBalloonFor(myRootPanel); + if (balloon != null) balloon.revalidate(); + }, ModalityState.current()); } @TestOnly diff --git a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java index 6da84caa56ec..aee165a4db8c 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/intention/CheckRegExpIntentionAction.java @@ -16,7 +16,9 @@ package org.intellij.lang.regexp.intention; import com.intellij.codeInsight.intention.impl.QuickEditAction; +import com.intellij.codeInsight.intention.impl.QuickEditHandler; import com.intellij.lang.Language; +import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -26,6 +28,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.util.IncorrectOperationException; import org.intellij.lang.regexp.RegExpLanguage; import org.jetbrains.annotations.NotNull; @@ -44,7 +47,19 @@ public class CheckRegExpIntentionAction extends QuickEditAction implements Icona Language language = pair.first.getLanguage(); return language.isKindOf(RegExpLanguage.INSTANCE); } - return false; + PsiFile baseFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file); + return baseFile != null && baseFile.getLanguage().isKindOf(RegExpLanguage.INSTANCE); + } + + @Override + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + PsiFile baseFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file); + if (baseFile == null || !baseFile.getLanguage().isKindOf(RegExpLanguage.INSTANCE)) { + super.invoke(project, editor, file); + return; + } + JComponent component = createBalloonComponent(file); + if (component != null) QuickEditHandler.showBalloon(editor, file, component); } @Override 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 094374c22495..669ff357ff6a 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 @@ -194,30 +194,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { public void navigate(int injectedOffset) { if (myAction.isShowInBalloon()) { final JComponent component = myAction.createBalloonComponent(myNewFile); - if (component != null) { - final Balloon balloon = JBPopupFactory.getInstance().createBalloonBuilder(component) - .setShadow(true) - .setAnimationCycle(0) - .setHideOnClickOutside(true) - .setHideOnKeyOutside(true) - .setHideOnAction(false) - .setFillColor(UIUtil.getControlColor()) - .createBalloon(); - 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); - if (position == Balloon.Position.above) { - final Point p = point.getPoint(); - point = new RelativePoint(point.getComponent(), new Point(p.x, p.y - myEditor.getLineHeight())); - } - balloon.show(point, position); - } + if (component != null) showBalloon(myEditor, myNewFile, component); } else { final FileEditorManagerEx fileEditorManager = FileEditorManagerEx.getInstanceEx(myProject); @@ -245,6 +222,31 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { } } + public static void showBalloon(Editor editor, PsiFile newFile, JComponent component) { + final Balloon balloon = JBPopupFactory.getInstance().createBalloonBuilder(component) + .setShadow(true) + .setAnimationCycle(0) + .setHideOnClickOutside(true) + .setHideOnKeyOutside(true) + .setHideOnAction(false) + .setFillColor(UIUtil.getControlColor()) + .createBalloon(); + new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + balloon.hide(); + } + }.registerCustomShortcutSet(CommonShortcuts.ESCAPE, component); + Disposer.register(newFile.getProject(), balloon); + final Balloon.Position position = QuickEditAction.getBalloonPosition(editor); + RelativePoint point = JBPopupFactory.getInstance().guessBestPopupLocation(editor); + if (position == Balloon.Position.above) { + final Point p = point.getPoint(); + point = new RelativePoint(point.getComponent(), new Point(p.x, p.y - editor.getLineHeight())); + } + balloon.show(point, position); + } + @Override public void documentChanged(DocumentEvent e) { UndoManager undoManager = UndoManager.getInstance(myProject); diff --git a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java index 1be13e6b0093..8ca103ce0a7b 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java @@ -531,26 +531,30 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, final Container parent = getParent(); if (parent instanceof JTable || parent instanceof CellRendererPane) return; - if (UIUtil.isUnderAquaLookAndFeel() || UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF()) { - editor.setBorder(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF() ? new DarculaEditorTextFieldBorder() : new MacUIUtil.EditorTextFieldBorder(this)); - editor.addFocusListener(new FocusChangeListener() { - @Override - public void focusGained(Editor editor) { - repaint(); - } + setupBorder(editor); + } + } - @Override - public void focusLost(Editor editor) { - repaint(); - } - }); - } - else if (UIUtil.isUnderAlloyLookAndFeel() || UIUtil.isUnderJGoodiesLookAndFeel()) { - editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(1, 1, 1, 1))); - } - else { - editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(2, 2, 2, 2))); - } + protected void setupBorder(@NotNull EditorEx editor) { + if (UIUtil.isUnderAquaLookAndFeel() || UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF()) { + editor.setBorder(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF() ? new DarculaEditorTextFieldBorder() : new MacUIUtil.EditorTextFieldBorder(this)); + editor.addFocusListener(new FocusChangeListener() { + @Override + public void focusGained(Editor editor) { + repaint(); + } + + @Override + public void focusLost(Editor editor) { + repaint(); + } + }); + } + else if (UIUtil.isUnderAlloyLookAndFeel() || UIUtil.isUnderJGoodiesLookAndFeel()) { + editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(1, 1, 1, 1))); + } + else { + editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(2, 2, 2, 2))); } } From 8c35bfd8ce72bc5ebd7ba43dcede4b7b606feaf1 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Fri, 3 Jun 2016 16:13:31 +0300 Subject: [PATCH 04/16] Do not pass runConfigurationName through processHandler since it's already there --- .../execution/JavaTestFrameworkRunnableState.java | 2 -- .../src/com/intellij/execution/TestStateStorage.java | 3 --- .../sm/runner/ui/SMTestRunnerResultsForm.java | 10 +--------- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java index d5f1ab56961d..ad173f205ebb 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -44,7 +44,6 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; @@ -136,7 +135,6 @@ public abstract class JavaTestFrameworkRunnableState RUN_CONFIGURATION_NAME_KEY = Key.create("run.configuration.name"); private static final File TEST_HISTORY_PATH = new File(PathManager.getSystemPath(), "testHistory"); diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/ui/SMTestRunnerResultsForm.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/ui/SMTestRunnerResultsForm.java index b5779548acf3..b1dab502cdb4 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/ui/SMTestRunnerResultsForm.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/ui/SMTestRunnerResultsForm.java @@ -19,7 +19,6 @@ import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.execution.TestStateStorage; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.RunProfile; -import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.testframework.*; import com.intellij.execution.testframework.actions.ScrollToTestSourceAction; import com.intellij.execution.testframework.export.TestResultsXmlFormatter; @@ -46,7 +45,6 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pass; import com.intellij.openapi.util.io.FileUtilRt; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.pom.Navigatable; @@ -70,8 +68,6 @@ import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import java.awt.*; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; import java.io.File; import java.io.FileWriter; import java.text.SimpleDateFormat; @@ -801,11 +797,7 @@ public class SMTestRunnerResultsForm extends TestResultsPanel for (SMTestProxy proxy : tests) { String url = proxy instanceof SMTestProxy.SMRootTestProxy ? ((SMTestProxy.SMRootTestProxy)proxy).getRootLocation() : proxy.getLocationUrl(); if (url != null) { - ProcessHandler handler = myRoot.getHandler(); - String configurationName = null; - if (handler != null) { - configurationName = handler.getUserData(TestStateStorage.RUN_CONFIGURATION_NAME_KEY); - } + String configurationName = myConfiguration != null ? myConfiguration.getName() : null; storage.writeState(url, new TestStateStorage.Record(proxy.getMagnitude(), new Date(), configurationName == null ? 0 : configurationName.hashCode())); } From 22ad3f402429dbd215723681ea625cf36e403185 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 3 Jun 2016 16:39:30 +0300 Subject: [PATCH 05/16] EA-81852 - assert: DocumentImpl.addDocumentListener --- .../diff/tools/util/FoldingModelSupport.java | 6 ++- .../util/base/ListenerDiffViewerBase.java | 43 ++++--------------- .../tools/util/base/TextDiffViewerUtil.java | 10 +++++ 3 files changed, 23 insertions(+), 36 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java b/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java index 47f3f9f4ef08..f81d6f159692 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java @@ -15,6 +15,7 @@ */ package com.intellij.diff.tools.util; +import com.intellij.diff.tools.util.base.TextDiffViewerUtil; import com.intellij.diff.util.DiffDividerDrawUtil; import com.intellij.diff.util.DiffDrawUtil; import com.intellij.diff.util.DiffUtil; @@ -22,6 +23,7 @@ import com.intellij.diff.util.LineRange; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.FoldRegion; import com.intellij.openapi.editor.event.DocumentAdapter; @@ -75,12 +77,14 @@ public class FoldingModelSupport { myShouldUpdateLineNumbers = new boolean[myCount]; MyDocumentListener documentListener = new MyDocumentListener(); + List documents = ContainerUtil.map(myEditors, EditorEx::getDocument); + TextDiffViewerUtil.installDocumentListeners(documentListener, documents, disposable); + for (int i = 0; i < myCount; i++) { if (myCount > 1) { myEditors[i].getFoldingModel().addListener(new MyFoldingListener(i), disposable); } myEditors[i].getGutterComponentEx().setLineNumberConvertor(getLineConvertor(i)); - myEditors[i].getDocument().addDocumentListener(documentListener, disposable); } } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java b/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java index 1c74e4f84a3e..e9d74176f44e 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java @@ -25,43 +25,31 @@ import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.vfs.*; -import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.Set; public abstract class ListenerDiffViewerBase extends DiffViewerBase { - @NotNull private final DocumentListener myDocumentListener; - @Nullable private final VirtualFileListener myFileListener; - public ListenerDiffViewerBase(@NotNull DiffContext context, @NotNull ContentDiffRequest request) { super(context, request); - myDocumentListener = createDocumentListener(); - myFileListener = createFileListener(request); } @Override protected void onInit() { super.onInit(); - if (myFileListener != null) VirtualFileManager.getInstance().addVirtualFileListener(myFileListener); - for (Document document : getDocuments()) { - document.addDocumentListener(myDocumentListener); - } - } + VirtualFileListener fileListener = createFileListener(myRequest); + if (fileListener != null) VirtualFileManager.getInstance().addVirtualFileListener(fileListener, this); - @Override - protected void onDispose() { - if (myFileListener != null) VirtualFileManager.getInstance().removeVirtualFileListener(myFileListener); - - for (Document document : getDocuments()) { - document.removeDocumentListener(myDocumentListener); - } - super.onDispose(); + DocumentListener documentListener = createDocumentListener(); + List documents = ContainerUtil.mapNotNull(myRequest.getContents(), (content) -> { + return content instanceof DocumentContent ? ((DocumentContent)content).getDocument() : null; + }); + TextDiffViewerUtil.installDocumentListeners(documentListener, documents, this); } @NotNull @@ -124,19 +112,4 @@ public abstract class ListenerDiffViewerBase extends DiffViewerBase { protected void onFileChange(@NotNull VirtualFileEvent event) { scheduleRediff(); } - - // - // Helpers - // - - @NotNull - private Set getDocuments() { - Set documents = new HashSet<>(); - for (DiffContent content : myRequest.getContents()) { - if (content instanceof DocumentContent) { - documents.add(((DocumentContent)content).getDocument()); - } - } - return documents; - } } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java b/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java index 9e44fde874ae..05674c09ab28 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java @@ -31,7 +31,9 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.actions.EditorActionUtil; +import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.editor.event.EditorMouseEvent; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.project.DumbAware; @@ -100,6 +102,14 @@ public class TextDiffViewerUtil { return result; } + public static void installDocumentListeners(@NotNull DocumentListener listener, + @NotNull List documents, + @NotNull Disposable disposable) { + for (Document document : ContainerUtil.newHashSet(documents)) { + document.addDocumentListener(listener, disposable); + } + } + public static void checkDifferentDocuments(@NotNull ContentDiffRequest request) { // Actually, this should be a valid case. But it has little practical sense and will require explicit checks everywhere. // Some listeners will be processed once instead of 2 times, some listeners will cause illegal document modifications. From 5f9c98bfc8e4c4c527ba212164e5e258e3352687 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 3 Jun 2016 17:01:34 +0300 Subject: [PATCH 06/16] vcs: do not erase `myDisposed` flag in commit dialog (EA-80310 - assert: Alarm.checkDisposed) --- .../openapi/vcs/changes/ui/CommitChangeListDialog.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java index 9c6d0ac667a8..a7fc3b63508e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java @@ -101,6 +101,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj @Nullable private final AbstractVcs myVcs; private final boolean myIsAlien; private boolean myDisposed = false; + private boolean myUpdateDisabled = false; @NotNull private final JLabel myWarningLabel; @NotNull private final Map myCheckinChangeListSpecificComponents; @@ -855,12 +856,12 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj } private void stopUpdate() { - myDisposed = true; + myUpdateDisabled = true; myUpdateButtonsRunnable.cancel(); } private void restartUpdate() { - myDisposed = false; + myUpdateDisabled = false; myUpdateButtonsRunnable.restart(this); } @@ -1213,7 +1214,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj } private void updateButtons() { - if (myDisposed) return; + if (myDisposed || myUpdateDisabled) return; final boolean enabled = hasDiffs(); setOKActionEnabled(enabled); if (myCommitAction != null) { @@ -1229,7 +1230,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj } private void updateLegend() { - if (myDisposed) return; + if (myDisposed || myUpdateDisabled) return; myChangesInfoCalculator.update(myBrowser.getCurrentDisplayedChanges(), getIncludedChanges(), myBrowser.getUnversionedFilesCount(), myBrowser.getIncludedUnversionedFiles().size()); myLegend.update(); From 279046b64698c85fdbeffdc89fb3d3a1ff5f124f Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Fri, 3 Jun 2016 17:12:18 +0300 Subject: [PATCH 07/16] IDEA-138256 High DPI monitor issue: New repository location dialog for SVN is cut off --- .../idea/svn/dialogs/AddRepositoryLocationDialog.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/AddRepositoryLocationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/AddRepositoryLocationDialog.java index 746c9d054666..92b1aae316a7 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/AddRepositoryLocationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/AddRepositoryLocationDialog.java @@ -19,6 +19,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.util.ArrayUtil; +import com.intellij.util.ui.JBDimension; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.SvnBundle; import org.tmatesoft.svn.core.SVNException; @@ -75,7 +76,7 @@ public class AddRepositoryLocationDialog extends DialogWrapper { myCombo = new JComboBox(ArrayUtil.toObjectArray(myPreviousLocations)); myCombo.setEditable(true); - myCombo.setMinimumSize(new Dimension(250, 20)); + myCombo.setMinimumSize(new JBDimension(250, 20)); gb.fill = GridBagConstraints.HORIZONTAL; mainPanel.add(myCombo, gb); gb.fill = GridBagConstraints.NONE; From fe02db11dd4369bddf1387b49440d8172a42c419 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 3 Jun 2016 17:20:30 +0300 Subject: [PATCH 08/16] refactoring: ConstructorInjectionComponentAdapter renamed to CachingConstructorInjectionComponentAdapter to avoid confusion with the class from picocontainer library (IDEA-CR-11149) --- .../daemon/impl/ThreadLocalAnnotatorMap.java | 4 ++-- .../components/impl/ComponentManagerImpl.java | 4 ++-- .../extensions/AbstractExtensionPointBean.java | 4 ++-- .../extensions/impl/ExtensionComponentAdapter.java | 4 ++-- .../openapi/extensions/impl/ExtensionsAreaImpl.java | 6 +++--- ...achingConstructorInjectionComponentAdapter.java} | 13 ++++++------- .../intellij/util/pico/DefaultPicoContainer.java | 2 +- .../intellij/find/findUsages/FindUsagesManager.java | 4 ++-- .../actionSystem/impl/ActionManagerImpl.java | 4 ++-- .../openapi/components/impl/ServiceManagerImpl.java | 4 ++-- .../intellij/openapi/project/impl/ProjectImpl.java | 4 ++-- .../fixtures/impl/HeavyTestFixtureBuilderImpl.java | 5 +++-- .../vcs/changes/ui/ChangesViewContentEP.java | 4 ++-- 13 files changed, 31 insertions(+), 31 deletions(-) rename platform/extensions/src/com/intellij/util/pico/{ConstructorInjectionComponentAdapter.java => CachingConstructorInjectionComponentAdapter.java} (84%) diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/ThreadLocalAnnotatorMap.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/ThreadLocalAnnotatorMap.java index 5a62359bf566..fc90a199fb97 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/ThreadLocalAnnotatorMap.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/ThreadLocalAnnotatorMap.java @@ -16,7 +16,7 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.picocontainer.PicoContainer; @@ -55,7 +55,7 @@ abstract class ThreadLocalAnnotatorMap { PicoContainer container = ApplicationManager.getApplication().getPicoContainer(); for (V template : templates) { Class aClass = (Class)template.getClass(); - V clone = (V)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass).getComponentInstance(container); + V clone = (V)new CachingConstructorInjectionComponentAdapter(aClass.getName(), aClass).getComponentInstance(container); result.add(clone); } return result; diff --git a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index b7e7e7e46ee6..e7b6c7c414d4 100644 --- a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -37,7 +37,7 @@ import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusFactory; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import com.intellij.util.pico.DefaultPicoContainer; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; @@ -461,7 +461,7 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements return myNameToComponent.get(name); } - private final class ComponentConfigComponentAdapter extends ConstructorInjectionComponentAdapter { + private final class ComponentConfigComponentAdapter extends CachingConstructorInjectionComponentAdapter { private final PluginId myPluginId; private volatile Object myInitializedComponentInstance; private boolean myInitializing; diff --git a/platform/extensions/src/com/intellij/openapi/extensions/AbstractExtensionPointBean.java b/platform/extensions/src/com/intellij/openapi/extensions/AbstractExtensionPointBean.java index 6433a1e0ca03..9eb4e2dfefe9 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/AbstractExtensionPointBean.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/AbstractExtensionPointBean.java @@ -16,7 +16,7 @@ package com.intellij.openapi.extensions; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.picocontainer.PicoContainer; @@ -72,7 +72,7 @@ public abstract class AbstractExtensionPointBean implements PluginAware { public static T instantiate(@NotNull final Class aClass, @NotNull final PicoContainer container, final boolean allowNonPublicClasses) { - return (T)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass, null, allowNonPublicClasses).getComponentInstance(container); + return (T)new CachingConstructorInjectionComponentAdapter(aClass.getName(), aClass, null, allowNonPublicClasses).getComponentInstance(container); } } diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java index 8618870dc72a..48cd8f8790d3 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java @@ -21,7 +21,7 @@ import com.intellij.openapi.extensions.PluginDescriptor; import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.util.pico.AssignableToComponentAdapter; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import com.intellij.util.xmlb.XmlSerializer; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -166,7 +166,7 @@ public class ExtensionComponentAdapter implements LoadingOrder.Orderable, Assign private synchronized ComponentAdapter getDelegate() { if (myDelegate == null) { Class impl = loadImplementationClass(); - myDelegate = new ConstructorInjectionComponentAdapter(getComponentKey(), impl, null, true); + myDelegate = new CachingConstructorInjectionComponentAdapter(getComponentKey(), impl, null, true); } return myDelegate; diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java index 5105462d2c13..7e7a8e7b019d 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -18,7 +18,7 @@ package com.intellij.openapi.extensions.impl; import com.intellij.openapi.extensions.*; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import com.intellij.util.pico.DefaultPicoContainer; import gnu.trove.THashMap; import org.jdom.Attribute; @@ -234,8 +234,8 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } private Object instantiate(Class clazz) { - ConstructorInjectionComponentAdapter adapter = - new ConstructorInjectionComponentAdapter(Integer.toString(System.identityHashCode(new Object())), clazz); + CachingConstructorInjectionComponentAdapter adapter = + new CachingConstructorInjectionComponentAdapter(Integer.toString(System.identityHashCode(new Object())), clazz); return adapter.getComponentInstance(getPicoContainer()); } diff --git a/platform/extensions/src/com/intellij/util/pico/ConstructorInjectionComponentAdapter.java b/platform/extensions/src/com/intellij/util/pico/CachingConstructorInjectionComponentAdapter.java similarity index 84% rename from platform/extensions/src/com/intellij/util/pico/ConstructorInjectionComponentAdapter.java rename to platform/extensions/src/com/intellij/util/pico/CachingConstructorInjectionComponentAdapter.java index c271a992a83f..def8413d59a0 100644 --- a/platform/extensions/src/com/intellij/util/pico/ConstructorInjectionComponentAdapter.java +++ b/platform/extensions/src/com/intellij/util/pico/CachingConstructorInjectionComponentAdapter.java @@ -27,27 +27,26 @@ import java.security.PrivilegedAction; import java.util.*; /** - * A drop-in replacement of {@link org.picocontainer.defaults.ConstructorInjectionComponentAdapter} + * A drop-in replacement of {@link ConstructorInjectionComponentAdapter} * The same code (generified and cleaned up) but without constructor caching (hence taking up less memory). * This class also inlines instance caching (e.g. it doesn't need to be wrapped in a CachingComponentAdapter). */ -@SuppressWarnings("ClassNameSameAsAncestorName") -public class ConstructorInjectionComponentAdapter extends org.picocontainer.defaults.ConstructorInjectionComponentAdapter { +public class CachingConstructorInjectionComponentAdapter extends ConstructorInjectionComponentAdapter { private Object myInstance; - public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses, ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy) throws AssignabilityRegistrationException, NotConcreteRegistrationException { + public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses, ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy) throws AssignabilityRegistrationException, NotConcreteRegistrationException { super(componentKey, componentImplementation, parameters, allowNonPublicClasses, monitor, lifecycleStrategy); } - public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses) throws AssignabilityRegistrationException, NotConcreteRegistrationException { + public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses) throws AssignabilityRegistrationException, NotConcreteRegistrationException { super(componentKey, componentImplementation, parameters, allowNonPublicClasses); } - public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) { + public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) { this(componentKey, componentImplementation, parameters, false); } - public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation) throws AssignabilityRegistrationException, NotConcreteRegistrationException { + public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation) throws AssignabilityRegistrationException, NotConcreteRegistrationException { this(componentKey, componentImplementation, null); } diff --git a/platform/extensions/src/com/intellij/util/pico/DefaultPicoContainer.java b/platform/extensions/src/com/intellij/util/pico/DefaultPicoContainer.java index 3d8008bea4e9..59f1a6b8b633 100644 --- a/platform/extensions/src/com/intellij/util/pico/DefaultPicoContainer.java +++ b/platform/extensions/src/com/intellij/util/pico/DefaultPicoContainer.java @@ -353,7 +353,7 @@ public class DefaultPicoContainer implements AreaPicoContainer, Serializable { @Override public ComponentAdapter registerComponentImplementation(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) { - ComponentAdapter componentAdapter = new ConstructorInjectionComponentAdapter(componentKey, componentImplementation, parameters, true); + ComponentAdapter componentAdapter = new CachingConstructorInjectionComponentAdapter(componentKey, componentImplementation, parameters, true); return registerComponent(componentAdapter); } diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java index 08d30f63c5d6..43b4b8d3ce36 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java @@ -68,7 +68,7 @@ import com.intellij.usages.*; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -189,7 +189,7 @@ public class FindUsagesManager { for (FindUsagesHandlerFactory factory : Extensions.getExtensions(FindUsagesHandlerFactory.EP_NAME, myProject)) { if (factory.canFindUsages(element)) { Class aClass = factory.getClass(); - FindUsagesHandlerFactory copy = (FindUsagesHandlerFactory)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass) + FindUsagesHandlerFactory copy = (FindUsagesHandlerFactory)new CachingConstructorInjectionComponentAdapter(aClass.getName(), aClass) .getComponentInstance(myProject.getPicoContainer()); final FindUsagesHandler handler = copy.createFindUsagesHandler(element, forHighlightUsages); if (handler == FindUsagesHandler.NULL_HANDLER) return null; diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java index 7f356e9dea0c..cdbcdb9c0e19 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java @@ -53,7 +53,7 @@ import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.intellij.util.messages.MessageBusConnection; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import com.intellij.util.ui.UIUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; @@ -666,7 +666,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab group = new DefaultCompactActionGroup(); } else { Class aClass = Class.forName(className, true, loader); - Object obj = new ConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(ApplicationManager.getApplication().getPicoContainer()); + Object obj = new CachingConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(ApplicationManager.getApplication().getPicoContainer()); if (!(obj instanceof ActionGroup)) { reportActionError(pluginId, "class with name \"" + className + "\" should be instance of " + ActionGroup.class.getName()); diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java index 7f4a76a8558a..d810f1fe583a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java @@ -36,7 +36,7 @@ import com.intellij.util.PairProcessor; import com.intellij.util.PlatformUtils; import com.intellij.util.io.storage.HeavyProcessLatch; import com.intellij.util.pico.AssignableToComponentAdapter; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.picocontainer.*; @@ -263,7 +263,7 @@ public class ServiceManagerImpl implements BaseComponent { throw new RuntimeException(e); } - myDelegate = new ConstructorInjectionComponentAdapter(getComponentKey(), implClass, null, true); + myDelegate = new CachingConstructorInjectionComponentAdapter(getComponentKey(), implClass, null, true); } return myDelegate; } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index 424505bc3d83..c31f54e76d78 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -54,7 +54,7 @@ import com.intellij.openapi.wm.impl.FrameTitleBuilder; import com.intellij.psi.impl.DebugUtil; import com.intellij.util.TimedReference; import com.intellij.util.io.storage.HeavyProcessLatch; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -161,7 +161,7 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project private ComponentAdapter getDelegate() { if (myDelegate == null) { Class storeClass = projectStoreClassProvider.getProjectStoreClass(isDefault()); - myDelegate = new ConstructorInjectionComponentAdapter(storeClass, storeClass, null, true); + myDelegate = new CachingConstructorInjectionComponentAdapter(storeClass, storeClass, null, true); } return myDelegate; } diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyTestFixtureBuilderImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyTestFixtureBuilderImpl.java index 2a7f4dd6aeb2..6277af4e5f78 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyTestFixtureBuilderImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyTestFixtureBuilderImpl.java @@ -20,7 +20,7 @@ import com.intellij.testFramework.builders.ModuleFixtureBuilder; import com.intellij.testFramework.fixtures.HeavyIdeaTestFixture; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; import com.intellij.testFramework.fixtures.TestFixtureBuilder; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import com.intellij.util.pico.DefaultPicoContainer; import org.jetbrains.annotations.NotNull; import org.junit.Assert; @@ -48,7 +48,8 @@ class HeavyTestFixtureBuilderImpl implements TestFixtureBuilder M createModuleBuilder(Class key) { Class implClass = myProviders.get(key); Assert.assertNotNull(key.toString(), implClass); - final ConstructorInjectionComponentAdapter adapter = new ConstructorInjectionComponentAdapter(implClass, implClass, null, true); + final CachingConstructorInjectionComponentAdapter + adapter = new CachingConstructorInjectionComponentAdapter(implClass, implClass, null, true); return (M)adapter.getComponentInstance(myContainer); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesViewContentEP.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesViewContentEP.java index 135e5b2c0648..bae581c67680 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesViewContentEP.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesViewContentEP.java @@ -21,7 +21,7 @@ import com.intellij.openapi.extensions.PluginAware; import com.intellij.openapi.extensions.PluginDescriptor; import com.intellij.openapi.project.Project; import com.intellij.util.NotNullFunction; -import com.intellij.util.pico.ConstructorInjectionComponentAdapter; +import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter; import com.intellij.util.xmlb.annotations.Attribute; import org.jetbrains.annotations.Nullable; @@ -90,7 +90,7 @@ public class ChangesViewContentEP implements PluginAware { try { final Class aClass = Class.forName(className, true, myPluginDescriptor == null ? getClass().getClassLoader() : myPluginDescriptor.getPluginClassLoader()); - return new ConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(project.getPicoContainer()); + return new CachingConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(project.getPicoContainer()); } catch(Exception e) { LOG.error(e); From 48365fc95fdf18426595f0cc8b0eb80821b3890e Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 3 Jun 2016 17:29:20 +0300 Subject: [PATCH 09/16] Apache Commons Compress licence moved to community --- build/scripts/libLicenses.gant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index e7d1bd41f2a3..a295e970a802 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -162,7 +162,7 @@ libraryLicense(name: "ANTLR 4 Runtime", libraryName: "antlr-runtime-4.1.jar", ve libraryLicense(name: "Antlr", libraryName: "antlr.jar", version: "3.4", license: "BSD", url: "http://www.antlr.org", licenseUrl: "http://www.antlr.org/license.html") libraryLicense(name: "Apache Commons BeanUtils", libraryName: "commons-beanutils.jar", version: "1.6", license: "Apache 2.0", url: "http://commons.apache.org/beanutils/") libraryLicense(name: "Apache Commons Codec", libraryName: "commons-codec", version: "1.8", license: "Apache 2.0", url: "http://commons.apache.org/codec/", licenseUrl: "http://www.apache.org/licenses/") -libraryLicense(name: "Apache Commons Compress", libraryName: "commons-compress-android", version: "1.0", license: "Apache 2.0", url: "http://commons.apache.org/proper/commons-compress/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0") +libraryLicense(name: "Apache Commons Compress", libraryName: "commons-compress", version: "1.10", license: "Apache 2.0", url: "http://commons.apache.org/proper/commons-compress/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0") libraryLicense(name: "Apache Commons Discovery", libraryName: "commons-discovery-0.4.jar", version: "0.4", license: "Apache 2.0", url: "http://jakarta.apache.org/commons/discovery/", licenseUrl: "http://www.apache.org/licenses/") libraryLicense(name: "Apache Commons HTTPClient", libraryName: "http-client-3.1", version: "3.1  (with patch by JetBrains)", license: "Apache 2.0", url: "http://hc.apache.org/httpclient-3.x") libraryLicense(name: "Apache Commons IO", libraryName: "commons-io-1.4.jar", version: "1.4", license: "Apache 2.0", url: "http://commons.apache.org/io/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0.txt") From cecd48064c0d30c005d5c0c922f72569b02ab365 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Fri, 3 Jun 2016 18:38:02 +0300 Subject: [PATCH 10/16] IDEA-156890 Support ANSI colors in Gradle task execution output --- .../execution/ExternalSystemRunConfiguration.java | 15 ++++++++++++++- .../execution/test/runner/GradleSMTestProxy.java | 13 +++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java index b3685bf87d0a..f523bb33b24f 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java @@ -9,6 +9,7 @@ import com.intellij.execution.configurations.LocatableConfigurationBase; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.executors.DefaultDebugExecutor; +import com.intellij.execution.process.AnsiEscapeDecoder; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.process.ProcessOutputTypes; import com.intellij.execution.runners.ExecutionEnvironment; @@ -30,6 +31,7 @@ import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.WriteExternalException; import com.intellij.util.ExceptionUtil; import com.intellij.util.containers.ContainerUtilRt; @@ -236,13 +238,19 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase { } } - private static class MyProcessHandler extends ProcessHandler { + private static class MyProcessHandler extends ProcessHandler implements AnsiEscapeDecoder.ColoredTextAcceptor { private final ExternalSystemExecuteTaskTask myTask; + private final AnsiEscapeDecoder myAnsiEscapeDecoder = new AnsiEscapeDecoder(); public MyProcessHandler(ExternalSystemExecuteTaskTask task) { myTask = task; } + @Override + public void notifyTextAvailable(final String text, final Key outputType) { + myAnsiEscapeDecoder.escapeText(text, outputType, this); + } + @Override protected void destroyProcessImpl() { } @@ -268,6 +276,11 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase { public void notifyProcessTerminated(int exitCode) { super.notifyProcessTerminated(exitCode); } + + @Override + public void coloredTextAvailable(String text, Key attributes) { + super.notifyTextAvailable(text, attributes); + } } @NotNull diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java index 978610068c01..3f472fc39341 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java @@ -17,9 +17,13 @@ package org.jetbrains.plugins.gradle.execution.test.runner; import com.intellij.execution.Location; import com.intellij.execution.stacktrace.StackTraceLine; +import com.intellij.execution.testframework.Printable; +import com.intellij.execution.testframework.Printer; import com.intellij.execution.testframework.sm.runner.SMTestProxy; +import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.openapi.diff.LineTokenizer; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; @@ -40,6 +44,15 @@ public class GradleSMTestProxy extends SMTestProxy { myClassName = className; } + @Override + public void addStdOutput(String output, Key outputType) { + addLast(new Printable() { + public void printOn(final Printer printer) { + printer.printWithAnsiColoring(output, ConsoleViewContentType.getConsoleViewType(outputType)); + } + }); + } + @Override public void setTestFailed(@NotNull String localizedMessage, @Nullable String stackTrace, boolean testError) { setStacktraceIfNotSet(stackTrace); From 4a998c632d37aa2aca4dd5ccb546440afd780581 Mon Sep 17 00:00:00 2001 From: Alexander Kass Date: Fri, 3 Jun 2016 18:48:04 +0300 Subject: [PATCH 11/16] incorrect intention popup position for oneline editor --- .../src/com/intellij/ui/popup/PopupFactoryImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java b/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java index fd64eaab11a6..fd7ad80c3081 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java @@ -675,7 +675,13 @@ public class PopupFactoryImpl extends JBPopupFactory { Point p = editor.visualPositionToXY(new VisualPosition(visualPosition.line + 1, visualPosition.column)); final Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); - return visibleArea.contains(p) ? p : null; + if (!visibleArea.contains(p)) { + int h = editor.getLineHeight(); + p.y -= h; + if (!visibleArea.contains(p)) return null; + p.y += h; + } + return p; } @Override From ea6eb6ece1ebb4322a49821d3bbb20c039158191 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Fri, 3 Jun 2016 17:50:51 +0200 Subject: [PATCH 12/16] WI-31893 Template project: provide progress indicator for creating a new project --- .../templates/TemplateModuleBuilder.java | 131 ++++++++++++++---- 1 file changed, 104 insertions(+), 27 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java b/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java index fd1da18ca73d..927bb30bff93 100644 --- a/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java +++ b/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java @@ -22,22 +22,29 @@ import com.intellij.execution.configurations.RunConfiguration; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.ide.util.projectWizard.*; +import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Attachment; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.module.*; import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; +import com.intellij.openapi.project.impl.ProjectMacrosUtil; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.*; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.text.StringUtilRt; import com.intellij.openapi.vfs.CharsetToolkit; @@ -54,6 +61,7 @@ import org.apache.velocity.exception.VelocityException; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.PathMacroUtil; import javax.swing.*; import java.io.File; @@ -157,7 +165,7 @@ public class TemplateModuleBuilder extends ModuleBuilder { throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException { final String path = getContentEntryPath(); final ExistingModuleLoader loader = ExistingModuleLoader.setUpLoader(getModuleFilePath()); - unzip(loader.getName(), path, true); + unzip(loader.getName(), path, true, null, true); Module module = loader.createModule(moduleModel); if (myProjectMode) { moduleModel.renameModule(module, module.getProject().getName()); @@ -190,7 +198,11 @@ public class TemplateModuleBuilder extends ModuleBuilder { return null; } - private void unzip(final @Nullable String projectName, String path, final boolean moduleMode) { + private void unzip(final @Nullable String projectName, + String path, + final boolean moduleMode, + @Nullable ProgressIndicator pI, + boolean reportFailuresWithDialog) { final WizardInputField basePackage = getBasePackageField(); try { final NullableFunction pathConvertor = path1 -> { @@ -224,20 +236,21 @@ public class TemplateModuleBuilder extends ModuleBuilder { return; } - String dialogMessage; - if (myFailures.size() == 1) { - dialogMessage = "Failed to decode file \'" + myFailures.get(0).getFirst() + "\'"; - } - else { - StringBuilder dialogMessageBuilder = new StringBuilder(); - dialogMessageBuilder.append("Failed to decode files: \n"); - for (Trinity failure : myFailures) { - dialogMessageBuilder.append(failure.getFirst()).append("\n"); + if(reportFailuresWithDialog) { + String dialogMessage; + if (myFailures.size() == 1) { + dialogMessage = "Failed to decode file \'" + myFailures.get(0).getFirst() + "\'"; } - dialogMessage = dialogMessageBuilder.toString(); + else { + StringBuilder dialogMessageBuilder = new StringBuilder(); + dialogMessageBuilder.append("Failed to decode files: \n"); + for (Trinity failure : myFailures) { + dialogMessageBuilder.append(failure.getFirst()).append("\n"); + } + dialogMessage = dialogMessageBuilder.toString(); + } + Messages.showErrorDialog(dialogMessage, "Decoding Template"); } - Messages.showErrorDialog(dialogMessage, "Decoding Template"); - StringBuilder reportBuilder = new StringBuilder(); for (Trinity failure : myFailures) { @@ -259,6 +272,9 @@ public class TemplateModuleBuilder extends ModuleBuilder { ZipUtil.unzip(ProgressManager.getInstance().getProgressIndicator(), dir, stream, pathConvertor, new ZipUtil.ContentProcessor() { @Override public byte[] processContent(byte[] content, File file) throws IOException { + if(pI != null){ + pI.checkCanceled(); + } FileType fileType = FileTypeManager.getInstance().getFileTypeByExtension(FileUtilRt.getExtension(file.getName())); String text = new String(content, CharsetToolkit.UTF8_CHARSET); consumer.setCurrentFile(file.getName(), text); @@ -318,21 +334,82 @@ public class TemplateModuleBuilder extends ModuleBuilder { @Nullable @Override public Project createProject(String name, final String path) { - myProjectMode = true; - unzip(name, path, false); - return ApplicationManager.getApplication().runWriteAction(new NullableComputable() { - @Nullable - @Override - public Project compute() { - try { - return ProjectManagerEx.getInstanceEx().convertAndLoadProject(path); - } - catch (IOException e) { - LOG.error(e); - return null; - } + final File location = new File(FileUtil.toSystemDependentName(path)); + LOG.assertTrue(location.exists()); + + final VirtualFile baseDir = ApplicationManager.getApplication().runWriteAction(new Computable() { + public VirtualFile compute() { + return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(location); } }); + if (baseDir == null) { + LOG.error("Couldn't find path '" + path + "' in VFS"); + return null; + } + + VirtualFile[] children = baseDir.getChildren(); + boolean isSomehowOverwriting = children.length > 1 || + (children.length == 1 && !PathMacroUtil.DIRECTORY_STORE_NAME.equals(children[0].getName())); + + Ref canceledRef = new Ref<>(); + Ref projectRef = new Ref<>(); + Task.Modal task = new Task.Modal(null, "Applying Template", true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + try { + projectRef.set(createProject(name, path, indicator)); + } + finally { + cleanup(); + if(indicator.isCanceled()){ + canceledRef.set(true); + if (!isSomehowOverwriting) { + ApplicationManager.getApplication().invokeLater(() -> { + AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(TemplateProjectDirectoryGenerator.class); + try { + baseDir.delete(TemplateProjectDirectoryGenerator.class); + } + catch (IOException e) { + LOG.error(e); + } + finally { + token.close(); + } + }); + } + } + } + } + }; + ProgressManager.getInstance().run(task); + if(canceledRef.get() == Boolean.TRUE){ + throw new ProcessCanceledException(); + } + return projectRef.get(); + } + + @Nullable + private Project createProject(String name, final String path, @Nullable ProgressIndicator progressIndicator) { + myProjectMode = true; + unzip(name, path, false, progressIndicator, false); + Ref projectRef = new Ref<>(); + ApplicationManager.getApplication().invokeAndWait(()->{ + projectRef.set( + ApplicationManager.getApplication().runWriteAction(new NullableComputable() { + @Nullable + @Override + public Project compute() { + try { + return ProjectManagerEx.getInstanceEx().convertAndLoadProject(path); + } + catch (IOException e) { + LOG.error(e); + return null; + } + } + })); + }, ModalityState.any()); + return projectRef.get(); } private final static Logger LOG = Logger.getInstance(TemplateModuleBuilder.class); From 4af4e654bb82b05d426dc2dca1fba9e196989e1d Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Fri, 3 Jun 2016 17:57:36 +0200 Subject: [PATCH 13/16] Template project: better text on progress indicator --- .../intellij/platform/templates/TemplateModuleBuilder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java b/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java index 927bb30bff93..00fdd3508707 100644 --- a/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java +++ b/platform/lang-impl/src/com/intellij/platform/templates/TemplateModuleBuilder.java @@ -37,7 +37,6 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; -import com.intellij.openapi.project.impl.ProjectMacrosUtil; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; @@ -285,6 +284,10 @@ public class TemplateModuleBuilder extends ModuleBuilder { } }); + if(pI != null) { + pI.setText("Refreshing..."); + } + String iml = ContainerUtil.find(dir.list(), s -> s.endsWith(".iml")); if (moduleMode) { File from = new File(path, iml); From 9a2b4f1a5196d5b7b01a9be0896abac063e7541e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 3 Jun 2016 16:11:49 +0300 Subject: [PATCH 14/16] EA-83492 - ISE: VisibilityUtil.getVisibilityString --- .../extractMethodObject/ExtractMethodObjectDialog.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java index d148cf645d4e..ada03da2a969 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java @@ -209,10 +209,7 @@ public class ExtractMethodObjectDialog extends DialogWrapper implements Abstract if (myProtectedRadioButton.isSelected()) { return PsiModifier.PROTECTED; } - if (myPrivateRadioButton.isSelected()) { - return PsiModifier.PRIVATE; - } - return null; + return PsiModifier.PRIVATE; } From 130abb0e05923c823401851daf78646e3e03e97e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 3 Jun 2016 16:29:48 +0300 Subject: [PATCH 15/16] NPE --- .../intellij/rt/execution/testFrameworks/ForkedSplitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-runtime/src/com/intellij/rt/execution/testFrameworks/ForkedSplitter.java b/java/java-runtime/src/com/intellij/rt/execution/testFrameworks/ForkedSplitter.java index 3e124dd2d4d8..64bc43cad745 100644 --- a/java/java-runtime/src/com/intellij/rt/execution/testFrameworks/ForkedSplitter.java +++ b/java/java-runtime/src/com/intellij/rt/execution/testFrameworks/ForkedSplitter.java @@ -42,7 +42,7 @@ public abstract class ForkedSplitter extends ForkedByModuleSplitter { sendTree(myRootDescription); if (myWorkingDirsPath == null || new File(myWorkingDirsPath).length() == 0) { final String classpath = System.getProperty("java.class.path"); - if (RepeatCount.getCount(repeatCount) != 0 && myForkMode.equals("repeat")) { + if (repeatCount != null && RepeatCount.getCount(repeatCount) != 0 && myForkMode.equals("repeat")) { return startChildFork(createChildArgs(myRootDescription), null, classpath, repeatCount); } final List children = getChildren(myRootDescription); From f496c7f0f5f3fc72466b5561e067e0428b672d01 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 3 Jun 2016 18:14:07 +0300 Subject: [PATCH 16/16] move: ensure encoding is done before any change so mutual references are processed correctly (IDEA-157066) --- .../MoveClassesOrPackagesProcessor.java | 8 +++++++- .../moveClass/conflictingNames/after/p1/empty.txt | 0 .../moveClass/conflictingNames/after/p2/First.java | 2 ++ .../moveClass/conflictingNames/after/p2/Test.java | 4 ++++ .../moveClass/conflictingNames/after/p3/First.java | 2 ++ .../moveClass/conflictingNames/after/p3/Second.java | 10 ++++++++++ .../moveClass/conflictingNames/after/p3/empty.txt | 0 .../moveClass/conflictingNames/before/p1/First.java | 2 ++ .../moveClass/conflictingNames/before/p1/Second.java | 10 ++++++++++ .../moveClass/conflictingNames/before/p1/empty.txt | 0 .../moveClass/conflictingNames/before/p2/First.java | 2 ++ .../moveClass/conflictingNames/before/p2/Test.java | 4 ++++ .../moveClass/conflictingNames/before/p3/empty.txt | 0 .../com/intellij/refactoring/MoveClassTest.java | 4 ++++ 14 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p1/empty.txt create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/First.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/Test.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/First.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/Second.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/empty.txt create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/First.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/Second.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/empty.txt create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/First.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/Test.java create mode 100644 java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p3/empty.txt diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index eeb7acb48cf6..af89fa0f65b4 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -499,6 +499,13 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } } } + + for (PsiElement element : myElementsToMove) { + if (element instanceof PsiClass) { + MoveClassesOrPackagesUtil.prepareMoveClass((PsiClass)element); + } + } + final Map oldToNewElementsMapping = new HashMap(); for (int idx = 0; idx < myElementsToMove.length; idx++) { PsiElement element = myElementsToMove[idx]; @@ -528,7 +535,6 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } else if (element instanceof PsiClass) { final PsiClass psiClass = (PsiClass)element; - MoveClassesOrPackagesUtil.prepareMoveClass(psiClass); final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass(psiClass, myMoveDestination.getTargetDirectory(element.getContainingFile()), allClasses.get(psiClass)); oldToNewElementsMapping.put(element, newElement); element = newElement; diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p1/empty.txt b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/First.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/First.java new file mode 100644 index 000000000000..3caf28f29574 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/First.java @@ -0,0 +1,2 @@ +package p2; +public class First {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/Test.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/Test.java new file mode 100644 index 000000000000..378e819e4ad0 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p2/Test.java @@ -0,0 +1,4 @@ +package p2; +public class Test { + public static void f() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/First.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/First.java new file mode 100644 index 000000000000..db291b05477c --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/First.java @@ -0,0 +1,2 @@ +package p3; +public class First extends p2.First {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/Second.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/Second.java new file mode 100644 index 000000000000..aca27357a6e7 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/Second.java @@ -0,0 +1,10 @@ +package p3; + +import p2.*; + +class Second { + { + new First(); + Test.f(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/empty.txt b/java/java-tests/testData/refactoring/moveClass/conflictingNames/after/p3/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/First.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/First.java new file mode 100644 index 000000000000..f718a8d53d35 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/First.java @@ -0,0 +1,2 @@ +package p1; +public class First extends p2.First {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/Second.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/Second.java new file mode 100644 index 000000000000..d299fb47a5b1 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/Second.java @@ -0,0 +1,10 @@ +package p1; + +import p2.*; + +class Second { + { + new First(); + Test.f(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/empty.txt b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/First.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/First.java new file mode 100644 index 000000000000..3caf28f29574 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/First.java @@ -0,0 +1,2 @@ +package p2; +public class First {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/Test.java b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/Test.java new file mode 100644 index 000000000000..378e819e4ad0 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p2/Test.java @@ -0,0 +1,4 @@ +package p2; +public class Test { + public static void f() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p3/empty.txt b/java/java-tests/testData/refactoring/moveClass/conflictingNames/before/p3/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveClassTest.java index 98c749655c2d..c3baf432496b 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveClassTest.java @@ -94,6 +94,10 @@ public class MoveClassTest extends RefactoringTestCase { doTest("qualifiedRef", new String[]{"p1.Test"}, "p2"); } + public void testConflictingClassNames() throws Exception { + doTest("conflictingNames", new String[] {"p1.First", "p1.Second"}, "p3"); + } + private void doTest(@NonNls String testName, @NonNls String[] classNames, @NonNls String newPackageName) throws Exception{ String root = JavaTestUtil.getJavaTestDataPath() + "/refactoring/moveClass/" + testName;