From 0508ea04d3141250538a0f0476ae3d44045db71d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 4 Oct 2011 16:46:07 +0200 Subject: [PATCH 01/38] java-psi-impl depends on resource-en (messages) --- java/java-psi-impl/java-psi-impl.iml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/java-psi-impl/java-psi-impl.iml b/java/java-psi-impl/java-psi-impl.iml index 396e8549943a..9a13137f6808 100644 --- a/java/java-psi-impl/java-psi-impl.iml +++ b/java/java-psi-impl/java-psi-impl.iml @@ -9,6 +9,7 @@ + From d3e12dfe4a432861b99259baea3bc10f62e69aed Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 4 Oct 2011 18:01:56 +0400 Subject: [PATCH 02/38] Fix GitLogStatusInfo for the COPIED case. GitLogStatusInfo.verifyParameters expected second path only for RENAMEs. It should expect it for COPIED as well. Made GitChangeType hold the information about necessity of the second path. --- .../src/git4idea/history/GitChangeType.java | 24 ++++++++++++++++--- .../git4idea/history/GitLogStatusInfo.java | 10 +++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/plugins/git4idea/src/git4idea/history/GitChangeType.java b/plugins/git4idea/src/git4idea/history/GitChangeType.java index a0a1d000fcb7..4dea24f36e7c 100644 --- a/plugins/git4idea/src/git4idea/history/GitChangeType.java +++ b/plugins/git4idea/src/git4idea/history/GitChangeType.java @@ -24,19 +24,30 @@ import org.jetbrains.annotations.NotNull; enum GitChangeType { MODIFIED('M'), ADDED('A'), - COPIED('C'), + COPIED('C', true), DELETED('D'), - RENAMED('R'), + RENAMED('R', true), UNRESOLVED('U'), TYPE_CHANGED('T') ; - private char myChar; + private final char myChar; + private final boolean myRequiresSecondPath; GitChangeType(char c) { + this(c, false); + } + + GitChangeType(char c, boolean requiresSecondPath) { myChar = c; + myRequiresSecondPath = requiresSecondPath; } + /** + * Finds the GitChangeType by the given string returned by Git. + * @throws GitFormatException if such status can't be found: it means either a developer mistake missing a possible valid status, + * or a Git invalid output. + */ @NotNull static GitChangeType fromString(@NotNull String statusString) { assert statusString.length() > 0; @@ -48,5 +59,12 @@ enum GitChangeType { } throw new GitFormatException("Unexpected status [" + statusString + "]"); } + + /** + * @return true if this change type has 2 paths: old and new. This is true for renames and copies. + */ + boolean requiresSecondPath() { + return myRequiresSecondPath; + } } diff --git a/plugins/git4idea/src/git4idea/history/GitLogStatusInfo.java b/plugins/git4idea/src/git4idea/history/GitLogStatusInfo.java index ba1fef8bb894..b2685b659a6d 100644 --- a/plugins/git4idea/src/git4idea/history/GitLogStatusInfo.java +++ b/plugins/git4idea/src/git4idea/history/GitLogStatusInfo.java @@ -15,6 +15,7 @@ */ package git4idea.history; +import com.intellij.openapi.diagnostic.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -24,6 +25,9 @@ import org.jetbrains.annotations.Nullable; * @author Kirill Likhodedov */ class GitLogStatusInfo { + + private static final Logger LOG = Logger.getInstance(GitLogStatusInfo.class); + private final GitChangeType myType; private final String myPath; private final String mySecondPath; @@ -39,10 +43,10 @@ class GitLogStatusInfo { * SecondPath == null iff it the type is rename */ private static void verifyParameters(@NotNull GitChangeType type, @NotNull String path, @Nullable String secondPath) { - if (type == GitChangeType.RENAMED) { - assert secondPath != null; + if (type.requiresSecondPath()) { + LOG.assertTrue(secondPath != null, "Rename change should have the second path"); } else { - assert secondPath == null; + LOG.assertTrue(secondPath == null, "Second path should be null in case of change type [" + type + "]"); } } From e91c3f572420c725e09fc2ddb8ad490db156fd4c Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 4 Oct 2011 19:50:06 +0400 Subject: [PATCH 03/38] IDEA-68504 Enable GitAdd if at least one of selected files can be added or is a directory. Allow to add a directory even if all files inside are, for instance, not changed, not to look through the whole folder tree: git add is harmless for such files anyway. --- plugins/git4idea/src/git4idea/actions/GitAdd.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/actions/GitAdd.java b/plugins/git4idea/src/git4idea/actions/GitAdd.java index 907b5ce8250f..8343152e1d5c 100644 --- a/plugins/git4idea/src/git4idea/actions/GitAdd.java +++ b/plugins/git4idea/src/git4idea/actions/GitAdd.java @@ -84,8 +84,10 @@ public class GitAdd extends BasicAction { protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) { for (VirtualFile file : vFiles) { FileStatus fileStatus = FileStatusManager.getInstance(project).getStatus(file); - if (fileStatus == FileStatus.NOT_CHANGED || fileStatus == FileStatus.DELETED) return false; + if (file.isDirectory() || (fileStatus != FileStatus.NOT_CHANGED && fileStatus != FileStatus.DELETED)) { + return true; + } } - return true; + return false; } } From 8f48b9a59deec35831a6312a361e6d6be7612d4b Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 4 Oct 2011 17:50:07 +0400 Subject: [PATCH 04/38] Fix EA-30006: MvcProjectViewPane.updateFromRoot() should be called in AWT thread. --- .../mvc/projectView/MvcProjectViewPane.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java index a372b5dc8e7e..d9a9c5e9a7d1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.mvc.projectView; import com.intellij.ide.util.EditorHelper; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.*; @@ -97,13 +98,27 @@ public class MvcProjectViewPane extends AbstractProjectViewPSIPane implements Id } }; - project.getMessageBus().connect(this).subscribe(PsiModificationTracker.TOPIC, new PsiModificationTracker.Listener() { - public void modificationCountChanged() { + class TreeUpdater implements Runnable, PsiModificationTracker.Listener { + private volatile boolean myInQueue; + + @Override + public void run() { if (getTree() != null && getTreeBuilder() != null) { updateFromRoot(true); } + myInQueue = false; } - }); + + @Override + public void modificationCountChanged() { + if (!myInQueue) { + myInQueue = true; + ApplicationManager.getApplication().invokeLater(this); + } + } + } + + project.getMessageBus().connect(this).subscribe(PsiModificationTracker.TOPIC, new TreeUpdater()); myComponent = new JPanel(new BorderLayout()); myComponent.add(createComponent(), BorderLayout.CENTER); From 7444dda53e8f3e564cd0cb7d7db5dc9e5bc3f5ae Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 4 Oct 2011 19:47:37 +0400 Subject: [PATCH 05/38] Fix EA-30104: ClassNotFound exception: Don't forget that plugins loaded by different class loader. --- .../groovy/util/ClassInstanceCache.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java index 22d4893c1d56..bf536189f4b1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java @@ -1,5 +1,7 @@ package org.jetbrains.plugins.groovy.util; +import com.intellij.ide.plugins.IdeaPluginDescriptor; +import com.intellij.ide.plugins.PluginManager; import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; @@ -13,24 +15,42 @@ public class ClassInstanceCache { private ClassInstanceCache() { } - @SuppressWarnings("unchecked") - public static T getInstance(@NotNull String className) { - Object res = CACHE.get(className); - if (res != null) return (T)res; - + private static Object createInstance(@NotNull String className) { try { - Object instance = Class.forName(className).newInstance(); - - Object oldValue = CACHE.putIfAbsent(className, instance); - if (oldValue != null) { - instance = oldValue; + try { + return Class.forName(className).newInstance(); } + catch (ClassNotFoundException e) { + for (IdeaPluginDescriptor descriptor : PluginManager.getPlugins()) { + try { + return descriptor.getPluginClassLoader().loadClass(className).newInstance(); + } + catch (ClassNotFoundException ignored) { - return (T)instance; + } + } + + throw new RuntimeException("Class not found: " + className); + } } catch (Exception e) { throw new RuntimeException(e); } } + + @SuppressWarnings("unchecked") + public static T getInstance(@NotNull String className) { + Object res = CACHE.get(className); + if (res == null) { + res = createInstance(className); + + Object oldValue = CACHE.putIfAbsent(className, res); + if (oldValue != null) { + res = oldValue; + } + } + + return (T)res; + } } From 63c3561084a842ad83fe39e6903f237420b19152 Mon Sep 17 00:00:00 2001 From: Nikolay Matveev Date: Tue, 4 Oct 2011 19:45:28 +0400 Subject: [PATCH 06/38] Mac: 100% CPU and hang on shutdown (IDEA-74601) --- .../fileTypes/FileTypeUsagesCollector.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/fileTypes/FileTypeUsagesCollector.java b/platform/lang-impl/src/com/intellij/openapi/fileTypes/FileTypeUsagesCollector.java index a29639cf9ad2..a93b73fae882 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileTypes/FileTypeUsagesCollector.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileTypes/FileTypeUsagesCollector.java @@ -18,6 +18,7 @@ package com.intellij.openapi.fileTypes; import com.intellij.internal.statistic.AbstractApplicationUsagesCollector; import com.intellij.internal.statistic.beans.GroupDescriptor; import com.intellij.internal.statistic.beans.UsageDescriptor; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.FileTypeIndex; @@ -45,23 +46,30 @@ public class FileTypeUsagesCollector extends AbstractApplicationUsagesCollector @NotNull @Override - public Set getProjectUsages(@NotNull Project project) { + public Set getProjectUsages(@NotNull final Project project) { final Set usedFileTypes = new HashSet(); - final FileType[] registeredFileTypes = FileTypeManager.getInstance().getRegisteredFileTypes(); - for (final FileType fileType : registeredFileTypes) { - FileBasedIndex.getInstance().processValues( - FileTypeIndex.NAME, - fileType, - null, - new FileBasedIndex.ValueProcessor() { - @Override - public boolean process(VirtualFile file, Void value) { - usedFileTypes.add(fileType); - return false; + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + if (!project.isDisposed()) { + final FileType[] registeredFileTypes = FileTypeManager.getInstance().getRegisteredFileTypes(); + for (final FileType fileType : registeredFileTypes) { + FileBasedIndex.getInstance().processValues( + FileTypeIndex.NAME, + fileType, + null, + new FileBasedIndex.ValueProcessor() { + @Override + public boolean process(VirtualFile file, Void value) { + usedFileTypes.add(fileType); + return false; + } + }, GlobalSearchScope.projectScope(project)); } - }, GlobalSearchScope.projectScope(project)); - } - usedFileTypes.add(UnknownFileType.INSTANCE); + usedFileTypes.add(UnknownFileType.INSTANCE); + } + } + }); return ContainerUtil.map2Set(usedFileTypes, new NotNullFunction() { @NotNull @Override From fad711bdc995ffbe6444b6e99df59320f156e9e7 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 4 Oct 2011 19:20:22 +0400 Subject: [PATCH 07/38] EA-29860 fix NPE --- .../XmlTagTreeBreadcrumbsPresentationProvider.java | 10 +++++++--- .../XmlTagTreeHighlightingPass.java | 8 +++++++- .../XmlTagTreeHighlightingUtil.java | 3 ++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeBreadcrumbsPresentationProvider.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeBreadcrumbsPresentationProvider.java index a96ab58791e5..9f524f041f7b 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeBreadcrumbsPresentationProvider.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeBreadcrumbsPresentationProvider.java @@ -22,6 +22,7 @@ import com.intellij.xml.breadcrumbs.BreadcrumbsPresentationProvider; import com.intellij.xml.breadcrumbs.CrumbPresentation; import com.intellij.xml.breadcrumbs.DefaultCrumbsPresentation; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.*; @@ -53,7 +54,8 @@ public class XmlTagTreeBreadcrumbsPresentationProvider extends BreadcrumbsPresen for (int i = result.length - 1; i >= 0; i--) { if (elements[i] instanceof XmlTag) { - result[i] = new MyCrumbPresentation(baseColors[index % baseColors.length]); + final Color color = baseColors[index % baseColors.length]; + result[i] = new MyCrumbPresentation(color); index++; } } @@ -63,14 +65,16 @@ public class XmlTagTreeBreadcrumbsPresentationProvider extends BreadcrumbsPresen private static class MyCrumbPresentation extends DefaultCrumbsPresentation { private final Color myColor; - private MyCrumbPresentation(Color color) { + private MyCrumbPresentation(@Nullable Color color) { myColor = color; } @Override public Color getBackgroundColor(boolean selected, boolean hovered, boolean light) { final Color baseColor = super.getBackgroundColor(selected, hovered, light); - return XmlTagTreeHighlightingUtil.makeTransparent(myColor, baseColor, 0.1); + return myColor != null + ? XmlTagTreeHighlightingUtil.makeTransparent(myColor, baseColor, 0.1) + : baseColor; } } } diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java index a19e444ccc3a..054436bea77e 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java @@ -176,6 +176,10 @@ public class XmlTagTreeHighlightingPass extends TextEditorHighlightingPass { Color color = colorsForEditor[i]; + if (color == null) { + continue; + } + if (pair.first != null) { highlightInfos.add(createHighlightInfo(color, pair.first)); } @@ -270,7 +274,9 @@ public class XmlTagTreeHighlightingPass extends TextEditorHighlightingPass { for (int i = 0; i < resultColors.length; i++) { final Color color = baseColors[i]; - final Color color1 = XmlTagTreeHighlightingUtil.makeTransparent(color, tagBackground, transparency); + final Color color1 = color != null + ? XmlTagTreeHighlightingUtil.makeTransparent(color, tagBackground, transparency) + : null; resultColors[i] = color1; } diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingUtil.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingUtil.java index 02d82ff509f0..35b2b2baf476 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingUtil.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingUtil.java @@ -25,6 +25,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.containers.HashSet; +import org.jetbrains.annotations.NotNull; import java.awt.*; import java.util.Set; @@ -66,7 +67,7 @@ class XmlTagTreeHighlightingUtil { return true; } - static Color makeTransparent(Color color, Color backgroundColor, double transparency) { + static Color makeTransparent(@NotNull Color color, @NotNull Color backgroundColor, double transparency) { int r = makeTransparent(transparency, color.getRed(), backgroundColor.getRed()); int g = makeTransparent(transparency, color.getGreen(), backgroundColor.getGreen()); int b = makeTransparent(transparency, color.getBlue(), backgroundColor.getBlue()); From 5cffb9bdb94cf1fe36a2a20a59d5b4c93acc369d Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 4 Oct 2011 20:04:43 +0400 Subject: [PATCH 08/38] EA-29830 check if sdk directory exists --- .../android/src/org/jetbrains/android/sdk/AndroidSdk.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java index 7404820affc8..8e1f780014a3 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java @@ -115,6 +115,12 @@ public abstract class AndroidSdk { @Nullable public static AndroidSdk parse(@NotNull String path, @NotNull ISdkLog log) { path = FileUtil.toSystemDependentName(path); + + final File f = new File(path); + if (!f.exists() && !f.isDirectory()) { + return null; + } + SdkManager manager = SdkManager.createManager(path + File.separatorChar, log); if (manager != null) { return new AndroidSdkImpl(manager); From c09a01ccab5810d25472204eb7cdcd2f9adc2b75 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 4 Oct 2011 20:09:50 +0400 Subject: [PATCH 09/38] EA-29345 check if module is already disposed --- .../android/src/org/jetbrains/android/util/AndroidUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java index 908b3d64cc64..5a10ea246d66 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java @@ -191,6 +191,10 @@ public class AndroidUtils { return ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable public T compute() { + if (module.isDisposed()) { + return null; + } + Project project = module.getProject(); if (project.isDisposed()) return null; PsiFile psiFile = PsiManager.getInstance(project).findFile(file); From f3ad5f5d62014e80598aeaba0b0160e26cbb0d2a Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 4 Oct 2011 14:58:30 +0200 Subject: [PATCH 10/38] apparently open projects don't necessarily have a frame (EA-30178) --- .../intellij/openapi/wm/impl/status/StatusPanel.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusPanel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusPanel.java index 7bd07ff04c41..e0a3c762b9f1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusPanel.java @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.WindowManager; import com.intellij.util.Alarm; import com.intellij.util.text.DateFormatUtil; @@ -90,9 +91,12 @@ class StatusPanel extends JPanel { private Project getActiveProject() { // a better way of finding a project would be great for (Project project : ProjectManager.getInstance().getOpenProjects()) { - final JComponent frame = WindowManager.getInstance().getIdeFrame(project).getComponent(); - if (SwingUtilities.isDescendingFrom(myTextPanel, frame)) { - return project; + IdeFrame ideFrame = WindowManager.getInstance().getIdeFrame(project); + if (ideFrame != null) { + final JComponent frame = ideFrame.getComponent(); + if (SwingUtilities.isDescendingFrom(myTextPanel, frame)) { + return project; + } } } return null; From 73fa3a12d9217b515437bd72e0178ce32516d62d Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 4 Oct 2011 15:03:50 +0200 Subject: [PATCH 11/38] some @NotNull assertions (EA-30173) --- .../codeInsight/completion/JavaInheritorsGetter.java | 2 +- java/java-psi-api/src/com/intellij/psi/PsiDiamondType.java | 5 +++++ java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java index eb109ac71a3e..080ad4ac0134 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java @@ -153,7 +153,7 @@ public class JavaInheritorsGetter extends CompletionProvider Date: Tue, 4 Oct 2011 15:36:07 +0200 Subject: [PATCH 12/38] start of a parameter with array type is in java declaration context --- .../completion/JavaCompletionData.java | 5 ++--- .../com/intellij/patterns/PsiElementPattern.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java index 362e722002bc..4a4234668260 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -70,9 +70,8 @@ public class JavaCompletionData extends JavaAwareCompletionData{ ))); public static final PsiJavaElementPattern.Capture INSIDE_PARAMETER_LIST = PsiJavaPatterns.psiElement().withParent( - psiElement(PsiJavaCodeReferenceElement.class).withParent( - psiElement(PsiTypeElement.class).withParent(or(psiElement(PsiParameter.class).withParent(PsiParameterList.class), - psiElement(PsiParameterList.class))))); + psiElement(PsiJavaCodeReferenceElement.class).insideStarting( + psiElement().withParent(PsiParameterList.class))); private static final AndFilter START_OF_CODE_FRAGMENT = new AndFilter( new ScopeFilter(new AndFilter( diff --git a/platform/lang-api/src/com/intellij/patterns/PsiElementPattern.java b/platform/lang-api/src/com/intellij/patterns/PsiElementPattern.java index 9b5528edee7a..8c0cd565c635 100644 --- a/platform/lang-api/src/com/intellij/patterns/PsiElementPattern.java +++ b/platform/lang-api/src/com/intellij/patterns/PsiElementPattern.java @@ -292,6 +292,22 @@ public abstract class PsiElementPattern ancestor) { + return with(new PatternCondition("insideStarting") { + @Override + public boolean accepts(@NotNull PsiElement start, ProcessingContext context) { + PsiElement element = getParent(start); + while (element != null && element.getTextRange().getStartOffset() == start.getTextRange().getStartOffset()) { + if (ancestor.accepts(element, context)) { + return true; + } + element = getParent(element); + } + return false; + } + }); + } public static class Capture extends PsiElementPattern> { From cf8385bb4fcfaac7f2279eeb6a8aa7f3d18abfee Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 4 Oct 2011 16:29:43 +0200 Subject: [PATCH 13/38] unblock document (EA-29936) --- .../src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index 1c3847d8432e..75e00d2f977f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -24,6 +24,7 @@ import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NonNls; @@ -51,6 +52,7 @@ public class PsiTypeLookupItem extends LookupItem { public void handleInsert(InsertionContext context) { context.getDocument().insertString(context.getTailOffset(), calcGenerics()); DefaultInsertHandler.addImportForItem(context, this); + PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(); int tail = context.getTailOffset(); String braces = StringUtil.repeat("[]", getBracketsCount()); From 25b7a2765649a9b19a92410234f867e9e0cd0e9f Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 4 Oct 2011 18:16:18 +0200 Subject: [PATCH 14/38] local variables should appear in smart completion faster than everything else --- .../JavaSmartCompletionContributor.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index 15b4966bc7a4..32cb6da742ad 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -190,37 +190,42 @@ public class JavaSmartCompletionContributor extends CompletionContributor { extend(CompletionType.SMART, INSIDE_EXPRESSION, new ExpectedTypeBasedCompletionProvider() { protected void addCompletions(final CompletionParameters params, final CompletionResultSet result, final Collection _infos) { - for (final ExpectedTypeInfo info : new THashSet(_infos, EXPECTED_TYPE_INFO_STRATEGY)) { - final JavaSmartCompletionParameters parameters = new JavaSmartCompletionParameters(params, info); - final PsiType type = info.getType(); + Consumer noTypeCheck = new Consumer() { + public void consume(final LookupElement lookupElement) { + result.addElement(decorate(lookupElement, _infos)); + } + }; - BasicExpressionCompletionContributor.fillCompletionVariants(parameters, new Consumer() { + THashSet mergedInfos = new THashSet(_infos, EXPECTED_TYPE_INFO_STRATEGY); + for (final ExpectedTypeInfo info : mergedInfos) { + ReferenceExpressionCompletionContributor.fillCompletionVariants(new JavaSmartCompletionParameters(params, info), noTypeCheck); + } + + for (final ExpectedTypeInfo info : mergedInfos) { + BasicExpressionCompletionContributor.fillCompletionVariants(new JavaSmartCompletionParameters(params, info), new Consumer() { @Override public void consume(LookupElement lookupElement) { final TypedLookupItem typed = lookupElement.as(TypedLookupItem.CLASS_CONDITION_KEY); if (typed != null) { final PsiType psiType = typed.getType(); - if (psiType != null && type.isAssignableFrom(psiType)) { + if (psiType != null && info.getType().isAssignableFrom(psiType)) { result.addElement(decorate(lookupElement, _infos)); } } } }, result.getPrefixMatcher()); - Consumer noTypeCheck = new Consumer() { - public void consume(final LookupElement lookupElement) { - result.addElement(decorate(lookupElement, _infos)); - } - }; - ReferenceExpressionCompletionContributor.fillCompletionVariants(parameters, noTypeCheck); - - PsiElement position = parameters.getPosition(); - if (!BasicExpressionCompletionContributor.AFTER_DOT.accepts(position)) { - final PsiElement parent = position.getParent(); - if (parent != null && !(parent.getParent() instanceof PsiSwitchLabelStatement)) { - new JavaMembersGetter(type).addMembers(position, true, noTypeCheck); - if (!parameters.getDefaultType().equals(type)) { - new JavaMembersGetter(parameters.getDefaultType()).addMembers(position, true, noTypeCheck); - } + + } + + PsiElement position = params.getPosition(); + final PsiElement parent = position.getParent(); + if (!BasicExpressionCompletionContributor.AFTER_DOT.accepts(position) && + parent != null && + !(parent.getParent() instanceof PsiSwitchLabelStatement)) { + for (ExpectedTypeInfo info : mergedInfos) { + new JavaMembersGetter(info.getType()).addMembers(position, true, noTypeCheck); + if (!info.getDefaultType().equals(info.getType())) { + new JavaMembersGetter(info.getDefaultType()).addMembers(position, true, noTypeCheck); } } } From ebf9119d0dfccef6ac18f078cd7417944fd6f8a9 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 4 Oct 2011 16:23:59 +0200 Subject: [PATCH 15/38] EA-30168 - NPE: LocalInspectionsPassFactory$MyLocalInspectionsPass. --- .../codeInsight/daemon/impl/LocalInspectionsPassFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPassFactory.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPassFactory.java index 4919a01e04f2..329d6f6ba5ce 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPassFactory.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPassFactory.java @@ -64,6 +64,7 @@ public class LocalInspectionsPassFactory extends AbstractProjectComponent implem @Override public TextEditorHighlightingPass createMainHighlightingPass(@NotNull PsiFile file, @NotNull Document document) { final TextRange textRange = file.getTextRange(); + assert textRange != null : "null range " + file.getClass(); return new MyLocalInspectionsPass(file, document, textRange, LocalInspectionsPass.EMPTY_PRIORITY_RANGE); } @@ -72,7 +73,7 @@ public class LocalInspectionsPassFactory extends AbstractProjectComponent implem } private static class MyLocalInspectionsPass extends LocalInspectionsPass { - public MyLocalInspectionsPass(PsiFile file, Document document, TextRange textRange, TextRange visibleRange) { + public MyLocalInspectionsPass(PsiFile file, Document document, @NotNull TextRange textRange, TextRange visibleRange) { super(file, document, textRange.getStartOffset(), textRange.getEndOffset(), visibleRange, true); } From 248e5af56f74ce34c83908d1fa8fb2428bbd8068 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 4 Oct 2011 18:39:12 +0200 Subject: [PATCH 16/38] coverage: disable listeners when no coverage enabled --- .../src/com/intellij/execution/RunConfigurationExtension.java | 2 +- plugins/junit/src/com/intellij/execution/junit/TestObject.java | 2 +- .../testng/configuration/TestNGRunnableState.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java b/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java index 9975df8c0c9a..fb34521e07df 100644 --- a/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java +++ b/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java @@ -79,7 +79,7 @@ public abstract class RunConfigurationExtension extends RunConfigurationExtensio return listener; } - public boolean isListenerDisabled(RunConfigurationBase configuration, Object listener) { + public boolean isListenerDisabled(RunConfigurationBase configuration, Object listener, RunnerSettings runnerSettings) { return false; } } \ No newline at end of file diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java index 731c12791804..f5ba1b0c3c9a 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java @@ -215,7 +215,7 @@ public abstract class TestObject implements JavaCommandLine { for (final Object listener : listeners) { boolean enabled = true; for (RunConfigurationExtension ext : Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { - if (ext.isListenerDisabled(myConfiguration, listener)) { + if (ext.isListenerDisabled(myConfiguration, listener, myRunnerSettings)) { enabled = false; break; } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java index 1360b8c1295d..7bf636c31a45 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java @@ -307,7 +307,7 @@ public class TestNGRunnableState extends JavaCommandLineState { for (Object o : Extensions.getExtensions(IDEATestNGListener.EP_NAME)) { boolean enabled = true; for (RunConfigurationExtension extension : Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { - if (extension.isListenerDisabled(config, o)) { + if (extension.isListenerDisabled(config, o, getRunnerSettings())) { enabled = false; break; } From 4f235496c394306eb37986d446695a9e668fd725 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 4 Oct 2011 19:24:24 +0400 Subject: [PATCH 17/38] EA-30116 - IAE: GeneralCommandLine.setExePath + fixed bug with phing path with space on Windows --- .../src/com/intellij/execution/process/ScriptRunnerUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/execution/process/ScriptRunnerUtil.java b/platform/platform-impl/src/com/intellij/execution/process/ScriptRunnerUtil.java index 52b997b7f300..2c48e5efd077 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/ScriptRunnerUtil.java +++ b/platform/platform-impl/src/com/intellij/execution/process/ScriptRunnerUtil.java @@ -98,7 +98,7 @@ public final class ScriptRunnerUtil { return outputBuilder.toString(); } - public static OSProcessHandler execute(String exePath, + public static OSProcessHandler execute(@NotNull String exePath, @Nullable String workingDirectory, @Nullable VirtualFile scriptFile, String[] parameters) throws ExecutionException { From 3f341a251f2fb68cdb1c3993b19b79ea54ebc070 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 4 Oct 2011 19:14:52 +0200 Subject: [PATCH 18/38] show unsorted node e.g. for binary files (EA-30091 - assert: UsageInfo.) --- .../ide/util/gotoByName/ChooseByNameBase.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java index 5fb2563b01c9..7fb1f091b930 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java @@ -19,6 +19,7 @@ package com.intellij.ide.util.gotoByName; import com.intellij.Patches; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl; +import com.intellij.find.findUsages.PsiElement2UsageTargetAdapter; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.CopyReferenceAction; import com.intellij.ide.ui.UISettings; @@ -1623,16 +1624,22 @@ public abstract class ChooseByNameBase { presentation.setCodeUsagesString(pattern); presentation.setTabName(pattern); presentation.setTabText(pattern); + presentation.setTargetsNodeText("Unsorted " + StringUtil.toLowerCase(pattern.toLowerCase())); final PsiElement[] elements = getElements(); - final UsageInfo[] usages = new UsageInfo[elements.length]; - for (int i = 0; i < elements.length; i++) { - usages[i] = new UsageInfo(elements[i]); + final List usageInfos = new ArrayList(); + final List targets = new ArrayList(); + for (PsiElement element : elements) { + if (element.getTextRange() != null) { + usageInfos.add(new UsageInfo(element)); + } else { + targets.add(element); + } } final UsageInfoToUsageConverter.TargetElementsDescriptor descriptor = new UsageInfoToUsageConverter.TargetElementsDescriptor(elements); final UsageViewImpl usageView = - (UsageViewImpl)UsageViewManager.getInstance(myProject).showUsages(UsageTarget.EMPTY_ARRAY, UsageInfoToUsageConverter.convert( - descriptor, usages), presentation); + (UsageViewImpl)UsageViewManager.getInstance(myProject).showUsages(targets.isEmpty() ? UsageTarget.EMPTY_ARRAY : PsiElement2UsageTargetAdapter.convert(targets.toArray(new PsiElement[targets.size()])), + UsageInfoToUsageConverter.convert(descriptor, usageInfos.toArray(new UsageInfo[usageInfos.size()])), presentation); if (myListModel.contains(EXTRA_ELEM)) { //start searching for the rest final String text = myTextField.getText(); final boolean checkboxState = myCheckBox.isSelected(); From 3dd9b35c2ae928a2ced8ba10dbd77d56a0583885 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 4 Oct 2011 19:18:24 +0200 Subject: [PATCH 19/38] show params info: skip inference when argument list is not valid anymore (EA-30223 - PIEAE: CompositePsiElement.getProject) --- .../hint/api/impls/MethodParameterInfoHandler.java | 4 ++-- .../src/com/intellij/psi/infos/MethodCandidateInfo.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java index c8486e3dfd5e..e69cc03ccbbd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java @@ -125,7 +125,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc for (int i = 0; i < candidates.length; i++) { CandidateInfo candidate = (CandidateInfo)candidates[i]; PsiMethod method = (PsiMethod)candidate.getElement(); - PsiSubstitutor substitutor = candidate instanceof MethodCandidateInfo ? ((MethodCandidateInfo)candidate).inferTypeArguments(true) : candidate.getSubstitutor(); + PsiSubstitutor substitutor = candidate instanceof MethodCandidateInfo && ((MethodCandidateInfo)candidate).isInferencePossible() ? ((MethodCandidateInfo)candidate).inferTypeArguments(true) : candidate.getSubstitutor(); assert substitutor != null; if (!method.isValid() || !substitutor.isValid()) { @@ -408,7 +408,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc public void updateUI(final Object p, final ParameterInfoUIContext context) { if (p instanceof CandidateInfo) { CandidateInfo info = (CandidateInfo)p; - updateMethodPresentation((PsiMethod)info.getElement(), info instanceof MethodCandidateInfo ? ((MethodCandidateInfo)info).inferTypeArguments(true) : info.getSubstitutor(), context); + updateMethodPresentation((PsiMethod)info.getElement(), info instanceof MethodCandidateInfo && ((MethodCandidateInfo)info).isInferencePossible() ? ((MethodCandidateInfo)info).inferTypeArguments(true) : info.getSubstitutor(), context); } else { updateMethodPresentation((PsiMethod)p, null, context); diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index fdaeb1f7b9a0..1b99fe323bad 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -136,6 +136,10 @@ public class MethodCandidateInfo extends CandidateInfo{ myArgumentList.getParent(), forCompletion); } + public boolean isInferencePossible() { + return myArgumentList.isValid(); + } + public static class ApplicabilityLevel { public static final int NOT_APPLICABLE = 1; public static final int VARARGS = 2; From 994f9cfa037e36cb8b8bcaafb81f8b5917e72ed9 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 4 Oct 2011 19:26:11 +0200 Subject: [PATCH 20/38] EA-30153 - NPE: AbstractJavaInplaceIntroducer.saveSettings --- .../introduceField/InplaceIntroduceConstantPopup.java | 3 ++- .../introduceField/InplaceIntroduceFieldPopup.java | 3 ++- .../introduceParameter/AbstractJavaInplaceIntroducer.java | 3 ++- .../introduceParameter/InplaceIntroduceParameterPopup.java | 3 ++- .../introduce/inplace/AbstractInplaceIntroducer.java | 7 +++++-- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java index d538f8f5854b..c5954c17f025 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java @@ -27,6 +27,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.occurrences.OccurrenceManager; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -165,7 +166,7 @@ public class InplaceIntroduceConstantPopup extends AbstractInplaceIntroduceField } @Override - protected void saveSettings(PsiVariable psiVariable) { + protected void saveSettings(@NotNull PsiVariable psiVariable) { super.saveSettings(psiVariable); JavaRefactoringSettings.getInstance().INTRODUCE_CONSTANT_VISIBILITY = getSelectedVisibility(); } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java index f3c5618cca73..4a712862f2ff 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java @@ -27,6 +27,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.occurrences.OccurrenceManager; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -141,7 +142,7 @@ public class InplaceIntroduceFieldPopup extends AbstractInplaceIntroduceFieldPop } @Override - protected void saveSettings(PsiVariable psiVariable) { + protected void saveSettings(@NotNull PsiVariable psiVariable) { super.saveSettings(psiVariable); JavaRefactoringSettings.getInstance().INTRODUCE_FIELD_VISIBILITY = myIntroduceFieldPanel.getFieldVisibility(); myIntroduceFieldPanel.saveFinalState(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java index 92438b31a2b9..ec59f37cf5b4 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java @@ -19,6 +19,7 @@ import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -91,7 +92,7 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro } @Override - protected void saveSettings(PsiVariable psiVariable) { + protected void saveSettings(@NotNull PsiVariable psiVariable) { TypeSelectorManagerImpl.typeSelected(psiVariable.getType(), getType());//myDefaultType.getType()); } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java index 9ad45a24d8fa..69897c42b818 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java @@ -34,6 +34,7 @@ import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.usageView.UsageInfo; import gnu.trove.TIntArrayList; import gnu.trove.TIntProcedure; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -151,7 +152,7 @@ public class InplaceIntroduceParameterPopup extends AbstractJavaInplaceIntroduce @Override - protected void saveSettings(PsiVariable psiVariable) { + protected void saveSettings(@NotNull PsiVariable psiVariable) { myPanel.saveSettings(JavaRefactoringSettings.getInstance()); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java index 8eb8d1586858..aa6978a75b77 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java @@ -193,7 +193,7 @@ public abstract class AbstractInplaceIntroducer Date: Tue, 4 Oct 2011 18:53:55 +0200 Subject: [PATCH 21/38] IDEA-75061 smart completion not provided for assertEquals() where expected --- .../codeInsight/ExpectedTypesProvider.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index e0040f8b7348..635948faa2d0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -994,7 +994,7 @@ public class ExpectedTypesProvider { PsiType parameterType = getParameterType(parameter, substitutor); TailType tailType = getMethodArgumentTailType(argument, index, method, substitutor, parameters); - PsiType defaultType = getDefaultType(method, substitutor, parameterType, argument, args); + PsiType defaultType = getDefaultType(method, substitutor, parameterType, argument, args, index); ExpectedTypeInfoImpl info = createInfoImpl(parameterType, ExpectedTypeInfo.TYPE_OR_SUBTYPE, defaultType, tailType); info.setInsertExplicitTypeParams(true); @@ -1053,7 +1053,7 @@ public class ExpectedTypesProvider { @Nullable private static PsiType getDefaultType(final PsiMethod method, final PsiSubstitutor substitutor, final PsiType parameterType, - final PsiExpression argument, PsiExpression[] args) { + final PsiExpression argument, PsiExpression[] args, int index) { final PsiClass containingClass = method.getContainingClass(); if (containingClass == null) return parameterType; @@ -1094,10 +1094,17 @@ public class ExpectedTypesProvider { }); if (type != null) return type; } - if (("assertEquals".equals(name) || "assertSame".equals(name)) && method.getParameterList().getParametersCount() == 2 && args.length == 2) { - ExpectedTypeInfo info = getEqualsType(args[0] == argument ? args[1] : args[0]); - if (info != null && parameterType.isAssignableFrom(info.getDefaultType())) { - return info.getDefaultType(); + int argCount = Math.max(index + 1, args.length); + if ("assertEquals".equals(name) || "assertSame".equals(name) && method.getParameterList().getParametersCount() == argCount) { + if (argCount == 2 || + argCount == 3 && method.getParameterList().getParameters()[0].getType().equalsToText(CommonClassNames.JAVA_LANG_STRING)) { + int other = index == argCount - 1 ? index - 1 : index + 1; + if (args.length > other) { + ExpectedTypeInfo info = getEqualsType(args[other]); + if (info != null && parameterType.isAssignableFrom(info.getDefaultType())) { + return info.getDefaultType(); + } + } } } return parameterType; From 1a88d40ef1f7ba6d95091d0a216b13b8cabaf5c8 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 4 Oct 2011 19:47:03 +0200 Subject: [PATCH 22/38] IDEA-75075 smart completion: can not add import exclusion for suggested field --- ...ExcludeFromCompletionLookupActionProvider.java | 10 ++++++---- .../completion/JavaCompletionUtil.java | 14 ++++++++------ .../impl/quickfix/StaticImportMethodFix.java | 15 +++++++++------ .../psi/filters/getters/MembersGetter.java | 2 ++ .../intentions/GroovyStaticImportMethodFix.java | 3 +-- .../completion/GroovyCompletionContributor.java | 2 +- 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ExcludeFromCompletionLookupActionProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/ExcludeFromCompletionLookupActionProvider.java index 8a085f2bb25b..0b40e14c4dd3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ExcludeFromCompletionLookupActionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ExcludeFromCompletionLookupActionProvider.java @@ -22,10 +22,7 @@ import com.intellij.codeInsight.lookup.LookupActionProvider; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementAction; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiMember; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiModifier; +import com.intellij.psi.*; import com.intellij.util.Consumer; import org.jetbrains.annotations.Nullable; @@ -43,6 +40,11 @@ public class ExcludeFromCompletionLookupActionProvider implements LookupActionPr if (method.hasModifierProperty(PsiModifier.STATIC)) { addExcludes(consumer, method, StaticImportMethodFix.getMemberQualifiedName(method)); } + } else if (o instanceof PsiField) { + final PsiField field = (PsiField)o; + if (field.hasModifierProperty(PsiModifier.STATIC)) { + addExcludes(consumer, field, StaticImportMethodFix.getMemberQualifiedName(field)); + } } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index c94cce4a3ddb..33754d3d1a8c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; import com.intellij.codeInsight.completion.scope.CompletionElement; import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor; import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler; +import com.intellij.codeInsight.daemon.impl.quickfix.StaticImportMethodFix; import com.intellij.codeInsight.guess.GuessManager; import com.intellij.codeInsight.lookup.*; import com.intellij.lang.ASTNode; @@ -171,8 +172,8 @@ public class JavaCompletionUtil { return type; } - public static boolean isInExcludedPackage(@NotNull final PsiClass psiClass) { - final String name = psiClass.getQualifiedName(); + public static boolean isInExcludedPackage(@NotNull final PsiMember member) { + final String name = StaticImportMethodFix.getMemberQualifiedName(member); if (name == null) return false; CodeInsightSettings cis = CodeInsightSettings.getInstance(); for (String excluded : cis.EXCLUDED_PACKAGES) { @@ -437,12 +438,13 @@ public class JavaCompletionUtil { LookupElement item = createLookupElement(completionElement, qualifierType); if (item != null) { final Object o = item.getObject(); - if (o instanceof PsiClass) { - if (!isSourceLevelAccessible(element, (PsiClass)o, pkgContext) || isInExcludedPackage((PsiClass)o)) { - continue; - } + if (o instanceof PsiClass && !isSourceLevelAccessible(element, (PsiClass)o, pkgContext)) { + continue; } if (o instanceof PsiMember) { + if (isInExcludedPackage((PsiMember)o)) { + continue; + } mentioned.add((PsiMember)o); } set.add(mayHighlight ? highlightIfNeeded(qualifierType, item, o) : item); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java index 959df550e806..558536ecd7ec 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java @@ -103,14 +103,13 @@ public class StaticImportMethodFix implements IntentionAction { List applicableList = new ArrayList(); for (PsiMethod method : methods) { ProgressManager.checkCanceled(); - PsiClass aClass = method.getContainingClass(); - if (aClass != null && JavaCompletionUtil.isInExcludedPackage(aClass)) continue; + if (JavaCompletionUtil.isInExcludedPackage(method)) continue; if (!method.hasModifierProperty(PsiModifier.STATIC)) continue; PsiFile file = method.getContainingFile(); if (file instanceof PsiJavaFile //do not show methods from default package && ((PsiJavaFile)file).getPackageName().length() != 0 - && PsiUtil.isAccessible(method, element, aClass)) { + && PsiUtil.isAccessible(method, element, method.getContainingClass())) { list.add(method); if (PsiUtil.isApplicable(method, PsiSubstitutor.EMPTY, argumentList)) { applicableList.add(method); @@ -269,12 +268,16 @@ public class StaticImportMethodFix implements IntentionAction { } @Nullable - public static String getMemberQualifiedName(PsiMember method) { - PsiClass containingClass = method.getContainingClass(); + public static String getMemberQualifiedName(PsiMember member) { + if (member instanceof PsiClass) { + return ((PsiClass)member).getQualifiedName(); + } + + PsiClass containingClass = member.getContainingClass(); if (containingClass == null) return null; String className = containingClass.getQualifiedName(); if (className == null) return null; - return className + "." + method.getName(); + return className + "." + member.getName(); } public boolean startInWriteAction() { diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java b/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java index ac34f4ecf518..3405347c2a0f 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java +++ b/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java @@ -17,6 +17,7 @@ package com.intellij.psi.filters.getters; import com.intellij.codeInsight.CodeInsightUtil; import com.intellij.codeInsight.completion.CompletionUtil; +import com.intellij.codeInsight.completion.JavaCompletionUtil; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.util.Condition; @@ -85,6 +86,7 @@ public abstract class MembersGetter { for (final PsiElement result : processor.getResults()) { if (result instanceof PsiMember && !(result instanceof PsiClass)) { final PsiMember member = (PsiMember)result; + if (JavaCompletionUtil.isInExcludedPackage(member)) continue; if (member.hasModifierProperty(PsiModifier.STATIC) && resolveHelper.isAccessible(member, context, null)) { if (result instanceof PsiField && !member.hasModifierProperty(PsiModifier.FINAL)) continue; if (result instanceof PsiMethod && acceptMethods) continue; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyStaticImportMethodFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyStaticImportMethodFix.java index 490c5b9d9776..1ad927f79c2d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyStaticImportMethodFix.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyStaticImportMethodFix.java @@ -113,8 +113,7 @@ public class GroovyStaticImportMethodFix implements IntentionAction { List applicableList = new ArrayList(); for (PsiMethod method : methods) { ProgressManager.checkCanceled(); - PsiClass aClass = method.getContainingClass(); - if (aClass != null && JavaCompletionUtil.isInExcludedPackage(aClass)) continue; + if (JavaCompletionUtil.isInExcludedPackage(method)) continue; if (!method.hasModifierProperty(PsiModifier.STATIC)) continue; PsiFile file = method.getContainingFile(); if (file instanceof PsiClassOwner diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index 4559619f9408..d20bf87dd3d3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -422,7 +422,7 @@ public class GroovyCompletionContributor extends CompletionContributor { object = ((GroovyResolveResult)object).getElement(); } - if (object instanceof PsiClass && JavaCompletionUtil.isInExcludedPackage((PsiClass)object)) { + if (object instanceof PsiMember && JavaCompletionUtil.isInExcludedPackage((PsiMember)object)) { return; } From 97b273ca8ef7e0bfe8f159505ca55ecf446cecbe Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 4 Oct 2011 19:59:02 +0200 Subject: [PATCH 23/38] IDEA-69687 Smart type completion does not provide package information when several type match --- .../getters/ClassLiteralLookupElement.java | 15 +++++++++------ .../completion/SmartTypeCompletionTest.java | 7 +++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralLookupElement.java b/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralLookupElement.java index b394347781e8..40db8cb6d96b 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralLookupElement.java +++ b/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralLookupElement.java @@ -16,11 +16,14 @@ package com.intellij.psi.filters.getters; import com.intellij.codeInsight.completion.InsertionContext; -import com.intellij.codeInsight.lookup.*; -import com.intellij.psi.*; -import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementPresentation; +import com.intellij.codeInsight.lookup.TypedLookupItem; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -49,9 +52,9 @@ public class ClassLiteralLookupElement extends LookupElement implements TypedLoo public void renderElement(LookupElementPresentation presentation) { presentation.setItemText(getLookupString()); presentation.setIcon(myExpr.getIcon(0)); - final PsiType type = myExpr.getType(); - if (type != null) { - presentation.setTypeText(type.getPresentableText()); + String pkg = StringUtil.getPackageName(myCanonicalText); + if (StringUtil.isNotEmpty(pkg)) { + presentation.setTailText(" (" + pkg + ")", true); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index a88db44ac360..4a243f745b76 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -4,6 +4,7 @@ import com.intellij.JavaTestUtil; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.codeInsight.lookup.PsiTypeLookupItem; import com.intellij.codeInsight.template.SmartCompletionContextType; import com.intellij.codeInsight.template.Template; @@ -783,6 +784,12 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testClassLiteral() throws Exception { doActionTest(); assertStringItems("String.class"); + + LookupElementPresentation p = new LookupElementPresentation(); + myFixture.getLookupElements()[0].renderElement(p); + assertEquals("String.class", p.getItemText()); + assertEquals(" (java.lang)", p.getTailText()); + assertNull(p.getTypeText()); } public void testNoClassLiteral() throws Exception { doActionTest(); From 577f3e9b861482841c24a72dc239c59b55e82c41 Mon Sep 17 00:00:00 2001 From: Yann Cebron Date: Tue, 4 Oct 2011 20:04:55 +0200 Subject: [PATCH 24/38] typo --- .../intellij/util/xml/highlighting/DomElementsInspection.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementsInspection.java b/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementsInspection.java index e8a6fa0a0614..4691a0a33ca9 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementsInspection.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementsInspection.java @@ -49,8 +49,8 @@ public abstract class DomElementsInspection extends XmlSup private final Set> myDomClasses; - public DomElementsInspection(Class domClass, @NotNull Class... additonalClasses) { - myDomClasses = new THashSet>(Arrays.asList(additonalClasses)); + public DomElementsInspection(Class domClass, @NotNull Class... additionalClasses) { + myDomClasses = new THashSet>(Arrays.asList(additionalClasses)); myDomClasses.add(domClass); } From d9d271a60508cc13b1eca957942c4d8c6887e35e Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 11:04:25 +0400 Subject: [PATCH 25/38] resolve for disjunction type --- .../expressions/GrReferenceResolveUtil.java | 3 +++ .../groovy/lang/resolve/ResolveMethodTest.groovy | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveUtil.java index af01ab8daae0..3971c47a235c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveUtil.java @@ -165,6 +165,9 @@ public class GrReferenceResolveUtil { GroovyPsiElement resolveContext, GroovyPsiElement place) { final ResolveState state; + if (qualifierType instanceof PsiDisjunctionType) { + qualifierType = ((PsiDisjunctionType)qualifierType).getLeastUpperBound(); + } if (qualifierType instanceof PsiClassType) { PsiClassType.ClassResolveResult qualifierResult = ((PsiClassType)qualifierType).resolveGenerics(); PsiClass qualifierClass = qualifierResult.getElement(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy index f6c9cdc369e2..1c46a1745fdf 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy @@ -796,4 +796,17 @@ print new B().foo() assertInstanceOf(resolved, GrMethod) assertTrue(resolved.isPhysical()) } + + void testDisjunctionType() { + def ref = configureByText (""" +import java.sql.SQLException +def test() { + try {} + catch (IOException | SQLException ex) { + ex.printStackTrace(); + } +}""") + assertNotNull(ref.resolve()) + } + } From 86e64cf1bf7286f4dd8b6bbc5692f17f3c27bb95 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 15:04:13 +0400 Subject: [PATCH 26/38] IDEA-74663 String injections don't override it parameter --- .../psi/impl/statements/blocks/GrClosableBlockImpl.java | 7 ++++++- .../plugins/groovy/lang/resolve/ResolveMethodTest.groovy | 6 ++++++ .../plugins/groovy/lang/resolve/TypeInferenceTest.java | 8 ++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java index 14e3a052885b..6e437a6097f3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java @@ -35,6 +35,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; @@ -85,7 +86,7 @@ public class GrClosableBlockImpl extends GrBlockImpl implements GrClosableBlock PsiElement current = place; boolean it_already_processed = false; while (current != this && current != null) { - if (current instanceof GrClosableBlock && !((GrClosableBlock)current).hasParametersSection()) { + if (current instanceof GrClosableBlock && !((GrClosableBlock)current).hasParametersSection() && !(current.getParent() instanceof GrStringInjection)) { it_already_processed = true; break; } @@ -184,6 +185,10 @@ public class GrClosableBlockImpl extends GrBlockImpl implements GrClosableBlock } public GrParameter[] getSyntheticItParameter() { + if (getParent() instanceof GrStringInjection) { + return GrParameter.EMPTY_ARRAY; + } + GrParameter[] res = mySyntheticItParameter; if (res == null) { res = new GrParameter[]{new ClosureSyntheticParameter(this)}; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy index 1c46a1745fdf..0f7a68d198a4 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy @@ -809,4 +809,10 @@ def test() { assertNotNull(ref.resolve()) } + void testStringInjectionDontOverrideItParameter() { + def ref = configureByText(""" +[2, 3, 4].collect {"\${it.toBigDecimal()}"} +""") + assertNotNull(ref.resolve()) + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java index 78362a0d0755..37a1d97d5c67 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java @@ -229,11 +229,11 @@ public class TypeInferenceTest extends GroovyResolveTestCase { public void testIncMethod() { assertTypeEquals(JAVA_LANG_INTEGER, "A.groovy"); } - + public void testDGMFind() { assertTypeEquals("java.io.File", "a.groovy"); } - + public void testMultiTypeParameter() { assertTypeEquals("X | Y", "a.groovy"); } @@ -241,4 +241,8 @@ public class TypeInferenceTest extends GroovyResolveTestCase { public void testTypeArgsInAccessor() { assertTypeEquals("Foo", "a.groovy"); } + + public void testSingleParameterInStringInjection() { + assertTypeEquals("java.util.StringBuilder", "a.groovy"); + } } From 9ebac656de3a5509f80470b0dc8a13b12558b52f Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 15:59:31 +0400 Subject: [PATCH 27/38] CommonClassNames.JAVA_LANG_STRING_BUILDER --- .../codeInsight/daemon/impl/quickfix/ChangeToAppendFix.java | 4 ++-- java/java-psi-api/src/com/intellij/psi/CommonClassNames.java | 1 + .../ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java | 2 +- .../src/com/siyeh/ig/memory/StringBufferFieldInspection.java | 2 +- .../StringBufferReplaceableByStringBuilderInspection.java | 2 +- .../LengthOneStringsInConcatenationInspection.java | 2 +- .../StringBufferMustHaveInitialCapacityInspection.java | 2 +- .../StringBufferReplaceableByStringInspection.java | 2 +- .../StringBufferToStringInConcatenationInspection.java | 2 +- ...StringConcatenationInsideStringBufferAppendInspection.java | 4 ++-- .../ig/performance/StringEqualsEmptyStringInspection.java | 2 +- .../src/com/siyeh/ipp/chartostring/CharToStringPredicate.java | 4 ++-- .../src/com/siyeh/ipp/chartostring/StringToCharPredicate.java | 4 ++-- .../src/com/siyeh/ipp/concatenation/AppendUtil.java | 4 ++-- .../ReplaceConcatenationWithStringBufferIntention.java | 4 ++-- 15 files changed, 21 insertions(+), 20 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToAppendFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToAppendFix.java index 180af116ff2c..bc52ba819893 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToAppendFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToAppendFix.java @@ -62,8 +62,8 @@ public class ChangeToAppendFix implements IntentionAction { return JavaTokenType.PLUSEQ == myTokenType && myAssignmentExpression.isValid() && myAssignmentExpression.getManager().isInProject(myAssignmentExpression) && - myRhsType.equalsToText("java.lang.String") && - (myLhsType.equalsToText("java.lang.StringBuilder") || myLhsType.equalsToText("java.lang.StringBuffer")); + myRhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING) && + (myLhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER) || myLhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUFFER)); } @Override diff --git a/java/java-psi-api/src/com/intellij/psi/CommonClassNames.java b/java/java-psi-api/src/com/intellij/psi/CommonClassNames.java index 4fb3775d9b16..629a3d6ccea7 100644 --- a/java/java-psi-api/src/com/intellij/psi/CommonClassNames.java +++ b/java/java-psi-api/src/com/intellij/psi/CommonClassNames.java @@ -74,6 +74,7 @@ public interface CommonClassNames { @NonNls String JAVA_LANG_CHARACTER = "java.lang.Character"; @NonNls String JAVA_LANG_STRING_BUFFER = "java.lang.StringBuffer"; + @NonNls String JAVA_LANG_STRING_BUILDER = "java.lang.StringBuilder"; @NonNls String JAVA_LANG_ABSTRACT_STRING_BUILDER = "java.lang.AbstractStringBuilder"; @NonNls String JAVA_LANG_CLONEABLE = "java.lang.Cloneable"; diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java index edf069f7791a..9af11426326f 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java @@ -193,7 +193,7 @@ public class MismatchedStringBuilderQueryUpdateInspection } final PsiClass aClass = (PsiClass)target; final String qualifiedName = aClass.getQualifiedName(); - if (!"java.lang.StringBuilder".equals(qualifiedName) && + if (!CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(qualifiedName) && !"java.lang.StringBuffer".equals(qualifiedName)) { return false; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/memory/StringBufferFieldInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/memory/StringBufferFieldInspection.java index a2062759c229..9faa2f617636 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/memory/StringBufferFieldInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/memory/StringBufferFieldInspection.java @@ -54,7 +54,7 @@ public class StringBufferFieldInspection extends BaseInspection { super.visitField(field); final PsiType type = field.getType(); if (!type.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUFFER) && - !type.equalsToText("java.lang.StringBuilder")) { + !type.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER)) { return; } registerFieldError(field, type); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/StringBufferReplaceableByStringBuilderInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/StringBufferReplaceableByStringBuilderInspection.java index 3b9926fc5bab..7c849a4e299e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/StringBufferReplaceableByStringBuilderInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/StringBufferReplaceableByStringBuilderInspection.java @@ -102,7 +102,7 @@ public class StringBufferReplaceableByStringBuilderInspection extends BaseInspectionVisitor { private static final Set excludes = new HashSet(Arrays.asList( - "java.lang.StringBuilder", + CommonClassNames.JAVA_LANG_STRING_BUILDER, CommonClassNames.JAVA_LANG_STRING_BUFFER)); @Override diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/LengthOneStringsInConcatenationInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/LengthOneStringsInConcatenationInspection.java index 54210b008d1f..ea1e398a3c61 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/LengthOneStringsInConcatenationInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/LengthOneStringsInConcatenationInspection.java @@ -148,7 +148,7 @@ public class LengthOneStringsInConcatenationInspection } final String className = methodClass.getQualifiedName(); return CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) || - "java.lang.StringBuilder".equals(className); + CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferMustHaveInitialCapacityInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferMustHaveInitialCapacityInspection.java index ec4497623130..554b2f33b42e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferMustHaveInitialCapacityInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferMustHaveInitialCapacityInspection.java @@ -61,7 +61,7 @@ public class StringBufferMustHaveInitialCapacityInspection if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUFFER, type) && - !TypeUtils.typeEquals("java.lang.StringBuilder", type)) { + !TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUILDER, type)) { return; } final PsiExpressionList argumentList = expression.getArgumentList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferReplaceableByStringInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferReplaceableByStringInspection.java index fe3a69de4d4f..5d6be63483a9 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferReplaceableByStringInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferReplaceableByStringInspection.java @@ -61,7 +61,7 @@ public class StringBufferReplaceableByStringInspection final PsiType type = variable.getType(); if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUFFER, type) && - !TypeUtils.typeEquals("java.lang.StringBuilder", type)) { + !TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUILDER, type)) { return; } final PsiExpression initializer = variable.getInitializer(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferToStringInConcatenationInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferToStringInConcatenationInspection.java index 2c21881982ac..7dc4948bfcf4 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferToStringInConcatenationInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringBufferToStringInConcatenationInspection.java @@ -118,7 +118,7 @@ public class StringBufferToStringInConcatenationInspection } final String className = aClass.getQualifiedName(); return CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) || - "java.lang.StringBuilder".equals(className); + CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java index 5ff3ff4deb30..ccb0f3f18ba0 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java @@ -111,7 +111,7 @@ public class StringConcatenationInsideStringBufferAppendInspection else { useStringValueOf = !qualifiedName.equals( CommonClassNames.JAVA_LANG_STRING_BUFFER) && - !qualifiedName.equals("java.lang.StringBuilder"); + !qualifiedName.equals(CommonClassNames.JAVA_LANG_STRING_BUILDER); } } } @@ -245,7 +245,7 @@ public class StringConcatenationInsideStringBufferAppendInspection } final String className = containingClass.getQualifiedName(); if (CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) || - "java.lang.StringBuilder".equals(className)) { + CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className)) { registerMethodCallError(expression, containingClass); return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringEqualsEmptyStringInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringEqualsEmptyStringInspection.java index b81cee2acf52..e5b7e2f765c1 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringEqualsEmptyStringInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/StringEqualsEmptyStringInspection.java @@ -154,7 +154,7 @@ public class StringEqualsEmptyStringInspection extends BaseInspection { if (HardcodedMethodConstants.TO_STRING.equals(referenceName) && type != null && (type.equalsToText( CommonClassNames.JAVA_LANG_STRING_BUFFER) || - type.equalsToText("java.lang.StringBuilder"))) { + type.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER))) { return qualifierExpression.getText(); } else { diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java index 943286a4f1b4..9f3db5ec6d15 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java @@ -95,8 +95,8 @@ class CharToStringPredicate implements PsiElementPredicate { return false; } final String className = type.getCanonicalText(); - if ("java.lang.StringBuffer".equals(className) || - "java.lang.StringBuilder".equals(className)) { + if (CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) || + CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className)) { @NonNls final String methodName = methodExpression.getReferenceName(); if (!"append".equals(methodName) && diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java index 63e3d0a6a577..74d8801a9af2 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java @@ -114,8 +114,8 @@ class StringToCharPredicate implements PsiElementPredicate { return false; } final String className = type.getCanonicalText(); - if ("java.lang.StringBuffer".equals(className) || - "java.lang.StringBuilder".equals(className)) { + if (CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) || + CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className)) { @NonNls final String methodName = methodExpression.getReferenceName(); if (!"append".equals(methodName) && diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/AppendUtil.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/AppendUtil.java index 23018bbd3c42..b877f42519ae 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/AppendUtil.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/AppendUtil.java @@ -62,8 +62,8 @@ class AppendUtil { return false; } final String name = containingClass.getQualifiedName(); - if ("java.lang.StringBuffer".equals(name) || - "java.lang.StringBuilder".equals(name)) { + if (CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(name) || + CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(name)) { return true; } final Project project = containingClass.getProject(); diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/ReplaceConcatenationWithStringBufferIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/ReplaceConcatenationWithStringBufferIntention.java index c66252169e76..f9f9059bc03b 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/ReplaceConcatenationWithStringBufferIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/ReplaceConcatenationWithStringBufferIntention.java @@ -110,8 +110,8 @@ public class ReplaceConcatenationWithStringBufferIntention extends MutablyNamedI return false; } final String className = type.getCanonicalText(); - if (!"java.lang.StringBuffer".equals(className) && - !"java.lang.StringBuilder".equals(className)) { + if (!CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) && + !CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className)) { return false; } @NonNls final String methodName = methodExpression.getReferenceName(); From e98bf3ebab1a4fa7e455fb067757f30151a0deb2 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 16:02:05 +0400 Subject: [PATCH 28/38] Type inference for string injection parameter --- .../plugins/groovy/lang/psi/ClosureParameterEnhancer.java | 5 +++++ .../plugins/groovy/lang/resolve/TypeInferenceTest.java | 2 +- .../inference/singleParameterInStringInjection/a.groovy | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 plugins/groovy/testdata/resolve/inference/singleParameterInStringInjection/a.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/ClosureParameterEnhancer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/ClosureParameterEnhancer.java index e111f2f34773..9410c7bf77dd 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/ClosureParameterEnhancer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/ClosureParameterEnhancer.java @@ -13,6 +13,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpres import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.arithmetic.GrRangeExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; import org.jetbrains.plugins.groovy.lang.psi.impl.GrRangeType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; @@ -85,6 +86,10 @@ public class ClosureParameterEnhancer extends AbstractClosureParameterEnhancer { @Nullable protected PsiType getClosureParameterType(GrClosableBlock closure, int index) { PsiElement parent = closure.getParent(); + if (parent instanceof GrStringInjection && index == 0) { + return TypesUtil.createTypeByFQClassName(CommonClassNames.JAVA_LANG_STRING_BUILDER, closure); + } + if (parent instanceof GrArgumentList) parent = parent.getParent(); if (!(parent instanceof GrMethodCall)) { return null; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java index 37a1d97d5c67..b5efb28857a1 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.java @@ -243,6 +243,6 @@ public class TypeInferenceTest extends GroovyResolveTestCase { } public void testSingleParameterInStringInjection() { - assertTypeEquals("java.util.StringBuilder", "a.groovy"); + assertTypeEquals("java.lang.StringBuilder", "a.groovy"); } } diff --git a/plugins/groovy/testdata/resolve/inference/singleParameterInStringInjection/a.groovy b/plugins/groovy/testdata/resolve/inference/singleParameterInStringInjection/a.groovy new file mode 100644 index 000000000000..5be6015b5223 --- /dev/null +++ b/plugins/groovy/testdata/resolve/inference/singleParameterInStringInjection/a.groovy @@ -0,0 +1 @@ +[2, 3, 4].collect {"${builder -> builder.append(it)}"} \ No newline at end of file From c80f54883117f80ad195990ecc115636be74a256 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 16:16:40 +0400 Subject: [PATCH 29/38] IDEA-74640 Broken parameter info for methods with default arguments --- .../GroovyParameterInfoHandler.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java index 00bc5a023ac7..e8b852282edb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java @@ -140,19 +140,19 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc final PsiElement parent = place.getParent(); if (parent instanceof GrMethodCall) { final GrExpression invoked = ((GrMethodCall)parent).getInvokedExpression(); - if (isSimpleMethodInvoked(invoked)) { - elementToShow.addAll(ContainerUtil.findAll(variants, condition)); - } - else { + if (isPropertyInvoked(invoked)) { final PsiType type = invoked.getType(); if (type instanceof GrClosureType) { elementToShow.add(type); } else if (type != null) { - elementToShow.addAll( - ContainerUtil.findAll(ResolveUtil.getMethodCandidates(type, "call", place, PsiUtil.getArgumentTypes(place, true)), condition)); + final GroovyResolveResult[] calls = ResolveUtil.getMethodCandidates(type, "call", place, PsiUtil.getArgumentTypes(place, true)); + elementToShow.addAll(ContainerUtil.findAll(calls, condition)); } } + else { + elementToShow.addAll(ContainerUtil.findAll(variants, condition)); + } } else { elementToShow.addAll(Arrays.asList(variants)); @@ -161,11 +161,11 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc context.showHint(place, place.getTextRange().getStartOffset(), this); } - private static boolean isSimpleMethodInvoked(GrExpression invoked) { + private static boolean isPropertyInvoked(GrExpression invoked) { if (!(invoked instanceof GrReferenceExpression)) return false; final GroovyResolveResult resolveResult = ((GrReferenceExpression)invoked).advancedResolve(); - return resolveResult.getElement() instanceof PsiMethod && !resolveResult.isInvokedOnProperty(); + return resolveResult.isInvokedOnProperty(); } public void updateParameterInfo(@NotNull GroovyPsiElement place, UpdateParameterInfoContext context) { From 01d859786390805bdf91eba9ad1cf14fe06cc3ce Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 16:20:27 +0400 Subject: [PATCH 30/38] IDEA-74635, IDEA-74639 Groovy Parameter Info is not updated after changes of PSI or caret position --- .../lang/parameterInfo/GroovyParameterInfoHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java index e8b852282edb..e362d89d7e17 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java @@ -169,6 +169,12 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc } public void updateParameterInfo(@NotNull GroovyPsiElement place, UpdateParameterInfoContext context) { + final PsiElement parameterOwner = context.getParameterOwner(); + if (parameterOwner != place) { + context.removeHint(); + return; + } + int offset = context.getEditor().getCaretModel().getOffset(); offset = CharArrayUtil.shiftForward(context.getEditor().getDocument().getText(), offset, " \t\n"); final int currIndex = getCurrentParameterIndex(place, offset); From aa0cd78f2df0f5dce94665bf3712ee651b5c03f9 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 17:15:45 +0400 Subject: [PATCH 31/38] IDEA-74704 Groovy 1.9: Introduce Refactorings applied to multi-catch parameter should not suggest union type --- .../plugins/groovy/refactoring/GroovyRefactoringUtil.java | 1 + .../introduce/constant/GrIntroduceConstantDialog.java | 7 ++++++- .../plugins/groovy/refactoring/ui/GrTypeComboBox.java | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java index 41e97b5a8e07..4534bfb12509 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java @@ -181,6 +181,7 @@ public abstract class GroovyRefactoringUtil { // todo add type hierarchy public static Map getCompatibleTypeNames(@NotNull PsiType type) { + if (type instanceof PsiDisjunctionType) type = ((PsiDisjunctionType)type).getLeastUpperBound(); Map map = new LinkedHashMap(); final PsiPrimitiveType unboxed = PsiPrimitiveType.getUnboxedType(type); if (unboxed != null) type = unboxed; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantDialog.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantDialog.java index 3e0bfbf517b5..2019ff4b7fa9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantDialog.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantDialog.java @@ -231,13 +231,18 @@ public class GrIntroduceConstantDialog extends DialogWrapper private void initializeTypeCombo() { - final PsiType expressionType; + PsiType expressionType; if (myContext.expression != null) { expressionType = myContext.expression.getType(); } else { expressionType = myContext.var.getDeclaredType(); } + + if (expressionType instanceof PsiDisjunctionType) { + expressionType = ((PsiDisjunctionType)expressionType).getLeastUpperBound(); + } + if (expressionType != null) { myTypes = GroovyRefactoringUtil.getCompatibleTypeNames(expressionType); for (String typeName : myTypes.keySet()) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/ui/GrTypeComboBox.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/ui/GrTypeComboBox.java index 4f17c158c0ec..8d5037342d70 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/ui/GrTypeComboBox.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/ui/GrTypeComboBox.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.groovy.refactoring.ui; +import com.intellij.psi.PsiDisjunctionType; import com.intellij.psi.PsiType; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; @@ -34,6 +35,7 @@ public class GrTypeComboBox extends JComboBox { public GrTypeComboBox(PsiType type, boolean selectType) { super(); + if (type instanceof PsiDisjunctionType) type = ((PsiDisjunctionType)type).getLeastUpperBound(); myType = type; initialize(); if (selectType && getItemCount() > 1) { From ba1ac92dee64e593e7355248d329b7bf385c40f6 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 17:35:31 +0400 Subject: [PATCH 32/38] IDEA-74716 Groovy: IOE at PsiJavaParserFacadeImpl.createExpressionFromText() on Change Signature Refactoring -> Add Parameter without default value, if method is used in Java code --- .../groovy/refactoring/changeSignature/GrParameterInfo.java | 3 +-- .../refactoring/changeSignature/ChangeSignatureTest.java | 4 ++++ .../changeSignature/DefaultInitializerInJava.groovy | 3 +++ .../changeSignature/DefaultInitializerInJava.java | 5 +++++ .../changeSignature/DefaultInitializerInJava_after.groovy | 3 +++ .../changeSignature/DefaultInitializerInJava_after.java | 5 +++++ 6 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.groovy create mode 100644 plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.java create mode 100644 plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.groovy create mode 100644 plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrParameterInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrParameterInfo.java index 270135255e79..5b81388bc112 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrParameterInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrParameterInfo.java @@ -103,8 +103,7 @@ public class GrParameterInfo implements JavaParameterInfo { } public PsiExpression getValue(PsiCallExpression callExpression) { - return JavaPsiFacade.getInstance(callExpression.getProject()).getElementFactory() - .createExpressionFromText(myDefaultValue, callExpression); + return JavaPsiFacade.getElementFactory(callExpression.getProject()).createExpressionFromText(getDefaultValue(), callExpression); } public boolean isVarargType() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTest.java index cfbfa451cb2d..316e605459ff 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTest.java @@ -240,6 +240,10 @@ public class ChangeSignatureTest extends ChangeSignatureTestCase { doTest(new SimpleInfo("newName", 0), new SimpleInfo(1)); } + public void testDefaultInitializerInJava() { + doTest(new SimpleInfo("p", -1, "", "1", "")); + } + private PsiType createType(String typeText) { return JavaPsiFacade.getElementFactory(getProject()).createTypeByFQClassName(typeText, GlobalSearchScope.allScope(getProject())); } diff --git a/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.groovy b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.groovy new file mode 100644 index 000000000000..7ae2a99dca0b --- /dev/null +++ b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.groovy @@ -0,0 +1,3 @@ +class GClass { + public void test() {} +} \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.java b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.java new file mode 100644 index 000000000000..5fdb3fed54fb --- /dev/null +++ b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava.java @@ -0,0 +1,5 @@ +public class JClass { + void doTest() { + new GClass().test(); + } +} diff --git a/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.groovy b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.groovy new file mode 100644 index 000000000000..a96448e49cf8 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.groovy @@ -0,0 +1,3 @@ +class GClass { + public test(def p = 1) {} +} \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.java b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.java new file mode 100644 index 000000000000..81b19989d6e8 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/changeSignature/DefaultInitializerInJava_after.java @@ -0,0 +1,5 @@ +public class JClass { + void doTest() { + new GClass().test(1); + } +} From 864ce15ffbe8411d8ab57d16a14ba6294077f07b Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 17:39:08 +0400 Subject: [PATCH 33/38] IDEA-74914 Groovy: Introduce Parameter Refactoring: scope chooser has unclear options --- .../introduce/parameter/GrIntroduceParameterHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java index 2cdcd43a7840..84dc11188520 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java @@ -91,8 +91,8 @@ import static org.jetbrains.plugins.groovy.refactoring.HelpID.GROOVY_INTRODUCE_P public class GrIntroduceParameterHandler implements RefactoringActionHandler { private static final Logger LOG = Logger.getInstance(GrIntroduceParameterHandler.class); - @NonNls public static final String USE_SUPER_METHOD_OF = "Use super method of"; - @NonNls public static final String CHANGE_USAGES_OF = "Change usages of"; + @NonNls public static final String USE_SUPER_METHOD_OF = "Change base method"; + @NonNls public static final String CHANGE_USAGES_OF = "Change usages"; private JBPopup myEnclosingMethodsPopup; public void invoke(final @NotNull Project project, final Editor editor, final PsiFile file, final @Nullable DataContext dataContext) { From ab9a63a19a0c6aa029a1f6b0d022bf6d9ec68be0 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 22:30:44 +0400 Subject: [PATCH 34/38] IDEA-74920 Groovy: Introduce Parameter Refactoring with delegating in super method --- .../parameter/GrIntroduceParameterProcessor.java | 4 ++-- .../GrIntroduceParameterTest.java | 2 ++ .../DelegaterInSuperMyClass.groovy | 7 +++++++ .../DelegaterInSuperMyClass_after.groovy | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass.groovy create mode 100644 plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass_after.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterProcessor.java index f73da138f528..52b0743f2b85 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterProcessor.java @@ -312,8 +312,8 @@ public class GrIntroduceParameterProcessor extends BaseRefactoringProcessor impl final GrOpenBlock block = factory.createMethodFromText(call.toString()).getBlock(); result.getBlock().replace(block); - final PsiElement parent = myContext.toReplaceIn.getParent(); - return (GrMethod)parent.addBefore(result, myContext.toReplaceIn); + final PsiElement parent = prototype.getParent(); + return (GrMethod)parent.addBefore(result, prototype); } private void processChangedMethodCall(PsiElement element) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.java index 4d835ab9e34c..5ec19fc45edf 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.java @@ -323,6 +323,8 @@ public class GrIntroduceParameterTest extends LightCodeInsightFixtureTestCase { public void testDelegate1() {doDelegateTest();} public void testDelegate2() {doDelegateTest();} + + public void testDelegaterInSuper() {doDelegateTest();} private void doDelegateTest() { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE, false, false, null, true); diff --git a/plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass.groovy b/plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass.groovy new file mode 100644 index 000000000000..0ce669b7cfc4 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass.groovy @@ -0,0 +1,7 @@ +class Base { + def foo(){} +} + +class Inh extends Base { + def foo() {print 123} +} \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass_after.groovy b/plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass_after.groovy new file mode 100644 index 000000000000..aa6dbf5bd5d4 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/introduceParameterGroovy/delegaterInSuper/DelegaterInSuperMyClass_after.groovy @@ -0,0 +1,15 @@ +class Base { + def foo() { + foo(123); + } + + def foo(int anObject){} +} + +class Inh extends Base { + def foo() { + foo(123); + } + + def foo(int anObject) {print anObject} +} \ No newline at end of file From d2aa9e1b16a26d6485dcbbfe4a474ba05a54bb9d Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 22:38:03 +0400 Subject: [PATCH 35/38] IDEA-74922 Groovy: cannot close Warning dialog shown on Introduce Parameter Refactoring --- .../introduce/parameter/GrIntroduceParameterHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java index 84dc11188520..af624d8c3e74 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterHandler.java @@ -177,6 +177,7 @@ public class GrIntroduceParameterHandler implements RefactoringActionHandler { final GrParametersOwner owner = scopes.get(0); if (owner instanceof GrMethod) { PsiMethod newMethod = SuperMethodWarningUtil.checkSuperMethod((PsiMethod)owner, RefactoringBundle.message("to.refactor")); + if (newMethod == null) return; getContext(project, editor, expression, variable, owner, newMethod); return; } From ea648dae0e244867361bbdfd5d325eb57712a1db Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 22:48:52 +0400 Subject: [PATCH 36/38] IDEA-74924 Groovy: unclear "Change usages of variable" option in Introduce Parameter dialog --- .../introduce/parameter/GrIntroduceParameterDialog.form | 4 ++-- .../introduce/parameter/GrIntroduceParameterDialog.java | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.form b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.form index 72e3a1f1fd43..614ba3eebe2e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.form +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.form @@ -86,7 +86,7 @@ - + @@ -95,7 +95,7 @@ - + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java index 73688f9cfc72..5ab54ed23831 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java @@ -33,6 +33,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrParametersOwner; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; @@ -95,6 +97,8 @@ public class GrIntroduceParameterDialog extends RefactoringDialog implements GrI initReplaceFieldsWithGetters(settings); myDeclareFinalCheckBox.setSelected(hasFinalModifier()); + + myChangeVarUsages.setVisible(context.toReplaceIn instanceof GrClosableBlock && context.toSearchFor instanceof GrVariable); setTitle(RefactoringBundle.message("introduce.parameter.title")); init(); @@ -151,6 +155,9 @@ public class GrIntroduceParameterDialog extends RefactoringDialog implements GrI processor = new GrIntroduceParameterProcessor(settings, myContext); } else { + if (!myChangeVarUsages.isSelected() && myContext.toSearchFor != null) { + myContext = new GrIntroduceParameterContext(myContext, myContext.toReplaceIn, null); + } processor = new GrIntroduceClosureParameterProcessor(settings, myContext); } invokeRefactoring(processor); From 9b3b37a76d3c588986ab50821001ce0e089d8fdd Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 22:55:58 +0400 Subject: [PATCH 37/38] IDEA-74926 Groovy: misleading message is shown on attempt to inline parameter --- .../intellij/refactoring/inline/InlineParameterHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java index 18993d7629a8..9352ac6951df 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java @@ -17,6 +17,7 @@ package com.intellij.refactoring.inline; import com.intellij.codeInsight.PsiEquivalenceUtil; import com.intellij.codeInspection.sameParameterValue.SameParameterValueInspection; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; @@ -48,7 +49,9 @@ public class InlineParameterHandler extends JavaInlineActionHandler { public static final String REFACTORING_NAME = RefactoringBundle.message("inline.parameter.refactoring"); public boolean canInlineElement(PsiElement element) { - return element instanceof PsiParameter && element.getParent() instanceof PsiParameterList; + return element instanceof PsiParameter && + element.getParent() instanceof PsiParameterList && + element.getLanguage() == JavaLanguage.INSTANCE; } public void inlineElement(final Project project, final Editor editor, final PsiElement psiElement) { From f0ea1406aa5841a40ae777938c7827edd5d91120 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 4 Oct 2011 23:11:38 +0400 Subject: [PATCH 38/38] IDEA-74933 Groovy: Introduce Closure Parameter with "Delegate via overloading" and "Remove parameter" options doesn't remove parameter no longer used --- .../parameter/GrIntroduceClosureParameterProcessor.java | 6 ++++-- .../introduce/parameter/GrIntroduceParameterDialog.java | 3 ++- .../GrIntroduceParameterInClosureTest.java | 4 ++++ .../DelegateRemoveUnusedParam.groovy | 3 +++ .../DelegateRemoveUnusedParam_after.groovy | 6 ++++++ 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam.groovy create mode 100644 plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam_after.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java index d9c636a877dc..588ac03e74bd 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java @@ -485,8 +485,10 @@ public class GrIntroduceClosureParameterProcessor extends BaseRefactoringProcess call.append(newName).append('('); final GrParameter[] parameters = result.getParameters(); - for (GrParameter parameter : parameters) { - call.append(parameter.getName()).append(", "); + for (int i = 0; i < parameters.length; i++) { + if (!mySettings.parametersToRemove().contains(i)) { + call.append(parameters[i].getName()).append(", "); + } } call.append(myParameterInitializer.getText()); call.append(")"); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java index 5ab54ed23831..4e1123d512df 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceParameterDialog.java @@ -99,6 +99,7 @@ public class GrIntroduceParameterDialog extends RefactoringDialog implements GrI myDeclareFinalCheckBox.setSelected(hasFinalModifier()); myChangeVarUsages.setVisible(context.toReplaceIn instanceof GrClosableBlock && context.toSearchFor instanceof GrVariable); + myChangeVarUsages.setSelected(true); setTitle(RefactoringBundle.message("introduce.parameter.title")); init(); @@ -176,7 +177,7 @@ public class GrIntroduceParameterDialog extends RefactoringDialog implements GrI @Override protected JComponent createCenterPanel() { - final GridBag c = new GridBag().setDefaultAnchor(GridBagConstraints.WEST).setLine(3); + final GridBag c = new GridBag().setDefaultAnchor(GridBagConstraints.WEST).setLine(4); for (Object o : toRemoveCBs.keys()) { c.nextLine(); myCheckBoxContainer.add(((JCheckBox)o), c); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterInClosureTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterInClosureTest.java index 8ef6db72d81a..c817c7e2d2b9 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterInClosureTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterInClosureTest.java @@ -92,4 +92,8 @@ public class GrIntroduceParameterInClosureTest extends LightCodeInsightFixtureTe public void testCorrectOccurrencesForLocalVar() { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE, false, false, null, false); } + + public void testDelegateRemoveUnusedParam() { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE, true, false, null, true); + } } diff --git a/plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam.groovy b/plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam.groovy new file mode 100644 index 000000000000..079c0cd9522d --- /dev/null +++ b/plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam.groovy @@ -0,0 +1,3 @@ +def clos = { int i -> + println "test" +} \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam_after.groovy b/plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam_after.groovy new file mode 100644 index 000000000000..e3f54601bc76 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/introduceParameterInClosure/DelegateRemoveUnusedParam_after.groovy @@ -0,0 +1,6 @@ +def closDelegate = { String anObject -> + println anObject +} +def clos = {int i -> + closDelegate("test") +} \ No newline at end of file