From 4dead6b5b973cbf6641ba72d7e853ade3054223c Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Wed, 27 Jan 2010 17:31:11 +0300 Subject: [PATCH 01/29] IDEA-51739 Code highlight is not updated upon modification --- .../src/com/intellij/codeInsight/daemon/LineMarkerInfo.java | 1 - .../com/intellij/codeInsight/daemon/impl/LineMarkersPass.java | 1 - .../codeInsight/daemon/impl/UpdateHighlightersUtil.java | 3 +-- xml/impl/src/com/intellij/xml/DefaultXmlExtension.java | 2 +- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerInfo.java b/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerInfo.java index 3ae3a2e1a867..f86bf6db7855 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerInfo.java +++ b/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerInfo.java @@ -47,7 +47,6 @@ public class LineMarkerInfo { @Nullable private final Function myTooltipProvider; private final GutterIconRenderer.Alignment myIconAlignment; @Nullable private final GutterIconNavigationHandler myNavigationHandler; - public TextAttributesKey textAttributesKey; public LineMarkerInfo(T element, diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java index b70d8223c90d..4b57eeab75a0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java @@ -143,7 +143,6 @@ public class LineMarkersPass extends ProgressableTextEditorHighlightingPass impl return injectedMarker.getLineMarkerTooltip(); } }, injectedMarker.getNavigationHandler(), GutterIconRenderer.Alignment.RIGHT); - converted.textAttributesKey = injectedMarker.textAttributesKey; result.add(converted); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java index 7bd8431b23e6..e86552ba77e6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java @@ -399,8 +399,7 @@ public class UpdateHighlightersUtil { } RangeHighlighter marker = toReuse.reuseHighlighterAt(info.startOffset, info.endOffset); if (marker == null) { - TextAttributes attributes = info.textAttributesKey == null ? null : colorsScheme.getAttributes(info.textAttributesKey); - marker = markupModel.addRangeHighlighter(info.startOffset, info.endOffset, HighlighterLayer.ADDITIONAL_SYNTAX, attributes, HighlighterTargetArea.EXACT_RANGE); + marker = markupModel.addRangeHighlighter(info.startOffset, info.endOffset, HighlighterLayer.ADDITIONAL_SYNTAX, null, HighlighterTargetArea.EXACT_RANGE); } LineMarkerInfo.LineMarkerGutterIconRenderer renderer = (LineMarkerInfo.LineMarkerGutterIconRenderer)info.createGutterRenderer(); LineMarkerInfo.LineMarkerGutterIconRenderer oldRenderer = marker.getGutterIconRenderer() instanceof LineMarkerInfo.LineMarkerGutterIconRenderer ? (LineMarkerInfo.LineMarkerGutterIconRenderer)marker.getGutterIconRenderer() : null; diff --git a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java index 26f740e8618b..985295a8ad62 100644 --- a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java +++ b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java @@ -244,7 +244,7 @@ public class DefaultXmlExtension extends XmlExtension { @NonNls String nsDeclarationAttrName = null; for(XmlTag t = context; t != null; t = t.getParentTag()) { if (t.hasNamespaceDeclarations()) { - if (nsDeclarationAttrName == null) nsDeclarationAttrName = "xmlns:"+namespacePrefix; + if (nsDeclarationAttrName == null) nsDeclarationAttrName = namespacePrefix.length() > 0 ? "xmlns:"+namespacePrefix:"xmlns"; if (t.getAttributeValue(nsDeclarationAttrName) != null) return true; } } From 6c4b454e1a95debad198df59bb18de17f6196887 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 27 Jan 2010 19:26:50 +0300 Subject: [PATCH 02/29] show/hide annotations bg --- .../vcs/actions/AnnotateToggleAction.java | 8 ++- .../vcs/actions/AnnotationFieldGutter.java | 10 +++- .../vcs/actions/ShowHideColorsAction.java | 51 +++++++++++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 platform/vcs-impl/src/com/intellij/openapi/vcs/actions/ShowHideColorsAction.java diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java index ea3247e1f2eb..7c815c363b37 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java @@ -214,7 +214,7 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware { final HighlightAnnotationsActions highlighting = new HighlightAnnotationsActions(project, file, fileAnnotation, editorGutterComponentEx); final List gutters = new ArrayList(); final AnnotationSourceSwitcher switcher = fileAnnotation.getAnnotationSourceSwitcher(); - final MyAnnotationPresentation presentation = new MyAnnotationPresentation(highlighting, switcher, editorGutterComponentEx); + final MyAnnotationPresentation presentation = new MyAnnotationPresentation(highlighting, switcher, editorGutterComponentEx, gutters); if (switcher != null) { @@ -372,19 +372,23 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware { private final HighlightAnnotationsActions myHighlighting; @Nullable private final AnnotationSourceSwitcher mySwitcher; + private final List myGutters; private final List myActions; private MySwitchAnnotationSourceAction mySwitchAction; public MyAnnotationPresentation(@NotNull final HighlightAnnotationsActions highlighting, @Nullable final AnnotationSourceSwitcher switcher, - final EditorGutterComponentEx gutter) { + final EditorGutterComponentEx gutter, + List gutters) { myHighlighting = highlighting; mySwitcher = switcher; + myGutters = gutters; myActions = new ArrayList(myHighlighting.getList()); if (mySwitcher != null) { mySwitchAction = new MySwitchAnnotationSourceAction(mySwitcher, gutter); myActions.add(mySwitchAction); } + myActions.add(new ShowHideColorsAction(myGutters, gutter)); } public EditorFontType getFontType(final int line) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java index f0fa642f11cc..2ac37f45dd8c 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java @@ -43,6 +43,7 @@ class AnnotationFieldGutter implements ActiveAnnotationGutter { private final AnnotationListener myListener; private final boolean myIsGutterAction; private Map myColorScheme; + private boolean myShowBg = true; AnnotationFieldGutter(FileAnnotation annotation, Editor editor, LineAnnotationAspect aspect, final TextAnnotationPresentation presentation) { myAnnotation = annotation; @@ -109,8 +110,9 @@ class AnnotationFieldGutter implements ActiveAnnotationGutter { @Nullable public Color getBgColor(int line, Editor editor) { + if (myColorScheme == null || !myShowBg) return null; final String s = getLineText(line, editor); - if (myColorScheme == null || s == null) return null; + if (s == null) return null; final Color bg = myColorScheme.get(s); return bg == null ? findBgColor(s) : bg; } @@ -129,5 +131,9 @@ class AnnotationFieldGutter implements ActiveAnnotationGutter { public void setAspectValueToBgColorMap(Map colorScheme) { myColorScheme = colorScheme; - } + } + + public void setShowBg(boolean show) { + myShowBg = show; + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/ShowHideColorsAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/ShowHideColorsAction.java new file mode 100644 index 000000000000..053d306f5b99 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/ShowHideColorsAction.java @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.vcs.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.editor.ex.EditorGutterComponentEx; +import com.intellij.openapi.util.registry.Registry; + +import java.util.List; + +/** + * @author Konstantin Bulenkov + */ +public class ShowHideColorsAction extends AnAction { + private boolean showColors = Registry.is("vcs.show.colored.annotations"); + private final List myGutters; + private final EditorGutterComponentEx myGutter; + + public ShowHideColorsAction(List gutters, EditorGutterComponentEx gutter) { + myGutters = gutters; + myGutter = gutter; + } + + @Override + public void actionPerformed(AnActionEvent e) { + showColors = !showColors; + for (AnnotationFieldGutter gutter : myGutters) { + gutter.setShowBg(showColors); + } + myGutter.revalidateMarkup(); + } + + @Override + public void update(AnActionEvent e) { + e.getPresentation().setText(showColors ? "Hide Colors" : "Show Colors"); + } +} From 89dd1d6b85811a87c55e121e2f6ed42ae57f0e22 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 27 Jan 2010 15:15:24 +0300 Subject: [PATCH 03/29] Fix method equivalence check indefinite recursion. --- .../src/com/intellij/psi/impl/PsiClassImplUtil.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java b/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java index 071981fb72b5..f524e85552cb 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java @@ -18,10 +18,7 @@ package com.intellij.psi.impl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Iconable; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.UserDataHolderEx; +import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.filters.OrFilter; @@ -972,6 +969,12 @@ public class PsiClassImplUtil { else { PsiClass class1 = ((PsiClassType)type1).resolve(); PsiClass class2 = ((PsiClassType)type2).resolve(); + + if (class1 instanceof PsiTypeParameter && class2 instanceof PsiTypeParameter) { + return Comparing.equal(class1.getName(), class2.getName()) && + ((PsiTypeParameter)class1).getIndex() == ((PsiTypeParameter)class2).getIndex(); + } + if (!manager.areElementsEquivalent(class1, class2)) return false; } } From 4f5a5bc370c38109cab13534fee18acc472d6e7f Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 27 Jan 2010 18:58:09 +0300 Subject: [PATCH 04/29] extend test framework: isTestMethodOrConfig --- java/openapi/src/com/intellij/codeInsight/TestFramework.java | 2 ++ .../src/com/intellij/execution/junit/JUnitTestFramework.java | 4 ++++ .../src/com/theoryinpractice/testng/util/TestNGUtil.java | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/java/openapi/src/com/intellij/codeInsight/TestFramework.java b/java/openapi/src/com/intellij/codeInsight/TestFramework.java index 195e188b64ce..037425648b9e 100644 --- a/java/openapi/src/com/intellij/codeInsight/TestFramework.java +++ b/java/openapi/src/com/intellij/codeInsight/TestFramework.java @@ -27,4 +27,6 @@ import com.intellij.util.IncorrectOperationException; public interface TestFramework { boolean isTestKlass(PsiClass psiClass); PsiMethod findSetUpMethod(PsiClass psiClass) throws IncorrectOperationException; + + boolean isTestMethodOrConfig(PsiMethod psiMethod); } \ No newline at end of file diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitTestFramework.java b/plugins/junit/src/com/intellij/execution/junit/JUnitTestFramework.java index 91c8b56b3745..5abcc25cf8df 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitTestFramework.java +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitTestFramework.java @@ -66,4 +66,8 @@ public class JUnitTestFramework implements TestFramework { } return inClass; } + + public boolean isTestMethodOrConfig(PsiMethod psiMethod) { + return JUnitUtil.isTestMethodOrConfig(psiMethod); + } } \ No newline at end of file diff --git a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java index aef188828bbe..24cc13eaeedd 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java +++ b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java @@ -477,6 +477,10 @@ public class TestNGUtil implements TestFramework return inClass; } + public boolean isTestMethodOrConfig(PsiMethod psiMethod) { + return hasTest(psiMethod) || hasConfig(psiMethod); + } + public static boolean checkTestNGInClasspath(PsiElement psiElement) { final Project project = psiElement.getProject(); final PsiManager manager = PsiManager.getInstance(project); From 9a03b53248ca7e53f60bbee8259c80ff7deb22f1 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 27 Jan 2010 19:01:52 +0300 Subject: [PATCH 05/29] extend test framework: isTestMethodOrConfig --- java/openapi/src/com/intellij/codeInsight/TestUtil.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/java/openapi/src/com/intellij/codeInsight/TestUtil.java b/java/openapi/src/com/intellij/codeInsight/TestUtil.java index 45e980e1aa32..b22d4f2f211f 100644 --- a/java/openapi/src/com/intellij/codeInsight/TestUtil.java +++ b/java/openapi/src/com/intellij/codeInsight/TestUtil.java @@ -60,4 +60,13 @@ public class TestUtil { } return null; } + + public static boolean isTestMethodOrConfig(PsiMethod psiMethod) { + for (TestFramework framework : Extensions.getExtensions(TEST_FRAMEWORK)) { + if (framework.isTestMethodOrConfig(psiMethod)) { + return true; + } + } + return false; + } } \ No newline at end of file From 837c4c9e747d0ef9aed777fd1a0e661092d0c6ba Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 27 Jan 2010 19:10:31 +0300 Subject: [PATCH 06/29] suite presentation/navigation fixed (DEA-24794) --- .../junit3/JUnit3OutputObjectRegistry.java | 3 ++ .../com/intellij/junit3/TestRunnerUtil.java | 28 +++++++++++++++++++ .../src/com/intellij/junit3/TreeSender.java | 3 ++ 3 files changed, 34 insertions(+) diff --git a/plugins/junit_rt/src/com/intellij/junit3/JUnit3OutputObjectRegistry.java b/plugins/junit_rt/src/com/intellij/junit3/JUnit3OutputObjectRegistry.java index acd48cc9fa97..0edf7adca7ff 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/JUnit3OutputObjectRegistry.java +++ b/plugins/junit_rt/src/com/intellij/junit3/JUnit3OutputObjectRegistry.java @@ -60,6 +60,9 @@ public class JUnit3OutputObjectRegistry extends OutputObjectRegistry { } addTestClass(packet, fullName); } + else if (test instanceof TestRunnerUtil.SuiteMethodWrapper) { + addTestClass(packet, ((TestRunnerUtil.SuiteMethodWrapper)test).getClassName()); + } else { addUnknownTest(packet, test); } diff --git a/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java b/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java index 4989d5db9a7c..51d8f6c03488 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java +++ b/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java @@ -17,6 +17,7 @@ package com.intellij.junit3; import junit.framework.Test; import junit.framework.TestCase; +import junit.framework.TestResult; import junit.framework.TestSuite; import junit.runner.BaseTestRunner; @@ -116,6 +117,7 @@ public class TestRunnerUtil { } try { test = (Test)suiteMethod.invoke(null, new Class[0]); // static method + test = new SuiteMethodWrapper(test, suiteClassName); } catch (final InvocationTargetException e) { final String message = MessageFormat.format(ourBundle.getString("junit.failed.to.invoke.suite"), new Object[]{testClass + " " + e.getTargetException().toString()}); @@ -235,4 +237,30 @@ public class TestRunnerUtil { } } } + + public static class SuiteMethodWrapper implements Test { + private Test mySuite; + private String myClassName; + + public SuiteMethodWrapper(Test suite, String className) { + mySuite = suite; + myClassName = className; + } + + public String getClassName() { + return myClassName; + } + + public int countTestCases() { + return mySuite.countTestCases(); + } + + public void run(TestResult result) { + mySuite.run(result); + } + + public Test getSuite() { + return mySuite; + } + } } diff --git a/plugins/junit_rt/src/com/intellij/junit3/TreeSender.java b/plugins/junit_rt/src/com/intellij/junit3/TreeSender.java index 5fb3b0ad51fa..ba0a54cdb163 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/TreeSender.java +++ b/plugins/junit_rt/src/com/intellij/junit3/TreeSender.java @@ -36,6 +36,9 @@ public class TreeSender { private static Vector getTestCasesOf(Test test) { Vector testCases = new Vector(); + if (test instanceof TestRunnerUtil.SuiteMethodWrapper) { + test = ((TestRunnerUtil.SuiteMethodWrapper)test).getSuite(); + } if (test instanceof TestSuite) { TestSuite testSuite = (TestSuite)test; From be29e51590a4c76e77fb60cbc9a5fc29c0c72c81 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 27 Jan 2010 21:53:28 +0300 Subject: [PATCH 07/29] NPE --- .../copy/CopyFilesOrDirectoriesDialog.java | 19 ++++++++----------- .../MoveFilesOrDirectoriesDialog.java | 15 +++++++-------- .../src/com/intellij/ui/EditorComboBox.java | 10 ++++++++++ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java b/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java index de118d9d2108..7efcab47e49e 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java @@ -22,16 +22,14 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.*; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.Messages; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.refactoring.RefactoringBundle; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.EditorComboWithBrowseButton; -import com.intellij.ui.IdeBorderFactory; -import com.intellij.ui.RecentsManager; +import com.intellij.ui.*; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; @@ -147,13 +145,12 @@ class CopyFilesOrDirectoriesDialog extends DialogWrapper{ if (myShowDirectoryField) { panel.add(new JLabel(RefactoringBundle.message("copy.files.to.directory.label")), new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(4,8,4,8),0,0)); - final ComponentWithBrowseButton.BrowseFolderActionListener browseActionListener = - new ComponentWithBrowseButton.BrowseFolderActionListener(RefactoringBundle.message("select.target.directory"), - RefactoringBundle.message("the.file.will.be.copied.to.this.directory"), - null, myProject, FileChooserDescriptorFactory.createSingleFolderDescriptor(), - TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT); - myTargetDirectoryField = new EditorComboWithBrowseButton(browseActionListener, "", myProject, + myTargetDirectoryField = new EditorComboWithBrowseButton(null, "", myProject, RECENT_KEYS); + myTargetDirectoryField.addBrowseFolderListener(RefactoringBundle.message("select.target.directory"), + RefactoringBundle.message("the.file.will.be.copied.to.this.directory"), + myProject, FileChooserDescriptorFactory.createSingleFolderDescriptor(), + EditorComboBox.COMPONENT_ACCESSOR); myTargetDirectoryField.setTextFieldPreferredWidth(60); panel.add(myTargetDirectoryField, new GridBagConstraints(1,1,1,1,1,0,GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(4,0,4,8),0,0)); diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesDialog.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesDialog.java index 3fe59552f956..4906d0a85439 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesDialog.java @@ -24,9 +24,7 @@ import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.ui.TextComponentAccessor; import com.intellij.openapi.util.Disposer; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; @@ -34,6 +32,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.ui.EditorComboBox; import com.intellij.ui.EditorComboWithBrowseButton; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.RecentsManager; @@ -90,12 +89,12 @@ public class MoveFilesOrDirectoriesDialog extends DialogWrapper{ panel.add(new JLabel(RefactoringBundle.message("move.files.to.directory.label")), new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(4,8,4,8),0,0)); - final ComponentWithBrowseButton.BrowseFolderActionListener browseActionListener = - new ComponentWithBrowseButton.BrowseFolderActionListener(RefactoringBundle.message("select.target.directory"), - RefactoringBundle.message("the.file.will.be.moved.to.this.directory"), null, - myProject, FileChooserDescriptorFactory.createSingleFolderDescriptor(), - TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT); - myTargetDirectoryField = new EditorComboWithBrowseButton(browseActionListener, "", myProject, RECENT_KEYS); + myTargetDirectoryField = new EditorComboWithBrowseButton(null, "", myProject, RECENT_KEYS); + myTargetDirectoryField.addBrowseFolderListener(RefactoringBundle.message("select.target.directory"), + RefactoringBundle.message("the.file.will.be.moved.to.this.directory"), + myProject, + FileChooserDescriptorFactory.createSingleFolderDescriptor(), + EditorComboBox.COMPONENT_ACCESSOR); myTargetDirectoryField.setTextFieldPreferredWidth(60); panel.add(myTargetDirectoryField, new GridBagConstraints(1,1,1,1,1,0,GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(4,0,4,8),0,0)); diff --git a/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java b/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java index 93c933a961d9..1d701013e79c 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java @@ -28,6 +28,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.TextComponentAccessor; import javax.swing.*; import java.awt.*; @@ -38,6 +39,15 @@ import java.util.ArrayList; * @author max */ public class EditorComboBox extends JComboBox implements DocumentListener { + public static TextComponentAccessor COMPONENT_ACCESSOR = new TextComponentAccessor() { + public String getText(EditorComboBox component) { + return component.getText(); + } + + public void setText(EditorComboBox component, String text) { + component.setText(text); + } + }; private static final Logger LOG = Logger.getInstance("#com.intellij.ui.EditorTextField"); private Document myDocument; From fa2813760e7515cd53108b7c6f0956206856516c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 27 Jan 2010 21:33:32 +0300 Subject: [PATCH 08/29] correct insertion of paired quotes in raw and unicode Python literals (PY-263) --- .../editorActions/SimpleTokenSetQuoteHandler.java | 13 +++++++++---- .../intellij/execution/impl/ConsoleViewImpl.java | 10 +++++++--- .../ex/util/LayeredLexerEditorHighlighter.java | 4 ++++ .../editor/highlighter/HighlighterIterator.java | 2 ++ .../editor/ex/util/EmptyEditorHighlighter.java | 11 ++++++++--- .../editor/ex/util/LexerEditorHighlighter.java | 4 ++++ .../ex/util/LimitedRangeHighlighterIterator.java | 5 +++++ 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SimpleTokenSetQuoteHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SimpleTokenSetQuoteHandler.java index 65f46bd4b6f8..bea5c066932d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SimpleTokenSetQuoteHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SimpleTokenSetQuoteHandler.java @@ -65,10 +65,7 @@ public class SimpleTokenSetQuoteHandler implements QuoteHandler { IElementType tokenType = iterator.getTokenType(); if (myLiteralTokenSet.contains(tokenType)) { - if (iterator.getStart() >= iterator.getEnd() - 1 || - chars.charAt(iterator.getEnd() - 1) != '\"' && chars.charAt(iterator.getEnd() - 1) != '\'') { - return true; - } + if (isNonClosedLiteral(iterator, chars)) return true; } iterator.advance(); } @@ -80,6 +77,14 @@ public class SimpleTokenSetQuoteHandler implements QuoteHandler { return false; } + protected boolean isNonClosedLiteral(HighlighterIterator iterator, CharSequence chars) { + if (iterator.getStart() >= iterator.getEnd() - 1 || + chars.charAt(iterator.getEnd() - 1) != '\"' && chars.charAt(iterator.getEnd() - 1) != '\'') { + return true; + } + return false; + } + public boolean isInsideLiteral(HighlighterIterator iterator) { return myLiteralTokenSet.contains(iterator.getTokenType()); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 26296a354797..ee4204cead67 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -850,7 +850,7 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } private class MyHighlighter extends DocumentAdapter implements EditorHighlighter { - private boolean myHasEditor; + private HighlighterClient myEditor; public HighlighterIterator createIterator(final int startOffset) { final int startIndex = findTokenInfoIndexByOffset(startOffset); @@ -889,6 +889,10 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ return myIndex < 0 || myIndex >= myTokens.size(); } + public Document getDocument() { + return myEditor.getDocument(); + } + private TokenInfo getTokenInfo() { return myTokens.get(myIndex); } @@ -899,8 +903,8 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } public void setEditor(final HighlighterClient editor) { - LOG.assertTrue(!myHasEditor, "Highlighters cannot be reused with different editors"); - myHasEditor = true; + LOG.assertTrue(myEditor == null, "Highlighters cannot be reused with different editors"); + myEditor = editor; } public void setColorScheme(EditorColorsScheme scheme) { diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java b/platform/lang-impl/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java index 820bffd471f9..f9a333971f38 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java @@ -498,5 +498,9 @@ public class LayeredLexerEditorHighlighter extends LexerEditorHighlighter { public boolean atEnd() { return myBaseIterator.atEnd(); } + + public Document getDocument() { + return myBaseIterator.getDocument(); + } } } diff --git a/platform/platform-api/src/com/intellij/openapi/editor/highlighter/HighlighterIterator.java b/platform/platform-api/src/com/intellij/openapi/editor/highlighter/HighlighterIterator.java index 4fbaeb082d1d..336a86977b4c 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/highlighter/HighlighterIterator.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/highlighter/HighlighterIterator.java @@ -16,6 +16,7 @@ package com.intellij.openapi.editor.highlighter; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.psi.tree.IElementType; @@ -28,4 +29,5 @@ public interface HighlighterIterator { void advance(); void retreat(); boolean atEnd(); + Document getDocument(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EmptyEditorHighlighter.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EmptyEditorHighlighter.java index a839190de2b3..51b392145ee6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EmptyEditorHighlighter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EmptyEditorHighlighter.java @@ -16,6 +16,7 @@ package com.intellij.openapi.editor.ex.util; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.HighlighterColors; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.event.DocumentEvent; @@ -31,7 +32,7 @@ public class EmptyEditorHighlighter implements EditorHighlighter, PrioritizedDoc private TextAttributes myAttributes; private int myTextLength = 0; - private boolean myHasEditor = false; + private HighlighterClient myEditor; public EmptyEditorHighlighter(TextAttributes attributes) { myAttributes = attributes; @@ -46,8 +47,8 @@ public class EmptyEditorHighlighter implements EditorHighlighter, PrioritizedDoc } public void setEditor(HighlighterClient editor) { - LOG.assertTrue(!myHasEditor, "Highlighters cannot be reused with different editors"); - myHasEditor = true; + LOG.assertTrue(myEditor == null, "Highlighters cannot be reused with different editors"); + myEditor = editor; } public void setColorScheme(EditorColorsScheme scheme) { @@ -92,6 +93,10 @@ public class EmptyEditorHighlighter implements EditorHighlighter, PrioritizedDoc return index != 0; } + public Document getDocument() { + return myEditor.getDocument(); + } + public IElementType getTokenType(){ return IElementType.find(IElementType.FIRST_TOKEN_INDEX); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java index 481ea5c6c92c..2efae3125f19 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java @@ -383,5 +383,9 @@ public class LexerEditorHighlighter implements EditorHighlighter, PrioritizedDoc public boolean atEnd() { return mySegmentIndex >= mySegments.getSegmentCount() || mySegmentIndex < 0; } + + public Document getDocument() { + return myEditor.getDocument(); + } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LimitedRangeHighlighterIterator.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LimitedRangeHighlighterIterator.java index 0a07d7131605..f46c83597fe7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LimitedRangeHighlighterIterator.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LimitedRangeHighlighterIterator.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.ex.util; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.psi.tree.IElementType; @@ -61,4 +62,8 @@ public class LimitedRangeHighlighterIterator implements HighlighterIterator { public boolean atEnd() { return myOriginal.atEnd() || myOriginal.getStart() >= myEndOffset || myOriginal.getEnd() <= myStartOffset; } + + public Document getDocument() { + return myOriginal.getDocument(); + } } From 4f581c7735a659fda44a99ac84b24a3c81b06daf Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 28 Jan 2010 12:14:20 +0300 Subject: [PATCH 09/29] dialogs: focus trackback is sheduled when focus manager is idle to help clients that expect data context to be immediately ready after show() method unblocks --- .../ui/impl/DialogWrapperPeerImpl.java | 21 ++++++++++++++++--- .../src/com/intellij/ui/FocusTrackback.java | 9 ++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index cf4137b05dd1..898848d82dd9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -609,7 +609,7 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra if (!isModal()) { final Ref focusManager = new Ref(null); if (myProject != null && myProject.get() != null && !myProject.get().isDisposed()) { - focusManager.set(IdeFocusManager.getInstance(myProject.get())); + focusManager.set(getFocusManager()); focusManager.get().doWhenFocusSettlesDown(new Runnable() { public void run() { disposeFocusTrackbackIfNoChildWindowFocused(focusManager.get()); @@ -640,6 +640,14 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra super.show(); } + private IdeFocusManager getFocusManager() { + if (myProject != null && myProject.get() != null && !myProject.get().isDisposed()) { + return IdeFocusManager.getInstance(myProject.get()); + } else { + return IdeFocusManager.findInstance(); + } + } + private void disposeFocusTrackbackIfNoChildWindowFocused(@Nullable IdeFocusManager focusManager) { if (myFocusTrackback == null) return; @@ -667,7 +675,14 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra public void hide() { super.hide(); if (myFocusTrackback != null) { - myFocusTrackback.restoreFocus(); + myFocusTrackback.setWillBeSheduledForRestore(); + IdeFocusManager mgr = getFocusManager(); + mgr.doWhenFocusSettlesDown(new Runnable() { + public void run() { + myFocusTrackback.restoreFocus(); + myFocusTrackback = null; + } + }); } } @@ -686,7 +701,7 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra myComponentListener = null; } - if (myFocusTrackback != null && !myFocusTrackback.isSheduledForRestore()) { + if (myFocusTrackback != null && !(myFocusTrackback.isSheduledForRestore() || myFocusTrackback.isWillBeSheduledForRestore())) { myFocusTrackback.dispose(); myFocusTrackback = null; } diff --git a/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java b/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java index ef7802e186d1..b377857f6638 100644 --- a/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java +++ b/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java @@ -60,6 +60,7 @@ public class FocusTrackback { private boolean myConsumed; private WeakReference myRequestor; private boolean mySheduledForRestore; + private boolean myWillBeSheduledForRestore; public FocusTrackback(@NotNull Object requestor, Component parent, boolean mustBeShown) { this(requestor, SwingUtilities.getWindowAncestor(parent), mustBeShown); @@ -375,10 +376,18 @@ public class FocusTrackback { return myRequestor.get(); } + public void setWillBeSheduledForRestore() { + myWillBeSheduledForRestore = true; + } + public boolean isSheduledForRestore() { return mySheduledForRestore; } + public boolean isWillBeSheduledForRestore() { + return myWillBeSheduledForRestore; + } + public interface Provider { FocusTrackback getFocusTrackback(); } From 0e5cd44be63da9bb16cfc8abe15d378f62762357 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 28 Jan 2010 13:22:29 +0300 Subject: [PATCH 10/29] dialogs: showAndAndGetOk() for notifiyng when focus is settled after the show --- .../intellij/openapi/ui/DialogWrapper.java | 15 ++++++++++++++- .../openapi/ui/DialogWrapperPeer.java | 3 ++- .../ui/impl/DialogWrapperPeerImpl.java | 19 +++++++++++++++---- .../ui/impl/GlassPaneDialogWrapperPeer.java | 5 ++++- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java index 352035aea5aa..b3992ccefc20 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java @@ -23,6 +23,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.StackingPopupDispatcher; +import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; @@ -940,6 +941,12 @@ public abstract class DialogWrapper { * @throws IllegalStateException if the dialog is invoked not on the event dispatch thread */ public void show() { + showAndGetOk(); + } + + public AsyncResult showAndGetOk() { + final AsyncResult result = new AsyncResult(); + ensureEventDispatchThread(); registerKeyboardShortcuts(); @@ -949,7 +956,13 @@ public abstract class DialogWrapper { Disposer.register(uiParent, myDisposable); // ensure everything is disposed on app quit } - myPeer.show(); + myPeer.show().doWhenProcessed(new Runnable() { + public void run() { + result.setDone(isOK()); + } + }); + + return result; } /** diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java index fc81a7273c8f..c501a19e7dde 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.ui; +import com.intellij.openapi.util.ActionCallback; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -138,7 +139,7 @@ public abstract class DialogWrapperPeer { */ public abstract void setLocation(int x, int y); - public abstract void show(); + public abstract ActionCallback show(); public abstract void setContentPane(JComponent content); diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index 898848d82dd9..c6355f453877 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -348,7 +348,9 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra myDialog.setLocation(x, y); } - public void show() { + public ActionCallback show() { + final ActionCallback result = new ActionCallback(); + LOG.assertTrue(EventQueue.isDispatchThread(), "Access is allowed from event dispatch thread only"); final AnCancelAction anCancelAction = new AnCancelAction(); @@ -397,7 +399,15 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra LaterInvocator.leaveModal(myDialog); } } + + myDialog.getFocusManager().doWhenFocusSettlesDown(new Runnable() { + public void run() { + result.setDone(); + } + }); } + + return result; } //[kirillk] for now it only deals with the TaskWindow under Mac OS X: modal dialogs are shown behind JBPopup @@ -674,15 +684,16 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra @Deprecated public void hide() { super.hide(); - if (myFocusTrackback != null) { + if (myFocusTrackback != null && !(myFocusTrackback.isSheduledForRestore() || myFocusTrackback.isWillBeSheduledForRestore())) { myFocusTrackback.setWillBeSheduledForRestore(); IdeFocusManager mgr = getFocusManager(); - mgr.doWhenFocusSettlesDown(new Runnable() { + Runnable r = new Runnable() { public void run() { myFocusTrackback.restoreFocus(); myFocusTrackback = null; } - }); + }; + mgr.doWhenFocusSettlesDown(r); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java index 0f30bbb7c3a1..e53703a43945 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java @@ -29,6 +29,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.DialogWrapperDialog; import com.intellij.openapi.ui.DialogWrapperPeer; +import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.wm.IdeFrame; @@ -275,12 +276,14 @@ public class GlassPaneDialogWrapperPeer extends DialogWrapperPeer implements Foc myDialog.setLocation(_x, _y); } - public void show() { + public ActionCallback show() { LOG.assertTrue(EventQueue.isDispatchThread(), "Access is allowed from event dispatch thread only"); hidePopupsIfNeeded(); myDialog.setVisible(true); + + return new ActionCallback.Done(); } public void setContentPane(final JComponent content) { From 19e8c4ea6468e98497fd75a1b6d7f1f6d2257459 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Thu, 28 Jan 2010 13:39:44 +0300 Subject: [PATCH 11/29] Use stubs in Groovy PSI, stubs for Groovy modifier list --- .../groovy/annotator/GroovyAnnotator.java | 59 ++++++------ .../closure/EachToForIntention.java | 3 +- .../ConvertMethodToClosureIntention.java | 3 +- .../GroovyCompletionContributor.java | 9 +- .../GroovyDocumentationProvider.java | 5 +- .../expressions/ChooseTypeExpression.java | 7 +- .../lang/parser/GroovyElementTypes.java | 3 +- .../api/auxiliary/modifiers/GrModifier.java | 26 ++++++ .../auxiliary/modifiers/GrModifierFlags.java | 40 ++++++++ .../auxiliary/modifiers/GrModifierList.java | 9 +- .../lang/psi/api/statements/GrField.java | 4 +- .../groovy/lang/psi/impl/GroovyFileImpl.java | 10 ++ .../modifiers/GrModifierListImpl.java | 92 +++++++++++++------ .../lang/psi/impl/statements/GrFieldImpl.java | 26 +++++- .../impl/statements/GrVariableBaseImpl.java | 3 +- .../typedef/GrTypeDefinitionImpl.java | 32 ++++--- .../members/GrAnnotationMethodImpl.java | 16 ++-- .../typedef/members/GrMethodImpl.java | 21 +++++ .../groovy/lang/psi/stubs/GrFieldStub.java | 5 + .../lang/psi/stubs/GrModifierListStub.java | 26 ++++++ .../elements/GrEnumConstantElementType.java | 2 +- .../stubs/elements/GrFieldElementType.java | 18 ++-- .../elements/GrModifierListElementType.java | 63 +++++++++++++ .../stubs/elements/GrStubFileElementType.java | 2 +- .../lang/psi/stubs/impl/GrFieldStubImpl.java | 49 +++++++++- .../stubs/impl/GrModifierListStubImpl.java | 82 +++++++++++++++++ .../noncode/BindableAnnotationProcessor.java | 5 +- .../noncode/VetoableAnnotationProcessor.java | 3 +- .../inline/GroovyInlineMethodUtil.java | 3 +- .../testdata/groovy/stubs/config_object.test | 73 +++++++++++++++ .../groovy/testdata/groovy/stubs/slurper.test | 73 ++++++++++++++- .../groovy/testdata/groovy/stubs/stub1.test | 4 +- .../testdata/groovy/stubs/stub_field1.test | 5 +- .../testdata/groovy/stubs/stub_method1.test | 4 + 34 files changed, 668 insertions(+), 117 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifier.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierFlags.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrModifierListStub.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrModifierListStubImpl.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index 2858bd3dcdf1..b9b4e0426248 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -45,6 +45,7 @@ import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.psi.*; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; @@ -153,7 +154,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { myHolder.createWarningAnnotation(referenceExpression.getReferenceNameElement(), message); } if (!resolveResult.isStaticsOK() && resolved instanceof PsiModifierListOwner) { - if (!((PsiModifierListOwner)resolved).hasModifierProperty(PsiModifier.STATIC)) { + if (!((PsiModifierListOwner)resolved).hasModifierProperty(GrModifier.STATIC)) { myHolder.createWarningAnnotation(referenceExpression, GroovyBundle.message("cannot.reference.nonstatic", referenceExpression.getReferenceName())); } } @@ -242,15 +243,15 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { PsiModifierList modifiersList = variableDeclaration.getModifierList(); checkAccessModifiers(myHolder, modifiersList); - if (modifiersList.hasExplicitModifier(PsiModifier.VOLATILE) && modifiersList.hasExplicitModifier(PsiModifier.FINAL)) { + if (modifiersList.hasExplicitModifier(GrModifier.VOLATILE) && modifiersList.hasExplicitModifier(GrModifier.FINAL)) { myHolder.createErrorAnnotation(modifiersList, GroovyBundle.message("illegal.combination.of.modifiers.volatile.and.final")); } - if (modifiersList.hasExplicitModifier(PsiModifier.NATIVE)) { + if (modifiersList.hasExplicitModifier(GrModifier.NATIVE)) { myHolder.createErrorAnnotation(modifiersList, GroovyBundle.message("variable.cannot.be.native")); } - if (modifiersList.hasExplicitModifier(PsiModifier.ABSTRACT)) { + if (modifiersList.hasExplicitModifier(GrModifier.ABSTRACT)) { myHolder.createErrorAnnotation(modifiersList, GroovyBundle.message("variable.cannot.be.abstract")); } } @@ -348,7 +349,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { final PsiElement element = refElement.resolve(); if (element instanceof PsiClass) { PsiClass clazz = (PsiClass)element; - if (clazz.hasModifierProperty(PsiModifier.ABSTRACT)) { + if (clazz.hasModifierProperty(GrModifier.ABSTRACT)) { if (newExpression.getAnonymousClassDefinition() == null) { String message = clazz.isInterface() ? GroovyBundle.message("cannot.instantiate.interface", clazz.getName()) @@ -358,7 +359,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { return; } if (newExpression.getQualifier() != null) { - if (clazz.hasModifierProperty(PsiModifier.STATIC)) { + if (clazz.hasModifierProperty(GrModifier.STATIC)) { myHolder.createErrorAnnotation(newExpression, GroovyBundle.message("qualified.new.of.static.class")); } } else { @@ -510,8 +511,8 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { for (PsiElement modifier : modifiers) { if (modifier instanceof PsiAnnotation) continue; final String modifierText = modifier.getText(); - if (PsiModifier.FINAL.equals(modifierText)) continue; - if ("def".equals(modifierText)) continue; + if (GrModifier.FINAL.equals(modifierText)) continue; + if (GrModifier.DEF.equals(modifierText)) continue; myHolder.createErrorAnnotation(modifier, GroovyBundle.message("not.allowed.modifier.in.forin", modifierText)); } } @@ -571,7 +572,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { : ((GrSuperReferenceExpression)expression).getQualifier(); if (qualifier == null) { final GrMethod method = PsiTreeUtil.getParentOfType(expression, GrMethod.class); - if (method != null && method.hasModifierProperty(PsiModifier.STATIC)) { + if (method != null && method.hasModifierProperty(GrModifier.STATIC)) { holder.createErrorAnnotation(expression, GroovyBundle.message("cannot.reference.nonstatic", expression.getText())); } } @@ -596,7 +597,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { final PsiClass containingClass = classMember.getContainingClass(); if (containingClass == null) return; if (com.intellij.psi.util.PsiUtil.isInnerClass(containingClass)) { - if (classMember.hasModifierProperty(PsiModifier.STATIC)) { + if (classMember.hasModifierProperty(GrModifier.STATIC)) { final PsiElement modifier = findModifierStatic(classMember); if (modifier != null) { holder.createErrorAnnotation(modifier, GroovyBundle.message("cannot.have.static.declarations")); @@ -613,7 +614,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { } for (PsiElement modifier : list.getModifiers()) { - if (PsiModifier.STATIC.equals(modifier.getText())) { + if (GrModifier.STATIC.equals(modifier.getText())) { return modifier; } } @@ -639,7 +640,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { } private static void checkImplementedMethodsOfClass(AnnotationHolder holder, GrTypeDefinition typeDefinition) { - if (typeDefinition.hasModifierProperty(PsiModifier.ABSTRACT)) return; + if (typeDefinition.hasModifierProperty(GrModifier.ABSTRACT)) return; if (typeDefinition.isEnum() || typeDefinition.isAnnotationType()) return; if (typeDefinition instanceof GrTypeParameter) return; @@ -682,14 +683,14 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { checkAccessModifiers(holder, modifiersList); //script methods - boolean isMethodAbstract = modifiersList.hasExplicitModifier(PsiModifier.ABSTRACT); - final boolean isMethodStatic = modifiersList.hasExplicitModifier(PsiModifier.STATIC); + boolean isMethodAbstract = modifiersList.hasExplicitModifier(GrModifier.ABSTRACT); + final boolean isMethodStatic = modifiersList.hasExplicitModifier(GrModifier.STATIC); if (method.getParent() instanceof GroovyFileBase) { if (isMethodAbstract) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("script.cannot.have.modifier.abstract")); } - if (modifiersList.hasExplicitModifier(PsiModifier.NATIVE)) { + if (modifiersList.hasExplicitModifier(GrModifier.NATIVE)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("script.cannot.have.modifier.native")); } } @@ -703,7 +704,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("interface.must.have.no.static.method")); } - if (modifiersList.hasExplicitModifier(PsiModifier.PRIVATE)) { + if (modifiersList.hasExplicitModifier(GrModifier.PRIVATE)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("interface.must.have.no.private.method")); } @@ -734,7 +735,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { PsiModifierList typeDefModifiersList = containingTypeDef.getModifierList(); LOG.assertTrue(typeDefModifiersList != null, "modifiers list must be not null"); - if (!typeDefModifiersList.hasExplicitModifier(PsiModifier.ABSTRACT)) { + if (!typeDefModifiersList.hasExplicitModifier(GrModifier.ABSTRACT)) { if (isMethodAbstract) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("not.abstract.class.cannot.have.abstract.method")); } @@ -768,35 +769,35 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { if (psiClass != null) { PsiModifierList modifierList = psiClass.getModifierList(); if (modifierList != null) { - if (modifierList.hasExplicitModifier(PsiModifier.FINAL)) { + if (modifierList.hasExplicitModifier(GrModifier.FINAL)) { holder.createErrorAnnotation(typeDefinition.getNameIdentifierGroovy(), GroovyBundle.message("final.class.cannot.be.extended")); } } } } - if (modifiersList.hasExplicitModifier(PsiModifier.ABSTRACT) && modifiersList.hasExplicitModifier(PsiModifier.FINAL)) { + if (modifiersList.hasExplicitModifier(GrModifier.ABSTRACT) && modifiersList.hasExplicitModifier(GrModifier.FINAL)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("illegal.combination.of.modifiers.abstract.and.final")); } - if (modifiersList.hasExplicitModifier(PsiModifier.TRANSIENT)) { + if (modifiersList.hasExplicitModifier(GrModifier.TRANSIENT)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("modifier.transient.not.allowed.here")); } - if (modifiersList.hasExplicitModifier(PsiModifier.VOLATILE)) { + if (modifiersList.hasExplicitModifier(GrModifier.VOLATILE)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("modifier.volatile.not.allowed.here")); } /**** interface ****/ if (typeDefinition.isInterface()) { - if (modifiersList.hasExplicitModifier(PsiModifier.FINAL)) { + if (modifiersList.hasExplicitModifier(GrModifier.FINAL)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("intarface.cannot.have.modifier.final")); } - if (modifiersList.hasExplicitModifier(PsiModifier.VOLATILE)) { + if (modifiersList.hasExplicitModifier(GrModifier.VOLATILE)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("modifier.volatile.not.allowed.here")); } - if (modifiersList.hasExplicitModifier(PsiModifier.TRANSIENT)) { + if (modifiersList.hasExplicitModifier(GrModifier.TRANSIENT)) { holder.createErrorAnnotation(modifiersList, GroovyBundle.message("modifier.transient.not.allowed.here")); } } @@ -805,9 +806,9 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { } private static void checkAccessModifiers(AnnotationHolder holder, @NotNull PsiModifierList modifierList) { - boolean hasPrivate = modifierList.hasExplicitModifier(PsiModifier.PRIVATE); - boolean hasPublic = modifierList.hasExplicitModifier(PsiModifier.PUBLIC); - boolean hasProtected = modifierList.hasExplicitModifier(PsiModifier.PROTECTED); + boolean hasPrivate = modifierList.hasExplicitModifier(GrModifier.PRIVATE); + boolean hasPublic = modifierList.hasExplicitModifier(GrModifier.PUBLIC); + boolean hasProtected = modifierList.hasExplicitModifier(GrModifier.PROTECTED); if (hasPrivate && hasPublic || hasPrivate && hasProtected || hasPublic && hasProtected) { holder.createErrorAnnotation(modifierList, GroovyBundle.message("illegal.combination.of.modifiers")); @@ -1003,7 +1004,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { } private static void highlightMemberResolved(AnnotationHolder holder, GrReferenceExpression refExpr, PsiMember member) { - boolean isStatic = member.hasModifierProperty(PsiModifier.STATIC); + boolean isStatic = member.hasModifierProperty(GrModifier.STATIC); Annotation annotation = holder.createInfoAnnotation(refExpr.getReferenceNameElement(), null); if (member instanceof PsiField ) { @@ -1197,7 +1198,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { if (member instanceof GrField) { GrField field = (GrField)member; PsiElement identifier = field.getNameIdentifierGroovy(); - final boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC); + final boolean isStatic = field.hasModifierProperty(GrModifier.STATIC); holder.createInfoAnnotation(identifier, null).setTextAttributes(isStatic ? DefaultHighlighter.STATIC_FIELD : DefaultHighlighter.INSTANCE_FIELD); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/closure/EachToForIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/closure/EachToForIntention.java index 6a410fa58b4f..17333c0a9fdb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/closure/EachToForIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/closure/EachToForIntention.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.intentions.base.Intention; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -52,7 +53,7 @@ public class EachToForIntention extends Intention { String var; if (parameters.length == 1) { var = parameters[0].getText(); - var = StringUtil.replace(var, "def", ""); + var = StringUtil.replace(var, GrModifier.DEF, ""); } else { var = "it"; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMethodToClosureIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMethodToClosureIntention.java index 18ba62a2ef07..5fb904c346c1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMethodToClosureIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMethodToClosureIntention.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.intentions.base.Intention; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody; @@ -45,7 +46,7 @@ public class ConvertMethodToClosureIntention extends Intention { StringBuilder builder = new StringBuilder(method.getTextLength()); String modifiers = method.getModifierList().getText(); if (modifiers.trim().length() == 0) { - modifiers = "def"; + modifiers = GrModifier.DEF; } builder.append(modifiers).append(' '); builder.append(method.getName()).append("={"); 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 9bf61714e4ea..82e13abd4ce8 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 @@ -26,7 +26,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Iconable; import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PlatformPatterns; -import static com.intellij.patterns.PlatformPatterns.psiElement; import com.intellij.psi.*; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiTreeUtil; @@ -41,6 +40,7 @@ import org.jetbrains.plugins.groovy.lang.completion.handlers.AfterNewClassInsert import org.jetbrains.plugins.groovy.lang.completion.handlers.ArrayInsertHandler; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; @@ -49,11 +49,13 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpres import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; -import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipWhitespaces; import java.util.ArrayList; import java.util.List; +import static com.intellij.patterns.PlatformPatterns.psiElement; +import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipWhitespaces; + /** * @author ilyas */ @@ -66,7 +68,8 @@ public class GroovyCompletionContributor extends CompletionContributor { private static final ElementPattern AFTER_DOT = psiElement().afterLeaf(".").withParent(GrReferenceExpression.class); private static final String[] MODIFIERS = - new String[]{"private", "public", "protected", "transient", "abstract", "native", "volatile", "strictfp", "def", "final", "synchronized", "static"}; + new String[]{GrModifier.PRIVATE, GrModifier.PUBLIC, GrModifier.PROTECTED, GrModifier.TRANSIENT, GrModifier.ABSTRACT, GrModifier.NATIVE, + GrModifier.VOLATILE, GrModifier.STRICTFP, GrModifier.DEF, GrModifier.FINAL, GrModifier.SYNCHRONIZED, GrModifier.STATIC}; private static final ElementPattern TYPE_IN_VARIABLE_DECLARATION_AFTER_MODIFIER = PlatformPatterns .or(psiElement(PsiElement.class).withParent(GrVariable.class).afterLeaf(MODIFIERS), psiElement(PsiElement.class).withParent(GrParameter.class)); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java index 4be79cfd4aa0..817f326bbdeb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java @@ -38,6 +38,7 @@ import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocCommentOwner; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.impl.GrDocCommentUtil; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -212,7 +213,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider { buffer.append(type.getCanonicalText()); } else { - buffer.append("def"); + buffer.append(GrModifier.DEF); } } @@ -344,7 +345,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider { builder.append(LINE_SEPARATOR); } - if ((method.getReturnType() != null || method.getModifierList().hasModifierProperty("def")) && + if ((method.getReturnType() != null || method.getModifierList().hasModifierProperty(GrModifier.DEF)) && method.getReturnType() != PsiType.VOID) { builder.append(CodeDocumentationUtil.createDocCommentLine(RETURN_TAG, project, commenter)); builder.append(LINE_SEPARATOR); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/template/expressions/ChooseTypeExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/template/expressions/ChooseTypeExpression.java index 0874faa083a5..c732b59c038c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/template/expressions/ChooseTypeExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/template/expressions/ChooseTypeExpression.java @@ -15,7 +15,9 @@ */ package org.jetbrains.plugins.groovy.lang.editor.template.expressions; -import com.intellij.codeInsight.lookup.*; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.codeInsight.lookup.PsiTypeLookupItem; import com.intellij.codeInsight.template.Expression; import com.intellij.codeInsight.template.ExpressionContext; import com.intellij.codeInsight.template.PsiTypeResult; @@ -23,6 +25,7 @@ import com.intellij.codeInsight.template.Result; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTypesUtil; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SubtypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SupertypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint; @@ -58,7 +61,7 @@ public class ChooseTypeExpression extends Expression { } } - result.add(LookupElementBuilder.create("def").setBold()); + result.add(LookupElementBuilder.create(GrModifier.DEF).setBold()); return result.toArray(new LookupElement[result.size()]); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java index 069c221ac082..20207dd844dd 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java @@ -22,6 +22,7 @@ import org.jetbrains.plugins.groovy.lang.groovydoc.parser.GroovyDocElementTypes; import org.jetbrains.plugins.groovy.lang.lexer.GroovyElementType; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GrStubElementType; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAnnotationMethod; @@ -210,7 +211,7 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GroovyElementType VARIABLE = new GroovyElementType("assigned variable"); //modifiers - GroovyElementType MODIFIERS = new GroovyElementType("modifiers"); //node + GrStubElementType MODIFIERS = new GrModifierListElementType("modifier list"); GroovyElementType BALANCED_BRACKETS = new GroovyElementType("balanced brackets"); //node diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifier.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifier.java new file mode 100644 index 000000000000..f2168dcddc63 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifier.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers; + +import com.intellij.psi.PsiModifier; +import org.jetbrains.annotations.NonNls; + +/** + * @author Maxim.Medvedev + */ +public interface GrModifier extends PsiModifier { + @NonNls String DEF = "def"; +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierFlags.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierFlags.java new file mode 100644 index 000000000000..56d3e8be7cd0 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierFlags.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers; + +/** + * @author Maxim.Medvedev + */ +public interface GrModifierFlags { + int PUBLIC_MASK = 0x0001; + int PRIVATE_MASK = 0x0002; + int PROTECTED_MASK = 0x0004; + int STATIC_MASK = 0x0008; + int FINAL_MASK = 0x0010; + int SYNCHRONIZED_MASK = 0x0020; + int VOLATILE_MASK = 0x0040; + int TRANSIENT_MASK = 0x0080; + int NATIVE_MASK = 0x0100; + int INTERFACE_MASK = 0x0200; + int ABSTRACT_MASK = 0x0400; + int STRICTFP_MASK = 0x0800; + int PACKAGE_LOCAL_MASK = 0x1000; + int DEPRECATED_MASK = 0x2000; + int ENUM_MASK = 0x4000; + int ANNOTATION_TYPE_MASK = 0x8000; + int ANNOTATION_DEPRECATED_MASK = 0x10000; + int DEF_MASK = 0x20000; +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierList.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierList.java index 75feb887e3ca..f9f621c07cd1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierList.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/auxiliary/modifiers/GrModifierList.java @@ -16,18 +16,19 @@ package org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiModifierList; +import com.intellij.psi.StubBasedPsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; -import com.intellij.psi.PsiModifierList; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiAnnotation; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub; /** * @autor: Dmitry.Krasilschikov * @date: 18.03.2007 */ -public interface GrModifierList extends GroovyPsiElement, PsiModifierList { +public interface GrModifierList extends GroovyPsiElement, PsiModifierList, StubBasedPsiElement { @NotNull PsiElement[] getModifiers(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java index bc9685681896..85232b963d22 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java @@ -30,7 +30,7 @@ import java.util.Set; * @author ven */ public interface GrField extends GrVariable, GrMember, PsiField, GrTopLevelDefintion, StubBasedPsiElement, GrDocCommentOwner { - public static final GrField[] EMPTY_ARRAY = new GrField[0]; + GrField[] EMPTY_ARRAY = new GrField[0]; boolean isProperty(); @@ -41,5 +41,5 @@ public interface GrField extends GrVariable, GrMember, PsiField, GrTopLevelDefin GrAccessorMethod[] getGetters(); @NotNull - public Set[] getNamedParametersArray(); + Set[] getNamedParametersArray(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java index 5dfdad8d70ae..450d79343b2d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java @@ -31,6 +31,7 @@ import com.intellij.psi.scope.BaseScopeProcessor; import com.intellij.psi.scope.NameHint; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.StubElement; import com.intellij.util.IncorrectOperationException; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -51,6 +52,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.GrTopStatement; import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement; import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDefinition; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFileStub; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint; @@ -82,6 +84,10 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { @NotNull public String getPackageName() { + final StubElement stub = getStub(); + if (stub instanceof GrFileStub) { + return ((GrFileStub)stub).getPackageName().toString(); + } GrPackageDefinition packageDef = findChildByClass(GrPackageDefinition.class); if (packageDef != null) { return packageDef.getPackageName(); @@ -371,6 +377,10 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { } public boolean isScript() { + final StubElement stub = getStub(); + if (stub instanceof GrFileStub) { + return ((GrFileStub)stub).isScript(); + } GrTopStatement[] top = findChildrenByClass(GrTopStatement.class); for (GrTopStatement st : top) { if (!(st instanceof GrTypeDefinition || st instanceof GrImportStatement || st instanceof GrPackageDefinition)) return true; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java index 3fed2f69db3e..fd2eabd681fc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java @@ -19,7 +19,9 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.modifiers; import com.intellij.lang.ASTNode; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.TreeUtil; +import com.intellij.psi.stubs.IStubElementType; import com.intellij.util.IncorrectOperationException; +import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,12 +31,15 @@ import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierFlags; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody; -import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl; +import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyBaseElementImpl; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub; import java.util.ArrayList; import java.util.Arrays; @@ -44,11 +49,37 @@ import java.util.List; * @autor: Dmitry.Krasilschikov * @date: 18.03.2007 */ -public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifierList { +public class GrModifierListImpl extends GroovyBaseElementImpl implements GrModifierList { + public static final TObjectIntHashMap NAME_TO_MODIFIER_FLAG_MAP = new TObjectIntHashMap(); + + static { + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.PUBLIC, GrModifierFlags.PUBLIC_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.PROTECTED, GrModifierFlags.PROTECTED_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.PRIVATE, GrModifierFlags.PRIVATE_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.PACKAGE_LOCAL, GrModifierFlags.PACKAGE_LOCAL_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.STATIC, GrModifierFlags.STATIC_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.ABSTRACT, GrModifierFlags.ABSTRACT_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.FINAL, GrModifierFlags.FINAL_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.NATIVE, GrModifierFlags.NATIVE_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.SYNCHRONIZED, GrModifierFlags.SYNCHRONIZED_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.STRICTFP, GrModifierFlags.STRICTFP_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.TRANSIENT, GrModifierFlags.TRANSIENT_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.VOLATILE, GrModifierFlags.VOLATILE_MASK); + NAME_TO_MODIFIER_FLAG_MAP.put(GrModifier.DEF, GrModifierFlags.DEF_MASK); + } + public GrModifierListImpl(@NotNull ASTNode node) { super(node); } + public GrModifierListImpl(GrModifierListStub stub) { + this(stub, GroovyElementTypes.MODIFIERS); + } + + public GrModifierListImpl(GrModifierListStub stub, IStubElementType nodeType) { + super(stub, nodeType); + } + public void accept(GroovyElementVisitor visitor) { visitor.visitModifierList(this); } @@ -78,23 +109,29 @@ public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifi } public boolean hasModifierProperty(@NotNull @NonNls String modifier) { + final GrModifierListStub stub = getStub(); + if (stub != null) { + final int flag = NAME_TO_MODIFIER_FLAG_MAP.get(modifier); + return (stub.getModifiersFlags() & flag) != 0; + } + final PsiElement parent = getParent(); if (parent instanceof GrVariableDeclaration && parent.getParent() instanceof GrTypeDefinitionBody && !hasExplicitVisibilityModifiers()) { //properties are backed by private fields PsiElement pParent = parent.getParent().getParent(); if (!(pParent instanceof PsiClass) || !((PsiClass)pParent).isInterface()) { - if (modifier.equals(PsiModifier.PUBLIC)) return true; - if (modifier.equals(PsiModifier.PROTECTED)) return false; - if (modifier.equals(PsiModifier.PRIVATE)) return false; + if (modifier.equals(GrModifier.PUBLIC)) return true; + if (modifier.equals(GrModifier.PROTECTED)) return false; + if (modifier.equals(GrModifier.PRIVATE)) return false; } else { - if (modifier.equals(PsiModifier.STATIC)) return true; - if (modifier.equals(PsiModifier.FINAL)) return true; + if (modifier.equals(GrModifier.STATIC)) return true; + if (modifier.equals(GrModifier.FINAL)) return true; } } - if (modifier.equals(PsiModifier.PUBLIC)) { + if (modifier.equals(GrModifier.PUBLIC)) { //groovy type definitions and methods are public by default return findChildByType(GroovyElementTypes.kPRIVATE) == null && findChildByType(GroovyElementTypes.kPROTECTED) == null; } @@ -104,11 +141,11 @@ public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifi } if (!(parent instanceof GrVariableDeclaration)) { - if (modifier.equals(PsiModifier.ABSTRACT)) { + if (modifier.equals(GrModifier.ABSTRACT)) { return (parent instanceof GrTypeDefinition && ((GrTypeDefinition)parent).isInterface()) || findChildByType(GroovyElementTypes.kABSTRACT) != null; } - if (modifier.equals(PsiModifier.NATIVE)) return findChildByType(GroovyElementTypes.kNATIVE) != null; + if (modifier.equals(GrModifier.NATIVE)) return findChildByType(GroovyElementTypes.kNATIVE) != null; } if (!(parent instanceof GrTypeDefinition)) { @@ -129,8 +166,8 @@ public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifi assert psiClassAnnotation instanceof GrAnnotation; if (GroovyImmutableAnnotationInspection.IMMUTABLE.equals(psiClassAnnotation.getQualifiedName())) { - if (modifier.equals(PsiModifier.FINAL)) return true; - if (modifier.equals(PsiModifier.PRIVATE)) return true; + if (modifier.equals(GrModifier.FINAL)) return true; + if (modifier.equals(GrModifier.PRIVATE)) return true; } } } @@ -141,33 +178,33 @@ public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifi } public boolean hasExplicitModifier(@NotNull @NonNls String name) { - - if (name.equals(PsiModifier.PUBLIC)) return findChildByType(GroovyElementTypes.kPUBLIC) != null; - if (name.equals(PsiModifier.ABSTRACT)) return findChildByType(GroovyElementTypes.kABSTRACT) != null; - if (name.equals(PsiModifier.NATIVE)) return findChildByType(GroovyElementTypes.kNATIVE) != null; + if (name.equals(GrModifier.PUBLIC)) return findChildByType(GroovyElementTypes.kPUBLIC) != null; + if (name.equals(GrModifier.ABSTRACT)) return findChildByType(GroovyElementTypes.kABSTRACT) != null; + if (name.equals(GrModifier.NATIVE)) return findChildByType(GroovyElementTypes.kNATIVE) != null; return hasOtherModifiers(name); } private boolean hasOtherModifiers(String name) { - if (name.equals(PsiModifier.PRIVATE)) return findChildByType(GroovyElementTypes.kPRIVATE) != null; - if (name.equals(PsiModifier.PROTECTED)) return findChildByType(GroovyElementTypes.kPROTECTED) != null; - if (name.equals(PsiModifier.SYNCHRONIZED)) return findChildByType(GroovyElementTypes.kSYNCHRONIZED) != null; - if (name.equals(PsiModifier.STRICTFP)) return findChildByType(GroovyElementTypes.kSTRICTFP) != null; - if (name.equals(PsiModifier.STATIC)) return findChildByType(GroovyElementTypes.kSTATIC) != null; - if (name.equals(PsiModifier.FINAL)) return findChildByType(GroovyElementTypes.kFINAL) != null; - if (name.equals(PsiModifier.TRANSIENT)) return findChildByType(GroovyElementTypes.kTRANSIENT) != null; - return name.equals(PsiModifier.VOLATILE) && findChildByType(GroovyElementTypes.kVOLATILE) != null; + if (name.equals(GrModifier.PRIVATE)) return findChildByType(GroovyElementTypes.kPRIVATE) != null; + if (name.equals(GrModifier.PROTECTED)) return findChildByType(GroovyElementTypes.kPROTECTED) != null; + if (name.equals(GrModifier.SYNCHRONIZED)) return findChildByType(GroovyElementTypes.kSYNCHRONIZED) != null; + if (name.equals(GrModifier.STRICTFP)) return findChildByType(GroovyElementTypes.kSTRICTFP) != null; + if (name.equals(GrModifier.STATIC)) return findChildByType(GroovyElementTypes.kSTATIC) != null; + if (name.equals(GrModifier.FINAL)) return findChildByType(GroovyElementTypes.kFINAL) != null; + if (name.equals(GrModifier.TRANSIENT)) return findChildByType(GroovyElementTypes.kTRANSIENT) != null; + return name.equals(GrModifier.VOLATILE) && findChildByType(GroovyElementTypes.kVOLATILE) != null; } public void setModifierProperty(@NotNull @NonNls String name, boolean doSet) throws IncorrectOperationException { - if (PsiModifier.PACKAGE_LOCAL.equals(name)) { + if (GrModifier.PACKAGE_LOCAL.equals(name)) { return; } if (doSet) { final ASTNode modifierNode = GroovyPsiElementFactory.getInstance(getProject()).createModifierFromText(name).getNode(); - if (!"def".equals(name)) { + assert modifierNode != null; + if (!GrModifier.DEF.equals(name)) { final PsiElement[] modifiers = getModifiers(); - if (modifiers.length == 1 && modifiers[0].getText().equals("def")) { + if (modifiers.length == 1 && modifiers[0].getText().equals(GrModifier.DEF)) { getNode().replaceChild(findChildByType(GroovyTokenTypes.kDEF).getNode(), modifierNode); return; } @@ -191,6 +228,7 @@ public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifi public GrAnnotation[] getAnnotations() { return findChildrenByClass(GrAnnotation.class); } + @NotNull public PsiAnnotation[] getApplicableAnnotations() { return getAnnotations(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java index aeb24c615d3a..d985b5d72a25 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java @@ -89,7 +89,11 @@ public class GrFieldImpl extends GrVariableBaseImpl implements GrFi } public boolean isDeprecated() { - return false; + final GrFieldStub stub = getStub(); + if (stub != null) { + return stub.isDeprecated(); + } + return PsiImplUtil.isDeprecatedByDocTag(this) || PsiImplUtil.isDeprecatedByAnnotation(this); } @Override @@ -137,8 +141,10 @@ public class GrFieldImpl extends GrVariableBaseImpl implements GrFi } public boolean isProperty() { -// final String name = getName(); -// if (!GroovyPropertyUtils.canBePropertyName(name)) return false; + final GrFieldStub stub = getStub(); + if (stub != null) { + return stub.isProperty(); + } final PsiClass clazz = getContainingClass(); if (clazz == null) return false; if (clazz.isInterface()) return false; @@ -237,6 +243,16 @@ public class GrFieldImpl extends GrVariableBaseImpl implements GrFi return PsiImplUtil.getMemberUseScope(this); } + @NotNull + @Override + public String getName() { + final GrFieldStub stub = getStub(); + if (stub != null) { + return stub.getName(); + } + return super.getName(); + } + @Override public ItemPresentation getPresentation() { return new ItemPresentation() { @@ -285,6 +301,10 @@ public class GrFieldImpl extends GrVariableBaseImpl implements GrFi @NotNull public Set[] getNamedParametersArray() { + final GrFieldStub stub = getStub(); + if (stub != null) { + return stub.getNamedParameters(); + } final GrExpression initializerGroovy = getInitializerGroovy(); List> namedParameters = new LinkedList>(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java index 705a0537d102..6ad5628f787d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java @@ -34,6 +34,7 @@ import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrTupleDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; @@ -190,7 +191,7 @@ public abstract class GrVariableBaseImpl extends GroovyBa if (typeElement == null) return; final ASTNode typeElementNode = typeElement.getNode(); final ASTNode parent = typeElementNode.getTreeParent(); - parent.addLeaf(GroovyTokenTypes.kDEF, "def", typeElementNode); + parent.addLeaf(GroovyTokenTypes.kDEF, GrModifier.DEF, typeElementNode); parent.removeChild(typeElementNode); } else { type = TypesUtil.unboxPrimitiveTypeWrapper(type); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java index 2ca9f5fef13e..2e2f43ec0bea 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java @@ -100,6 +100,11 @@ public abstract class GrTypeDefinitionImpl extends GroovyBaseElementImpl getNamedParameters(int paramNumber) { - return null; - } - @NotNull public Set[] getNamedParametersArray() { return new HashSet[0]; } + + @NotNull + @Override + public String getName() { + final GrAnnotationMethodStub stub = getStub(); + if (stub != null) { + return stub.getName(); + } + return super.getName(); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodImpl.java index b43da6914f7c..de786c7e96e9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodImpl.java @@ -23,6 +23,8 @@ import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrMethodStub; +import java.util.Set; + /** * @author Dmitry.Krasilschikov * @date 26.03.2007 @@ -41,4 +43,23 @@ public class GrMethodImpl extends GrMethodBaseImpl implements GrMe return "Method"; } + @NotNull + @Override + public Set[] getNamedParametersArray() { + final GrMethodStub stub = getStub(); + if (stub != null) { + return stub.getNamedParameters(); + } + return super.getNamedParametersArray(); + } + + @NotNull + @Override + public String getName() { + final GrMethodStub stub = getStub(); + if (stub != null) { + return stub.getName(); + } + return super.getName(); + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java index 14202cae7e40..8b49daa5ab7f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java @@ -36,4 +36,9 @@ public interface GrFieldStub extends NamedStub { @NotNull Set[] getNamedParameters(); + boolean isProperty(); + + boolean isDeprecated(); + + byte getFlags(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrModifierListStub.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrModifierListStub.java new file mode 100644 index 000000000000..2d24da14c2c1 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrModifierListStub.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.psi.stubs; + +import com.intellij.psi.stubs.StubElement; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; + +/** + * @author Maxim.Medvedev + */ +public interface GrModifierListStub extends StubElement{ + int getModifiersFlags(); +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java index 5689f4ca25d3..105944040d49 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java @@ -70,7 +70,7 @@ public class GrEnumConstantElementType extends GrStubElementType Set[] namedParametersArray = new Set[0]; if (psi instanceof GrFieldImpl){ - namedParametersArray = ((GrFieldImpl)psi).getNamedParametersArray(); + namedParametersArray = psi.getNamedParametersArray(); } - return new GrFieldStubImpl(parentStub, StringRef.fromString(psi.getName()), false, annNames, namedParametersArray, FIELD); + return new GrFieldStubImpl(parentStub, StringRef.fromString(psi.getName()), annNames, namedParametersArray, FIELD, GrFieldStubImpl.buildFlags(psi)); } public void serialize(GrFieldStub stub, StubOutputStream dataStream) throws IOException { @@ -117,7 +118,7 @@ public class GrFieldElementType extends GrStubElementType dataStream.writeUTF(namepParameter); } } - dataStream.writeBoolean(stub.isEnumConstant()); + dataStream.writeByte(stub.getFlags()); } static GrFieldStub deserializeFieldStub(StubInputStream dataStream, StubElement parentStub) throws IOException { @@ -144,9 +145,10 @@ public class GrFieldElementType extends GrStubElementType namedParametersSets.add(curSet); } - boolean isEnumConstant = dataStream.readBoolean(); - return new GrFieldStubImpl(parentStub, ref, isEnumConstant, annNames, namedParametersSets.toArray(new HashSet[0]), - isEnumConstant ? ENUM_CONSTANT : FIELD); + byte flags = dataStream.readByte(); + + return new GrFieldStubImpl(parentStub, ref, annNames, namedParametersSets.toArray(new HashSet[namedParametersSets.size()]), + GrFieldStubImpl.isEnumConstant(flags) ? ENUM_CONSTANT : FIELD, flags); } static void indexFieldStub(GrFieldStub stub, IndexSink sink) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java new file mode 100644 index 000000000000..8b591f40a4ee --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java @@ -0,0 +1,63 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.psi.stubs.elements; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.stubs.StubElement; +import com.intellij.psi.stubs.StubInputStream; +import com.intellij.psi.stubs.StubOutputStream; +import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; +import org.jetbrains.plugins.groovy.lang.psi.GrStubElementType; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; +import org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.modifiers.GrModifierListImpl; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub; +import org.jetbrains.plugins.groovy.lang.psi.stubs.impl.GrModifierListStubImpl; + +import java.io.IOException; + +/** + * @author Maxim.Medvedev + */ +public class GrModifierListElementType extends GrStubElementType { + public GrModifierListElementType(String debugName) { + super(debugName); + } + + @Override + public PsiElement createElement(ASTNode node) { + return new GrModifierListImpl(node); + } + + @Override + public GrModifierList createPsi(GrModifierListStub stub) { + return new GrModifierListImpl(stub); + } + + @Override + public GrModifierListStub createStub(GrModifierList psi, StubElement parentStub) { + return new GrModifierListStubImpl(parentStub, GroovyElementTypes.MODIFIERS, GrModifierListStubImpl.buildFlags(psi)); + } + + public void serialize(GrModifierListStub stub, StubOutputStream dataStream) throws IOException { + dataStream.writeVarInt(stub.getModifiersFlags()); + } + + public GrModifierListStub deserialize(StubInputStream dataStream, StubElement parentStub) throws IOException { + return new GrModifierListStubImpl(parentStub, GroovyElementTypes.MODIFIERS, dataStream.readVarInt()); + } + +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java index 71fc3eb67a9f..70a7da0e41a1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java @@ -43,7 +43,7 @@ public class GrStubFileElementType extends IStubFileElementType { @Override public int getStubVersion() { - return super.getStubVersion() + 4; + return super.getStubVersion() + 5; } public String getExternalId() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFieldStubImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFieldStubImpl.java index 1078e0db3a9a..7277ca8339a8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFieldStubImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrFieldStubImpl.java @@ -22,6 +22,7 @@ import com.intellij.util.io.StringRef; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFieldStub; import java.util.Set; @@ -30,23 +31,31 @@ import java.util.Set; * @author ilyas */ public class GrFieldStubImpl extends StubBase implements GrFieldStub { + public static final byte IS_PROPERTY = 0x01; + public static final byte IS_ENUM_CONSTANT = 0x02; + public static final byte IS_DEPRECATED = 0x04; - private final boolean isEnumConstant; + private final byte myFlags; private final StringRef myName; private final String[] myAnnotations; @Nullable private final Set[] myNamedParameters; - public GrFieldStubImpl(StubElement parent, StringRef name, boolean isEnumConstant, final String[] annotations, @NotNull Set[] namedParameters, final IStubElementType elemType) { + public GrFieldStubImpl(StubElement parent, + StringRef name, + final String[] annotations, + @NotNull Set[] namedParameters, + final IStubElementType elemType, + byte flags) { super(parent, elemType); myName = name; - this.isEnumConstant = isEnumConstant; myAnnotations = annotations; myNamedParameters = namedParameters; + myFlags = flags; } public boolean isEnumConstant() { - return isEnumConstant; + return (myFlags & IS_ENUM_CONSTANT) != 0; } public String getName() { @@ -61,4 +70,36 @@ public class GrFieldStubImpl extends StubBase implements GrFieldStub { public Set[] getNamedParameters() { return myNamedParameters; } + + public boolean isProperty() { + return (myFlags & IS_PROPERTY) != 0; + } + + public boolean isDeprecated() { + return (myFlags & IS_DEPRECATED) != 0; + } + + public byte getFlags() { + return myFlags; + } + + public static byte buildFlags(GrField field) { + byte f = 0; + if (field instanceof GrEnumConstant) { + f |= IS_ENUM_CONSTANT; + } + + if (field.isProperty()) { + f |= IS_PROPERTY; + } + + if (field.isDeprecated()) { + f|= IS_DEPRECATED; + } + return f; + } + + public static boolean isEnumConstant(byte flags) { + return (flags & IS_ENUM_CONSTANT) != 0; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrModifierListStubImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrModifierListStubImpl.java new file mode 100644 index 000000000000..2400a5d824a3 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/impl/GrModifierListStubImpl.java @@ -0,0 +1,82 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.psi.stubs.impl; + +import com.intellij.psi.PsiModifier; +import com.intellij.psi.impl.cache.ModifierFlags; +import com.intellij.psi.stubs.IStubElementType; +import com.intellij.psi.stubs.StubBase; +import com.intellij.psi.stubs.StubElement; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; +import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub; + +/** + * @author Maxim.Medvedev + */ +public class GrModifierListStubImpl extends StubBase implements GrModifierListStub { + private final int myFlags; + + public GrModifierListStubImpl(StubElement parent, IStubElementType elementType, int flags) { + super(parent, elementType); + this.myFlags = flags; + } + + public int getModifiersFlags() { + return myFlags; + } + + public static int buildFlags(GrModifierList modifierList) { + int flags = 0; + if (modifierList.hasModifierProperty(PsiModifier.ABSTRACT)) { + flags |= ModifierFlags.ABSTRACT_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.FINAL)) { + flags |= ModifierFlags.FINAL_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.NATIVE)) { + flags |= ModifierFlags.NATIVE_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.STATIC)) { + flags |= ModifierFlags.STATIC_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.SYNCHRONIZED)) { + flags |= ModifierFlags.SYNCHRONIZED_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.TRANSIENT)) { + flags |= ModifierFlags.TRANSIENT_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.VOLATILE)) { + flags |= ModifierFlags.VOLATILE_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.PRIVATE)) { + flags |= ModifierFlags.PRIVATE_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.PROTECTED)) { + flags |= ModifierFlags.PROTECTED_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) { + flags |= ModifierFlags.PUBLIC_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) { + flags |= ModifierFlags.PACKAGE_LOCAL_MASK; + } + if (modifierList.hasModifierProperty(PsiModifier.STRICTFP)) { + flags |= ModifierFlags.STRICTFP_MASK; + } + return flags; + } + +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/BindableAnnotationProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/BindableAnnotationProcessor.java index 9ed6ef807e60..659eeaa46b8e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/BindableAnnotationProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/BindableAnnotationProcessor.java @@ -19,6 +19,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.noncode; import com.intellij.psi.*; import com.intellij.psi.scope.PsiScopeProcessor; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; @@ -54,11 +55,11 @@ public class BindableAnnotationProcessor implements NonCodeMembersProcessor { for (GrAnnotation annotation : annotations) { if (BINDABLE.equals(annotation.getQualifiedName())) { GrMethod addPropertyChangeListenerMethod = GroovyPsiElementFactory.getInstance(annotation.getProject()) - .createMethodFromText("def", "addPropertyChangeListener", PsiType.VOID.getCanonicalText(), + .createMethodFromText(GrModifier.DEF, "addPropertyChangeListener", PsiType.VOID.getCanonicalText(), new String[]{"PropertyChangeListener"}); GrMethod removePropertyChangeListenerMethod = GroovyPsiElementFactory.getInstance(annotation.getProject()) - .createMethodFromText("def", "removePropertyChangeListener", PsiType.VOID.getCanonicalText(), + .createMethodFromText(GrModifier.DEF, "removePropertyChangeListener", PsiType.VOID.getCanonicalText(), new String[]{"PropertyChangeListener"}); GroovyResolveResultImpl addPropertyResult = new GroovyResolveResultImpl(addPropertyChangeListenerMethod, true); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/VetoableAnnotationProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/VetoableAnnotationProcessor.java index ed2965efc287..7ffa1e94b72c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/VetoableAnnotationProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/noncode/VetoableAnnotationProcessor.java @@ -21,6 +21,7 @@ import com.intellij.psi.*; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; @@ -56,7 +57,7 @@ public class VetoableAnnotationProcessor implements NonCodeMembersProcessor { if (VETOABLE.equals(annotation.getQualifiedName())) { Project project = annotation.getProject(); GrVariableDeclaration vetoableChangeVar = GroovyPsiElementFactory.getInstance(project) - .createVariableDeclaration(new String[]{"def"}, null, PsiType.getJavaLangObject(PsiManager.getInstance(project), GlobalSearchScope.allScope( + .createVariableDeclaration(new String[]{GrModifier.DEF}, null, PsiType.getJavaLangObject(PsiManager.getInstance(project), GlobalSearchScope.allScope( project)), "vetoableChange"); GroovyResolveResultImpl vetoableChangeResult = new GroovyResolveResultImpl(vetoableChangeVar.getVariables()[0], true); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java index 59f54c2f7345..f34df291cf52 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java @@ -36,6 +36,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrBlockStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrIfStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; @@ -607,7 +608,7 @@ public class GroovyInlineMethodUtil { type = ""; } if (modifiers.length() == 0 && type.length() == 0) { - modifiers = "def"; + modifiers = GrModifier.DEF; } return modifiers + " " + type + " " + varName + " = " + expression.getText(); diff --git a/plugins/groovy/testdata/groovy/stubs/config_object.test b/plugins/groovy/testdata/groovy/stubs/config_object.test index f2f4980eb79b..b07c21da755d 100644 --- a/plugins/groovy/testdata/groovy/stubs/config_object.test +++ b/plugins/groovy/testdata/groovy/stubs/config_object.test @@ -254,22 +254,95 @@ class ConfigObject extends LinkedHashMap implements Writable { } ----- [Groovy script] + [Modifiers] [Class definition : ConfigObject] + [Modifiers] [Extends clause] [Implements clause] + [Modifiers] [Field : KEYWORDS] + [Modifiers] [Field : TAB_CHARACTER] + [Modifiers] [Field : configFile] + [Modifiers] + [Modifiers] + [Modifiers] [Method : writeTo] + [Modifiers] + [Modifiers] + [Modifiers] [Method : getProperty] + [Modifiers] + [Modifiers] + [Modifiers] [Method : flatten] + [Modifiers] [Method : flatten] + [Modifiers] + [Modifiers] [Method : merge] + [Modifiers] + [Modifiers] [Method : toProperties] + [Modifiers] + [Modifiers] [Method : toProperties] + [Modifiers] + [Modifiers] + [Modifiers] [Method : merge] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Method : writeConfig] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Method : writeValue] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Method : writeNode] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Method : convertValuesToString] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Method : populate] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/stubs/slurper.test b/plugins/groovy/testdata/groovy/stubs/slurper.test index 4db519bcb71c..4ed90e486341 100644 --- a/plugins/groovy/testdata/groovy/stubs/slurper.test +++ b/plugins/groovy/testdata/groovy/stubs/slurper.test @@ -273,21 +273,92 @@ class ConfigBinding extends Binding { } ----- [Groovy script] + [Modifiers] + [Modifiers] + [Modifiers] [Class definition : ConfigSlurper] + [Modifiers] + [Modifiers] [Field : ENV_METHOD] + [Modifiers] [Field : ENV_SETTINGS] + [Modifiers] [Field : classLoader] + [Modifiers] [Field : environment] + [Modifiers] [Field : envMode] + [Modifiers] [Field : bindingVars] + [Modifiers] + [Modifiers] + [Modifiers] [Method : setBinding] + [Modifiers] + [Modifiers] [Method : parse] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Method : parse] + [Modifiers] + [Modifiers] [Method : parse] + [Modifiers] + [Modifiers] [Method : parse] + [Modifiers] + [Modifiers] [Method : parse] + [Modifiers] + [Modifiers] [Method : parse] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] + [Modifiers] [Class definition : ConfigBinding] + [Modifiers] [Extends clause] + [Modifiers] [Field : callable] - [Method : setVariable] \ No newline at end of file + [Modifiers] + [Modifiers] + [Method : setVariable] + [Modifiers] + [Modifiers] + [Modifiers] \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/stubs/stub1.test b/plugins/groovy/testdata/groovy/stubs/stub1.test index 4d5bf621084e..751b75df5534 100644 --- a/plugins/groovy/testdata/groovy/stubs/stub1.test +++ b/plugins/groovy/testdata/groovy/stubs/stub1.test @@ -4,4 +4,6 @@ interface I {} ----- [Groovy script] [Class definition : A] - [Interface definition : I] \ No newline at end of file + [Modifiers] + [Interface definition : I] + [Modifiers] \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/stubs/stub_field1.test b/plugins/groovy/testdata/groovy/stubs/stub_field1.test index a0bd2e54acd9..45ff4724fd7c 100644 --- a/plugins/groovy/testdata/groovy/stubs/stub_field1.test +++ b/plugins/groovy/testdata/groovy/stubs/stub_field1.test @@ -5,5 +5,8 @@ class Boo{} ----- [Groovy script] [Class definition : Stub] + [Modifiers] + [Modifiers] [Field : foo] - [Class definition : Boo] \ No newline at end of file + [Class definition : Boo] + [Modifiers] \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/stubs/stub_method1.test b/plugins/groovy/testdata/groovy/stubs/stub_method1.test index 238e5f542473..4f0fb14e60ae 100644 --- a/plugins/groovy/testdata/groovy/stubs/stub_method1.test +++ b/plugins/groovy/testdata/groovy/stubs/stub_method1.test @@ -5,5 +5,9 @@ class Stub { ----- [Groovy script] [Class definition : Stub] + [Modifiers] + [Modifiers] [Field : myInt] [Method : foo] + [Modifiers] + [Modifiers] \ No newline at end of file From 9407d0379b2d0a9bed8622f510d0c9da778f223c Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Thu, 28 Jan 2010 14:27:37 +0300 Subject: [PATCH 12/29] IDEA-24452: Autocomplete doesn't work in with context and GString expression --- .../plugins/groovy/lang/psi/impl/PsiImplUtil.java | 6 ++++-- .../plugins/groovy/lang/GroovyHighlightingTest.java | 2 ++ plugins/groovy/testdata/highlighting/WithMethod.groovy | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/highlighting/WithMethod.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java index 6a7a89569218..7cf685c2c7e1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java @@ -31,7 +31,6 @@ import com.intellij.psi.util.MethodSignatureUtil; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; import org.jetbrains.plugins.groovy.lang.psi.GrNamedElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; @@ -56,6 +55,8 @@ import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.Arrays; import java.util.List; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; + /** * */ @@ -143,10 +144,11 @@ public class PsiImplUtil { } else if (parent instanceof GrMethodCallExpression) { funExpr = ((GrMethodCallExpression) parent).getInvokedExpression(); } + if (funExpr instanceof GrReferenceExpression) { qualifier = ((GrReferenceExpression) funExpr).getQualifierExpression(); if (qualifier != null) break; - } else break; + } closure = PsiTreeUtil.getParentOfType(closure, GrClosableBlock.class); } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index b988a1b9d915..d6a15df3f223 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -201,4 +201,6 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { } public void testStringAndGStringUpperBound() throws Exception {doTest();} + + public void testWithMethod() throws Exception {doTest();} } \ No newline at end of file diff --git a/plugins/groovy/testdata/highlighting/WithMethod.groovy b/plugins/groovy/testdata/highlighting/WithMethod.groovy new file mode 100644 index 000000000000..5b79c97b6308 --- /dev/null +++ b/plugins/groovy/testdata/highlighting/WithMethod.groovy @@ -0,0 +1,9 @@ +final def calendar = Calendar.getInstance() + +calendar.with { + clear() + set YEAR, 2009 + set MONTH, 7 + set DAY_OF_MONTH, 30 + println "Time is ${time}" +} \ No newline at end of file From a00d32721fce2daa06c5f5208e92de283aa932b6 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 28 Jan 2010 13:41:53 +0100 Subject: [PATCH 13/29] =?UTF-8?q?IDEA-51755=20(Quickfix=20for=20"=E2=80=8B?= =?UTF-8?q?Instantiating=20object=20to=20get=20class=20object"=20fails=20w?= =?UTF-8?q?ith=20arrays)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...atingObjectToGetClassObjectInspection.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InstantiatingObjectToGetClassObjectInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InstantiatingObjectToGetClassObjectInspection.java index 3c1ff82eeacf..e50855883ca6 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InstantiatingObjectToGetClassObjectInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InstantiatingObjectToGetClassObjectInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,22 +29,26 @@ import org.jetbrains.annotations.NotNull; public class InstantiatingObjectToGetClassObjectInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "instantiating.object.to.get.class.object.display.name"); } + @Override public boolean isEnabledByDefault() { return true; } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "instantiating.object.to.get.class.object.problem.descriptor"); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new InstantiatingObjectToGetClassObjectFix(); } @@ -58,6 +62,7 @@ public class InstantiatingObjectToGetClassObjectInspection "instantiating.object.to.get.class.object.replace.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiMethodCallExpression expression = @@ -70,15 +75,27 @@ public class InstantiatingObjectToGetClassObjectInspection return; } final PsiType type = qualifier.getType(); - if (type == null || !(type instanceof PsiClassType)) { + if (type == null) { return; } - final PsiClassType classType = (PsiClassType)type; - final String text = classType.getClassName(); - replaceExpression(expression, text + ".class"); + replaceExpression(expression, + getTypeText(type, new StringBuilder()) + ".class"); + } + + private static StringBuilder getTypeText(PsiType type, + StringBuilder text) { + if (type instanceof PsiArrayType) { + text.append("[]"); + final PsiArrayType arrayType = (PsiArrayType)type; + getTypeText(arrayType.getComponentType(), text); + } else { + text.insert(0, type.getCanonicalText()); + } + return text; } } + @Override public BaseInspectionVisitor buildVisitor() { return new InstantiatingObjectToGetClassObjectVisitor(); } From d5103284a618fa9f4c7a7b4a922902ee13e3adba Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 28 Jan 2010 13:00:46 +0300 Subject: [PATCH 14/29] do not navigate to test class if test method is not found (IDEA-24815) --- .../src/com/intellij/execution/junit2/info/TestCaseInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/junit/src/com/intellij/execution/junit2/info/TestCaseInfo.java b/plugins/junit/src/com/intellij/execution/junit2/info/TestCaseInfo.java index 3b911e15a502..af5e13304a36 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/info/TestCaseInfo.java +++ b/plugins/junit/src/com/intellij/execution/junit2/info/TestCaseInfo.java @@ -52,7 +52,7 @@ class TestCaseInfo extends ClassBasedInfo { MethodSignatureUtil.createMethodSignature(strippedMethodName, PsiType.EMPTY_ARRAY, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY), true); if (method != null) return new MethodLocation(project, method, classLocation); - return classLocation; + return null; } public boolean shouldRun() { From fca2bf37295da1d8ba4eb95856332da6d3ddd584 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 28 Jan 2010 16:21:35 +0300 Subject: [PATCH 15/29] Git: show history for selection --- plugins/git4idea/src/META-INF/plugin.xml | 2 +- plugins/git4idea/src/git4idea/GitRevisionNumber.java | 5 +++++ plugins/git4idea/src/git4idea/GitVcs.java | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/git4idea/src/META-INF/plugin.xml b/plugins/git4idea/src/META-INF/plugin.xml index 373b061be5e5..8a65cc2c7428 100644 --- a/plugins/git4idea/src/META-INF/plugin.xml +++ b/plugins/git4idea/src/META-INF/plugin.xml @@ -30,7 +30,7 @@ - + diff --git a/plugins/git4idea/src/git4idea/GitRevisionNumber.java b/plugins/git4idea/src/git4idea/GitRevisionNumber.java index 93d81c35d9e1..03ac46965355 100644 --- a/plugins/git4idea/src/git4idea/GitRevisionNumber.java +++ b/plugins/git4idea/src/git4idea/GitRevisionNumber.java @@ -242,4 +242,9 @@ public class GitRevisionNumber implements VcsRevisionNumber { Date timestamp = GitUtil.parseTimestamp(tokenizer.nextToken()); return new GitRevisionNumber(tokenizer.nextToken(), timestamp); } + + @Override + public String toString() { + return myRevisionHash; + } } diff --git a/plugins/git4idea/src/git4idea/GitVcs.java b/plugins/git4idea/src/git4idea/GitVcs.java index 5e0f55d7dde2..564ff94c7079 100644 --- a/plugins/git4idea/src/git4idea/GitVcs.java +++ b/plugins/git4idea/src/git4idea/GitVcs.java @@ -332,6 +332,11 @@ public class GitVcs extends AbstractVcs { return myHistoryProvider; } + @Override + public VcsHistoryProvider getVcsBlockHistoryProvider() { + return myHistoryProvider; + } + /** * {@inheritDoc} */ From 365ed16a158e4500b8f360abd13533a41bf623ab Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 28 Jan 2010 16:22:12 +0300 Subject: [PATCH 16/29] change signature: propagate params/exceptions to implicit constructors --- .../ChangeSignatureProcessor.java | 32 ++++++++- .../inCallers/CallerChooser.java | 11 +-- .../changeSignature/inCallers/MethodNode.java | 9 ++- .../IntroduceParameterProcessor.java | 2 +- .../DefaultConstructorImplicitUsageInfo.java | 8 ++- .../DefaultConstructorUsageCollector.java | 38 ----------- .../ExceptionWithImplicitConstructor.java | 9 +++ ...xceptionWithImplicitConstructor.java.after | 10 +++ .../ExceptionWithNoConstructor.java | 7 ++ .../ExceptionWithNoConstructor.java.after | 10 +++ .../ParamWithImplicitConstructor.java | 9 +++ .../ParamWithImplicitConstructor.java.after | 10 +++ .../ParamWithImplicitConstructors.java | 14 ++++ .../ParamWithImplicitConstructors.java.after | 16 +++++ .../ParamWithNoConstructor.java | 7 ++ .../ParamWithNoConstructor.java.after | 10 +++ .../ChangeSignaturePropagationTest.java | 67 +++++++++++++++++-- 17 files changed, 213 insertions(+), 56 deletions(-) delete mode 100644 java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorUsageCollector.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java.after create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java.after create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java.after create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java.after create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java index 55fd1868d55c..1c4578948d35 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java @@ -26,6 +26,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; @@ -182,11 +183,16 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { result.add(new UsageInfo(ref.getElement())); } else if (element instanceof PsiMethod && ((PsiMethod)element).isConstructor()) { - DefaultConstructorImplicitUsageInfo implicitUsageInfo = new DefaultConstructorImplicitUsageInfo((PsiMethod)element, method); + DefaultConstructorImplicitUsageInfo implicitUsageInfo = new DefaultConstructorImplicitUsageInfo((PsiMethod)element, + ((PsiMethod)element).getContainingClass(), method); result.add(implicitUsageInfo); } else if(element instanceof PsiClass) { - result.add(new NoConstructorClassUsageInfo((PsiClass)element)); + LOG.assertTrue(method.isConstructor()); + final PsiClass psiClass = (PsiClass)element; + if (shouldPropagateToNonPhysicalMethod(method, result, psiClass, myPropagateParametersMethods)) continue; + if (shouldPropagateToNonPhysicalMethod(method, result, psiClass, myPropagateExceptionsMethods)) continue; + result.add(new NoConstructorClassUsageInfo(psiClass)); } else if (ref instanceof PsiCallReference) { result.add(new CallReferenceUsageInfo((PsiCallReference) ref)); @@ -223,6 +229,16 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { return overridingMethods; } + private static boolean shouldPropagateToNonPhysicalMethod(PsiMethod method, ArrayList result, PsiClass containingClass, final Set propagateMethods) { + for (PsiMethod psiMethod : propagateMethods) { + if (!psiMethod.isPhysical() && Comparing.strEqual(psiMethod.getName(), containingClass.getName())) { + result.add(new DefaultConstructorImplicitUsageInfo(psiMethod, containingClass, method)); + return true; + } + } + return false; + } + private void findUsagesInCallers(final ArrayList usages) { for (PsiMethod caller : myPropagateParametersMethods) { usages.add(new CallerUsageInfo(caller, true, myPropagateExceptionsMethods.contains(caller))); @@ -512,7 +528,17 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { if (usage instanceof DefaultConstructorImplicitUsageInfo) { final DefaultConstructorImplicitUsageInfo defConstructorUsage = (DefaultConstructorImplicitUsageInfo)usage; - addSuperCall(defConstructorUsage.getConstructor(), defConstructorUsage.getBaseConstructor(),usages); + PsiMethod constructor = defConstructorUsage.getConstructor(); + if (!constructor.isPhysical()) { + final boolean toPropagate = myPropagateParametersMethods.remove(constructor); + final PsiClass containingClass = defConstructorUsage.getContainingClass(); + constructor = (PsiMethod)containingClass.add(constructor); + PsiUtil.setModifierProperty(constructor, VisibilityUtil.getVisibilityModifier(containingClass.getModifierList()), true); + if (toPropagate) { + myPropagateParametersMethods.add(constructor); + } + } + addSuperCall(constructor, defConstructorUsage.getBaseConstructor(),usages); } else if (usage instanceof NoConstructorClassUsageInfo) { addDefaultConstructor(((NoConstructorClassUsageInfo)usage).getPsiClass(),usages); diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/CallerChooser.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/CallerChooser.java index 885a750a2cd5..d6c21254df54 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/CallerChooser.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/CallerChooser.java @@ -136,7 +136,7 @@ public abstract class CallerChooser extends DialogWrapper { final PsiMethod caller = node.getMethod(); final PsiMethod callee = parentNode != null ? parentNode.getMethod() : null; - if (caller != null && callee != null) { + if (caller != null && caller.isPhysical() && callee != null) { HighlightManager highlighter = HighlightManager.getInstance(myProject); EditorColorsManager colorManager = EditorColorsManager.getInstance(); TextAttributes attributes = colorManager.getGlobalScheme().getAttributes(EditorColors.TEXT_SEARCH_RESULT_ATTRIBUTES); @@ -162,9 +162,12 @@ public abstract class CallerChooser extends DialogWrapper { if (method == null) return ""; final PsiFile file = method.getContainingFile(); Document document = PsiDocumentManager.getInstance(myProject).getDocument(file); - final int start = document.getLineStartOffset(document.getLineNumber(method.getTextRange().getStartOffset())); - final int end = document.getLineEndOffset(document.getLineNumber(method.getTextRange().getEndOffset())); - return document.getText().substring(start, end); + if (document != null) { + final int start = document.getLineStartOffset(document.getLineNumber(method.getTextRange().getStartOffset())); + final int end = document.getLineEndOffset(document.getLineNumber(method.getTextRange().getEndOffset())); + return document.getText().substring(start, end); + } + return ""; } private int getStartOffset (@NotNull final PsiMethod method) { diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/MethodNode.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/MethodNode.java index 73944c0d5ee7..fd872608f65b 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/MethodNode.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/inCallers/MethodNode.java @@ -103,6 +103,9 @@ public class MethodNode extends CheckedTreeNode { if (enclosingContext instanceof PsiMethod && !myMethod.equals(enclosingContext) && !myCalled.contains(myMethod)) { //do not add recursive methods callers.add((PsiMethod) enclosingContext); + } else if (element instanceof PsiClass) { + final PsiClass aClass = (PsiClass)element; + callers.add(JavaPsiFacade.getElementFactory(project).createMethodFromText(aClass.getName() + "(){}", aClass)); } } } @@ -137,8 +140,10 @@ public class MethodNode extends CheckedTreeNode { SimpleTextAttributes.EXCLUDED_ATTRIBUTES; renderer.append(buffer.toString(), attributes); - final String packageName = getPackageName(myMethod.getContainingClass()); - renderer.append(" (" + packageName + ")", new SimpleTextAttributes(SimpleTextAttributes.STYLE_ITALIC, Color.GRAY)); + if (containingClass != null) { + final String packageName = getPackageName(containingClass); + renderer.append(" (" + packageName + ")", new SimpleTextAttributes(SimpleTextAttributes.STYLE_ITALIC, Color.GRAY)); + } } @Nullable diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java index cf98a5ee8dfe..16b23ae7e1fd 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -152,7 +152,7 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem PsiElement ref = ref1.getElement(); if (ref instanceof PsiMethod && ((PsiMethod)ref).isConstructor()) { DefaultConstructorImplicitUsageInfo implicitUsageInfo = - new DefaultConstructorImplicitUsageInfo((PsiMethod)ref, myMethodToSearchFor); + new DefaultConstructorImplicitUsageInfo((PsiMethod)ref, ((PsiMethod)ref).getContainingClass(), myMethodToSearchFor); result.add(implicitUsageInfo); } else if (ref instanceof PsiClass) { diff --git a/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorImplicitUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorImplicitUsageInfo.java index eb5719643dd7..67666dd9618d 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorImplicitUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorImplicitUsageInfo.java @@ -23,11 +23,13 @@ import com.intellij.usageView.UsageInfo; */ public class DefaultConstructorImplicitUsageInfo extends UsageInfo { private final PsiMethod myOverridingConstructor; + private final PsiClass myContainingClass; private final PsiMethod myBaseConstructor; - public DefaultConstructorImplicitUsageInfo(PsiMethod overridingConstructor, PsiMethod baseConstructor) { + public DefaultConstructorImplicitUsageInfo(PsiMethod overridingConstructor, PsiClass containingClass, PsiMethod baseConstructor) { super(overridingConstructor); myOverridingConstructor = overridingConstructor; + myContainingClass = containingClass; myBaseConstructor = baseConstructor; } @@ -38,4 +40,8 @@ public class DefaultConstructorImplicitUsageInfo extends UsageInfo { public PsiMethod getBaseConstructor() { return myBaseConstructor; } + + public PsiClass getContainingClass() { + return myContainingClass; + } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorUsageCollector.java b/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorUsageCollector.java deleted file mode 100644 index ce59dbb93872..000000000000 --- a/java/java-impl/src/com/intellij/refactoring/util/usageInfo/DefaultConstructorUsageCollector.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.refactoring.util.usageInfo; - -import com.intellij.psi.*; -import com.intellij.refactoring.util.RefactoringUtil; -import com.intellij.usageView.UsageInfo; - -import java.util.ArrayList; - -public class DefaultConstructorUsageCollector implements RefactoringUtil.ImplicitConstructorUsageVisitor { - private final ArrayList myUsages; - - public void visitConstructor(PsiMethod constructor, PsiMethod baseConstructor) { - myUsages.add(new DefaultConstructorImplicitUsageInfo(constructor, baseConstructor)); - } - - public void visitClassWithoutConstructors(PsiClass aClass) { - myUsages.add(new NoConstructorClassUsageInfo(aClass)); - } - - public DefaultConstructorUsageCollector(ArrayList result) { - myUsages = result; - } -} diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java new file mode 100644 index 000000000000..fd8fd12f3e7e --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java @@ -0,0 +1,9 @@ +public class P { + public P() { + } +} + +class PP extends P { + public PP(){ + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java.after b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java.after new file mode 100644 index 000000000000..a19dbb44d854 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithImplicitConstructor.java.after @@ -0,0 +1,10 @@ +public class P { + public P() throws Exception { + } +} + +class PP extends P { + public PP() throws Exception { + super(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java new file mode 100644 index 000000000000..979cd56def00 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java @@ -0,0 +1,7 @@ +public class P { + public P() { + } +} + +class PP extends P { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java.after b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java.after new file mode 100644 index 000000000000..c5d842f4acdb --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ExceptionWithNoConstructor.java.after @@ -0,0 +1,10 @@ +public class P { + public P() throws Exception { + } +} + +class PP extends P { + PP() throws Exception { + super(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java new file mode 100644 index 000000000000..fd8fd12f3e7e --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java @@ -0,0 +1,9 @@ +public class P { + public P() { + } +} + +class PP extends P { + public PP(){ + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java.after b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java.after new file mode 100644 index 000000000000..61db41131b2f --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructor.java.after @@ -0,0 +1,10 @@ +public class P { + public P(Class clazz) { + } +} + +class PP extends P { + public PP(Class clazz){ + super(clazz); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java new file mode 100644 index 000000000000..77b523600c3c --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java @@ -0,0 +1,14 @@ +public class P { + public P() { + } +} + +class PP extends P { + public PP(){ + } +} + +class PPP extends P { + public PPP(){ + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java.after b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java.after new file mode 100644 index 000000000000..47fd44056b99 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithImplicitConstructors.java.after @@ -0,0 +1,16 @@ +public class P { + public P(Class clazz) { + } +} + +class PP extends P { + public PP(Class clazz){ + super(clazz); + } +} + +class PPP extends P { + public PPP(Class clazz){ + super(clazz); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java new file mode 100644 index 000000000000..979cd56def00 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java @@ -0,0 +1,7 @@ +public class P { + public P() { + } +} + +class PP extends P { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java.after b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java.after new file mode 100644 index 000000000000..51e2f0a300a6 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ParamWithNoConstructor.java.after @@ -0,0 +1,10 @@ +public class P { + public P(Class clazz) { + } +} + +class PP extends P { + PP(Class clazz) { + super(clazz); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignaturePropagationTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignaturePropagationTest.java index 571adeab21a6..65f1245cb276 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignaturePropagationTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignaturePropagationTest.java @@ -4,12 +4,15 @@ import com.intellij.JavaTestUtil; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.searches.ClassInheritorsSearch; +import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.refactoring.changeSignature.ChangeSignatureProcessor; import com.intellij.refactoring.changeSignature.ParameterInfoImpl; import com.intellij.refactoring.changeSignature.ThrownExceptionInfo; import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.testFramework.LightCodeInsightTestCase; import com.intellij.util.containers.HashSet; +import junit.framework.Assert; import java.util.Arrays; import java.util.Set; @@ -34,21 +37,71 @@ public class ChangeSignaturePropagationTest extends LightCodeInsightTestCase { exceptionPropagationTest(); } + public void testParamWithNoConstructor() throws Exception { + final PsiMethod method = getPrimaryMethod(); + parameterPropagationTest(method, collectNonPhysicalMethodsToPropagate(method)); + } + + public void testExceptionWithNoConstructor() throws Exception { + final PsiMethod method = getPrimaryMethod(); + exceptionPropagationTest(method, collectNonPhysicalMethodsToPropagate(method)); + } + + private static HashSet collectNonPhysicalMethodsToPropagate(PsiMethod method) { + final HashSet methodsToPropagate = new HashSet(); + final PsiReference[] references = + MethodReferencesSearch.search(method, GlobalSearchScope.allScope(getProject()), true).toArray(PsiReference.EMPTY_ARRAY); + for (PsiReference reference : references) { + final PsiElement element = reference.getElement(); + Assert.assertTrue(element instanceof PsiClass); + PsiClass containingClass = (PsiClass)element; + methodsToPropagate.add(JavaPsiFacade.getElementFactory(getProject()).createMethodFromText(containingClass.getName() + "(){}", containingClass)); + } + return methodsToPropagate; + } + + public void testParamWithImplicitConstructor() throws Exception { + final PsiMethod method = getPrimaryMethod(); + parameterPropagationTest(method, collectDefaultConstructorsToPropagate(method)); + } + + public void testParamWithImplicitConstructors() throws Exception { + final PsiMethod method = getPrimaryMethod(); + parameterPropagationTest(method, collectDefaultConstructorsToPropagate(method)); + } + + public void testExceptionWithImplicitConstructor() throws Exception { + final PsiMethod method = getPrimaryMethod(); + exceptionPropagationTest(method, collectDefaultConstructorsToPropagate(method)); + } + + private static HashSet collectDefaultConstructorsToPropagate(PsiMethod method) { + final HashSet methodsToPropagate = new HashSet(); + for (PsiClass inheritor : ClassInheritorsSearch.search(method.getContainingClass())) { + methodsToPropagate.add(inheritor.getConstructors()[0]); + } + return methodsToPropagate; + } + private void parameterPropagationTest() throws Exception { - PsiMethod method = getPrimaryMethod(); - PsiClass aClass = method.getContainingClass(); + final PsiMethod method = getPrimaryMethod(); + parameterPropagationTest(method, new HashSet(Arrays.asList(method.getContainingClass().getMethods()))); + } + + private void parameterPropagationTest(final PsiMethod method, final HashSet psiMethods) throws Exception { PsiType newParamType = JavaPsiFacade.getElementFactory(getProject()).createTypeByFQClassName("java.lang.Class", GlobalSearchScope.allScope(getProject())); final ParameterInfoImpl[] newParameters = new ParameterInfoImpl[]{new ParameterInfoImpl(-1, "clazz", newParamType, "null")}; - final Set methodsToPropagateParameters = new HashSet(Arrays.asList(aClass.getMethods())); - doTest(newParameters, new ThrownExceptionInfo[0], methodsToPropagateParameters, null, method); + doTest(newParameters, new ThrownExceptionInfo[0], psiMethods, null, method); } private void exceptionPropagationTest() throws Exception { - PsiMethod method = getPrimaryMethod(); - PsiClass aClass = method.getContainingClass(); + final PsiMethod method = getPrimaryMethod(); + exceptionPropagationTest(method, new HashSet(Arrays.asList(method.getContainingClass().getMethods()))); + } + + private void exceptionPropagationTest(final PsiMethod method, final Set methodsToPropagateExceptions) throws Exception { PsiClassType newExceptionType = JavaPsiFacade.getElementFactory(getProject()).createTypeByFQClassName("java.lang.Exception", GlobalSearchScope.allScope(getProject())); final ThrownExceptionInfo[] newExceptions = new ThrownExceptionInfo[]{new ThrownExceptionInfo(-1, newExceptionType)}; - final Set methodsToPropagateExceptions = new HashSet(Arrays.asList(aClass.getMethods())); doTest(new ParameterInfoImpl[0], newExceptions, null, methodsToPropagateExceptions, method); } From 00051ab08fda00b95b45495d40ae8adbdce94c0d Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Thu, 28 Jan 2010 16:48:08 +0300 Subject: [PATCH 17/29] IDEA-51686: Overloadded access to arrays --- .../expressions/path/GrIndexPropertyImpl.java | 36 ++++++++++--------- .../groovy/lang/GroovyHighlightingTest.java | 2 ++ .../highlighting/ArrayLikeAccess.groovy | 19 ++++++++++ 3 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 plugins/groovy/testdata/highlighting/ArrayLikeAccess.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java index a49e24029cd0..3e8f0cfc9272 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java @@ -17,9 +17,9 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path; import com.intellij.lang.ASTNode; +import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiArrayType; import com.intellij.psi.PsiType; -import com.intellij.psi.CommonClassNames; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; @@ -27,9 +27,9 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrIndexProperty; +import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.GrExpressionImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; -import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; /** * @author ilyas @@ -64,13 +64,26 @@ public class GrIndexPropertyImpl extends GrExpressionImpl implements GrIndexProp PsiType thisType = selected.getType(); if (thisType != null) { - if (thisType instanceof PsiArrayType) { - PsiType componentType = ((PsiArrayType)thisType).getComponentType(); - return TypesUtil.boxPrimitiveType(componentType, getManager(), getResolveScope()); - } - GrArgumentList argList = getArgumentList(); if (argList != null) { + GrExpression[] arguments = argList.getExpressionArguments(); + PsiType[] argTypes = new PsiType[arguments.length]; + for (int i = 0; i < arguments.length; i++) { + PsiType argType = arguments[i].getType(); + if (argType == null) argType = TypesUtil.getJavaLangObject(argList); + argTypes[i] = argType; + } + + final PsiType overloadedOperatorType = TypesUtil.getOverloadedOperatorType(thisType, "getAt", this, argTypes); + if (overloadedOperatorType!=null) { + return overloadedOperatorType; + } + + if (thisType instanceof PsiArrayType) { + PsiType componentType = ((PsiArrayType)thisType).getComponentType(); + return TypesUtil.boxPrimitiveType(componentType, getManager(), getResolveScope()); + } + if (thisType instanceof GrTupleType) { PsiType[] types = ((GrTupleType)thisType).getParameters(); return types.length == 1 ? types[0] : null; @@ -84,15 +97,6 @@ public class GrIndexPropertyImpl extends GrExpressionImpl implements GrIndexProp if (InheritanceUtil.isInheritor(thisType, CommonClassNames.JAVA_UTIL_MAP)) { return PsiUtil.substituteTypeParameter(thisType, CommonClassNames.JAVA_UTIL_MAP, 1, true); } - GrExpression[] arguments = argList.getExpressionArguments(); - PsiType[] argTypes = new PsiType[arguments.length]; - for (int i = 0; i < arguments.length; i++) { - PsiType argType = arguments[i].getType(); - if (argType == null) argType = TypesUtil.getJavaLangObject(argList); - argTypes[i] = argType; - } - - return TypesUtil.getOverloadedOperatorType(thisType, "getAt", this, argTypes); } } return null; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index d6a15df3f223..4a4ced60ae66 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -203,4 +203,6 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { public void testStringAndGStringUpperBound() throws Exception {doTest();} public void testWithMethod() throws Exception {doTest();} + + public void testArrayLikeAccess() throws Exception {doTest();} } \ No newline at end of file diff --git a/plugins/groovy/testdata/highlighting/ArrayLikeAccess.groovy b/plugins/groovy/testdata/highlighting/ArrayLikeAccess.groovy new file mode 100644 index 000000000000..949799b7d93d --- /dev/null +++ b/plugins/groovy/testdata/highlighting/ArrayLikeAccess.groovy @@ -0,0 +1,19 @@ +def foo = [1, 2, 5] +def bar = [00, 11, 22, 33, 44, 55, 66, 77, 88] + +// highlights right side as 'Can not assign Integer to Collection' +Collection baz = bar[foo] +assert baz == [11, 22, 55] + +// highlights right side as 'Can not assign Integer to Collection' +Collection qux = bar[[1, 2, 5]] +assert qux == [11, 22, 55] + +// accepted as correct +Collection quux = [bar[1], bar[5], bar[2]] +assert quux == [11, 22, 55] + +// highlights right side as 'Can not assign Integer to Collection' + +Collection quuux = bar[2..5] +assert quuux == [22, 33, 44, 55] From 9a99e12c00cc132a19fb490f7ebe6335d22672aa Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 28 Jan 2010 17:14:46 +0300 Subject: [PATCH 18/29] TreeUi: attempt to fix 17446 : CME on UpdaterTreeState.addAll() --- .../src/com/intellij/ide/util/treeView/AbstractTreeUi.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 1d4573be2471..6fdf984cb6dd 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -906,6 +906,8 @@ public class AbstractTreeUi { @NotNull UpdaterTreeState setUpdaterState(UpdaterTreeState state) { + if (myUpdaterState != null && myUpdaterState.equals(state)) return state; + final UpdaterTreeState oldState = myUpdaterState; if (oldState == null) { myUpdaterState = state; From f22b1665cff7efb00315d3733f61d2521b6ae7dd Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 28 Jan 2010 17:16:52 +0300 Subject: [PATCH 19/29] TreeUi: fix for 14917 -- no need for LOG.error() --- .../src/com/intellij/ide/util/treeView/AbstractTreeUi.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 6fdf984cb6dd..a73971d4cc5a 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -1644,9 +1644,7 @@ public class AbstractTreeUi { needToUpdate = true; } - //noinspection ConstantConditions if (childDescr.get() == null) { - LOG.error("childDescr == null, treeStructure = " + getTreeStructure() + ", child = " + child); processingDone.setDone(); continue; } From 82454f6044606b86af56b954b2df97eb1c0798fc Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 28 Jan 2010 15:37:07 +0100 Subject: [PATCH 20/29] =?UTF-8?q?IDEA-26944=20(Refused=20bequest=20inspect?= =?UTF-8?q?ion=20should=20be=20JUnit=E2=80=8B-=E2=80=8B4=E2=80=8B.?= =?UTF-8?q?=E2=80=8B5=20aware)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inheritance/RefusedBequestInspection.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/inheritance/RefusedBequestInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/inheritance/RefusedBequestInspection.java index 575eaa7c49c9..441b0b44a8ea 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/inheritance/RefusedBequestInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/inheritance/RefusedBequestInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,33 +15,37 @@ */ package com.siyeh.ig.inheritance; +import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.psi.*; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.psiutils.MethodUtils; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.siyeh.ig.psiutils.TestUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; +import javax.swing.JComponent; public class RefusedBequestInspection extends BaseInspection { /** @noinspection PublicField*/ public boolean ignoreEmptySuperMethods = false; + @Override @NotNull public String getDisplayName(){ return InspectionGadgetsBundle.message("refused.bequest.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos){ return InspectionGadgetsBundle.message( "refused.bequest.problem.descriptor"); } + @Override public JComponent createOptionsPanel() { //noinspection HardCodedStringLiteral return new SingleCheckboxOptionsPanel( @@ -50,6 +54,7 @@ public class RefusedBequestInspection extends BaseInspection { "", this, "ignoreEmptySuperMethods"); } + @Override public BaseInspectionVisitor buildVisitor(){ return new RefusedBequestVisitor(); } @@ -57,7 +62,6 @@ public class RefusedBequestInspection extends BaseInspection { private class RefusedBequestVisitor extends BaseInspectionVisitor{ @Override public void visitMethod(@NotNull PsiMethod method){ - super.visitMethod(method); final PsiCodeBlock body = method.getBody(); if(body == null){ return; @@ -72,6 +76,9 @@ public class RefusedBequestInspection extends BaseInspection { } final PsiClass containingClass = leastConcreteSuperMethod.getContainingClass(); + if (containingClass == null) { + return; + } final String className = containingClass.getQualifiedName(); if("java.lang.Object".equals(className)){ return; @@ -83,6 +90,9 @@ public class RefusedBequestInspection extends BaseInspection { return; } } + if (TestUtils.isJUnit4BeforeOrAfterMethod(method)) { + return; + } if(containsSuperCall(body, leastConcreteSuperMethod)){ return; } @@ -96,7 +106,8 @@ public class RefusedBequestInspection extends BaseInspection { for(final PsiMethod superMethod : superMethods){ final PsiClass containingClass = superMethod.getContainingClass(); - if(!superMethod.hasModifierProperty(PsiModifier.ABSTRACT) && + if(containingClass != null && + !superMethod.hasModifierProperty(PsiModifier.ABSTRACT) && !containingClass.isInterface()){ leastConcreteSuperMethod = superMethod; return leastConcreteSuperMethod; @@ -105,10 +116,10 @@ public class RefusedBequestInspection extends BaseInspection { return leastConcreteSuperMethod; } - private boolean containsSuperCall(PsiCodeBlock body, - PsiMethod method){ + private boolean containsSuperCall(@NotNull PsiElement context, + @NotNull PsiMethod method){ final SuperCallVisitor visitor = new SuperCallVisitor(method); - body.accept(visitor); + context.accept(visitor); return visitor.hasSuperCall(); } } From 80b2c2f0f60016b99dd4a0445d6661825d1d121c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 27 Jan 2010 14:43:01 +0300 Subject: [PATCH 21/29] less revolting messages --- plugins/git4idea/src/git4idea/i18n/GitBundle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/i18n/GitBundle.properties b/plugins/git4idea/src/git4idea/i18n/GitBundle.properties index bcba3b45fca1..36c26418331b 100644 --- a/plugins/git4idea/src/git4idea/i18n/GitBundle.properties +++ b/plugins/git4idea/src/git4idea/i18n/GitBundle.properties @@ -214,12 +214,12 @@ push.active.pushing=Pushing branches... push.active.rebase.tooltip=Rebase branches in order to make push possible (might reorder commits) push.active.rebase=&Rebase push.active.rebasing=Rebasing ... -push.active.status.behind=Unable to push. The current branch is behind tracked branch by {0} commit(s). +push.active.status.behind=Unable to push. The current branch is behind tracked branch by {0,choice, 1#1 commit|2#{0,number} commits}. push.active.status.no.branch=The head is not on the branch. -push.active.status.no.commits.behind=Nothing to push. The current branch is behind tracked branch by {0} commit(s). +push.active.status.no.commits.behind=Nothing to push. The current branch is behind tracked branch by {0,choice, 1#1 commit|2#{0,number} commits}. push.active.status.no.commits=Nothing to push. push.active.status.no.tracked=No tracked branch is configured. -push.active.status.push={0} commit(s) will be pushed. +push.active.status.push={0,choice, 1#1 commit|2#{0,number} commits} will be pushed. push.active.status.status=Status: push.active.title=Push Active Branches push.active.view=&View From 0d1bf588da62428e7fc414c91590bacc25cf2f71 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 27 Jan 2010 14:52:51 +0300 Subject: [PATCH 22/29] garbage removed --- resources-en/src/messages/JavaErrorMessages.properties | 4 ---- 1 file changed, 4 deletions(-) diff --git a/resources-en/src/messages/JavaErrorMessages.properties b/resources-en/src/messages/JavaErrorMessages.properties index 0d72c9964ca0..1c905d8329e1 100644 --- a/resources-en/src/messages/JavaErrorMessages.properties +++ b/resources-en/src/messages/JavaErrorMessages.properties @@ -334,7 +334,3 @@ illegal.initializer=Illegal initializer for ''{0}'' class.cannot.inherit.from.its.type.parameter=Class cannot inherit from its type parameter cannot.resolve.package=Cannot resolve package {0} override.not.allowed.in.interfaces=@Override is not allowed when implementing interface method -<<<<<<< HEAD - -======= ->>>>>>> idea90 From af02a23644f88e9debc6ad4520e09e2ac830a28e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 27 Jan 2010 15:22:50 +0300 Subject: [PATCH 23/29] remember scope chosen --- java/java-impl/src/com/intellij/slicer/SliceHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/slicer/SliceHandler.java b/java/java-impl/src/com/intellij/slicer/SliceHandler.java index c4ba3ba77913..09008cf97df5 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceHandler.java +++ b/java/java-impl/src/com/intellij/slicer/SliceHandler.java @@ -83,9 +83,8 @@ public class SliceHandler implements CodeInsightActionHandler { dialog.show(); if (!dialog.isOK()) return null; - storedSettingsBean.analysisUIOptions.save(analysisUIOptions); - AnalysisScope scope = dialog.getScope(analysisUIOptions, analysisScope, myProject, module); + storedSettingsBean.analysisUIOptions.save(analysisUIOptions); SliceAnalysisParams params = new SliceAnalysisParams(); params.scope = scope; From a4bbe1bf98ea05c73402b23dff4e365642a99186 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 27 Jan 2010 15:32:56 +0300 Subject: [PATCH 24/29] correct group by nullness --- .../slicer/SliceNullnessAnalyzer.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java b/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java index 3657654a17b8..2aba643f5d7e 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java +++ b/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java @@ -28,16 +28,14 @@ import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.intellij.util.NullableFunction; +import com.intellij.util.PairProcessor; import com.intellij.util.containers.FactoryMap; import gnu.trove.THashMap; import gnu.trove.THashSet; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; +import java.util.*; /** * User: cdr @@ -67,7 +65,14 @@ public class SliceNullnessAnalyzer { public SliceNode fun(SliceNode oldNode) { return oldNode.getDuplicate() == null && node(oldNode, map).nulls.contains(nullExpression) ? oldNode.copy() : null; } - },null); + },new PairProcessor>() { + public boolean process(SliceNode node, List children) { + if (!children.isEmpty()) return true; + PsiElement element = node.getValue().getElement(); + if (element == null) return false; + return element.getManager().areElementsEquivalent(element, nullExpression); // leaf can be there only if it's filtering expression + } + }); nullRoot.myCachedChildren.add(new SliceLeafValueRootNode(root.getProject(), nullExpression, nullRoot, Collections.singletonList(newRoot), oldRoot.getValue().params)); } @@ -81,7 +86,14 @@ public class SliceNullnessAnalyzer { public SliceNode fun(SliceNode oldNode) { return oldNode.getDuplicate() == null && node(oldNode, map).notNulls.contains(expression) ? oldNode.copy() : null; } - },null); + },new PairProcessor>() { + public boolean process(SliceNode node, List children) { + if (!children.isEmpty()) return true; + PsiElement element = node.getValue().getElement(); + if (element == null) return false; + return element.getManager().areElementsEquivalent(element, expression); // leaf can be there only if it's filtering expression + } + }); valueRoot.myCachedChildren.add(new SliceLeafValueRootNode(root.getProject(), expression, valueRoot, Collections.singletonList(newRoot), oldRoot.getValue().params)); } @@ -95,7 +107,14 @@ public class SliceNullnessAnalyzer { public SliceNode fun(SliceNode oldNode) { return oldNode.getDuplicate() == null && node(oldNode, map).unknown.contains(expression) ? oldNode.copy() : null; } - },null); + },new PairProcessor>() { + public boolean process(SliceNode node, List children) { + if (!children.isEmpty()) return true; + PsiElement element = node.getValue().getElement(); + if (element == null) return false; + return element.getManager().areElementsEquivalent(element, expression); // leaf can be there only if it's filtering expression + } + }); valueRoot.myCachedChildren.add(new SliceLeafValueRootNode(root.getProject(), expression, valueRoot, Collections.singletonList(newRoot), oldRoot.getValue().params)); } From ccc33ef1f031a334f707fc8bf754bfdf695cb52c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 28 Jan 2010 14:23:01 +0300 Subject: [PATCH 25/29] lossy encoding inspection false positive for transparently converted properties files --- .../codeInspection/LossyEncodingInspection.java | 15 ++++++--------- .../src/com/intellij/openapi/vfs/VfsUtil.java | 3 ++- .../properties/PropertiesReferenceManager.java | 6 ++---- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java b/java/java-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java index 9e8514d95b17..aa76760e298a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java @@ -66,14 +66,16 @@ public class LossyEncodingInspection extends BaseJavaLocalInspectionTool { if (virtualFile == null) return null; String text = file.getText(); Charset charset = LoadTextUtil.extractCharsetFromFileContent(file.getProject(), virtualFile, text); - charset = Native2AsciiCharset.nativeToBaseCharset(charset); + + // no sense in checking transparently decoded file: all characters there are already safely encoded + if (charset instanceof Native2AsciiCharset) return null; int errorCount = 0; int start = -1; List descriptors = new SmartList(); - for (int i = 0; i < text.length(); i++) { - char c = text.charAt(i); - if (isRepresentable(c, charset)) { + for (int i = 0; i <= text.length(); i++) { + char c = i == text.length() ? 0 : text.charAt(i); + if (i == text.length() || isRepresentable(c, charset)) { if (start != -1) { ProblemDescriptor descriptor = manager.createProblemDescriptor(file, new TextRange(start, i), InspectionsBundle.message( "unsupported.character.for.the.charset", charset), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); @@ -90,11 +92,6 @@ public class LossyEncodingInspection extends BaseJavaLocalInspectionTool { } } } - if (start != -1) { - ProblemDescriptor descriptor = manager.createProblemDescriptor(file, new TextRange(start, text.length()), InspectionsBundle.message( - "unsupported.character.for.the.charset", charset), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); - descriptors.add(descriptor); - } return descriptors.toArray(new ProblemDescriptor[descriptors.size()]); } diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java b/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java index b37ddc8f06d3..ada5ce6b290e 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java @@ -56,7 +56,8 @@ public class VfsUtil { } public static void saveText(@NotNull VirtualFile file, @NotNull String text) throws IOException { - file.setBinaryContent(text.getBytes(file.getCharset().name())); + Charset charset = file.getCharset(); + file.setBinaryContent(text.getBytes(charset.name())); } /** diff --git a/plugins/properties/src/com/intellij/lang/properties/PropertiesReferenceManager.java b/plugins/properties/src/com/intellij/lang/properties/PropertiesReferenceManager.java index c869d2705b59..0f567e740428 100644 --- a/plugins/properties/src/com/intellij/lang/properties/PropertiesReferenceManager.java +++ b/plugins/properties/src/com/intellij/lang/properties/PropertiesReferenceManager.java @@ -38,15 +38,13 @@ import java.util.Locale; * @author max */ public class PropertiesReferenceManager { - private final Project myProject; private final PsiManager myPsiManager; public static PropertiesReferenceManager getInstance(Project project) { return ServiceManager.getService(project, PropertiesReferenceManager.class); } - public PropertiesReferenceManager(Project project, PsiManager psiManager) { - myProject = project; + public PropertiesReferenceManager(PsiManager psiManager) { myPsiManager = psiManager; } @@ -98,7 +96,7 @@ public class PropertiesReferenceManager { return null; } - public String[] getPropertyFileBaseNames(final @NotNull GlobalSearchScope searchScope, final BundleNameEvaluator bundleNameEvaluator) { + public String[] getPropertyFileBaseNames(@NotNull final GlobalSearchScope searchScope, final BundleNameEvaluator bundleNameEvaluator) { final ArrayList result = new ArrayList(); processPropertiesFiles(searchScope, new PropertiesFileProcessor() { public void process(String baseName, PropertiesFile propertiesFile) { From 9d8477d1b6bac399a86e650f632fecc31a2aeca0 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 28 Jan 2010 17:39:25 +0300 Subject: [PATCH 26/29] IDEA-51739 --- .../com/intellij/openapi/editor/impl/MarkupModelImpl.java | 1 - .../intellij/openapi/editor/impl/RangeHighlighterImpl.java | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java index 1c11ac707723..6530bad009ba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java @@ -170,7 +170,6 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx public void setRangeHighlighterAttributes(final RangeHighlighter highlighter, final TextAttributes textAttributes) { ((RangeHighlighterImpl)highlighter).setTextAttributes(textAttributes); - fireSegmentHighlighterChanged(highlighter); } private MarkupModelListener[] getCachedListeners() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeHighlighterImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeHighlighterImpl.java index d9de2c9fdf38..1e7951db0055 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeHighlighterImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeHighlighterImpl.java @@ -70,6 +70,7 @@ public class RangeHighlighterImpl implements RangeHighlighterEx { public void setTextAttributes(final TextAttributes textAttributes) { myTextAttributes = textAttributes; + fireChanged(); } public int getLayer() { @@ -128,6 +129,7 @@ public class RangeHighlighterImpl implements RangeHighlighterEx { public void setErrorStripeTooltip(Object tooltipObject) { myErrorStripeTooltip = tooltipObject; + fireChanged(); } public boolean isThinErrorStripeMark() { @@ -136,6 +138,7 @@ public class RangeHighlighterImpl implements RangeHighlighterEx { public void setThinErrorStripeMark(boolean value) { myErrorStripeMarkIsThin = value; + fireChanged(); } public Color getLineSeparatorColor() { @@ -158,6 +161,7 @@ public class RangeHighlighterImpl implements RangeHighlighterEx { public void setEditorFilter(@NotNull MarkupEditorFilter filter) { myFilter = filter; + fireChanged(); } @NotNull @@ -171,6 +175,7 @@ public class RangeHighlighterImpl implements RangeHighlighterEx { public void setAfterEndOfLine(boolean afterEndOfLine) { isAfterEndOfLine = afterEndOfLine; + fireChanged(); } private void fireChanged() { From e9d56b7c0ba648463c6783cc2cb9323e3a05fc12 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 28 Jan 2010 17:41:50 +0300 Subject: [PATCH 27/29] do not erase signatures in type parameter-less classes --- .../src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java b/java/java-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java index 7aa1a25d2d81..2b97f5f305ea 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java @@ -150,7 +150,7 @@ public class PsiSuperMethodImplUtil { final PsiSubstitutor superSubstitutor = superTypeResolveResult.getSubstitutor(); PsiSubstitutor finalSubstitutor = obtainFinalSubstitutor(superClass, superSubstitutor, substitutor); - final boolean isInRawContextSuper = isInRawContext || PsiUtil.isRawSubstitutor(superClass, superSubstitutor); + final boolean isInRawContextSuper = (isInRawContext || PsiUtil.isRawSubstitutor(superClass, superSubstitutor)) && superClass.getTypeParameters().length != 0; Map superResult = buildMethodHierarchy(superClass, finalSubstitutor, false, visited, isInRawContextSuper); visited.remove(superClass); From fde62e30ad5db4f219d8c3311403eb13a2b6ddcb Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Thu, 28 Jan 2010 17:58:53 +0300 Subject: [PATCH 28/29] IDEA-51824 Task list menu unavailable with scroll bar --- .../platform-impl/src/com/intellij/ui/popup/WizardPopup.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java index fdb9f6763bb7..ea45e3b56648 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java @@ -288,6 +288,10 @@ public abstract class WizardPopup extends AbstractPopup implements ActionListene int resultWidth = ofContent.width > MAX_SIZE.width ? MAX_SIZE.width : ofContent.width; int resultHeight = ofContent.height > MAX_SIZE.height ? MAX_SIZE.height : ofContent.height; + if (ofContent.height > MAX_SIZE.height) { + resultWidth += new JScrollPane().getVerticalScrollBar().getPreferredSize().getWidth(); + } + return new Dimension(resultWidth, resultHeight); } } From 602701d166108ea2d8db6b2811cae652ad62b28a Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 29 Jan 2010 10:05:46 +0300 Subject: [PATCH 29/29] IDEA-51749 "Could not save project" error message may occur after deleting module imported from Maven --- .../intellij/module/ModulePointerTest.java | 11 +++++++- .../module/impl/ModulePointerManagerImpl.java | 27 ++++++++++++------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/module/ModulePointerTest.java b/java/java-tests/testSrc/com/intellij/module/ModulePointerTest.java index a05e17a2d2a2..32a944d3f4df 100644 --- a/java/java-tests/testSrc/com/intellij/module/ModulePointerTest.java +++ b/java/java-tests/testSrc/com/intellij/module/ModulePointerTest.java @@ -27,6 +27,7 @@ import com.intellij.testFramework.PlatformTestCase; public class ModulePointerTest extends PlatformTestCase { public void testCreateByName() throws Exception { final ModulePointer pointer = getPointerManager().create("m"); + assertSame(pointer, getPointerManager().create("m")); assertNull(pointer.getModule()); assertEquals("m", pointer.getModuleName()); @@ -39,6 +40,8 @@ public class ModulePointerTest extends PlatformTestCase { public void testCreateByModule() throws Exception { final Module module = addModule("x"); final ModulePointer pointer = getPointerManager().create(module); + assertSame(pointer, getPointerManager().create(module)); + assertSame(pointer, getPointerManager().create("x")); assertSame(module, pointer.getModule()); assertEquals("x", pointer.getModuleName()); @@ -48,6 +51,9 @@ public class ModulePointerTest extends PlatformTestCase { assertNull(pointer.getModule()); assertEquals("x", pointer.getModuleName()); + + final Module newModule = addModule("x"); + assertSame(pointer, getPointerManager().create(newModule)); } public void testRenameModule() throws Exception { @@ -61,9 +67,12 @@ public class ModulePointerTest extends PlatformTestCase { } public void testDisposePointerFromUncommitedModifiableModel() throws Exception { + final ModulePointer pointer = getPointerManager().create("xxx"); + final ModifiableModuleModel modifiableModel = getModuleManager().getModifiableModel(); final Module module = modifiableModel.newModule(myProject.getBaseDir().getPath() + "/xxx.iml", EmptyModuleType.getInstance()); - final ModulePointer pointer = getPointerManager().create(module); + assertSame(pointer, getPointerManager().create(module)); + assertSame(pointer, getPointerManager().create("xxx")); assertSame(module, pointer.getModule()); assertEquals("xxx", pointer.getModuleName()); diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java index 9a2c96ef2ab0..8d21b1f85040 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java @@ -47,25 +47,26 @@ public class ModulePointerManagerImpl extends ModulePointerManager { @Override public void moduleAdded(Project project, Module module) { - final ModulePointerImpl pointer = myUnresolved.remove(module.getName()); - if (pointer != null) { - pointer.moduleAdded(module); - registerPointer(module, pointer); - } + moduleAppears(module); } @Override public void modulesRenamed(Project project, List modules) { for (Module module : modules) { - ModulePointerImpl pointer = myUnresolved.get(module.getName()); - if (pointer != null) { - pointer.moduleAdded(module); - } + moduleAppears(module); } } }); } + private void moduleAppears(Module module) { + ModulePointerImpl pointer = myUnresolved.remove(module.getName()); + if (pointer != null && pointer.getModule() == null) { + pointer.moduleAdded(module); + registerPointer(module, pointer); + } + } + private void registerPointer(final Module module, final ModulePointerImpl pointer) { myPointers.put(module, pointer); Disposer.register(module, new Disposable() { @@ -88,7 +89,13 @@ public class ModulePointerManagerImpl extends ModulePointerManager { public ModulePointer create(@NotNull Module module) { ModulePointerImpl pointer = myPointers.get(module); if (pointer == null) { - pointer = new ModulePointerImpl(module); + pointer = myUnresolved.get(module.getName()); + if (pointer == null) { + pointer = new ModulePointerImpl(module); + } + else { + pointer.moduleAdded(module); + } registerPointer(module, pointer); } return pointer;