From 563dc867cce3ba1442dc1d390cdbdf3fb56b11e3 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 13:45:38 +0400 Subject: [PATCH 01/27] replace constructor with builder: qualify references ( IDEA-55476 ) --- .../ReplaceConstructorWithBuilderProcessor.java | 2 +- .../ReplaceConstructorWithSettersChainInfo.java | 2 +- .../imports/after/Bar.java | 5 +++++ .../imports/after/Test.java | 7 +++++++ .../imports/after/foo/Builder.java | 14 ++++++++++++++ .../imports/before/Bar.java | 3 +++ .../imports/before/Test.java | 7 +++++++ .../ReplaceConstructorWithBuilderTest.java | 13 ++++++++++++- 8 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Bar.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Test.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/foo/Builder.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Bar.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java index 30f404a01a7f..41f53f6631d7 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java @@ -90,7 +90,7 @@ public class ReplaceConstructorWithBuilderProcessor extends FixableUsagesRefacto final PsiElement element = reference.getElement(); final PsiNewExpression newExpression = PsiTreeUtil.getParentOfType(element, PsiNewExpression.class); if (newExpression != null && !PsiTreeUtil.isAncestor(builderClass, element, false)) { - usages.add(new ReplaceConstructorWithSettersChainInfo(newExpression, myClassName, myParametersMap)); + usages.add(new ReplaceConstructorWithSettersChainInfo(newExpression, StringUtil.getQualifiedName(myPackageName, myClassName), myParametersMap)); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/usageInfo/ReplaceConstructorWithSettersChainInfo.java b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/usageInfo/ReplaceConstructorWithSettersChainInfo.java index 0510863beb37..45e6624187ea 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/usageInfo/ReplaceConstructorWithSettersChainInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/usageInfo/ReplaceConstructorWithSettersChainInfo.java @@ -73,7 +73,7 @@ public class ReplaceConstructorWithSettersChainInfo extends FixableUsageInfo { "new " + myBuilderClass + "()." + buf.toString() + "create" + StringUtil.capitalize(constructor.getName()) + "()", null); - expr.replace(settersChain); + styleManager.shortenClassReferences(expr.replace(settersChain)); } } } diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Bar.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Bar.java new file mode 100644 index 000000000000..4722e516f78f --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Bar.java @@ -0,0 +1,5 @@ +import foo.Builder; + +public class Bar { + final Test foo = new Builder().setBar("bar").createTest(); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Test.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Test.java new file mode 100644 index 000000000000..3cc05c40bb7e --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/Test.java @@ -0,0 +1,7 @@ +public class Test { + private final String bar; + + public Test(final String bar) { + this.bar = bar; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/foo/Builder.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/foo/Builder.java new file mode 100644 index 000000000000..0887c556595c --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/after/foo/Builder.java @@ -0,0 +1,14 @@ +package foo; + +public class Builder { + private String bar; + + public Builder setBar(String bar) { + this.bar = bar; + return this; + } + + public Test createTest() { + return new Test(bar); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Bar.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Bar.java new file mode 100644 index 000000000000..9c0c5a98b8e4 --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Bar.java @@ -0,0 +1,3 @@ +public class Bar { + final Test foo = new Test("bar"); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Test.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Test.java new file mode 100644 index 000000000000..3cc05c40bb7e --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/imports/before/Test.java @@ -0,0 +1,7 @@ +public class Test { + private final String bar; + + public Test(final String bar) { + this.bar = bar; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java index 2643b518c1d1..e6f4d814c019 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java @@ -58,6 +58,10 @@ public class ReplaceConstructorWithBuilderTest extends MultiFileTestCase { doTest(true); } + public void testImports() throws Exception { + doTest(true, null, null, "foo"); + } + private void doTest(final boolean createNewBuilderClass) throws Exception { doTest(createNewBuilderClass, null); } @@ -67,6 +71,13 @@ public class ReplaceConstructorWithBuilderTest extends MultiFileTestCase { } private void doTest(final boolean createNewBuilderClass, final Map expectedDefaults, final String conflicts) throws Exception { + doTest(createNewBuilderClass, expectedDefaults, conflicts, ""); + } + + private void doTest(final boolean createNewBuilderClass, + final Map expectedDefaults, + final String conflicts, + final String packageName) throws Exception { doTest(new PerformAction() { public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception { final PsiClass aClass = myJavaFacade.findClass("Test", GlobalSearchScope.projectScope(getProject())); @@ -85,7 +96,7 @@ public class ReplaceConstructorWithBuilderTest extends MultiFileTestCase { } } try { - new ReplaceConstructorWithBuilderProcessor(getProject(), constructors, map, "Builder", "", createNewBuilderClass).run(); + new ReplaceConstructorWithBuilderProcessor(getProject(), constructors, map, "Builder", packageName, createNewBuilderClass).run(); if (conflicts != null) { fail("Conflicts were not detected:" + conflicts); } From ffa6f672e064915d069fd5eec8b4ce9e89715f1e Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 14:31:33 +0400 Subject: [PATCH 02/27] path name completion for history text field ( IDEA-55482 ) --- .../MoveFilesOrDirectoriesDialog.java | 35 +++++++++++-------- .../openapi/ui/TextComponentAccessor.java | 14 ++++++++ 2 files changed, 35 insertions(+), 14 deletions(-) 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 4906d0a85439..bd9f6ea921eb 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 @@ -19,12 +19,14 @@ package com.intellij.refactoring.move.moveFilesOrDirectories; import com.intellij.ide.util.DirectoryUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; -import com.intellij.openapi.editor.event.DocumentAdapter; -import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; +import com.intellij.openapi.fileChooser.FileChooserFactory; 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; @@ -32,14 +34,15 @@ 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.DocumentAdapter; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.RecentsManager; +import com.intellij.ui.TextFieldWithStoredHistory; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import javax.swing.*; +import javax.swing.event.DocumentEvent; import java.awt.*; import java.io.File; @@ -51,7 +54,7 @@ public class MoveFilesOrDirectoriesDialog extends DialogWrapper{ } private JLabel myNameLabel; - private EditorComboWithBrowseButton myTargetDirectoryField; + private ComponentWithBrowseButton myTargetDirectoryField; private String myHelpID; private final Project myProject; private final Callback myCallback; @@ -89,18 +92,21 @@ 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)); - myTargetDirectoryField = new EditorComboWithBrowseButton(null, "", myProject, RECENT_KEYS); + myTargetDirectoryField = new ComponentWithBrowseButton(new TextFieldWithStoredHistory(RECENT_KEYS), null); + final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); myTargetDirectoryField.addBrowseFolderListener(RefactoringBundle.message("select.target.directory"), RefactoringBundle.message("the.file.will.be.moved.to.this.directory"), myProject, - FileChooserDescriptorFactory.createSingleFolderDescriptor(), - EditorComboBox.COMPONENT_ACCESSOR); + descriptor, + TextComponentAccessor.TEXT_FIELD_WITH_STORED_HISTORY_WHOLE_TEXT); + final TextFieldWithStoredHistory textFieldWithStoredHistory = myTargetDirectoryField.getChildComponent(); + FileChooserFactory.getInstance().installFileCompletion(textFieldWithStoredHistory.getTextEditor(), descriptor, true, getDisposable()); 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)); - myTargetDirectoryField.getChildComponent().getDocument().addDocumentListener(new DocumentAdapter() { + textFieldWithStoredHistory.addDocumentListener(new DocumentAdapter(){ @Override - public void documentChanged(DocumentEvent e) { + protected void textChanged(DocumentEvent e) { validateOKButton(); } }); @@ -135,7 +141,8 @@ public class MoveFilesOrDirectoriesDialog extends DialogWrapper{ RefactoringBundle.message("move.specified.directories") : RefactoringBundle.message("move.specified.elements")); } - myTargetDirectoryField.prependItem(initialTargetDirectory == null ? "" : initialTargetDirectory.getVirtualFile().getPresentableUrl()); + + myTargetDirectoryField.getChildComponent().setText(initialTargetDirectory == null ? "" : initialTargetDirectory.getVirtualFile().getPresentableUrl()); validateOKButton(); myHelpID = helpID; @@ -146,16 +153,16 @@ public class MoveFilesOrDirectoriesDialog extends DialogWrapper{ } private void validateOKButton() { - setOKActionEnabled(myTargetDirectoryField.getText().length() > 0); + setOKActionEnabled(myTargetDirectoryField.getChildComponent().getText().length() > 0); } protected void doOKAction() { - RecentsManager.getInstance(myProject).registerRecentEntry(RECENT_KEYS, myTargetDirectoryField.getText()); + myTargetDirectoryField.getChildComponent().addCurrentTextToHistory(); CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { public void run() { final Runnable action = new Runnable() { public void run() { - String directoryName = myTargetDirectoryField.getText().replace(File.separatorChar, '/'); + String directoryName = myTargetDirectoryField.getChildComponent().getText().replace(File.separatorChar, '/'); try { myTargetDirectory = DirectoryUtil.mkdirs(PsiManager.getInstance(myProject), directoryName); } diff --git a/platform/platform-api/src/com/intellij/openapi/ui/TextComponentAccessor.java b/platform/platform-api/src/com/intellij/openapi/ui/TextComponentAccessor.java index 827f978f22f0..510ec59c4ae9 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/TextComponentAccessor.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/TextComponentAccessor.java @@ -16,6 +16,7 @@ package com.intellij.openapi.ui; import com.intellij.ui.TextFieldWithHistory; +import com.intellij.ui.TextFieldWithStoredHistory; import javax.swing.*; import java.awt.*; @@ -82,6 +83,19 @@ public interface TextComponentAccessor { } }; + /** + * The accessor that gets and changes whole text + */ + TextComponentAccessor TEXT_FIELD_WITH_STORED_HISTORY_WHOLE_TEXT = new TextComponentAccessor() { + public String getText(TextFieldWithStoredHistory textField) { + return textField.getText(); + } + + public void setText(TextFieldWithStoredHistory textField, String text) { + textField.setText(text); + } + }; + /** * Get text from component * @param component a component to examine From 2504abd6bed3b7d7e848bf6574a57f1aa65c552f Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 17:55:58 +0400 Subject: [PATCH 03/27] pull up: static class references should NOT be updated if that classe was pulled as well --- .../memberPullUp/PullUpHelper.java | 32 ++++++++++++++----- .../pullUp/PullUpInheritedStaticClasses.java | 8 +++++ .../PullUpInheritedStaticClasses_after.java | 10 ++++++ .../com/intellij/refactoring/PullUpTest.java | 5 +++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java create mode 100644 java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java index f05c59913260..8b5b90821a0a 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java @@ -30,6 +30,7 @@ import com.intellij.codeInsight.PsiEquivalenceUtil; import com.intellij.codeInsight.intention.AddAnnotationFix; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; @@ -60,6 +61,7 @@ import java.util.*; public class PullUpHelper extends BaseRefactoringProcessor{ private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.memberPullUp.PullUpHelper"); + private static final Key PRESERVE_QUALIFIER = Key.create("PRESERVE_QUALIFIER"); private final PsiClass mySourceClass; private final PsiClass myTargetSuperClass; private final boolean myIsTargetInterface; @@ -234,6 +236,20 @@ public class PullUpHelper extends BaseRefactoringProcessor{ ChangeContextUtil.decodeContextInfo(myTargetSuperClass, null, null); for (final PsiMember movedMember : myMembersAfterMove) { + movedMember.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + final PsiExpression qualifierExpression = expression.getQualifierExpression(); + if (qualifierExpression != null) { + final Boolean preserveQualifier = qualifierExpression.getCopyableUserData(PRESERVE_QUALIFIER); + if (preserveQualifier != null && !preserveQualifier) { + qualifierExpression.delete(); + return; + } + } + super.visitReferenceExpression(expression); + } + }); final JavaRefactoringListenerManager listenerManager = JavaRefactoringListenerManager.getInstance(movedMember.getProject()); ((JavaRefactoringListenerManagerImpl)listenerManager).fireMemberMoved(mySourceClass, movedMember); } @@ -632,7 +648,7 @@ public class PullUpHelper extends BaseRefactoringProcessor{ } private void fixReferencesToStatic(PsiElement classMember, Set movedMembers) throws IncorrectOperationException { - StaticReferencesCollector collector = new StaticReferencesCollector(movedMembers); + final StaticReferencesCollector collector = new StaticReferencesCollector(movedMembers); classMember.accept(collector); ArrayList refs = collector.getReferences(); ArrayList members = collector.getReferees(); @@ -649,18 +665,19 @@ public class PullUpHelper extends BaseRefactoringProcessor{ (PsiReferenceExpression) factory.createExpressionFromText ("a." + ((PsiNamedElement) namedElement).getName(), null); - final PsiExpression qualifierExpression = newRef.getQualifierExpression(); + PsiExpression qualifierExpression = newRef.getQualifierExpression(); assert qualifierExpression != null; - qualifierExpression.replace(factory.createReferenceExpression(aClass)); + qualifierExpression = (PsiExpression)qualifierExpression.replace(factory.createReferenceExpression(aClass)); + qualifierExpression.putCopyableUserData(PRESERVE_QUALIFIER, ref.isQualified()); ref.replace(newRef); } } } private class StaticReferencesCollector extends ClassMemberReferencesVisitor { - ArrayList myReferences; - ArrayList myReferees; - ArrayList myRefereeClasses; + private ArrayList myReferences; + private ArrayList myReferees; + private ArrayList myRefereeClasses; private final Set myMovedMembers; private StaticReferencesCollector(Set movedMembers) { @@ -684,7 +701,6 @@ public class PullUpHelper extends BaseRefactoringProcessor{ } protected void visitClassMemberReferenceElement(PsiMember classMember, PsiJavaCodeReferenceElement classMemberReference) { - if (classMember instanceof PsiClass) return; if (classMember.hasModifierProperty(PsiModifier.STATIC)) { if (!myMovedMembers.contains(classMember) && RefactoringHierarchyUtil.isMemberBetween(myTargetSuperClass, mySourceClass, classMember)) { @@ -692,7 +708,7 @@ public class PullUpHelper extends BaseRefactoringProcessor{ myReferees.add(classMember); myRefereeClasses.add(classMember.getContainingClass()); } - else if ((myMovedMembers.contains(classMember) || myMembersAfterMove.contains(classMember)) && classMemberReference.isQualified()) { + else if (myMovedMembers.contains(classMember) || myMembersAfterMove.contains(classMember)) { myReferences.add(classMemberReference); myReferees.add(classMember); myRefereeClasses.add(myTargetSuperClass); diff --git a/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java new file mode 100644 index 000000000000..48cc5066e1f4 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java @@ -0,0 +1,8 @@ +public class A extends AA { + + static class C extends D {} + static class D extends B {} + static class B {} +} + +class AA {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java new file mode 100644 index 000000000000..f11aabb892d3 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java @@ -0,0 +1,10 @@ +public class A extends AA { + + static class B {} +} + +class AA { + static class C extends D {} + + static class D extends A.B {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java index 52149292c41a..d5fe5eedc979 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -36,6 +36,11 @@ public class PullUpTest extends LightCodeInsightTestCase { new RefactoringTestUtil.MemberDescriptor("setX", PsiMethod.class)); } + + public void testPullUpInheritedStaticClasses() throws Exception { + doTest(new RefactoringTestUtil.MemberDescriptor("C", PsiClass.class), + new RefactoringTestUtil.MemberDescriptor("D", PsiClass.class)); + } public void testPullUpAndAbstractize() throws Exception { doTest(new RefactoringTestUtil.MemberDescriptor("a", PsiMethod.class), From c6c7190d11316d5656563a79a9070ac141100e78 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 18:11:43 +0400 Subject: [PATCH 04/27] extract superclass: do not conflict if methods from superclass are used as superclass would be super for extracted class --- .../extractSuperclass/ExtractSuperclassHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java index 70641e1f052f..52e2f3fff772 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java @@ -133,8 +133,8 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra else { targetPackage = null; } - MultiMap conflicts = - PullUpConflictsUtil.checkConflicts(infos, mySubclass, null, targetPackage, targetDirectory, dialog.getContainmentVerifier()); + final MultiMap conflicts = + PullUpConflictsUtil.checkConflicts(infos, mySubclass, mySubclass.getSuperClass(), targetPackage, targetDirectory, dialog.getContainmentVerifier()); if (!conflicts.isEmpty()) { ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); conflictsDialog.show(); From 48913eb2feb9f46d31152725fb0571c523addacf Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 20:42:17 +0400 Subject: [PATCH 05/27] extract method: null checks should not miss final modifiers ( IDEA-55515 ) --- .../extractMethod/ExtractMethodProcessor.java | 22 +++++++++---------- .../NullableCheckDontMissFinal.java | 13 +++++++++++ .../NullableCheckDontMissFinal_after.java | 18 +++++++++++++++ .../refactoring/ExtractMethodTest.java | 4 ++++ 4 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 6ce642719400..2f18ccf88cce 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -636,11 +636,7 @@ public class ExtractMethodProcessor implements MatchProvider { if (myNullConditionalCheck) { final String varName = myOutputVariable.getName(); if (isDeclaredInside(myOutputVariable)) { - PsiDeclarationStatement statement = (PsiDeclarationStatement)myElementFactory - .createStatementFromText(myOutputVariable.getType().getCanonicalText() + " " + varName + "=x;", null); - statement = (PsiDeclarationStatement)addToMethodCallLocation(statement); - myMethodCall = - (PsiMethodCallExpression)((PsiLocalVariable)statement.getDeclaredElements()[0]).getInitializer().replace(myMethodCall); + declareVariableAtMethodCallLocation(varName); } else { PsiExpressionStatement assignmentExpression = @@ -676,12 +672,7 @@ public class ExtractMethodProcessor implements MatchProvider { myMethodCall = (PsiMethodCallExpression)assignment.getRExpression().replace(myMethodCall); } else { - PsiDeclarationStatement statement = - myElementFactory.createVariableDeclarationStatement(name, myOutputVariable.getType(), myMethodCall); - statement = (PsiDeclarationStatement)addToMethodCallLocation(statement); - PsiVariable var = (PsiVariable)statement.getDeclaredElements()[0]; - myMethodCall = (PsiMethodCallExpression)var.getInitializer(); - var.getModifierList().replace(myOutputVariable.getModifierList()); + declareVariableAtMethodCallLocation(name); } } else if (myHasReturnStatementOutput) { @@ -737,6 +728,15 @@ public class ExtractMethodProcessor implements MatchProvider { } + private void declareVariableAtMethodCallLocation(String name) { + PsiDeclarationStatement statement = + myElementFactory.createVariableDeclarationStatement(name, myOutputVariable.getType(), myMethodCall); + statement = (PsiDeclarationStatement)addToMethodCallLocation(statement); + PsiVariable var = (PsiVariable)statement.getDeclaredElements()[0]; + myMethodCall = (PsiMethodCallExpression)var.getInitializer(); + var.getModifierList().replace(myOutputVariable.getModifierList()); + } + private void adjustFinalParameters(final PsiMethod method) throws IncorrectOperationException { final IncorrectOperationException[] exc = new IncorrectOperationException[1]; exc[0] = null; diff --git a/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal.java b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal.java new file mode 100644 index 000000000000..f1dea911b29a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal.java @@ -0,0 +1,13 @@ +class Test { + void foo() { + final String str = ""; + if (str == "") { + return; + } + new Runnable() { + public void run() { + System.out.println(str); + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java new file mode 100644 index 000000000000..47b5fa6686e0 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java @@ -0,0 +1,18 @@ +class Test { + void foo() { + final String str = newMethod(); + new Runnable() { + public void run() { + System.out.println(str); + } + } + } + + private String newMethod() { + final String str = ""; + if (str == "") { + return; + } + return str; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 4d95425778a5..1a08474e4d56 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -400,6 +400,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testNullableCheckDontMissFinal() throws Exception { + doTest(); + } + public void testSimpleArrayAccess() throws Exception { doTest(); } From 7d3a015f5f8d103985801f93870a817ef4f6c04a Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 22:11:33 +0400 Subject: [PATCH 06/27] temp icons fixed --- .../src/com/intellij/execution/ProgramRunnerUtil.java | 8 +++++++- .../src/com/intellij/execution/impl/RunConfigurable.java | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java index d07b4c7d2e6e..2b534f422c37 100644 --- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java +++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java @@ -83,11 +83,17 @@ public class ProgramRunnerUtil { public static Icon getConfigurationIcon(final Project project, final RunnerAndConfigurationSettings settings, final boolean invalid) { final RunManager runManager = RunManager.getInstance(project); + return getConfigurationIcon(settings, invalid, runManager.isTemporary(settings.getConfiguration())); + } + + public static Icon getConfigurationIcon(final RunnerAndConfigurationSettings settings, + final boolean invalid, + boolean isTemporary) { RunConfiguration configuration = settings.getConfiguration(); final Icon icon = settings.getFactory().getIcon(configuration); LOG.assertTrue(icon != null, "Icon should not be null!"); - final Icon configurationIcon = runManager.isTemporary(configuration) ? IconLoader.getTransparentIcon(icon, 0.3f) : icon; + final Icon configurationIcon = isTemporary ? IconLoader.getTransparentIcon(icon, 0.3f) : icon; if (invalid) { return LayeredIcon.create(configurationIcon, INVALID_CONFIGURATION); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index fa62d357ea01..00e5a35fcfec 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -123,15 +123,17 @@ class RunConfigurable extends BaseConfigurable { if (userObject instanceof SingleConfigurationConfigurable) { final SingleConfigurationConfigurable settings = (SingleConfigurationConfigurable)userObject; RunnerAndConfigurationSettings snapshot; + boolean valid = true; try { snapshot = settings.getSnapshot(); } catch (ConfigurationException e) { + valid = false; snapshot = settings.getSettings(); } - setIcon(ProgramRunnerUtil.getConfigurationIcon(getProject(), snapshot, !settings.isValid())); configuration = settings.getConfiguration(); name = settings.getNameText(); + setIcon(ProgramRunnerUtil.getConfigurationIcon(snapshot, !valid, runManager.isTemporary(configuration))); } else if (userObject instanceof RunnerAndConfigurationSettingsImpl) { RunnerAndConfigurationSettings settings = (RunnerAndConfigurationSettings)userObject; From bdf98799352664309dd1e62d439d021a03bdf485 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 22:28:54 +0400 Subject: [PATCH 07/27] invalidation --- .../src/com/intellij/execution/impl/RunConfigurable.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index 00e5a35fcfec..6f4786b789f2 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -123,17 +123,15 @@ class RunConfigurable extends BaseConfigurable { if (userObject instanceof SingleConfigurationConfigurable) { final SingleConfigurationConfigurable settings = (SingleConfigurationConfigurable)userObject; RunnerAndConfigurationSettings snapshot; - boolean valid = true; try { snapshot = settings.getSnapshot(); } catch (ConfigurationException e) { - valid = false; snapshot = settings.getSettings(); } configuration = settings.getConfiguration(); name = settings.getNameText(); - setIcon(ProgramRunnerUtil.getConfigurationIcon(snapshot, !valid, runManager.isTemporary(configuration))); + setIcon(ProgramRunnerUtil.getConfigurationIcon(snapshot, !settings.isValid(), runManager.isTemporary(configuration))); } else if (userObject instanceof RunnerAndConfigurationSettingsImpl) { RunnerAndConfigurationSettings settings = (RunnerAndConfigurationSettings)userObject; From 05df4ef4d9797a42b806dd69af06333c0b5f9879 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 4 Jun 2010 12:03:57 +0400 Subject: [PATCH 08/27] AntResolveTest fix (platform-independent test data) --- plugins/ant/tests/data/psi/resolve/EnvProperty.ant | 2 +- plugins/ant/tests/data/psi/resolve/EnvProperty1.ant | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/ant/tests/data/psi/resolve/EnvProperty.ant b/plugins/ant/tests/data/psi/resolve/EnvProperty.ant index 4a17acf576a8..3f785c3c2b9f 100644 --- a/plugins/ant/tests/data/psi/resolve/EnvProperty.ant +++ b/plugins/ant/tests/data/psi/resolve/EnvProperty.ant @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/resolve/EnvProperty1.ant b/plugins/ant/tests/data/psi/resolve/EnvProperty1.ant index 9625f4fa216d..c242a2eab947 100644 --- a/plugins/ant/tests/data/psi/resolve/EnvProperty1.ant +++ b/plugins/ant/tests/data/psi/resolve/EnvProperty1.ant @@ -1,6 +1,6 @@ - + \ No newline at end of file From 5b3b4b753b5e7ed8e59328cbd24d43b30f5b7b4c Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 4 Jun 2010 12:15:54 +0400 Subject: [PATCH 09/27] AntParsingTest fix (platform-independent test data) --- .../testFramework/ParsingTestCase.java | 9 +++ .../psi/{Dirname.txt.0 => Dirname_u.txt.0} | 0 plugins/ant/tests/data/psi/Dirname_u.txt.1 | 6 ++ plugins/ant/tests/data/psi/Dirname_w.txt.0 | 57 +++++++++++++++++++ .../psi/{Dirname.txt.1 => Dirname_w.txt.1} | 0 .../com/intellij/lang/ant/AntParsingTest.java | 3 +- 6 files changed, 74 insertions(+), 1 deletion(-) rename plugins/ant/tests/data/psi/{Dirname.txt.0 => Dirname_u.txt.0} (100%) create mode 100644 plugins/ant/tests/data/psi/Dirname_u.txt.1 create mode 100644 plugins/ant/tests/data/psi/Dirname_w.txt.0 rename plugins/ant/tests/data/psi/{Dirname.txt.1 => Dirname_w.txt.1} (100%) diff --git a/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java b/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java index 42bf76b81c3e..a6393382fb7f 100644 --- a/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java @@ -67,6 +67,15 @@ public abstract class ParsingTestCase extends LightPlatformTestCase { } } + protected void doTest(String suffix) throws Exception{ + String name = getTestName(false); + String text = loadFile(name + "." + myFileExt); + myFile = createPsiFile(name, text); + myFile.accept(new PsiRecursiveElementVisitor(){}); + assertEquals(text, myFile.getText()); + checkResult(name + suffix + ".txt", myFile); + } + protected PsiFile createPsiFile(String name, String text) { return createFile(name + "." + myFileExt, text); } diff --git a/plugins/ant/tests/data/psi/Dirname.txt.0 b/plugins/ant/tests/data/psi/Dirname_u.txt.0 similarity index 100% rename from plugins/ant/tests/data/psi/Dirname.txt.0 rename to plugins/ant/tests/data/psi/Dirname_u.txt.0 diff --git a/plugins/ant/tests/data/psi/Dirname_u.txt.1 b/plugins/ant/tests/data/psi/Dirname_u.txt.1 new file mode 100644 index 000000000000..bd26a0ea019b --- /dev/null +++ b/plugins/ant/tests/data/psi/Dirname_u.txt.1 @@ -0,0 +1,6 @@ +AntFile[Dirname.ant] + AntProject[project] + AntProperty[prop = /] + AntElement[PsiElement(XML_ATTRIBUTE_VALUE)]('prop') + AntTarget:[A] + AntElement[PsiElement(XML_ATTRIBUTE_VALUE)]('A') \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/Dirname_w.txt.0 b/plugins/ant/tests/data/psi/Dirname_w.txt.0 new file mode 100644 index 000000000000..ea49effbd1e5 --- /dev/null +++ b/plugins/ant/tests/data/psi/Dirname_w.txt.0 @@ -0,0 +1,57 @@ +XmlFile:Dirname.ant + PsiElement(XML_DOCUMENT) + PsiElement(XML_PROLOG) + + XmlTag:project + XmlToken:XML_START_TAG_START('<') + XmlToken:XML_NAME('project') + PsiWhiteSpace(' ') + PsiElement(XML_ATTRIBUTE) + XmlToken:XML_NAME('default') + XmlToken:XML_EQ('=') + PsiElement(XML_ATTRIBUTE_VALUE) + XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"') + XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('A') + XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"') + XmlToken:XML_TAG_END('>') + XmlText + PsiWhiteSpace('\n ') + XmlTag:dirname + XmlToken:XML_START_TAG_START('<') + XmlToken:XML_NAME('dirname') + PsiWhiteSpace(' ') + PsiElement(XML_ATTRIBUTE) + XmlToken:XML_NAME('property') + XmlToken:XML_EQ('=') + PsiElement(XML_ATTRIBUTE_VALUE) + XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"') + XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('prop') + XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"') + PsiWhiteSpace(' ') + PsiElement(XML_ATTRIBUTE) + XmlToken:XML_NAME('file') + XmlToken:XML_EQ('=') + PsiElement(XML_ATTRIBUTE_VALUE) + XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"') + XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('${ant.file}') + XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"') + XmlToken:XML_EMPTY_ELEMENT_END('/>') + XmlText + PsiWhiteSpace('\n ') + XmlTag:target + XmlToken:XML_START_TAG_START('<') + XmlToken:XML_NAME('target') + PsiWhiteSpace(' ') + PsiElement(XML_ATTRIBUTE) + XmlToken:XML_NAME('name') + XmlToken:XML_EQ('=') + PsiElement(XML_ATTRIBUTE_VALUE) + XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"') + XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('A') + XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"') + XmlToken:XML_EMPTY_ELEMENT_END('/>') + XmlText + PsiWhiteSpace('\n') + XmlToken:XML_END_TAG_START('') \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/Dirname.txt.1 b/plugins/ant/tests/data/psi/Dirname_w.txt.1 similarity index 100% rename from plugins/ant/tests/data/psi/Dirname.txt.1 rename to plugins/ant/tests/data/psi/Dirname_w.txt.1 diff --git a/plugins/ant/tests/src/com/intellij/lang/ant/AntParsingTest.java b/plugins/ant/tests/src/com/intellij/lang/ant/AntParsingTest.java index d7066511bcf8..02d0a3c58513 100644 --- a/plugins/ant/tests/src/com/intellij/lang/ant/AntParsingTest.java +++ b/plugins/ant/tests/src/com/intellij/lang/ant/AntParsingTest.java @@ -17,6 +17,7 @@ package com.intellij.lang.ant; import com.intellij.openapi.application.PluginPathManager; +import com.intellij.openapi.util.SystemInfo; import com.intellij.testFramework.ParsingTestCase; public class AntParsingTest extends ParsingTestCase { @@ -110,7 +111,7 @@ public class AntParsingTest extends ParsingTestCase { } public void testDirname() throws Exception { - doTest(true); + doTest(SystemInfo.isWindows ? "_w" : "_u"); } public void testBasename() throws Exception { From d41a7287451ec731d634367c4d633644c1a39660 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 3 Jun 2010 15:24:28 +0400 Subject: [PATCH 10/27] do not cut off tooltip text --- .../impl/analysis/HighlightMethodUtil.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index ca27a5c4ab78..514c3cda7d2b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -529,6 +529,7 @@ public class HighlightMethodUtil { return containingClass == null ? method.getContainingFile().getName() : HighlightUtil.formatClass(containingClass, false); } + @Language("HTML") private static String createAmbiguousMethodHtmlTooltipMethodRow(final MethodCandidateInfo methodCandidate) { PsiMethod method = methodCandidate.getElement(); PsiParameter[] parameters = method.getParameterList().getParameters(); @@ -565,6 +566,7 @@ public class HighlightMethodUtil { PsiExpression[] expressions = list.getExpressions(); int cols = Math.max(parameters.length, expressions.length); + @Language("HTML") @NonNls String parensizedName = methodName + (parameters.length == 0 ? "( ) " : ""); return JavaErrorMessages.message( "argument.mismatch.html.tooltip", @@ -576,7 +578,7 @@ public class HighlightMethodUtil { } private static String esctrim(@NotNull String s) { - return StringUtil.first(XmlStringUtil.escapeString(s), 40, true); + return XmlStringUtil.escapeString(StringUtil.first(s, 40, true)); } private static String createMismatchedArgumentsHtmlTooltip(PsiExpressionList list, @@ -592,6 +594,7 @@ public class HighlightMethodUtil { } } + @Language("HTML") private static String createLongMismatchedArgumentsHtmlTooltip(PsiExpressionList list, PsiParameter[] parameters, String methodName, @@ -599,22 +602,21 @@ public class HighlightMethodUtil { PsiClass aClass) { PsiExpression[] expressions = list.getExpressions(); - @NonNls @Language("HTML") + @NonNls String s = "" + - " "+ - " " - +" " + ""+ + ""+ + "" ; - for (int i = 0; i < Math.max(parameters.length,expressions.length); i++) { PsiParameter parameter = i < parameters.length ? parameters[i] : null; PsiExpression expression = i < expressions.length ? expressions[i] : null; @NonNls String mismatchColor = showShortType(i, parameters, expressions, substitutor) ? null : "red"; - s += ""; + s += ""; s += ""; } - s+= "
" + methodName + "() in " + HighlightUtil.formatClass(aClass, false) +" cannot be applied to:
Expected
Parameters:
Actual
Arguments:

" + + "" + methodName + "() in " + HighlightUtil.formatClass(aClass, false) +" cannot be applied to:" + + "
Expected
Parameters:
Actual
Arguments:

"; if (parameter != null) { String name = parameter.getName(); @@ -651,10 +653,11 @@ public class HighlightMethodUtil { s += "
"; + s+= ""; return s; } + @Language("HTML") private static String createMismatchedArgsHtmlTooltipArgumentsRow(final PsiExpression[] expressions, final PsiParameter[] parameters, final PsiSubstitutor substitutor, final int cols) { @NonNls String ms = ""; @@ -678,6 +681,7 @@ public class HighlightMethodUtil { return ms; } + @Language("HTML") private static String createMismatchedArgsHtmlTooltipParamsRow(final PsiParameter[] parameters, final PsiSubstitutor substitutor, final PsiExpression[] expressions) { From 0301c300b6239a4bb3d4385325c24126684e5b31 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 3 Jun 2010 15:29:01 +0400 Subject: [PATCH 11/27] truncate extremely long inspection descriptions --- .../ui/ProblemDescriptionNode.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java index 24ee0577a4d9..81286c4b3284 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java @@ -44,8 +44,7 @@ public class ProblemDescriptionNode extends InspectionTreeNode { private CommonProblemDescriptor myDescriptor; protected DescriptorProviderInspection myTool; - public ProblemDescriptionNode(final Object userObject, - final DescriptorProviderInspection tool) { + public ProblemDescriptionNode(final Object userObject, final DescriptorProviderInspection tool) { super(userObject); myTool = tool; } @@ -60,9 +59,14 @@ public class ProblemDescriptionNode extends InspectionTreeNode { } @Nullable - public RefEntity getElement() { return myElement; } + public RefEntity getElement() { + return myElement; + } + @Nullable - public CommonProblemDescriptor getDescriptor() { return myDescriptor; } + public CommonProblemDescriptor getDescriptor() { + return myDescriptor; + } public Icon getIcon(boolean expanded) { if (myDescriptor instanceof ProblemDescriptorImpl) { @@ -78,7 +82,7 @@ public class ProblemDescriptionNode extends InspectionTreeNode { } public boolean isValid() { - if (myElement instanceof RefElement && !((RefElement)myElement).isValid()) return false; + if (myElement instanceof RefElement && !myElement.isValid()) return false; final CommonProblemDescriptor descriptor = getDescriptor(); if (descriptor instanceof ProblemDescriptor) { final PsiElement psiElement = ((ProblemDescriptor)descriptor).getPsiElement(); @@ -127,15 +131,17 @@ public class ProblemDescriptionNode extends InspectionTreeNode { public static String extractHighlightedText(CommonProblemDescriptor descriptor, PsiElement psiElement) { if (psiElement == null || !psiElement.isValid()) return ""; String ref = psiElement.getText(); - if(descriptor instanceof ProblemDescriptorImpl) { + if (descriptor instanceof ProblemDescriptorImpl) { TextRange textRange = ((ProblemDescriptorImpl)descriptor).getTextRange(); final TextRange elementRange = psiElement.getTextRange(); - if (textRange!=null && elementRange!=null) { + if (textRange != null && elementRange != null) { textRange = textRange.shiftRight(-elementRange.getStartOffset()); - if(textRange.getStartOffset() >= 0 && textRange.getEndOffset() <= ref.length()) + if (textRange.getStartOffset() >= 0 && textRange.getEndOffset() <= ref.length()) { ref = textRange.substring(ref); + } } } + ref = StringUtil.first(ref.replaceAll("\n"," ").trim(), 100, true); return ref; } } From 8838ec396381779a45719fd7bcfc0bc666f8d1dc Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 3 Jun 2010 15:29:31 +0400 Subject: [PATCH 12/27] cleanup --- .../codeInsight/hint/TooltipController.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java b/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java index c0e3ea2edebf..82fd73f9ea28 100644 --- a/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java +++ b/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.ui.LightweightHint; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.Alarm; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; @@ -49,10 +50,11 @@ public class TooltipController { } } - public void showTooltipByMouseMove(final Editor editor, - MouseEvent e, + public void showTooltipByMouseMove(@NotNull final Editor editor, + @NotNull MouseEvent e, final TooltipRenderer tooltipObject, - final boolean alignToRight, final TooltipGroup group) { + final boolean alignToRight, + @NotNull final TooltipGroup group) { myTooltipAlarm.cancelAllRequests(); if (myCurrentTooltip == null || !myCurrentTooltip.isVisible()) { myCurrentTooltipObject = null; @@ -95,11 +97,13 @@ public class TooltipController { } public void showTooltip(final Editor editor, Point p, String text, boolean alignToRight, TooltipGroup group) { - showTooltip(editor, p, ((EditorMarkupModel)editor.getMarkupModel()).getErrorStripTooltipRendererProvider().calcTooltipRenderer(text), alignToRight, group); + TooltipRenderer tooltipRenderer = ((EditorMarkupModel)editor.getMarkupModel()).getErrorStripTooltipRendererProvider().calcTooltipRenderer(text); + showTooltip(editor, p, tooltipRenderer, alignToRight, group); } public void showTooltip(final Editor editor, Point p, String text, int currentWidth, boolean alignToRight, TooltipGroup group) { - showTooltip(editor, p, ((EditorMarkupModel)editor.getMarkupModel()).getErrorStripTooltipRendererProvider().calcTooltipRenderer(text, currentWidth), alignToRight, group); + TooltipRenderer tooltipRenderer = ((EditorMarkupModel)editor.getMarkupModel()).getErrorStripTooltipRendererProvider().calcTooltipRenderer(text, currentWidth); + showTooltip(editor, p, tooltipRenderer, alignToRight, group); } public void showTooltip(final Editor editor, Point p, TooltipRenderer tooltipRenderer, boolean alignToRight, TooltipGroup group) { @@ -133,4 +137,4 @@ public class TooltipController { } return false; } -} \ No newline at end of file +} From e832cc79de3a6dd7e44616c8eaba9ec7ef62afc9 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 3 Jun 2010 16:11:57 +0400 Subject: [PATCH 13/27] truncate extremely long inspection descriptions the proper way --- .../intellij/codeInspection/ui/ProblemDescriptionNode.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java index 81286c4b3284..072dea7c420e 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java @@ -141,7 +141,10 @@ public class ProblemDescriptionNode extends InspectionTreeNode { } } } - ref = StringUtil.first(ref.replaceAll("\n"," ").trim(), 100, true); + ref = ref.replaceAll("\n", " ").trim(); + if (ref.length() > 100) { + ref = ref.substring(0, 100).trim() + "..."; + } return ref; } } From ce1d4f38290904037364d25c21655fb2f43229f2 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 3 Jun 2010 16:48:03 +0400 Subject: [PATCH 14/27] http://youtrack.jetbrains.net/issue/IDEA-53966 --- .../codeInsight/hint/LineTooltipRenderer.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java b/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java index cb1e903f019e..e6ed3096f99f 100644 --- a/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java +++ b/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java @@ -81,14 +81,14 @@ public class LineTooltipRenderer implements TooltipRenderer { int height = expanded ? Math.max(pane.getPreferredSize().height, 150) : pane.getPreferredSize().height; if (alignToRight) { - p.x -= width; + p.x = Math.max(0, p.x - width); } // try to make cursor outside tooltip. SCR 15038 p.x += 3; p.y += 3; - if (p.x + width >= widthLimit) { + if (p.x >= widthLimit - width) { p.x = widthLimit - width; width = Math.min(width, widthLimit); height += 20; @@ -98,7 +98,7 @@ public class LineTooltipRenderer implements TooltipRenderer { p.x = 3; } - if (p.y + height > heightLimit) { + if (p.y > heightLimit - height) { p.y = heightLimit - height; height = Math.min(heightLimit, height); } @@ -107,7 +107,9 @@ public class LineTooltipRenderer implements TooltipRenderer { p.y = 3; } - //in order to restrict tooltip size + locateOutsideMouseCursor(editor, layeredPane, p, width, height, heightLimit); + + // in order to restrict tooltip size pane.setSize(width, height); pane.setMaximumSize(new Dimension(width, height)); pane.setMinimumSize(new Dimension(width, height)); @@ -116,7 +118,6 @@ public class LineTooltipRenderer implements TooltipRenderer { scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); - final Ref anAction = new Ref(); final LightweightHint hint = new LightweightHint(scrollPane) { public void hide() { @@ -197,6 +198,27 @@ public class LineTooltipRenderer implements TooltipRenderer { return hint; } + private static void locateOutsideMouseCursor(Editor editor, + JComponent editorComponent, + Point p, + int width, + int height, + int heightLimit) { + Point mouse = MouseInfo.getPointerInfo().getLocation(); + SwingUtilities.convertPointFromScreen(mouse, editorComponent); + Rectangle tooltipRect = new Rectangle(p, new Dimension(width, height)); + // should show at least one line apart + tooltipRect.setBounds(tooltipRect.x, tooltipRect.y - editor.getLineHeight(), width, height + 2 * editor.getLineHeight()); + if (tooltipRect.contains(mouse)) { + if (mouse.y + height + editor.getLineHeight() > heightLimit && mouse.y - height - editor.getLineHeight() > 0) { + p.y = mouse.y - height - editor.getLineHeight(); + } + else { + p.y = mouse.y + editor.getLineHeight(); + } + } + } + protected String convertTextOnLinkHandled(String text) { return text; } From ce302415572b6bfff1ff4aaf648ca8e3ee3283a1 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 4 Jun 2010 11:50:54 +0400 Subject: [PATCH 15/27] common method extracted --- .../daemon/impl/LocalInspectionsPass.java | 21 +----------------- .../ui/ProblemDescriptionNode.java | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java index 55ff32229e95..80f75904567c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java @@ -380,7 +380,7 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass final Set emptyActionRegistered) { PsiElement psiElement = descriptor.getPsiElement(); if (psiElement == null) return null; - @NonNls String message = renderDescriptionMessage(descriptor); + @NonNls String message = ProblemDescriptionNode.renderDescriptionMessage(descriptor); final HighlightDisplayKey key = HighlightDisplayKey.find(tool.getShortName()); final InspectionProfile inspectionProfile = InspectionProjectProfileManager.getInstance(myProject).getInspectionProfile(); @@ -432,25 +432,6 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass } } - private static String renderDescriptionMessage(ProblemDescriptor descriptor) { - PsiElement psiElement = descriptor.getPsiElement(); - String message = descriptor.getDescriptionTemplate(); - - // no message. Should not be the case if inspection correctly implemented. - // noinspection ConstantConditions - if (message == null) return ""; - - message = StringUtil.replace(message, "", "'"); - message = StringUtil.replace(message, "", "'"); - //message = message.replaceAll("<[^>]*>", ""); - String ref = ProblemDescriptionNode.extractHighlightedText(descriptor, psiElement); - message = StringUtil.replace(message, "#loc", ""); - message = StringUtil.replace(message, "#ref", ref); - - message = StringUtil.unescapeXml(message).trim(); - return message; - } - public static PsiElement[] getElementsIntersectingRange(PsiFile file, final int startOffset, final int endOffset) { final FileViewProvider viewProvider = file.getViewProvider(); final Set result = new LinkedHashSet(); diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java index 072dea7c420e..0d09572cecc8 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java @@ -28,7 +28,6 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.FileStatus; import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -112,19 +111,30 @@ public class ProblemDescriptionNode extends InspectionTreeNode { } public String toString() { - return renderDescriptionMessage(getDescriptor()); + return renderDescriptionMessage(getDescriptor()).replaceAll("<[^>]*>", ""); } - private static String renderDescriptionMessage(@Nullable CommonProblemDescriptor descriptor) { + public static String renderDescriptionMessage(CommonProblemDescriptor descriptor) { PsiElement psiElement = descriptor instanceof ProblemDescriptor ? ((ProblemDescriptor)descriptor).getPsiElement() : null; - @NonNls String message = descriptor != null ? descriptor.getDescriptionTemplate().replaceAll("<[^>]*>", "") : ""; + String message = descriptor.getDescriptionTemplate(); + + // no message. Should not be the case if inspection correctly implemented. + // noinspection ConstantConditions + if (message == null) return ""; + + message = StringUtil.replace(message, "", "'"); + message = StringUtil.replace(message, "", "'"); message = StringUtil.replace(message, "#loc", ""); - message = StringUtil.replace(message, "#ref", extractHighlightedText(descriptor, psiElement)); + if (message.contains("#ref")) { + String ref = extractHighlightedText(descriptor, psiElement); + message = StringUtil.replace(message, "#ref", ref); + } final int endIndex = message.indexOf("#end"); if (endIndex > 0) { message = message.substring(0, endIndex); } - message = StringUtil.unescapeXml(message); + + message = StringUtil.unescapeXml(message).trim(); return message; } From 967b1125a2e0b558ecc52d4cc9ab609bf2fd9863 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Fri, 4 Jun 2010 12:22:10 +0400 Subject: [PATCH 16/27] Another fix for EA-20311: split HTML attribute if it contains outer language elements (a case when there is a mix of CSS and PHP in attribute value) --- .../intellij/psi/formatter/xml/XmlBlock.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/xml/impl/src/com/intellij/psi/formatter/xml/XmlBlock.java b/xml/impl/src/com/intellij/psi/formatter/xml/XmlBlock.java index 656292521664..9c4feb8b3ecf 100644 --- a/xml/impl/src/com/intellij/psi/formatter/xml/XmlBlock.java +++ b/xml/impl/src/com/intellij/psi/formatter/xml/XmlBlock.java @@ -17,6 +17,7 @@ package com.intellij.psi.formatter.xml; import com.intellij.formatting.*; import com.intellij.lang.ASTNode; +import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiErrorElement; @@ -111,7 +112,7 @@ public class XmlBlock extends AbstractXmlBlock { } } - private static List splitAttribute(ASTNode node, XmlFormattingPolicy formattingPolicy) { + private List splitAttribute(ASTNode node, XmlFormattingPolicy formattingPolicy) { final ArrayList result = new ArrayList(3); ASTNode child = node.getFirstChildNode(); while (child != null) { @@ -119,6 +120,12 @@ public class XmlBlock extends AbstractXmlBlock { child.getElementType() == XmlElementType.XML_ATTRIBUTE_VALUE_END_DELIMITER) { result.add(new XmlBlock(child, null, null, formattingPolicy, null, null)); } + else if (!child.getPsi().getLanguage().isKindOf(XMLLanguage.INSTANCE) && containsOuterLanguageElement(child)) { + // Fix for EA-20311: + // In case of another embedded language create a splittable XML block which can be + // merged with other language's code blocks. + result.add(new XmlBlock(child, null, null, myXmlFormattingPolicy, getChildIndent(), null)); + } else if (child.getElementType() != TokenType.ERROR_ELEMENT) { result.add(new ReadOnlyBlock(child)); } @@ -128,6 +135,18 @@ public class XmlBlock extends AbstractXmlBlock { } + private static boolean containsOuterLanguageElement(ASTNode node) { + ASTNode child = node.getFirstChildNode(); + while (child != null) { + if (child instanceof OuterLanguageElement) { + return true; + } + child = child.getTreeNext(); + } + return false; + } + + private List splitComment() { if (myNode.getElementType() != XmlElementType.XML_COMMENT) return EMPTY; final ArrayList result = new ArrayList(3); From 888cc1abd80b81a5de001fb107159921ea0118d1 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Fri, 4 Jun 2010 15:55:32 +0400 Subject: [PATCH 17/27] mac tree ui fix --- platform/util/src/com/intellij/util/ui/UIUtil.java | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index bb38b9a1b69c..7d88a6c3ed2f 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -1132,7 +1132,6 @@ public class UIUtil { super.completeUIInstall(); tree.setOpaque(false); - tree.setLargeModel(true); tree.setShowsRootHandles(true); tree.addMouseListener(mySelectionListener); From 4222e87c187fe74102b0286cb4181235dd360fe9 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Fri, 4 Jun 2010 17:05:35 +0400 Subject: [PATCH 18/27] Maven: community test fix --- .../importing/ArtifactsDownloadingTest.java | 64 ------------------- 1 file changed, 64 deletions(-) diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java index 6eeba7af237d..90415f08e8dc 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java @@ -146,70 +146,6 @@ public class ArtifactsDownloadingTest extends MavenImportingTestCase { assertTrue(javadoc.exists()); } - public void testCustomDocsAndSources() throws Exception { - String remoteRepo = FileUtil.toSystemIndependentName(myDir.getPath() + "/repo"); - updateSettingsXmlFully("" + - "" + - " " + - " Nexus" + - " " + VfsUtil.pathToUrl(remoteRepo) + "" + - " *" + - " " + - "" + - ""); - - FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-sources.jar"), "111".getBytes()); - FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-sources.jar.sha1"), - "6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 xxx/yyy/1/yyy-1-sources.jar".getBytes()); - - FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-asdoc.zip"), "111".getBytes()); - FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-asdoc.zip.sha1"), - "6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 xxx/yyy/1/yyy-1-asdoc.zip".getBytes()); - - FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-javadoc.jar"), "111".getBytes()); - FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-javadoc.jar.sha1"), - "6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 xxx/yyy/1/yyy-1-javadoc.jar".getBytes()); - - importProject("test" + - "project" + - "1" + - "swf" + - - "" + - " " + - " xxx" + - " yyy" + - " 1" + - " swc" + - " " + - "" + - - "" + - " " + - " " + - " org.sonatype.flexmojos" + - " flexmojos-maven-plugin" + - " 3.5.0" + - " true" + - " " + - " " + - ""); - - File sources = new File(getRepositoryPath(), "/xxx/yyy/1/yyy-1-sources.jar"); - File asdoc = new File(getRepositoryPath(), "/xxx/yyy/1/yyy-1-asdoc.zip"); - File javadoc = new File(getRepositoryPath(), "/xxx/yyy/1/yyy-1-javadoc.jar"); - - assertFalse(sources.exists()); - assertFalse(asdoc.exists()); - assertFalse(javadoc.exists()); - - downloadArtifacts(); - - assertTrue(sources.exists()); - assertTrue(asdoc.exists()); - assertFalse(javadoc.exists()); - } - public void testDownloadingPlugins() throws Exception { importProject("test" + "project" + From 295d6a601f23d513fc545906e359b19e323ca896 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Fri, 4 Jun 2010 17:40:34 +0400 Subject: [PATCH 19/27] Maven: community tests fixes --- plugins/maven/maven.iml | 1 + .../jetbrains/idea/maven/MavenTestCase.java | 50 +++++++++++--- .../idea/maven/dom/MavenDomTestCase.java | 7 +- ...PropertiesCompletionAndResolutionTest.java | 3 + .../importing/ArtifactsDownloadingTest.java | 66 +++++++++++++++++++ .../importing/DependenciesImportingTest.java | 2 + 6 files changed, 117 insertions(+), 12 deletions(-) diff --git a/plugins/maven/maven.iml b/plugins/maven/maven.iml index 276526c316bf..9fcf9be4dc66 100644 --- a/plugins/maven/maven.iml +++ b/plugins/maven/maven.iml @@ -30,6 +30,7 @@ + diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java index 2996687d1ebb..562d0ae1a9aa 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java @@ -15,6 +15,7 @@ */ package org.jetbrains.idea.maven; +import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; @@ -36,6 +37,7 @@ import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; +import java.awt.*; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; @@ -157,15 +159,28 @@ public abstract class MavenTestCase extends UsefulTestCase { @Override protected void runTest() throws Throwable { - if (runInWriteAction()) { - new WriteAction() { - protected void run(Result result) throws Throwable { - MavenTestCase.super.runTest(); - } - }.executeSilently().throwException(); + try { + if (runInWriteAction()) { + new WriteAction() { + protected void run(Result result) throws Throwable { + MavenTestCase.super.runTest(); + } + }.executeSilently().throwException(); + } + else { + MavenTestCase.super.runTest(); + } } - else { - MavenTestCase.super.runTest(); + catch (Exception throwable) { + Throwable each = throwable; + do { + if (each instanceof HeadlessException) { + printIgnoredMessage("Doesn't work in Headless environment"); + return; + } + } + while ((each = each.getCause()) != null); + throw throwable; } } @@ -450,16 +465,31 @@ public abstract class MavenTestCase extends UsefulTestCase { } protected boolean ignore() { - System.out.println("Ignored: " + getClass().getSimpleName() + "." + getName()); + printIgnoredMessage(null); return true; } + public boolean checkUltimate() { + if ("IU".equals(ApplicationInfo.getInstance().getBuild().getProductCode())) return true; + printIgnoredMessage("Ultimate edition is required"); + return false; + } + protected boolean hasMavenInstallation() { boolean result = getTestMavenHome() != null; - if (!result) System.out.println("Ignored, because Maven installation not found: " + getClass().getSimpleName() + "." + getName()); + if (!result) printIgnoredMessage("Maven installation not found"); return result; } + private void printIgnoredMessage(String message) { + String toPrint = "Ignored"; + if (message != null) { + toPrint += ", beacuse " + message; + } + toPrint += ": " + getClass().getSimpleName() + "." + getName(); + System.out.println(toPrint); + } + private String getTestMavenHome() { return System.getProperty("idea.maven.test.home"); } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenDomTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenDomTestCase.java index ceb7e5b75ec4..edd3a2256009 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenDomTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenDomTestCase.java @@ -52,6 +52,7 @@ import com.intellij.usages.UsageTargetUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; +import junit.framework.AssertionFailedError; import org.jetbrains.annotations.NonNls; import org.jetbrains.idea.maven.MavenImportingTestCase; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; @@ -279,7 +280,7 @@ public abstract class MavenDomTestCase extends MavenImportingTestCase { invokeRename(context, renameHandler); } - protected void assertCannotRename() throws IOException { + protected void assertCannotRename() throws Exception { MapDataContext context = createRenameDataContext(myProjectPom, "new name"); RenameHandler handler = RenameHandlerRegistry.getInstance().getRenameHandler(context); if (handler == null) return; @@ -287,7 +288,9 @@ public abstract class MavenDomTestCase extends MavenImportingTestCase { invokeRename(context, handler); } catch (Exception e) { - assertTrue(e.getMessage(), e.getMessage().startsWith("Cannot perform refactoring.")); + if (!e.getMessage().startsWith("Cannot perform refactoring.")) { + throw e; + } } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java index cc25c4ae2889..d8b15db05518 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java @@ -21,6 +21,9 @@ import com.intellij.psi.PsiManager; import org.jetbrains.idea.maven.dom.model.MavenDomProfilesModel; import org.jetbrains.idea.maven.dom.references.MavenPropertyPsiReference; +import java.awt.*; +import java.io.IOException; + public class MavenFilteredPropertiesCompletionAndResolutionTest extends MavenDomTestCase { public void testBasic() throws Exception { createProjectSubDir("res"); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java index 90415f08e8dc..904bd52127a0 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java @@ -146,6 +146,72 @@ public class ArtifactsDownloadingTest extends MavenImportingTestCase { assertTrue(javadoc.exists()); } + public void testCustomDocsAndSources() throws Exception { + if (!checkUltimate()) return; + + String remoteRepo = FileUtil.toSystemIndependentName(myDir.getPath() + "/repo"); + updateSettingsXmlFully("" + + "" + + " " + + " Nexus" + + " " + VfsUtil.pathToUrl(remoteRepo) + "" + + " *" + + " " + + "" + + ""); + + FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-sources.jar"), "111".getBytes()); + FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-sources.jar.sha1"), + "6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 xxx/yyy/1/yyy-1-sources.jar".getBytes()); + + FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-asdoc.zip"), "111".getBytes()); + FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-asdoc.zip.sha1"), + "6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 xxx/yyy/1/yyy-1-asdoc.zip".getBytes()); + + FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-javadoc.jar"), "111".getBytes()); + FileUtil.writeToFile(new File(remoteRepo, "/xxx/yyy/1/yyy-1-javadoc.jar.sha1"), + "6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 xxx/yyy/1/yyy-1-javadoc.jar".getBytes()); + + importProject("test" + + "project" + + "1" + + "swf" + + + "" + + " " + + " xxx" + + " yyy" + + " 1" + + " swc" + + " " + + "" + + + "" + + " " + + " " + + " org.sonatype.flexmojos" + + " flexmojos-maven-plugin" + + " 3.5.0" + + " true" + + " " + + " " + + ""); + + File sources = new File(getRepositoryPath(), "/xxx/yyy/1/yyy-1-sources.jar"); + File asdoc = new File(getRepositoryPath(), "/xxx/yyy/1/yyy-1-asdoc.zip"); + File javadoc = new File(getRepositoryPath(), "/xxx/yyy/1/yyy-1-javadoc.jar"); + + assertFalse(sources.exists()); + assertFalse(asdoc.exists()); + assertFalse(javadoc.exists()); + + downloadArtifacts(); + + assertTrue(sources.exists()); + assertTrue(asdoc.exists()); + assertFalse(javadoc.exists()); + } + public void testDownloadingPlugins() throws Exception { importProject("test" + "project" + diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java index 3f94e53655f2..044731e6bf0b 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java @@ -1500,6 +1500,8 @@ public class DependenciesImportingTest extends MavenImportingTestCase { } public void testCustomSourcesAndJavadocPaths() throws Exception { + if (!checkUltimate()) return; + importProject("test" + "project" + "1" + From 626252154a1a9ef1819bd2e7776a8f7cc572ed46 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 4 Jun 2010 17:49:23 +0400 Subject: [PATCH 20/27] ensure MXML typed handler delegate invoked before xml one --- platform/platform-resources/src/META-INF/XmlPlugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-resources/src/META-INF/XmlPlugin.xml b/platform/platform-resources/src/META-INF/XmlPlugin.xml index 50ec133dec53..633e864898d6 100644 --- a/platform/platform-resources/src/META-INF/XmlPlugin.xml +++ b/platform/platform-resources/src/META-INF/XmlPlugin.xml @@ -216,7 +216,7 @@ - +