From d50f621e157120b45d7149cb302eeca1fee16e04 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Sat, 1 Feb 2014 22:00:44 +0400 Subject: [PATCH 01/44] IDEA-118325 honor "maximum blank lines" setting --- .../processors/GroovySpacingProcessor.java | 22 ++++++++----------- .../lang/formatter/FormatterTest.groovy | 2 ++ .../testdata/groovy/formatter/extraLines.test | 14 ++++++++++++ 3 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/formatter/extraLines.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java index 84a6807b1594..e64154c3a14b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java @@ -370,27 +370,27 @@ public class GroovySpacingProcessor extends GroovyElementVisitor { @Override public void visitFile(GroovyFileBase file) { if (isAfterElementOrSemi(PACKAGE_DEFINITION)) { - myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_PACKAGE + 1, mySettings.KEEP_LINE_BREAKS, Integer.MAX_VALUE / 2); + myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_PACKAGE + 1, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } else if (myType2 == PACKAGE_DEFINITION) { - myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_BEFORE_PACKAGE + 1, mySettings.KEEP_LINE_BREAKS, Integer.MAX_VALUE / 2); + myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_BEFORE_PACKAGE + 1, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } else if (isLeftOrRight(TYPE_DEFINITION_TYPES)) { if (myType1 == GROOVY_DOC_COMMENT) { createLF(true); } else { - myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AROUND_CLASS + 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_DECLARATIONS); + myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AROUND_CLASS + 1, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } } else if (isAfterElementOrSemi(IMPORT_STATEMENT) && myType2 != IMPORT_STATEMENT) { //after imports - myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_IMPORTS + 1, mySettings.KEEP_LINE_BREAKS, Integer.MAX_VALUE / 2); + myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_IMPORTS + 1, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } else if (myType1 != IMPORT_STATEMENT && !isSemiAfter(IMPORT_STATEMENT) && myType2 == IMPORT_STATEMENT) { //before imports - myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_BEFORE_IMPORTS, mySettings.KEEP_LINE_BREAKS, Integer.MAX_VALUE / 2); + myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_BEFORE_IMPORTS, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } else if (isAfterElementOrSemi(IMPORT_STATEMENT) && myType2 == IMPORT_STATEMENT) { - myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, Integer.MAX_VALUE / 2); + myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } else { processClassMembers(null); @@ -582,7 +582,7 @@ public class GroovySpacingProcessor extends GroovyElementVisitor { @Override public void visitTypeArgumentList(GrTypeArgumentList typeArgumentList) { if (myType1 == mLT || myType2 == mGT) { - createSpaceProperty(false, true, 1); + createSpaceInCode(false); } } @@ -858,7 +858,7 @@ public class GroovySpacingProcessor extends GroovyElementVisitor { } private void createLazySpace() { - myResult = Spacing.createSpacing(0, Integer.MAX_VALUE, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE); + myResult = Spacing.createSpacing(0, Integer.MAX_VALUE, 0, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } public void visitDocTag(GrDocTag docTag) { @@ -1021,11 +1021,7 @@ public class GroovySpacingProcessor extends GroovyElementVisitor { } private void createSpaceInCode(final boolean space) { - createSpaceProperty(space, keepBlankLines()); - } - - private void createSpaceProperty(boolean space, int keepBlankLines) { - createSpaceProperty(space, mySettings.KEEP_LINE_BREAKS, keepBlankLines); + createSpaceProperty(space, mySettings.KEEP_LINE_BREAKS, keepBlankLines()); } private void createSpaceProperty(boolean space, boolean keepLineBreaks, final int keepBlankLines) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy index 72bb95deddbf..7b76abec59fe 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy @@ -770,6 +770,8 @@ def foo() { void testSpreadArg() { doTest() } + void testExtraLines() { doTest() } + void testLabelWithDescription() { GroovyCodeStyleSettings customSettings = myTempSettings.getCustomSettings(GroovyCodeStyleSettings.class) CommonCodeStyleSettings commonSettings = myTempSettings.getCommonSettings(GroovyFileType.GROOVY_LANGUAGE) diff --git a/plugins/groovy/testdata/groovy/formatter/extraLines.test b/plugins/groovy/testdata/groovy/formatter/extraLines.test new file mode 100644 index 000000000000..1fa2e574326d --- /dev/null +++ b/plugins/groovy/testdata/groovy/formatter/extraLines.test @@ -0,0 +1,14 @@ +package abc + + + + + + + +print 1 +----- +package abc + + +print 1 \ No newline at end of file From 0e3104e2c2544d872497238092f435aa5860c865 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Sat, 1 Feb 2014 22:42:52 +0400 Subject: [PATCH 02/44] introduce parameter from expression with null type --- ...troduceParameterMethodUsagesProcessor.java | 4 ++-- .../GrIntroduceParameterTest.groovy | 21 ++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java index 2e1b0f81be05..a5383af62f6c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -270,7 +270,7 @@ public class GroovyIntroduceParameterMethodUsagesProcessor implements IntroduceP @NotNull Project project) { GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(project); - final String typeText = forcedType.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) ? null : forcedType.getCanonicalText(); + final String typeText = forcedType.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) || forcedType == PsiType.NULL ? null : forcedType.getCanonicalText(); GrParameter parameter = factory.createParameter(parameterName, typeText, parametersOwner); parameter.getModifierList().setModifierProperty(PsiModifier.FINAL, isFinal); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.groovy index 8cc14aa1e0ee..3956cf8da7be 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/GrIntroduceParameterTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -356,6 +356,25 @@ class X { print new X(2) { } +''') + } + + + void testNullType() { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE, false, false, null, false, '''\ +def foo() { + def a = '4' + print a +} + +foo() +''', '''\ +def foo(anObject) { + def a = '4' + anObject +} + +foo(print(a)) ''') } } From 6ec28aca654f9e4f9b75f898279e11627d31ef59 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Mon, 3 Feb 2014 12:08:40 +0400 Subject: [PATCH 03/44] duplicates --- .../groovy/formatter/AlignmentProvider.java | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java index 815900804ec0..5c052f4beade 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,40 +58,18 @@ public class AlignmentProvider { } if (myAlignments.containsKey(set2)) { - for (Iterator iterator = set1.iterator(); iterator.hasNext(); ) { - PsiElement element = iterator.next(); - iterator.remove(); - - addInternal(set2, element); - } + addSet(set1, set2); } else { set1.addAll(set2); - for (Iterator iterator = set2.iterator(); iterator.hasNext(); ) { - PsiElement element = iterator.next(); - iterator.remove(); - - addInternal(set1, element); - } + addSet(set2, set1); } } else if (set1 != null) { - if (allowBackwardShift != null) { - assert myAllowBackwardShift.get(set1).booleanValue() == allowBackwardShift.booleanValue(); - } - if (anchor != null) { - assert myAnchor.get(set1) == anchor; - } - addInternal(set1, e2); + addElement(e2, allowBackwardShift, anchor, set1); } else if (set2 != null) { - if (allowBackwardShift != null) { - assert(myAllowBackwardShift.get(set2).booleanValue() == allowBackwardShift.booleanValue()); - } - if (anchor != null) { - assert(myAnchor.get(set2) == anchor); - } - addInternal(set2, e1); + addElement(e1, allowBackwardShift, anchor, set2); } else { final HashSet set = createHashSet(); @@ -102,6 +80,25 @@ public class AlignmentProvider { } } + private void addElement(PsiElement e, Boolean allowBackwardShift, Alignment.Anchor anchor, Set set) { + if (allowBackwardShift != null) { + assert myAllowBackwardShift.get(set).booleanValue() == allowBackwardShift.booleanValue(); + } + if (anchor != null) { + assert myAnchor.get(set) == anchor; + } + addInternal(set, e); + } + + private void addSet(Set set1, Set set2) { + for (Iterator iterator = set1.iterator(); iterator.hasNext(); ) { + PsiElement element = iterator.next(); + iterator.remove(); + + addInternal(set2, element); + } + } + private void addInternal(@NotNull Set set, @NotNull PsiElement element) { myTree.put(element, set); set.add(element); From 1097ad667bb82daa04621e6e117071115c09418f Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Mon, 3 Feb 2014 12:51:12 +0400 Subject: [PATCH 04/44] IDEA-120134 align ? and : of ternary operator --- .../blocks/GroovyBlockGenerator.java | 20 ++++++++++++------- .../lang/formatter/FormatterTest.groovy | 9 +++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/blocks/GroovyBlockGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/blocks/GroovyBlockGenerator.java index c2ac05abe6f7..721e482c5c5f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/blocks/GroovyBlockGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/blocks/GroovyBlockGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -301,12 +301,20 @@ public class GroovyBlockGenerator implements GroovyElementTypes { if (myContext.getSettings().ALIGN_MULTILINE_TERNARY_OPERATION) { final GrConditionalExpression conditional = (GrConditionalExpression)blockPsi; - final AlignmentProvider.Aligner aligner = myAlignmentProvider.createAligner(false); - aligner.append(conditional.getCondition()); + final AlignmentProvider.Aligner exprAligner = myAlignmentProvider.createAligner(false); + exprAligner.append(conditional.getCondition()); if (!(conditional instanceof GrElvisExpression)) { - aligner.append(conditional.getThenBranch()); + exprAligner.append(conditional.getThenBranch()); + } + exprAligner.append(conditional.getElseBranch()); + + ASTNode question = conditional.getNode().findChildByType(GroovyTokenTypes.mQUESTION); + ASTNode colon = conditional.getNode().findChildByType(GroovyTokenTypes.mCOLON); + if (question != null && colon != null) { + AlignmentProvider.Aligner questionColonAligner = myAlignmentProvider.createAligner(false); + questionColonAligner.append(question.getPsi()); + questionColonAligner.append(colon.getPsi()); } - aligner.append(conditional.getElseBranch()); } } @@ -508,7 +516,6 @@ public class GroovyBlockGenerator implements GroovyElementTypes { return blockPsi instanceof GrParameterList && myContext.getSettings().ALIGN_MULTILINE_PARAMETERS || blockPsi instanceof GrExtendsClause && myContext.getSettings().ALIGN_MULTILINE_EXTENDS_LIST || blockPsi instanceof GrThrowsClause && myContext.getSettings().ALIGN_MULTILINE_THROWS_LIST || - blockPsi instanceof GrConditionalExpression && myContext.getSettings().ALIGN_MULTILINE_TERNARY_OPERATION || blockPsi instanceof GrListOrMap && myContext.getGroovySettings().ALIGN_MULTILINE_LIST_OR_MAP; } @@ -516,7 +523,6 @@ public class GroovyBlockGenerator implements GroovyElementTypes { return blockPsi instanceof GrParameterList || blockPsi instanceof GrArgumentList || blockPsi instanceof GrAssignmentExpression || - blockPsi instanceof GrConditionalExpression || blockPsi instanceof GrExtendsClause || blockPsi instanceof GrThrowsClause || blockPsi instanceof GrListOrMap; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy index 7b76abec59fe..01cb0f735a43 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy @@ -713,6 +713,15 @@ print abc ?: ''' } + void testConditional2() { + groovySettings.ALIGN_MULTILINE_TERNARY_OPERATION = true + checkFormatting('''\ +print abc ? cde +:xyz''', '''\ +print abc ? cde + : xyz''') + } + void testLabelsInBasicMode() { groovySettings.indentOptions.INDENT_SIZE = 4 groovySettings.indentOptions.LABEL_INDENT_SIZE = -2 From 321cebbc5d04114c2dc3e89ed8fad55377182846 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Fri, 31 Jan 2014 18:27:40 +0400 Subject: [PATCH 05/44] style --- plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java index cacf3257335a..921d4cf9fbc5 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java @@ -353,7 +353,7 @@ public abstract class HgUtil { //get file name in target revision if it was moved/renamed HgStatusCommand statCommand = new HgStatusCommand.Builder(false).copySource(true).baseRevision(vcsRevisionNumber).build(project); - Set changes = statCommand.execute(localHgFile.getRepo(), Arrays.asList(localHgFile.toFilePath())); + Set changes = statCommand.execute(localHgFile.getRepo(), Collections.singletonList(localHgFile.toFilePath())); for (HgChange change : changes) { if (change.afterFile().equals(localHgFile)) { From 940384509c59a8c5fa071d84ebd9fb975f39cf91 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Fri, 31 Jan 2014 18:42:35 +0400 Subject: [PATCH 06/44] style --- plugins/hg4idea/src/org/zmlx/hg4idea/util/HgVersion.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgVersion.java b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgVersion.java index e8cceeda7225..2f8e822190bc 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgVersion.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgVersion.java @@ -70,10 +70,7 @@ public final class HgVersion implements Comparable { @NotNull private final Set myUnsupportedExtensions; public HgVersion(int major, int middle, int minor) { - myMajor = major; - myMiddle = middle; - myMinor = minor; - myUnsupportedExtensions = Collections.emptySet(); + this(major, middle, minor, Collections.emptySet()); } public HgVersion(int major, int middle, int minor, @NotNull Set unsupportedExtensions) { From fa2e57747cd294f67a7c422ee1c078a707f26ce4 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Fri, 31 Jan 2014 19:07:13 +0400 Subject: [PATCH 07/44] Capitalize property for dialog --- .../resources/org/zmlx/hg4idea/HgVcsMessages.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties b/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties index 52b1203e06dd..1bd5aa4e0c6f 100644 --- a/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties +++ b/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties @@ -52,8 +52,8 @@ hg4idea.configuration.executable.error=\"{0}\" doesn''t appear to be a valid hg hg4idea.configuration.test.label=Test hg4idea.configuration.test=&Test hg4idea.unable.to.run.hg=Unable to run hg: {0} -hg4idea.run.success.title=Hg executed successfully -hg4idea.run.failed.title=Hg execution failed +hg4idea.run.success.title=Hg Executed Successfully +hg4idea.run.failed.title=Hg Execution Failed hg4idea.command.executable.error=Error executing \"{0}\". Make sure you have setup the right executable in Mercurial configuration From 65bce6c0dc399dcc0e2ae3dab3b934bdf8f806c7 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Fri, 31 Jan 2014 19:17:20 +0400 Subject: [PATCH 08/44] unnecessary 'else' removed --- .../src/org/zmlx/hg4idea/action/HgBranchesAction.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchesAction.java b/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchesAction.java index e808b73ee25e..61cf991c20a5 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchesAction.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchesAction.java @@ -32,7 +32,7 @@ public class HgBranchesAction extends HgAbstractGlobalAction { @Override protected void execute(@NotNull Project project, @NotNull Collection repositories, @Nullable VirtualFile selectedRepo) { - HgRepository repository; + HgRepository repository = null; if (selectedRepo != null) { repository = HgUtil.getRepositoryManager(project).getRepositoryForRoot(selectedRepo); } @@ -41,9 +41,6 @@ public class HgBranchesAction extends HgAbstractGlobalAction { if (selectedRoot != null) { repository = HgUtil.getRepositoryManager(project).getRepositoryForRoot(selectedRoot); } - else { - return; - } } if (repository != null) { HgBranchPopup.getInstance(project, repository).asListPopup().showInFocusCenter(); From acdc335ec4054534515cfde189f82834ac77d868 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Sun, 2 Feb 2014 23:59:04 +0400 Subject: [PATCH 09/44] root detection call optimized for empty root checkers --- .../intellij/openapi/vcs/roots/VcsRootDetectorImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsRootDetectorImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsRootDetectorImpl.java index 338023582e0f..8b600cbfed73 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsRootDetectorImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsRootDetectorImpl.java @@ -37,6 +37,7 @@ public class VcsRootDetectorImpl implements VcsRootDetector { @NotNull private final Project myProject; @NotNull private final ProjectRootManager myProjectManager; @NotNull private final ProjectLevelVcsManager myVcsManager; + @NotNull private final VcsRootChecker[] myCheckers; public VcsRootDetectorImpl(@NotNull Project project, @NotNull ProjectRootManager projectRootManager, @@ -44,6 +45,7 @@ public class VcsRootDetectorImpl implements VcsRootDetector { myProject = project; myProjectManager = projectRootManager; myVcsManager = projectLevelVcsManager; + myCheckers = Extensions.getExtensions(VcsRootChecker.EXTENSION_POINT_NAME); } @NotNull @@ -53,7 +55,7 @@ public class VcsRootDetectorImpl implements VcsRootDetector { @NotNull public Collection detect(@Nullable VirtualFile startDir) { - if (startDir == null) { + if (startDir == null || myCheckers.length == 0) { return Collections.emptyList(); } @@ -140,9 +142,8 @@ public class VcsRootDetectorImpl implements VcsRootDetector { @NotNull private List getVcsListFor(@NotNull VirtualFile dir) { - VcsRootChecker[] checkers = Extensions.getExtensions(VcsRootChecker.EXTENSION_POINT_NAME); List vcsList = new ArrayList(); - for (VcsRootChecker checker : checkers) { + for (VcsRootChecker checker : myCheckers) { if (checker.isRoot(dir.getPath())) { vcsList.add(myVcsManager.findVcsByName(checker.getSupportedVcs().getName())); } From 7bd76e877e3055dfb2490158f3bfc3668aaedd55 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Mon, 3 Feb 2014 13:21:59 +0400 Subject: [PATCH 10/44] Reverted percent formatting by default for MySQL parser compatibility with Python (PY-10771) --- .../src/com/jetbrains/python/codeInsight/PyInjectionUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java b/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java index 6030afc5a158..fe51d6468fd5 100644 --- a/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java +++ b/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java @@ -81,7 +81,8 @@ public class PyInjectionUtil { */ @NotNull public static InjectionResult registerStringLiteralInjection(@NotNull PsiElement element, @NotNull MultiHostRegistrar registrar) { - return processStringLiteral(element, registrar, "", "", Formatting.NONE); + // Assume percent formatting since the MySQL parser cannot handle Python-style substitutions + return processStringLiteral(element, registrar, "", "", Formatting.PERCENT); } private static boolean isStringLiteralPart(@NotNull PsiElement element, @Nullable PsiElement context) { From 1cb0753b2a694b6fd027bd21b9c60f128d7c9d14 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 3 Feb 2014 13:29:52 +0400 Subject: [PATCH 11/44] do not prefer simple python run configuration over custom (django, etc.) --- .../python/run/PythonRunConfigurationProducer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java index c14bde2030b4..64f55259a7d9 100644 --- a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java +++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java @@ -17,6 +17,7 @@ package com.jetbrains.python.run; import com.intellij.execution.Location; import com.intellij.execution.actions.ConfigurationContext; +import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.execution.actions.RunConfigurationProducer; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; @@ -26,6 +27,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.python.PythonFileType; +import com.jetbrains.python.testing.PythonTestConfigurationProducer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -94,4 +96,8 @@ public class PythonRunConfigurationProducer extends RunConfigurationProducer Date: Mon, 3 Feb 2014 13:49:27 +0400 Subject: [PATCH 12/44] JavaFX Scene Builder integration --- .../javaFX/FxBuilderEmbedder/lib/embedder.jar | Bin 6496 -> 6608 bytes .../javaFX/sceneBuilder/SceneBuilderImpl.java | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/javaFX/FxBuilderEmbedder/lib/embedder.jar b/plugins/javaFX/FxBuilderEmbedder/lib/embedder.jar index 1ddf9204cf68e922e3a4bc2705c45391a107b99b..9400a2955c5b8b65c08eb093e1f493856573d031 100644 GIT binary patch delta 4390 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 delta 4278 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 diff --git a/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderImpl.java b/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderImpl.java index 025da2f708f0..fba7e4de778a 100644 --- a/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderImpl.java +++ b/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderImpl.java @@ -27,6 +27,7 @@ public class SceneBuilderImpl implements SceneBuilder { private final JFXPanel myPanel = new JFXPanel(); private EditorController myEditorController; private ChangeListener myListener; + private volatile boolean mySkipChanges; public SceneBuilderImpl(URL url, EditorCallback editorCallback) { myFileURL = url; @@ -88,7 +89,9 @@ public class SceneBuilderImpl implements SceneBuilder { myListener = new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - myEditorCallback.saveChanges(myEditorController.getFxmlText()); + if (!mySkipChanges) { + myEditorCallback.saveChanges(myEditorController.getFxmlText()); + } } }; @@ -103,6 +106,8 @@ public class SceneBuilderImpl implements SceneBuilder { } private void loadFile() { + mySkipChanges = true; + try { String fxmlText = FXOMDocument.readContentFromURL(myFileURL); myEditorController.setFxmlTextAndLocation(fxmlText, myFileURL); @@ -110,5 +115,8 @@ public class SceneBuilderImpl implements SceneBuilder { catch (Throwable e) { myEditorCallback.handleError(e); } + finally { + mySkipChanges = false; + } } } \ No newline at end of file From fdaa217c36a6c0074ce2913e3281257ef47e05b6 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 3 Feb 2014 13:51:14 +0400 Subject: [PATCH 13/44] do not prefer simple python run configuration over tests --- .../jetbrains/python/run/PythonRunConfigurationProducer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java index 64f55259a7d9..581776880816 100644 --- a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java +++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java @@ -27,7 +27,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.python.PythonFileType; -import com.jetbrains.python.testing.PythonTestConfigurationProducer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -98,6 +97,6 @@ public class PythonRunConfigurationProducer extends RunConfigurationProducer Date: Mon, 3 Feb 2014 13:58:37 +0400 Subject: [PATCH 14/44] fixed PY-11916 PyCharm nose helper causes DeprecationWarning --- python/helpers/pycharm/nose_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/helpers/pycharm/nose_utils.py b/python/helpers/pycharm/nose_utils.py index 9a6d68251cb3..a7efa08d4f4e 100644 --- a/python/helpers/pycharm/nose_utils.py +++ b/python/helpers/pycharm/nose_utils.py @@ -116,7 +116,7 @@ class TeamcityPlugin(ErrorClassPlugin, TextTestResult, TeamcityTestResult): suite = strclass(test.__class__) suite_location = "python_nosetestid://" + suite try: - from nose_helper.util import func_lineno + from nose.util import func_lineno if hasattr(test.test, "descriptor") and test.test.descriptor: suite_location = "file://" + self.test_address( From ba80bec5ad7db0f091c7df03c280b9fab02ffc80 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 29 Jan 2014 14:53:21 +0400 Subject: [PATCH 15/44] memleak --- .../codeInsight/daemon/impl/PsiChangeHandler.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java index f07d31847302..f4563f47e53e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -107,9 +107,11 @@ public class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable application.invokeLater(new Runnable() { @Override public void run() { - EditorMarkupModel markupModel = (EditorMarkupModel)editor.getMarkupModel(); - PsiFile file = PsiDocumentManager.getInstance(myProject).getPsiFile(editor.getDocument()); - TrafficLightRenderer.setOrRefreshErrorStripeRenderer(markupModel, myProject, editor.getDocument(), file); + if (!editor.isDisposed()) { + EditorMarkupModel markupModel = (EditorMarkupModel)editor.getMarkupModel(); + PsiFile file = PsiDocumentManager.getInstance(myProject).getPsiFile(editor.getDocument()); + TrafficLightRenderer.setOrRefreshErrorStripeRenderer(markupModel, myProject, editor.getDocument(), file); + } } }, ModalityState.stateForComponent(editor.getComponent()), myProject.getDisposed()); } From 42ee4dca1c5f3817b1cb7f0552e5b4d480574efa Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 29 Jan 2014 14:54:18 +0400 Subject: [PATCH 16/44] cleanup --- .../impl/quickfix/ImplementMethodsFix.java | 4 +- .../makeStatic/MakeStaticHandler.java | 11 ++-- .../intellij/refactoring/util/InlineUtil.java | 5 +- .../com/intellij/psi/impl/PsiImplUtil.java | 4 +- .../daemon/AdvHighlightingTest.java | 4 +- .../quickFix/LightQuickFixTestCase.java | 4 +- .../codeInspection/ProblemDescriptorBase.java | 3 +- .../openapi/application/ModalityState.java | 5 +- .../com/intellij/mock/MockApplication.java | 7 ++- .../psi/impl/file/impl/PsiVFSListener.java | 3 +- .../src/com/intellij/util/Alarm.java | 2 +- .../application/impl/LaterInvocator.java | 55 +++++++++---------- .../openapi/project/FileContentQueue.java | 4 +- .../com/intellij/ui/popup/AbstractPopup.java | 14 ++--- 14 files changed, 62 insertions(+), 63 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java index eae38cc03a17..715da62323de 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ public class ImplementMethodsFix extends LocalQuickFixAndIntentionActionOnPsiEle @Override @NotNull public String getFamilyName() { - return QuickFixBundle.message("implement.methods.fix"); + return getText(); } @Override diff --git a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeStaticHandler.java b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeStaticHandler.java index 91497a30334f..fde9098298e3 100644 --- a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeStaticHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeStaticHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,8 +26,6 @@ package com.intellij.refactoring.makeStatic; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -50,6 +48,7 @@ public class MakeStaticHandler implements RefactoringActionHandler { public static final String REFACTORING_NAME = RefactoringBundle.message("make.method.static.title"); private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.makeMethodStatic.MakeMethodStaticHandler"); + @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(dataContext); editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); @@ -71,6 +70,7 @@ public class MakeStaticHandler implements RefactoringActionHandler { invoke(project, new PsiElement[]{element}, dataContext); } + @Override public void invoke(@NotNull final Project project, @NotNull PsiElement[] elements, DataContext dataContext) { if(elements.length != 1 || !(elements[0] instanceof PsiTypeParameterListOwner)) return; @@ -108,10 +108,7 @@ public class MakeStaticHandler implements RefactoringActionHandler { @Override public boolean process(PsiReference reference) { final PsiElement element = reference.getElement(); - if (element instanceof PsiMethodReferenceExpression) { - return false; - } - return true; + return !(element instanceof PsiMethodReferenceExpression); } }); } diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index 2f80b2c651a1..486258f275f4 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -107,6 +107,7 @@ public class InlineUtil { builder.append(exprType.getCanonicalText()); builder.append("[]{"); builder.append(StringUtil.join(Arrays.asList(arguments), new Function() { + @Override public String fun(final PsiExpression expr) { return expr.getText(); } @@ -294,8 +295,10 @@ public class InlineUtil { public static boolean allUsagesAreTailCalls(final PsiMethod method) { final List nonTailCallUsages = Collections.synchronizedList(new ArrayList()); boolean result = ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + @Override public void run() { ReferencesSearch.search(method).forEach(new Processor() { + @Override public boolean process(final PsiReference psiReference) { ProgressManager.checkCanceled(); if (getTailCallType(psiReference) == TailCallType.None) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java index adb86e5ad49a..0de45be17786 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -370,7 +370,7 @@ public class PsiImplUtil { // todo[r.sh] cache? @Nullable - public static Set getAnnotationTargets(PsiClass annotationType) { + public static Set getAnnotationTargets(@NotNull PsiClass annotationType) { if (!annotationType.isAnnotationType()) return null; PsiModifierList modifierList = annotationType.getModifierList(); if (modifierList == null) return null; diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingTest.java index 968d078f6e10..89d37921f11c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,7 +49,7 @@ import java.io.File; import java.util.Collection; /** - * This class intended for "heavily-loaded" tests only, e.g. those need to setup separate project directory structure to run. + * This class intended for "heavy-loaded" tests only, e.g. those need to setup separate project directory structure to run. * For "lightweight" tests use LightAdvHighlightingTest. */ public class AdvHighlightingTest extends DaemonAnalyzerTestCase { diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java index 7d28d8ed12bd..eafc24d7d15f 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -189,7 +189,7 @@ public abstract class LightQuickFixTestCase extends LightDaemonAnalyzerTestCase return findActionWithText(getAvailableActions(), text); } - public static IntentionAction findActionWithText(final List actions, final String text) { + public static IntentionAction findActionWithText(@NotNull List actions, final String text) { for (IntentionAction action : actions) { if (text.equals(action.getText())) { return action; diff --git a/platform/analysis-impl/src/com/intellij/codeInspection/ProblemDescriptorBase.java b/platform/analysis-impl/src/com/intellij/codeInspection/ProblemDescriptorBase.java index 45997b0579af..3ac277c96d8e 100644 --- a/platform/analysis-impl/src/com/intellij/codeInspection/ProblemDescriptorBase.java +++ b/platform/analysis-impl/src/com/intellij/codeInspection/ProblemDescriptorBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -102,6 +102,7 @@ public class ProblemDescriptorBase extends CommonProblemDescriptorImpl implement return PsiTreeUtil.findCommonParent(startElement, endElement); } + @Override @Nullable public TextRange getTextRangeInElement() { return myTextRangeInElement; diff --git a/platform/core-api/src/com/intellij/openapi/application/ModalityState.java b/platform/core-api/src/com/intellij/openapi/application/ModalityState.java index fde756290433..7ade35e7ca71 100644 --- a/platform/core-api/src/com/intellij/openapi/application/ModalityState.java +++ b/platform/core-api/src/com/intellij/openapi/application/ModalityState.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,4 +63,7 @@ public abstract class ModalityState { } public abstract boolean dominates(@NotNull ModalityState anotherState); + + @Override + public abstract String toString(); } diff --git a/platform/core-impl/src/com/intellij/mock/MockApplication.java b/platform/core-impl/src/com/intellij/mock/MockApplication.java index 5a888c827aa1..f331a7dd9c8f 100644 --- a/platform/core-impl/src/com/intellij/mock/MockApplication.java +++ b/platform/core-impl/src/com/intellij/mock/MockApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -195,6 +195,11 @@ public class MockApplication extends MockComponentManager implements Application public boolean dominates(@NotNull ModalityState anotherState) { return false; } + + @Override + public String toString() { + return "NONE"; + } }; } return MODALITY_STATE_NONE; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java index eeb09fbec56a..1d9ef8c6525b 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,6 @@ import com.intellij.psi.impl.PsiDocumentManagerImpl; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.PsiTreeChangeEventImpl; import com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl; -import com.intellij.util.FileContentUtil; import com.intellij.util.FileContentUtilCore; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; diff --git a/platform/platform-api/src/com/intellij/util/Alarm.java b/platform/platform-api/src/com/intellij/util/Alarm.java index 1605a167cc7f..9cafa8debef1 100644 --- a/platform/platform-api/src/com/intellij/util/Alarm.java +++ b/platform/platform-api/src/com/intellij/util/Alarm.java @@ -357,7 +357,7 @@ public class Alarm implements Disposable { @Override public String toString() { Runnable task = getTask(); - return super.toString() + (task != null ? " "+task:null); + return super.toString() + (task != null ? ": "+task : ""); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java index 841cda70bc5a..adb76477f181 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java @@ -57,10 +57,10 @@ public class LaterInvocator { } private static class RunnableInfo { - final Runnable runnable; - final ModalityState modalityState; - final Condition expired; - final ActionCallback callback; + @NotNull private final Runnable runnable; + @NotNull private final ModalityState modalityState; + @NotNull private final Condition expired; + @NotNull private final ActionCallback callback; public RunnableInfo(@NotNull Runnable runnable, @NotNull ModalityState modalityState, @@ -74,7 +74,7 @@ public class LaterInvocator { @NonNls public String toString() { - return "[runnable: " + runnable + "; state=" + modalityState + "] "; + return "[runnable: " + runnable + "; state=" + modalityState + (expired.value(null) ? "; expired" : "")+"] "; } } @@ -88,21 +88,12 @@ public class LaterInvocator { private static final EventDispatcher ourModalityStateMulticaster = EventDispatcher.create(ModalityStateListener.class); - - private static final ArrayList ourForcedFlushQueue = new ArrayList(); - - public static void addModalityStateListener(@NotNull ModalityStateListener listener) { - ourModalityStateMulticaster.addListener(listener); - } + private static final List ourForcedFlushQueue = new ArrayList(); public static void addModalityStateListener(@NotNull ModalityStateListener listener, @NotNull Disposable parentDisposable) { ourModalityStateMulticaster.addListener(listener, parentDisposable); } - public static void removeModalityStateListener(@NotNull ModalityStateListener listener) { - ourModalityStateMulticaster.removeListener(listener); - } - @NotNull static ModalityStateEx modalityStateForWindow(@NotNull Window window) { int index = ourModalEntities.indexOf(window); @@ -113,9 +104,7 @@ public class LaterInvocator { if (window instanceof Dialog && ((Dialog)window).isModal()) { return ownerState.appendEntity(window); } - else { - return ownerState; - } + return ownerState; } ArrayList result = new ArrayList(); @@ -132,27 +121,32 @@ public class LaterInvocator { return new ModalityStateEx(result.toArray()); } + @NotNull public static ActionCallback invokeLater(@NotNull Runnable runnable) { return invokeLater(runnable, Conditions.FALSE); } + @NotNull public static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull Condition expired) { ModalityState modalityState = ModalityState.defaultModalityState(); return invokeLater(runnable, modalityState, expired); } + @NotNull public static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull ModalityState modalityState) { return invokeLater(runnable, modalityState, Conditions.FALSE); } + @NotNull public static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull ModalityState modalityState, @NotNull Condition expired) { ourFrequentEventDetector.eventHappened(); final ActionCallback callback = new ActionCallback(); + RunnableInfo runnableInfo = new RunnableInfo(runnable, modalityState, expired, callback); synchronized (LOCK) { - ourQueue.add(new RunnableInfo(runnable, modalityState, expired, callback)); + ourQueue.add(runnableInfo); } requestFlush(); return callback; @@ -177,7 +171,7 @@ public class LaterInvocator { @NonNls public String toString() { - return "InvokeAndWait[" + runnable.toString() + "]"; + return "InvokeAndWait[" + runnable + "]"; } }; invokeLater(runnable1, modalityState); @@ -326,7 +320,7 @@ public class LaterInvocator { lastInfo.callback.setDone(); } catch (ProcessCanceledException ex) { - // ignore + // ignore } catch (Throwable t) { if (t instanceof StackOverflowError) { @@ -348,20 +342,23 @@ public class LaterInvocator { @NonNls public String toString() { - return "LaterInvocator[lastRunnable=" + myLastInfo + "]"; + return "LaterInvocator.FlushQueue" + (myLastInfo == null ? "" : " lastInfo="+myLastInfo); } } @TestOnly - public static List dumpQueue() { + static String dumpQueue() { synchronized (LOCK) { - if (!ourQueue.isEmpty()) { - ArrayList r = new ArrayList(); - r.addAll(ourQueue); - Collections.reverse(r); - return r; + @NonNls String result = ""; + if (!ourForcedFlushQueue.isEmpty()) { + result = "(Forced queue: " + ourForcedFlushQueue + ") "; } + List r = new ArrayList(ourQueue); + result += r + (ourQueueSkipCount == 0 ? "" : " (ourQueueSkipCount="+ourQueueSkipCount+")") + + (ourModalEntities.isEmpty() ? " (non-modal)" : " (modal entities: "+ourModalEntities+")" + + (FLUSHER_SCHEDULED.get() ? " (Flusher scheduled)" : "") + ); + return result; } - return null; } } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/FileContentQueue.java b/platform/platform-impl/src/com/intellij/openapi/project/FileContentQueue.java index 7315999171c8..923935b0645c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/FileContentQueue.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/FileContentQueue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ public class FileContentQueue { private final Object myProceedWithProcessingLock = new Object(); private static final boolean ourAllowParallelFileReading = SystemProperties.getBooleanProperty("idea.allow.parallel.file.reading", true); - public void queue(final Collection files, @NotNull final ProgressIndicator indicator) { + public void queue(@NotNull Collection files, @NotNull final ProgressIndicator indicator) { myFilesToLoadQueue.addAll(files); final Runnable contentLoadingRunnable = new Runnable() { @Override diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index 53b84612f59f..8f7600865961 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -95,7 +95,6 @@ public class AbstractPopup implements JBPopup { private boolean myCancelOnWindowDeactivation = true; private Dimension myForcedSize; private Point myForcedLocation; - private ChildFocusWatcher myFocusWatcher; private boolean myCancelKeyEnabled; private boolean myLocateByContent; protected FocusTrackback myFocusTrackback; @@ -1037,7 +1036,7 @@ public class AbstractPopup implements JBPopup { } - myFocusWatcher = new ChildFocusWatcher(myContent) { + ChildFocusWatcher focusWatcher = new ChildFocusWatcher(myContent) { @Override protected void onFocusGained(final FocusEvent event) { setWindowActive(true); @@ -1047,8 +1046,8 @@ public class AbstractPopup implements JBPopup { protected void onFocusLost(final FocusEvent event) { setWindowActive(false); } - }; + Disposer.register(this, focusWatcher); mySpeedSearchPatternField = new JTextField(); if (SystemInfo.isMac) { @@ -1058,7 +1057,7 @@ public class AbstractPopup implements JBPopup { } private Window updateMaskAndAlpha(Window window) { - if (window == null) return window; + if (window == null) return null; final WindowManagerEx wndManager = getWndManager(); if (wndManager == null) return window; @@ -1249,11 +1248,6 @@ public class AbstractPopup implements JBPopup { } myMouseOutCanceller = null; - if (myFocusWatcher != null) { - myFocusWatcher.dispose(); - myFocusWatcher = null; - } - resetWindow(); if (myFinalRunnable != null) { From 6e01cbc4de03c372319d3476e5752350adaab131 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 29 Jan 2014 14:56:28 +0400 Subject: [PATCH 17/44] moved to analysis --- .../lang/ExternalAnnotatorsFilter.java | 2 +- .../lang/ExternalLanguageAnnotators.java | 2 +- .../lang/annotation/ExternalAnnotator.java | 2 +- .../ExternalAnnotatorInspectionVisitor.java | 32 +++++++++++++++---- 4 files changed, 28 insertions(+), 10 deletions(-) rename platform/{lang-api => analysis-api}/src/com/intellij/lang/ExternalAnnotatorsFilter.java (96%) rename platform/{lang-api => analysis-api}/src/com/intellij/lang/ExternalLanguageAnnotators.java (97%) rename platform/{lang-api => analysis-api}/src/com/intellij/lang/annotation/ExternalAnnotator.java (98%) rename platform/{lang-impl => analysis-impl}/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java (75%) diff --git a/platform/lang-api/src/com/intellij/lang/ExternalAnnotatorsFilter.java b/platform/analysis-api/src/com/intellij/lang/ExternalAnnotatorsFilter.java similarity index 96% rename from platform/lang-api/src/com/intellij/lang/ExternalAnnotatorsFilter.java rename to platform/analysis-api/src/com/intellij/lang/ExternalAnnotatorsFilter.java index e4050f0f491a..1ca4a369cc0d 100644 --- a/platform/lang-api/src/com/intellij/lang/ExternalAnnotatorsFilter.java +++ b/platform/analysis-api/src/com/intellij/lang/ExternalAnnotatorsFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform/lang-api/src/com/intellij/lang/ExternalLanguageAnnotators.java b/platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java similarity index 97% rename from platform/lang-api/src/com/intellij/lang/ExternalLanguageAnnotators.java rename to platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java index 4a46297597b9..90bd7a13f89a 100644 --- a/platform/lang-api/src/com/intellij/lang/ExternalLanguageAnnotators.java +++ b/platform/analysis-api/src/com/intellij/lang/ExternalLanguageAnnotators.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform/lang-api/src/com/intellij/lang/annotation/ExternalAnnotator.java b/platform/analysis-api/src/com/intellij/lang/annotation/ExternalAnnotator.java similarity index 98% rename from platform/lang-api/src/com/intellij/lang/annotation/ExternalAnnotator.java rename to platform/analysis-api/src/com/intellij/lang/annotation/ExternalAnnotator.java index 9f8644c02708..9381a2a04c1b 100644 --- a/platform/lang-api/src/com/intellij/lang/annotation/ExternalAnnotator.java +++ b/platform/analysis-api/src/com/intellij/lang/annotation/ExternalAnnotator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java b/platform/analysis-impl/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java similarity index 75% rename from platform/lang-impl/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java rename to platform/analysis-impl/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java index 54caec4262e6..f2a7c67be5c4 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java +++ b/platform/analysis-impl/src/com/intellij/codeInspection/ExternalAnnotatorInspectionVisitor.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.codeInspection; import com.intellij.codeInsight.daemon.impl.AnnotationHolderImpl; @@ -19,7 +34,7 @@ public class ExternalAnnotatorInspectionVisitor extends PsiElementVisitor { private final ProblemsHolder myHolder; private final ExternalAnnotator myAnnotator; - private boolean myOnTheFly; + private final boolean myOnTheFly; public ExternalAnnotatorInspectionVisitor(ProblemsHolder holder, ExternalAnnotator annotator, boolean onTheFly) { myHolder = holder; @@ -27,17 +42,19 @@ public class ExternalAnnotatorInspectionVisitor extends PsiElementVisitor { myOnTheFly = onTheFly; } - public static ProblemDescriptor[] checkFileWithExternalAnnotator(PsiFile file, - InspectionManager manager, - boolean isOnTheFly, ExternalAnnotator annotator) { + @NotNull + public static ProblemDescriptor[] checkFileWithExternalAnnotator(@NotNull PsiFile file, + @NotNull InspectionManager manager, + boolean isOnTheFly, + @NotNull ExternalAnnotator annotator) { if (isOnTheFly) { // concrete JSLinterExternalAnnotator implementation does this work return ProblemDescriptor.EMPTY_ARRAY; } - Object info = annotator.collectInformation(file); + Init info = annotator.collectInformation(file); if (info != null) { - Object annotationResult = annotator.doAnnotate(info); + Result annotationResult = annotator.doAnnotate(info); if (annotationResult == null) { return ProblemDescriptor.EMPTY_ARRAY; } @@ -48,10 +65,11 @@ public class ExternalAnnotatorInspectionVisitor extends PsiElementVisitor { return ProblemDescriptor.EMPTY_ARRAY; } + @NotNull private static ProblemDescriptor[] convertToProblemDescriptors(@NotNull final List annotations, @NotNull final InspectionManager manager, @NotNull final PsiFile file) { - if (annotations.size() == 0) { + if (annotations.isEmpty()) { return ProblemDescriptor.EMPTY_ARRAY; } From f0facb34db94044de39a7b231afcf2b9aaa3a40b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 3 Feb 2014 14:06:39 +0400 Subject: [PATCH 18/44] jdk8 compilation --- .../com/intellij/patterns/ObjectPattern.java | 10 +-- .../intellij/util/containers/OrderedSet.java | 65 +++++------------- .../xdebugger/impl/XDebugSessionImpl.java | 4 +- plugins/gradle/gradle.iml | 1 + plugins/gradle/lib/gradle-reporting-1.9.jar | Bin 0 -> 34216 bytes .../project/GradleProjectResolver.java | 5 +- .../service/project/ProjectImportAction.java | 5 +- python/testSrc/python-community-tests.iml | 1 + 8 files changed, 33 insertions(+), 58 deletions(-) create mode 100644 plugins/gradle/lib/gradle-reporting-1.9.jar diff --git a/platform/core-api/src/com/intellij/patterns/ObjectPattern.java b/platform/core-api/src/com/intellij/patterns/ObjectPattern.java index a76ee94c6b73..cf9f751c9852 100644 --- a/platform/core-api/src/com/intellij/patterns/ObjectPattern.java +++ b/platform/core-api/src/com/intellij/patterns/ObjectPattern.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,11 +58,13 @@ public abstract class ObjectPattern> impl } public Self andNot(final ElementPattern pattern) { - return and(StandardPatterns.not(pattern)); + ElementPattern not = StandardPatterns.not(pattern); + return and(not); } - public Self andOr(final ElementPattern... patterns) { - return and(StandardPatterns.or(patterns)); + public Self andOr(@NotNull ElementPattern... patterns) { + ElementPattern or = StandardPatterns.or(patterns); + return and(or); } public Self and(final ElementPattern pattern) { diff --git a/platform/util/src/com/intellij/util/containers/OrderedSet.java b/platform/util/src/com/intellij/util/containers/OrderedSet.java index ce03ffcba6eb..76cfc8c27480 100644 --- a/platform/util/src/com/intellij/util/containers/OrderedSet.java +++ b/platform/util/src/com/intellij/util/containers/OrderedSet.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,28 +18,26 @@ package com.intellij.util.containers; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.RandomAccess; +import java.util.Set; -public class OrderedSet extends AbstractList implements Set, RandomAccess { +// have to extend ArrayList because otherwise the spliterator() methods declared in Set and List are in conflict +public class OrderedSet extends ArrayList implements Set, RandomAccess { private final OpenTHashSet myHashSet; - private final ArrayList myElements; public OrderedSet() { this(ContainerUtil.canonicalStrategy()); } - public OrderedSet(TObjectHashingStrategy hashingStrategy) { + public OrderedSet(@NotNull TObjectHashingStrategy hashingStrategy) { this(hashingStrategy, 4); } - public OrderedSet(TObjectHashingStrategy hashingStrategy, int capacity) { + public OrderedSet(@NotNull TObjectHashingStrategy hashingStrategy, int capacity) { + super(capacity); myHashSet = new OpenTHashSet(capacity, hashingStrategy); - myElements = new ArrayList(capacity); - } - - @Override - public int size() { - return myElements.size(); } @Override @@ -50,7 +48,7 @@ public class OrderedSet extends AbstractList implements Set, RandomAcce @Override public boolean add(T o) { if (myHashSet.add(o)){ - myElements.add(o); + super.add(o); return true; } return false; @@ -59,7 +57,7 @@ public class OrderedSet extends AbstractList implements Set, RandomAcce @Override public boolean remove(Object o) { if (myHashSet.remove(o)){ - myElements.remove(o); + super.remove(o); return true; } return false; @@ -68,19 +66,7 @@ public class OrderedSet extends AbstractList implements Set, RandomAcce @Override public void clear() { myHashSet.clear(); - myElements.clear(); - } - - @NotNull - @Override - public Object[] toArray() { - return myElements.toArray(); - } - - @NotNull - @Override - public T[] toArray(@NotNull T[] a) { - return myElements.toArray(a); + super.clear(); } @Override @@ -88,11 +74,6 @@ public class OrderedSet extends AbstractList implements Set, RandomAcce throw new UnsupportedOperationException(); } - @Override - public T get(final int index) { - return myElements.get(index); - } - @Override public T set(final int index, final T element) { final T removed = remove(index); @@ -103,13 +84,13 @@ public class OrderedSet extends AbstractList implements Set, RandomAcce @Override public void add(final int index, final T element) { if (myHashSet.add(element)){ - myElements.add(index, element); + super.add(index, element); } } @Override public T remove(final int index) { - final T t = myElements.remove(index); + final T t = super.remove(index); myHashSet.remove(t); return t; } @@ -117,24 +98,12 @@ public class OrderedSet extends AbstractList implements Set, RandomAcce @Override public int indexOf(final Object o) { final int index = myHashSet.index((T)o); - return index >= 0? myElements.indexOf(myHashSet.get(index)) : -1; + return index >= 0? super.indexOf(myHashSet.get(index)) : -1; } @Override public int lastIndexOf(final Object o) { final int index = myHashSet.index((T)o); - return index >= 0 ? myElements.lastIndexOf(myHashSet.get(index)) : -1; - } - - @NotNull - @Override - public ListIterator listIterator() { - return myElements.listIterator(); - } - - @NotNull - @Override - public ListIterator listIterator(final int index) { - return myElements.listIterator(index); + return index >= 0 ? super.lastIndexOf(myHashSet.get(index)) : -1; } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java index 1b17a3a815b0..8accea1d4c36 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -322,7 +322,7 @@ public class XDebugSessionImpl implements XDebugSession { return myValueMarkers; } - private static > XBreakpointType getBreakpointTypeClass(final XBreakpointHandler handler) { + private static XBreakpointType getBreakpointTypeClass(final XBreakpointHandler handler) { return XDebuggerUtil.getInstance().findBreakpointType(handler.getBreakpointTypeClass()); } diff --git a/plugins/gradle/gradle.iml b/plugins/gradle/gradle.iml index 6f6de2602ed6..9c852ed6ffc1 100644 --- a/plugins/gradle/gradle.iml +++ b/plugins/gradle/gradle.iml @@ -35,6 +35,7 @@ + diff --git a/plugins/gradle/lib/gradle-reporting-1.9.jar b/plugins/gradle/lib/gradle-reporting-1.9.jar new file mode 100644 index 0000000000000000000000000000000000000000..5315525368336ca109d0e25ada55f7418d453093 GIT binary patch literal 34216 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 N8|%gmZ-=Y@{tqE?=T!gz literal 0 HcmV?d00001 diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 03f0e66451dc..58120f90a4d4 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -187,8 +187,9 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver aClass = resolverCtx.isPreviewMode() ? BasicIdeaProject.class : IdeaProject.class; ModelBuilder modelBuilder = myHelper.getModelBuilder( - resolverCtx.isPreviewMode() ? BasicIdeaProject.class : IdeaProject.class, + aClass, resolverCtx.getExternalSystemTaskId(), resolverCtx.getSettings(), resolverCtx.getConnection(), diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectImportAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectImportAction.java index 52c6e3d47b74..407f12c6981a 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectImportAction.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectImportAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,8 @@ public class ProjectImportAction implements BuildAction aClass1 = myIsPreviewMode ? BasicIdeaProject.class : IdeaProject.class; + final IdeaProject ideaProject = controller.getModel(aClass1); if (ideaProject == null || ideaProject.getModules().isEmpty()) { return null; } diff --git a/python/testSrc/python-community-tests.iml b/python/testSrc/python-community-tests.iml index b4cc2764d3aa..6511d8860c87 100644 --- a/python/testSrc/python-community-tests.iml +++ b/python/testSrc/python-community-tests.iml @@ -15,6 +15,7 @@ + From 9eae97504cce10f301d1ea0760e5408b0d06b0a6 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Mon, 3 Feb 2014 14:55:27 +0400 Subject: [PATCH 19/44] JavaFX Scene Builder integration --- .../src/META-INF/common-javaFX-plugin.xml | 1 + .../actions/OpenInSceneBuilderAction.java | 128 +----------------- 2 files changed, 8 insertions(+), 121 deletions(-) diff --git a/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml b/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml index d6ef063029af..ffb957bff742 100644 --- a/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml +++ b/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml @@ -57,6 +57,7 @@ + diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/actions/OpenInSceneBuilderAction.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/actions/OpenInSceneBuilderAction.java index f41b9be4c614..6a56d6b60cdc 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/actions/OpenInSceneBuilderAction.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/actions/OpenInSceneBuilderAction.java @@ -17,35 +17,18 @@ package org.jetbrains.plugins.javaFX.actions; import com.intellij.CommonBundle; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.configurations.JavaParameters; -import com.intellij.execution.configurations.PathEnvironmentVariableUtil; -import com.intellij.execution.process.OSProcessHandler; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ArrayUtil; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.javaFX.JavaFxSettings; -import org.jetbrains.plugins.javaFX.JavaFxSettingsConfigurable; import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; +import org.jetbrains.plugins.javaFX.sceneBuilder.SceneBuilderInfo; /** * User: anna @@ -53,84 +36,21 @@ import java.util.List; */ public class OpenInSceneBuilderAction extends AnAction { private static final Logger LOG = Logger.getInstance("#" + OpenInSceneBuilderAction.class.getName()); - public static final String ORACLE = "Oracle"; @Override public void actionPerformed(AnActionEvent e) { final VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE); LOG.assertTrue(virtualFile != null); final String path = virtualFile.getPath(); - - final JavaFxSettings settings = JavaFxSettings.getInstance(); - String pathToSceneBuilder = settings.getPathToSceneBuilder(); - if (StringUtil.isEmptyOrSpaces(settings.getPathToSceneBuilder())){ - final VirtualFile sceneBuilderFile = FileChooser.chooseFile(JavaFxSettingsConfigurable.createSceneBuilderDescriptor(), e.getProject(), getPredefinedPath()); - if (sceneBuilderFile == null) return; - - pathToSceneBuilder = sceneBuilderFile.getPath(); - settings.setPathToSceneBuilder(FileUtil.toSystemIndependentName(pathToSceneBuilder)); - } - final Project project = getEventProject(e); - if (project != null && !Registry.is("scene.builder.start.executable", true)) { - final Module module = ModuleUtilCore.findModuleForFile(virtualFile, project); - if (module != null) { - try { - final JavaParameters javaParameters = new JavaParameters(); - javaParameters.configureByModule(module, JavaParameters.JDK_AND_CLASSES); - final File sceneBuilderLibsFile; - if (SystemInfo.isMac) { - sceneBuilderLibsFile = new File(new File(pathToSceneBuilder, "Contents"), "Java"); - } else if (SystemInfo.isWindows) { - File sceneBuilderRoot = new File(pathToSceneBuilder); - File sceneBuilderRootDir = sceneBuilderRoot.getParentFile(); - if (sceneBuilderRootDir == null) { - final File foundInPath = PathEnvironmentVariableUtil.findInPath(pathToSceneBuilder); - if (foundInPath != null) { - sceneBuilderRootDir = foundInPath.getParentFile(); - } - } - sceneBuilderRoot = sceneBuilderRootDir != null ? sceneBuilderRootDir.getParentFile() : null; - if (sceneBuilderRoot != null) { - final File libFile = new File(sceneBuilderRoot, "lib"); - if (libFile.isDirectory()) { - sceneBuilderLibsFile = libFile; - } - else { - final File appFile = new File(sceneBuilderRootDir, "app"); - sceneBuilderLibsFile = appFile.isDirectory() ? appFile : null; - } - } - else { - sceneBuilderLibsFile = null; - } - } else { - sceneBuilderLibsFile = new File(new File(pathToSceneBuilder).getParent(), "app"); - } - if (sceneBuilderLibsFile != null) { - final File[] sceneBuilderLibs = sceneBuilderLibsFile.listFiles(); - if (sceneBuilderLibs != null) { - for (File jarFile : sceneBuilderLibs) { - javaParameters.getClassPath().add(jarFile.getPath()); - } - javaParameters.setMainClass("com.oracle.javafx.authoring.Main"); - javaParameters.getProgramParametersList().add(path); - - final OSProcessHandler processHandler = javaParameters.createOSProcessHandler(); - final String commandLine = processHandler.getCommandLine(); - LOG.info("scene builder command line: " + commandLine); - processHandler.startNotify(); - return; - } - } - } - catch (Throwable ex) { - LOG.info(ex); - } - } + final SceneBuilderInfo info = SceneBuilderInfo.get(project, true); + if (info == SceneBuilderInfo.EMPTY) { + return; } + String pathToSceneBuilder = info.path; + if (SystemInfo.isMac) { pathToSceneBuilder += "/Contents/MacOS/scenebuilder-launcher.sh"; } @@ -152,45 +72,11 @@ public class OpenInSceneBuilderAction extends AnAction { presentation.setEnabled(false); presentation.setVisible(false); final VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE); - if (virtualFile != null && + if (virtualFile != null && JavaFxFileTypeFactory.isFxml(virtualFile) && e.getProject() != null) { presentation.setEnabled(true); presentation.setVisible(true); } } - - @Nullable - private static VirtualFile getPredefinedPath() { - String path = null; - if (SystemInfo.isWindows) { - final String sb11 = File.separator + "JavaFX Scene Builder 1.1" + File.separator + "JavaFX Scene Builder 1.1.exe"; - final String sb10 = File.separator + "JavaFX Scene Builder 1.0" + File.separator + "bin" + File.separator + "scenebuilder.exe"; - final List suspiciousPaths = new ArrayList(); - final String programFiles = "C:\\Program Files"; - fillPaths(programFiles, sb11, sb10, suspiciousPaths); - fillPaths(programFiles + " (x86)", sb11, sb10, suspiciousPaths); - final File sb = FileUtil.findFirstThatExist(ArrayUtil.toStringArray(suspiciousPaths)); - if (sb != null) { - path = sb.getPath(); - } - } - else if (SystemInfo.isMac) { - final File sb = FileUtil.findFirstThatExist("/Applications/JavaFX Scene Builder 1.1.app", - "/Applications/JavaFX Scene Builder 1.0.app"); - if (sb != null) { - path = sb.getPath(); - } - } - else if (SystemInfo.isUnix) { - path = "/opt/JavaFXSceneBuilder1.1/JavaFXSceneBuilder1.1"; - } - - return path != null ? LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(path)) : null; - } - - private static void fillPaths(String programFilesPath, String sb11, String sb10, List suspiciousPaths) { - suspiciousPaths.add(new File(programFilesPath, ORACLE).getPath() + sb11); - suspiciousPaths.add(new File(programFilesPath, ORACLE).getPath() + sb10); - } } From c10330075996574bfdaa2098bb259b05e75fc274 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 3 Feb 2014 15:12:22 +0400 Subject: [PATCH 20/44] IDEA-120224 Add possibility to customize ConsoleView popup actions --- .../actions/ConsoleActionsPostProcessor.java | 13 ++++++++++--- .../intellij/execution/impl/ConsoleViewImpl.java | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/platform/lang-api/src/com/intellij/execution/actions/ConsoleActionsPostProcessor.java b/platform/lang-api/src/com/intellij/execution/actions/ConsoleActionsPostProcessor.java index 859cd8162108..792208811bd3 100644 --- a/platform/lang-api/src/com/intellij/execution/actions/ConsoleActionsPostProcessor.java +++ b/platform/lang-api/src/com/intellij/execution/actions/ConsoleActionsPostProcessor.java @@ -26,9 +26,9 @@ import org.jetbrains.annotations.NotNull; * @author Denis Zhdanov * @since 4/25/11 1:16 PM */ -public interface ConsoleActionsPostProcessor { +public abstract class ConsoleActionsPostProcessor { - ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.consoleActionsPostProcessor"); + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.consoleActionsPostProcessor"); /** * Allows to adjust actions to use within the given console instance. @@ -40,5 +40,12 @@ public interface ConsoleActionsPostProcessor { * @return actions to use within the given console instance (given actions may be returned by default) */ @NotNull - AnAction[] postProcess(@NotNull ConsoleView console, @NotNull AnAction[] actions); + public AnAction[] postProcess(@NotNull ConsoleView console, @NotNull AnAction[] actions) { + return actions; + } + + @NotNull + public AnAction[] postProcessPopupActions(@NotNull ConsoleView console, @NotNull AnAction[] actions) { + return actions; + } } 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 c5ad2799230e..79e0220c1174 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -922,7 +922,21 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo if (group == null) { group = (ActionGroup)actionManager.getAction(CONSOLE_VIEW_POPUP_MENU); } - final ActionPopupMenu menu = actionManager.createActionPopupMenu(ActionPlaces.EDITOR_POPUP, group); + final ConsoleActionsPostProcessor[] postProcessors = Extensions.getExtensions(ConsoleActionsPostProcessor.EP_NAME); + AnAction[] result = group.getChildren(null); + + for (ConsoleActionsPostProcessor postProcessor : postProcessors) { + result = postProcessor.postProcessPopupActions(this, result); + } + final AnAction[] processedActions = result; + final ActionGroup processedGroup = new ActionGroup() { + @NotNull + @Override + public AnAction[] getChildren(@Nullable AnActionEvent e) { + return processedActions; + } + }; + final ActionPopupMenu menu = actionManager.createActionPopupMenu(ActionPlaces.EDITOR_POPUP, processedGroup); menu.getComponent().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } From 3b73d7897087052b8a9e8569a790c0e9244beb19 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 3 Feb 2014 15:23:12 +0400 Subject: [PATCH 21/44] IDEA-119508 pass context PsiFile to ImportFilter --- .../daemon/impl/quickfix/ImportClassFixBase.java | 3 ++- .../intellij/psi/impl/source/codeStyle/ImportHelper.java | 2 +- .../src/com/intellij/codeInsight/ImportFilter.java | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java index 510a79e4705a..957893ffe680 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java @@ -113,6 +113,7 @@ public abstract class ImportClassFixBase classList = new ArrayList(classes.length); boolean isAnnotationReference = myElement.getParent() instanceof PsiAnnotation; + final PsiFile file = myElement.getContainingFile(); for (PsiClass aClass : classes) { if (isAnnotationReference && !aClass.isAnnotationType()) continue; if (JavaCompletionUtil.isInExcludedPackage(aClass, false)) continue; @@ -120,7 +121,7 @@ public abstract class ImportClassFixBase EP_NAME = new ExtensionPointName("com.intellij.importFilter"); - public abstract boolean shouldUseFullyQualifiedName(@NotNull String classQualifiedName); + public abstract boolean shouldUseFullyQualifiedName(@Nullable PsiFile targetFile, @NotNull String classQualifiedName); - public static boolean shouldImport(@NotNull String classQualifiedName) { + public static boolean shouldImport(@Nullable PsiFile targetFile, @NotNull String classQualifiedName) { for (ImportFilter filter : EP_NAME.getExtensions()) { - if (filter.shouldUseFullyQualifiedName(classQualifiedName)) { + if (filter.shouldUseFullyQualifiedName(targetFile, classQualifiedName)) { return false; } } From c8dda3a8eeb97e73386d934a6b5dd8db970f0a7f Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Mon, 3 Feb 2014 15:38:52 +0400 Subject: [PATCH 22/44] Remove previous generic version of Gitlab connector --- .../tasks/generic/GenericRepositoryType.java | 9 +- .../tasks/generic/connectors/gitlab.xml | 75 ---------- .../integration/GitlabIntegrationTest.java | 129 ------------------ 3 files changed, 1 insertion(+), 212 deletions(-) delete mode 100644 plugins/tasks/tasks-core/src/com/intellij/tasks/generic/connectors/gitlab.xml delete mode 100644 plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/GitlabIntegrationTest.java diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/GenericRepositoryType.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/GenericRepositoryType.java index 3d10a1c811ee..b4e2a0e9262b 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/GenericRepositoryType.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/GenericRepositoryType.java @@ -61,8 +61,7 @@ public class GenericRepositoryType extends BaseRepositoryType this, new AsanaRepository(), new AssemblaRepository(), - new SprintlyRepository(), - new GitlabRepository() + new SprintlyRepository() ); } @@ -127,10 +126,4 @@ public class GenericRepositoryType extends BaseRepositoryType super("Sprintly", TasksIcons.Sprintly); } } - - public final class GitlabRepository extends GenericSubtype { - public GitlabRepository() { - super("Gitlab", TasksIcons.Gitlab); - } - } } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/connectors/gitlab.xml b/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/connectors/gitlab.xml deleted file mode 100644 index b3ffd3c21111..000000000000 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/generic/connectors/gitlab.xml +++ /dev/null @@ -1,75 +0,0 @@ - - {id} {summary} - diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/GitlabIntegrationTest.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/GitlabIntegrationTest.java deleted file mode 100644 index 7c4e2d934206..000000000000 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/GitlabIntegrationTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.intellij.tasks.integration; - -import com.intellij.tasks.Task; -import com.intellij.tasks.TaskTestUtil; -import com.intellij.tasks.generic.GenericRepository; -import com.intellij.tasks.generic.GenericRepositoryType; -import org.jetbrains.annotations.NotNull; - -/** - * @author Mikhail Golubev - */ -public class GitlabIntegrationTest extends GenericSubtypeTestCase { - private static final String TASK_LIST_RESPONSE = "[\n" + - " {\n" + - " \"id\": 2,\n" + - " \"iid\": 2,\n" + - " \"project_id\": 1,\n" + - " \"title\": \"Drink more tea\",\n" + - " \"description\": \"It\\u0027s healthy.\",\n" + - " \"labels\": [],\n" + - " \"assignee\": {\n" + - " \"id\": 4,\n" + - " \"username\": \"deva\",\n" + - " \"email\": \"deva@somemail.com\",\n" + - " \"name\": \"John Smith\",\n" + - " \"state\": \"active\",\n" + - " \"created_at\": \"2013-11-14T12:34:37Z\"\n" + - " },\n" + - " \"author\": {\n" + - " \"id\": 1,\n" + - " \"username\": \"root\",\n" + - " \"email\": \"admin@local.host\",\n" + - " \"name\": \"Administrator\",\n" + - " \"state\": \"active\",\n" + - " \"created_at\": \"2013-11-14T12:19:43Z\"\n" + - " },\n" + - " \"state\": \"opened\",\n" + - " \"updated_at\": \"2013-11-14T12:38:51Z\",\n" + - " \"created_at\": \"2013-11-14T12:33:07Z\"\n" + - " },\n" + - " {\n" + - " \"id\": 1,\n" + - " \"iid\": 1,\n" + - " \"project_id\": 1,\n" + - " \"title\": \"Eat more bananas\",\n" + - " \"description\": \"They're tasty.\",\n" + - " \"labels\": [\n" + - " \"spam\"\n" + - " ],\n" + - " \"assignee\": {\n" + - " \"id\": 1,\n" + - " \"username\": \"root\",\n" + - " \"email\": \"admin@local.host\",\n" + - " \"name\": \"Administrator\",\n" + - " \"state\": \"active\",\n" + - " \"created_at\": \"2013-11-14T12:19:43Z\"\n" + - " },\n" + - " \"author\": {\n" + - " \"id\": 1,\n" + - " \"username\": \"root\",\n" + - " \"email\": \"admin@local.host\",\n" + - " \"name\": \"Administrator\",\n" + - " \"state\": \"active\",\n" + - " \"created_at\": \"2013-11-14T12:19:43Z\"\n" + - " },\n" + - " \"state\": \"opened\",\n" + - " \"updated_at\": \"2013-11-14T12:30:39Z\",\n" + - " \"created_at\": \"2013-11-14T12:30:39Z\"\n" + - " }\n" + - "] "; - - private static final String SINGLE_TASK_RESPONSE = "{\n" + - " \"id\": 2,\n" + - " \"iid\": 2,\n" + - " \"project_id\": 1,\n" + - " \"title\": \"Drink more tea\",\n" + - " \"description\": \"It\\u0027s healthy.\",\n" + - " \"labels\": [],\n" + - " \"assignee\": {\n" + - " \"id\": 4,\n" + - " \"username\": \"deva\",\n" + - " \"email\": \"deva@somemail.com\",\n" + - " \"name\": \"John Smith\",\n" + - " \"state\": \"active\",\n" + - " \"created_at\": \"2013-11-14T12:34:37Z\"\n" + - " },\n" + - " \"author\": {\n" + - " \"id\": 1,\n" + - " \"username\": \"root\",\n" + - " \"email\": \"admin@local.host\",\n" + - " \"name\": \"Administrator\",\n" + - " \"state\": \"active\",\n" + - " \"created_at\": \"2013-11-14T12:19:43Z\"\n" + - " },\n" + - " \"state\": \"opened\",\n" + - " \"updated_at\": \"2013-11-14T12:38:51Z\",\n" + - " \"created_at\": \"2013-11-14T12:33:07Z\"\n" + - "}"; - - private Task getTask1() { - return new TaskTestUtil.TaskBuilder("1", "Eat more bananas", myRepository) - .withDescription("They're tasty.") - .withUpdated("2013-11-14T12:30:39Z") - .withCreated("2013-11-14T12:30:39Z"); - } - - private Task getTask2() { - return new TaskTestUtil.TaskBuilder("2", "Drink more tea", myRepository) - .withDescription("It's healthy.") - .withUpdated("2013-11-14T12:38:51Z") - .withCreated("2013-11-14T12:33:07Z"); - } - - @NotNull - @Override - protected GenericRepository createRepository(GenericRepositoryType genericType) { - return (GenericRepository)genericType.new GitlabRepository().createRepository(); - } - - public void testParsingTaskList() throws Exception { - Task[] tasks = myRepository.getActiveResponseHandler().parseIssues(TASK_LIST_RESPONSE, 50); - TaskTestUtil.assertTasksEqual(new Task[]{getTask2(), getTask1()}, tasks); - } - - public void testParsingSingleTask() throws Exception { - Task task = myRepository.getActiveResponseHandler().parseIssue(SINGLE_TASK_RESPONSE); - TaskTestUtil.assertTasksEqual(getTask2(), task); - } -} From c49c45f0cb8c81513a3d12cd7a864f440d9f23da Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 3 Feb 2014 12:38:17 +0100 Subject: [PATCH 23/44] move agreement dialog to platform-api --- .../openapi/ui/dialogs/AgreementDialog.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 platform/platform-api/src/com/intellij/openapi/ui/dialogs/AgreementDialog.java diff --git a/platform/platform-api/src/com/intellij/openapi/ui/dialogs/AgreementDialog.java b/platform/platform-api/src/com/intellij/openapi/ui/dialogs/AgreementDialog.java new file mode 100644 index 000000000000..9addc1cf15ef --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/ui/dialogs/AgreementDialog.java @@ -0,0 +1,104 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.ui.dialogs; + +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.ui.ScrollPaneFactory; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.MessageFormat; +import java.util.ResourceBundle; + +public class AgreementDialog extends DialogWrapper { + private final Font myFont = new Font("SansSerif", Font.PLAIN, 12); + private final ResourceBundle myBundle = ResourceBundle.getBundle("messages.LicenseCommonBundle"); + + private final String myText; + private JCheckBox myAcceptCheckBox; + private boolean myOK = false; + + public AgreementDialog(String text, String programName) { + super(null, false, true); + getPeer().setAppIcons(); + + myText = text; + String title; + if (programName != null) { + title = MessageFormat.format(myBundle.getString("license.agreement.title.for"), programName); + } + else { + title = myBundle.getString("license.agreement.title"); + } + + setTitle(title); + + init(); + + getOKAction().setEnabled(false); + } + + protected void doOKAction() { + myOK = true; + super.doOKAction(); + } + + protected JComponent createNorthPanel() { + JPanel panel = new JPanel(new BorderLayout()); + String text = myBundle.getString("license.agreement.prompt"); + JLabel licensePrompt = new JLabel(text); + licensePrompt.setFocusable(false); + licensePrompt.setFont(myFont); + licensePrompt.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 5)); + panel.add(licensePrompt, BorderLayout.WEST); + panel.add(new JPanel(), BorderLayout.CENTER); + return panel; + } + + public boolean isAgreed() { + return myOK && myAcceptCheckBox.isSelected(); + } + + protected JComponent createCenterPanel() { + JPanel optionsPanel = new JPanel(new BorderLayout()); + JTextArea licenseTextArea = new JTextArea(myText, 20, 50); + licenseTextArea.getCaret().setDot(0); + licenseTextArea.setFont(myFont); + licenseTextArea.setLineWrap(true); + licenseTextArea.setWrapStyleWord(true); + licenseTextArea.setEditable(false); + JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(licenseTextArea); + + optionsPanel.add(scrollPane, BorderLayout.CENTER); + JPanel agreePanel = new JPanel(new GridLayout(1, 1)); + agreePanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 5)); + myAcceptCheckBox = new JCheckBox(myBundle.getString("license.agreement.accept.checkbox")); + myAcceptCheckBox.setMnemonic(myAcceptCheckBox.getText().charAt(0)); + myAcceptCheckBox.setFont(myFont); + + agreePanel.add(myAcceptCheckBox); + optionsPanel.add(agreePanel, BorderLayout.SOUTH); + + myAcceptCheckBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + getOKAction().setEnabled(myAcceptCheckBox.isSelected()); + } + }); + return optionsPanel; + } +} From e66493f94836a404cf1dc489458e7badaf92eebf Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 31 Jan 2014 20:24:57 +0400 Subject: [PATCH 24/44] javadoc added --- .../src/com/intellij/openapi/util/WriteExternalException.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/util/src/com/intellij/openapi/util/WriteExternalException.java b/platform/util/src/com/intellij/openapi/util/WriteExternalException.java index 3d61f6e3ac7d..76714142f974 100644 --- a/platform/util/src/com/intellij/openapi/util/WriteExternalException.java +++ b/platform/util/src/com/intellij/openapi/util/WriteExternalException.java @@ -15,6 +15,10 @@ */ package com.intellij.openapi.util; +/** + * Throw this exception from {@link JDOMExternalizable#writeExternal(org.jdom.Element)} method if you don't want to store any settings. + * If you simply return from the method empty '' tag will be written leading to unneeded modification of configuration files. + */ public class WriteExternalException extends Exception { public WriteExternalException() { super(); From 3ef4f28f4e7ed8942d8b8092877f0e82c0ec1104 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Mon, 3 Feb 2014 16:09:07 +0400 Subject: [PATCH 25/44] cleanup: http://crucible.labs.intellij.net/cru/CR-IC-4132#c21654 --- platform/util/src/com/intellij/util/ui/UIUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index 1b3ad87b4a6d..b939c924968d 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -356,9 +356,9 @@ public class UIUtil { public static void setEnabled(Component component, boolean enabled, boolean recursively) { component.setEnabled(enabled); - if (component instanceof JComboBox) { + if (component instanceof JComboBox && isUnderAquaLookAndFeel()) { // On Mac JComboBox instances have children: com.apple.laf.AquaComboBoxButton and javax.swing.CellRendererPane. - // Disabling these children results in ugly UI. See WEB-10733 + // Disabling these children results in ugly UI: WEB-10733 return; } if (component instanceof JLabel) { From 7548b579bdc7362144f388be3e589be62337f949 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 3 Feb 2014 14:53:38 +0400 Subject: [PATCH 26/44] EA-53622 - IAE: ContextComputationProcessor.getTopLevelInjectionTarget --- .../inject/java/JavaLanguageInjectionSupport.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java index 14c7535f8044..c597fc840521 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java @@ -178,7 +178,7 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo } private static boolean doInjectInJava(final Project project, - final PsiElement psiElement, + @NotNull final PsiElement psiElement, PsiLanguageInjectionHost host, final String languageId) { final PsiElement target = ContextComputationProcessor.getTopLevelInjectionTarget(psiElement); @@ -245,7 +245,7 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo return false; } new WriteCommandAction(modifierListOwner.getProject(), modifierListOwner.getContainingFile()) { - protected void run(final Result result) throws Throwable { + protected void run(@NotNull final Result result) throws Throwable { JVMElementFactory factory = JVMElementFactories.getFactory(modifierListOwner.getLanguage(), modifierListOwner.getProject()); if (factory == null) { factory = JavaPsiFacade.getElementFactory(modifierListOwner.getProject()); @@ -484,7 +484,7 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo } } } - else { +// else { // todo tbd //for (InjectionPlace place : injection.getInjectionPlaces()) { // final Matcher matcher = pattern.matcher(place.getText()); @@ -492,7 +492,7 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo // // } //} - } +// } result.setMethodInfos(infos); result.generatePlaces(); return result; From 193105e62f44b96dcaab0495875f109c6adbba68 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 3 Feb 2014 16:29:37 +0400 Subject: [PATCH 27/44] IDEA-120145 New Project wizard: when for Java Enterprise or Spring type 'create by template' option is selected the chosen technologies are ignored, jars are downloaded to wrong place --- .../intellij/ide/projectWizard/ProjectTypeStep.java | 11 ++++++----- .../ide/util/projectWizard/AbstractModuleBuilder.java | 5 +++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java index 1e2cc6c22c4e..c84a6aa54edf 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java @@ -112,7 +112,6 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { private final MultiMap myTemplatesMap; private boolean myRemoteTemplatesLoaded; private Cards myCurrentCard; - private boolean myNeedDownload; public ProjectTypeStep(WizardContext context, NewProjectWizard wizard, ModulesProvider modulesProvider) { myContext = context; @@ -163,7 +162,7 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { myConfigurationUpdater = new ModuleBuilder.ModuleConfigurationUpdater() { @Override public void update(@NotNull Module module, @NotNull ModifiableRootModel rootModel) { - if (myCurrentCard == Cards.FRAMEWORKS) { + if (isFrameworksMode()) { myFrameworksPanel.addSupport(module, rootModel); } } @@ -210,6 +209,10 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { myTemplatesList.restoreSelection(); } + private boolean isFrameworksMode() { + return myCurrentCard == Cards.FRAMEWORKS && getSelectedBuilder().equals(myContext.getProjectBuilder()); + } + private List fillTemplatesMap(WizardContext context) { List builders = ModuleBuilder.getAllBuilders(); @@ -306,7 +309,6 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { // new TemplatesGroup selected public void projectTypeChanged() { - myNeedDownload = false; TemplatesGroup group = getSelectedGroup(); if (group == null) return; PropertiesComponent.getInstance().setValue(PROJECT_WIZARD_GROUP, group.getId() ); @@ -332,7 +334,6 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { myFrameworksPanel.setProviders(providers); } getSelectedBuilder().addModuleConfigurationUpdater(myConfigurationUpdater); - myNeedDownload = true; showCard(FRAMEWORKS_CARD); } @@ -412,7 +413,7 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { } public void onWizardFinished() throws CommitStepException { - if (myNeedDownload) { + if (isFrameworksMode()) { boolean ok = myFrameworksPanel.downloadLibraries(); if (!ok) { int answer = Messages.showYesNoDialog(getComponent(), diff --git a/platform/lang-api/src/com/intellij/ide/util/projectWizard/AbstractModuleBuilder.java b/platform/lang-api/src/com/intellij/ide/util/projectWizard/AbstractModuleBuilder.java index 020ff5658a98..485514fd9e58 100644 --- a/platform/lang-api/src/com/intellij/ide/util/projectWizard/AbstractModuleBuilder.java +++ b/platform/lang-api/src/com/intellij/ide/util/projectWizard/AbstractModuleBuilder.java @@ -53,4 +53,9 @@ public abstract class AbstractModuleBuilder extends ProjectBuilder { public abstract void setModuleFilePath(@NonNls String path); public abstract void setContentEntryPath(String moduleRootPath); + + @Override + public boolean equals(Object obj) { + return obj instanceof AbstractModuleBuilder && getBuilderId() != null && getBuilderId().equals(((AbstractModuleBuilder)obj).getBuilderId()); + } } From 1384b9c7c52da0320f74ea8bfc2b1ac9e76b3bb4 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 3 Feb 2014 11:53:20 +0400 Subject: [PATCH 28/44] diff: Add separator after 'IgnoreWhitespaces' action on toolbar --- .../src/com/intellij/openapi/diff/impl/DiffPanelImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java index 9978b78f8533..8d777953e580 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java @@ -110,6 +110,7 @@ public class DiffPanelImpl implements DiffPanelEx, ContentChangeListener, TwoSid public void customize(DiffToolbar toolbar) { ActionManager actionManager = ActionManager.getInstance(); toolbar.addAction(actionManager.getAction("DiffPanel.Toolbar")); + toolbar.addSeparator(); toolbar.addAction(actionManager.getAction("ContextHelp")); toolbar.addAction(getEditSourceAction()); toolbar.addSeparator(); From ec1afef0d904a31cf6df1a7b1183fa4624124382 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 3 Feb 2014 14:34:50 +0400 Subject: [PATCH 29/44] diff: add DumbAware to the inner action too Otherwise there will be empty dropdown list during indexing --- .../intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java index 78c5ba756923..6a68ad75d5d8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java @@ -82,7 +82,7 @@ public class IgnoreWhiteSpacesAction extends ComboBoxAction implements DumbAware } } - private static class IgnoringPolicyAction extends AnAction { + private static class IgnoringPolicyAction extends AnAction implements DumbAware { private final ComparisonPolicy myPolicy; public IgnoringPolicyAction(String text, ComparisonPolicy policy) { From d30c09e75e7dc4e6c11a553a7504e03e291e4510 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 3 Feb 2014 15:05:19 +0400 Subject: [PATCH 30/44] IDEA-56098 diff: add ability to disable autoscroll --- .../diff/actions/ToggleAutoScrollAction.java | 50 +++++++++++++++++++ .../intellij/openapi/diff/ex/DiffPanelEx.java | 4 ++ .../openapi/diff/impl/DiffPanelImpl.java | 11 ++++ .../diff/impl/util/SyncScrollSupport.java | 11 +++- 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/diff/actions/ToggleAutoScrollAction.java diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/ToggleAutoScrollAction.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/ToggleAutoScrollAction.java new file mode 100644 index 000000000000..04ec31e10ff6 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/ToggleAutoScrollAction.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.diff.actions; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.diff.ex.DiffPanelEx; +import com.intellij.openapi.diff.impl.DiffPanelImpl; +import com.intellij.openapi.project.DumbAware; +import com.intellij.ui.ToggleActionButton; + +import javax.swing.*; + +public class ToggleAutoScrollAction extends ToggleActionButton implements DumbAware { + public ToggleAutoScrollAction() { + super("Auto Scroll", AllIcons.General.AutoscrollToSource); + } + + @Override + public boolean isSelected(AnActionEvent e) { + DiffPanelEx diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext()); + if (diffPanel != null) { + return diffPanel.isAutoScrollEnabled(); + } + else { + return true; + } + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + final DiffPanelImpl diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext()); + if (diffPanel != null) { + diffPanel.setAutoScrollEnabled(state); + } + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java b/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java index e0df0bb7dc2b..c3bf682ab9f7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java @@ -41,4 +41,8 @@ public interface DiffPanelEx extends DiffPanel, Disposable { void setComparisonPolicy(ComparisonPolicy comparisonPolicy); ComparisonPolicy getComparisonPolicy(); + + void setAutoScrollEnabled(boolean enabled); + + boolean isAutoScrollEnabled(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java index 8d777953e580..37b9438522b2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java @@ -26,6 +26,7 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diff.*; import com.intellij.openapi.diff.actions.MergeActionGroup; +import com.intellij.openapi.diff.actions.ToggleAutoScrollAction; import com.intellij.openapi.diff.ex.DiffPanelEx; import com.intellij.openapi.diff.ex.DiffPanelOptions; import com.intellij.openapi.diff.impl.external.DiffManagerImpl; @@ -111,6 +112,8 @@ public class DiffPanelImpl implements DiffPanelEx, ContentChangeListener, TwoSid ActionManager actionManager = ActionManager.getInstance(); toolbar.addAction(actionManager.getAction("DiffPanel.Toolbar")); toolbar.addSeparator(); + toolbar.addAction(new ToggleAutoScrollAction()); + toolbar.addSeparator(); toolbar.addAction(actionManager.getAction("ContextHelp")); toolbar.addAction(getEditSourceAction()); toolbar.addSeparator(); @@ -468,6 +471,14 @@ public class DiffPanelImpl implements DiffPanelEx, ContentChangeListener, TwoSid } } + public void setAutoScrollEnabled(boolean enabled) { + myScrollSupport.setEnabled(enabled); + } + + public boolean isAutoScrollEnabled() { + return myScrollSupport.isEnabled(); + } + public void setComparisonPolicy(ComparisonPolicy comparisonPolicy) { setComparisonPolicy(comparisonPolicy, true); } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java index ab45e1ec2ede..47ba0e817ced 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java @@ -36,6 +36,7 @@ public class SyncScrollSupport implements Disposable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.util.SyncScrollSupport"); private boolean myDuringVerticalScroll = false; private final ArrayList myScrollers = new ArrayList(); + private boolean myEnabled = true; public void install(EditingSides[] sideContainers) { Disposer.dispose(this); @@ -58,6 +59,14 @@ public class SyncScrollSupport implements Disposable { myScrollers.clear(); } + public void setEnabled(boolean enabled) { + myEnabled = enabled; + } + + public boolean isEnabled() { + return myEnabled; + } + private void install2(Editor[] editors, EditingSides[] sideContainers) { addSlavesScroller(editors[0], new Pair(FragmentSide.SIDE1, sideContainers[0])); addSlavesScroller(editors[1], new Pair(FragmentSide.SIDE2, sideContainers[0])); @@ -100,7 +109,7 @@ public class SyncScrollSupport implements Disposable { } public void visibleAreaChanged(VisibleAreaEvent e) { - if (myDuringVerticalScroll) return; + if (!myEnabled || myDuringVerticalScroll) return; Rectangle newRectangle = e.getNewRectangle(); Rectangle oldRectangle = e.getOldRectangle(); if (newRectangle == null || oldRectangle == null) return; From a1ce98ffb558fcc743fbf374e31de03a28b5cb73 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 3 Feb 2014 14:31:12 +0400 Subject: [PATCH 31/44] diff: Add option to reduce diff granularity and to turn diff highlighting off. --- .../diff/actions/HighlightModeAction.java | 103 ++++++++++++++++++ .../intellij/openapi/diff/ex/DiffPanelEx.java | 5 + .../openapi/diff/impl/DiffPanelImpl.java | 10 ++ .../highlighting/SimpleDiffPanelState.java | 18 ++- .../impl/processing/TextCompareProcessor.java | 32 ++++-- .../src/messages/CommonBundle.properties | 3 +- .../src/messages/DiffBundle.properties | 4 + .../src/idea/PlatformActions.xml | 2 + .../diff/impl/processing/HighlightMode.java | 20 ++++ 9 files changed, 184 insertions(+), 13 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java create mode 100644 platform/util/src/com/intellij/openapi/diff/impl/processing/HighlightMode.java diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java new file mode 100644 index 000000000000..06e25a95fe57 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java @@ -0,0 +1,103 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.diff.actions; + +import com.intellij.CommonBundle; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.actionSystem.ex.ComboBoxAction; +import com.intellij.openapi.diff.DiffBundle; +import com.intellij.openapi.diff.ex.DiffPanelEx; +import com.intellij.openapi.diff.impl.DiffPanelImpl; +import com.intellij.openapi.diff.impl.processing.HighlightMode; +import com.intellij.openapi.project.DumbAware; +import com.intellij.util.containers.HashMap; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +public class HighlightModeAction extends ComboBoxAction implements DumbAware { + private final Map myActions = new HashMap(); + private static final HighlightMode[] ourActionOrder = + new HighlightMode[]{HighlightMode.BY_WORD, HighlightMode.BY_LINE, HighlightMode.NO_HIGHLIGHTING}; + + public HighlightModeAction() { + myActions.put(HighlightMode.BY_WORD, + new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.word"), HighlightMode.BY_WORD)); + myActions.put(HighlightMode.BY_LINE, + new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.line"), HighlightMode.BY_LINE)); + myActions.put(HighlightMode.NO_HIGHLIGHTING, + new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.no.highlighting"), + HighlightMode.NO_HIGHLIGHTING)); + } + + @Override + public JComponent createCustomComponent(final Presentation presentation) { + JPanel panel = new JPanel(new BorderLayout()); + final JLabel label = new JLabel(CommonBundle.message("diff.acton.highlight.mode.action.name")); + label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); + panel.add(label, BorderLayout.WEST); + panel.add(super.createCustomComponent(presentation), BorderLayout.CENTER); + return panel; + } + + @NotNull + protected DefaultActionGroup createPopupActionGroup(JComponent button) { + DefaultActionGroup actionGroup = new DefaultActionGroup(); + for (HighlightMode comparisonPolicy : ourActionOrder) { + actionGroup.add(myActions.get(comparisonPolicy)); + } + return actionGroup; + } + + public void update(AnActionEvent e) { + super.update(e); + Presentation presentation = e.getPresentation(); + DiffPanelEx diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext()); + if (diffPanel != null && diffPanel.getComponent().isDisplayable()) { + AnAction action = myActions.get(diffPanel.getHighlightMode()); + Presentation templatePresentation = action.getTemplatePresentation(); + presentation.setIcon(templatePresentation.getIcon()); + presentation.setText(templatePresentation.getText()); + presentation.setEnabled(true); + } + else { + presentation.setIcon(null); + presentation.setText(DiffBundle.message("diff.acton.highlight.mode.not.available.action.name")); + presentation.setEnabled(false); + } + } + + private static class SetHighlightModeAction extends AnAction implements DumbAware { + private final HighlightMode myHighlightMode; + + public SetHighlightModeAction(String text, HighlightMode mode) { + super(text); + myHighlightMode = mode; + } + + public void actionPerformed(AnActionEvent e) { + final DiffPanelImpl diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext()); + if (diffPanel != null) { + diffPanel.setHighlightMode(myHighlightMode); + } + } + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java b/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java index c3bf682ab9f7..933d017be2ef 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/ex/DiffPanelEx.java @@ -27,6 +27,7 @@ package com.intellij.openapi.diff.ex; import com.intellij.openapi.Disposable; import com.intellij.openapi.diff.DiffPanel; import com.intellij.openapi.diff.impl.ComparisonPolicy; +import com.intellij.openapi.diff.impl.processing.HighlightMode; import com.intellij.openapi.editor.Editor; import org.jetbrains.annotations.Nullable; @@ -45,4 +46,8 @@ public interface DiffPanelEx extends DiffPanel, Disposable { void setAutoScrollEnabled(boolean enabled); boolean isAutoScrollEnabled(); + + void setHighlightMode(HighlightMode highlightMode); + + HighlightMode getHighlightMode(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java index 37b9438522b2..913d5e7cc8f9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java @@ -34,6 +34,7 @@ import com.intellij.openapi.diff.impl.fragments.Fragment; import com.intellij.openapi.diff.impl.fragments.FragmentList; import com.intellij.openapi.diff.impl.highlighting.DiffPanelState; import com.intellij.openapi.diff.impl.highlighting.FragmentSide; +import com.intellij.openapi.diff.impl.processing.HighlightMode; import com.intellij.openapi.diff.impl.processing.HorizontalDiffSplitter; import com.intellij.openapi.diff.impl.settings.DiffMergeEditorSetting; import com.intellij.openapi.diff.impl.settings.DiffMergeSettings; @@ -483,6 +484,15 @@ public class DiffPanelImpl implements DiffPanelEx, ContentChangeListener, TwoSid setComparisonPolicy(comparisonPolicy, true); } + public void setHighlightMode(HighlightMode highlightMode) { + myData.setHighlightMode(highlightMode); + rediff(); + } + + public HighlightMode getHighlightMode() { + return myData.getHighlightMode(); + } + public Rediffers getDiffUpdater() { return myDiffUpdater; } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/SimpleDiffPanelState.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/SimpleDiffPanelState.java index 5446f66e50c6..d90005d70678 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/SimpleDiffPanelState.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/SimpleDiffPanelState.java @@ -24,6 +24,7 @@ import com.intellij.openapi.diff.impl.fragments.FragmentList; import com.intellij.openapi.diff.impl.fragments.FragmentListImpl; import com.intellij.openapi.diff.impl.fragments.LineFragment; import com.intellij.openapi.diff.impl.processing.DiffPolicy; +import com.intellij.openapi.diff.impl.processing.HighlightMode; import com.intellij.openapi.diff.impl.processing.TextCompareProcessor; import com.intellij.openapi.diff.impl.splitter.LineBlocks; import com.intellij.openapi.project.Project; @@ -37,6 +38,7 @@ import java.util.Iterator; public abstract class SimpleDiffPanelState implements Disposable { protected ComparisonPolicy myComparisonPolicy = ComparisonPolicy.DEFAULT; protected DiffPolicy myDiffPolicy; + protected HighlightMode myHighlightMode; protected final EditorPlaceHolder myAppender1; protected final EditorPlaceHolder myAppender2; protected FragmentList myFragmentList = FragmentList.EMPTY; @@ -47,6 +49,7 @@ public abstract class SimpleDiffPanelState implements Disposable { myAppender2 = createEditorWrapper(project, changeListener, FragmentSide.SIDE2); myProject = project; myDiffPolicy = DiffPolicy.LINES_WO_FORMATTING; + myHighlightMode = HighlightMode.BY_WORD; Disposer.register(parentDisposable, this); } @@ -72,6 +75,14 @@ public abstract class SimpleDiffPanelState implements Disposable { return myComparisonPolicy; } + public HighlightMode getHighlightMode() { + return myHighlightMode; + } + + public void setHighlightMode(HighlightMode highlightMode) { + myHighlightMode = highlightMode; + } + public void dispose() { } @@ -105,7 +116,12 @@ public abstract class SimpleDiffPanelState implements Disposable { return LineBlocks.EMPTY; } - return addMarkup(new TextCompareProcessor(myComparisonPolicy, myDiffPolicy).process(myAppender1.getText(), myAppender2.getText())); + if (myHighlightMode == HighlightMode.NO_HIGHLIGHTING) { + return LineBlocks.fromLineFragments(new ArrayList()); + } + + return addMarkup(new TextCompareProcessor(myComparisonPolicy, myDiffPolicy, myHighlightMode == HighlightMode.BY_WORD) + .process(myAppender1.getText(), myAppender2.getText())); } public Project getProject() { return myProject; } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java index 1555656c3865..01534b487ff5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java @@ -32,28 +32,38 @@ public class TextCompareProcessor { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.processing.Processor"); private final DiffPolicy myDiffPolicy; @NotNull private final ComparisonPolicy myComparisonPolicy; + private final boolean mySearchForSubFragments; - public TextCompareProcessor(@NotNull ComparisonPolicy comparisonPolicy, final DiffPolicy diffPolicy) { + public TextCompareProcessor(@NotNull ComparisonPolicy comparisonPolicy, + final DiffPolicy diffPolicy, + boolean searchForSubFragments) { myComparisonPolicy = comparisonPolicy; myDiffPolicy = diffPolicy; + mySearchForSubFragments = searchForSubFragments; } - public TextCompareProcessor(ComparisonPolicy comparisonPolicy) { + public TextCompareProcessor(@NotNull ComparisonPolicy comparisonPolicy, final DiffPolicy diffPolicy) { + this(comparisonPolicy, diffPolicy, true); + } + + public TextCompareProcessor(@NotNull ComparisonPolicy comparisonPolicy) { this(comparisonPolicy, DiffPolicy.LINES_WO_FORMATTING); } public ArrayList process(String text1, String text2) throws FilesTooBigForDiffException { DiffFragment[] woFormattingBlocks = myDiffPolicy.buildFragments(text1, text2); - DiffFragment[] step1lineFragments = new DiffCorrection.TrueLineBlocks(myComparisonPolicy). - correctAndNormalize(woFormattingBlocks); + DiffFragment[] step1lineFragments = new DiffCorrection.TrueLineBlocks(myComparisonPolicy).correctAndNormalize(woFormattingBlocks); ArrayList lineBlocks = new DiffFragmentsProcessor().process(step1lineFragments); - for (LineFragment lineBlock : lineBlocks) { - if (lineBlock.isOneSide() || lineBlock.isEqual()) continue; - String subText1 = lineBlock.getText(text1, FragmentSide.SIDE1); - String subText2 = lineBlock.getText(text2, FragmentSide.SIDE2); - ArrayList subFragments = findSubFragments(subText1, subText2); - lineBlock.setChildren(new ArrayList(subFragments)); - lineBlock.adjustTypeFromChildrenTypes(); + + if (mySearchForSubFragments) { + for (LineFragment lineBlock : lineBlocks) { + if (lineBlock.isOneSide() || lineBlock.isEqual()) continue; + String subText1 = lineBlock.getText(text1, FragmentSide.SIDE1); + String subText2 = lineBlock.getText(text2, FragmentSide.SIDE2); + ArrayList subFragments = findSubFragments(subText1, subText2); + lineBlock.setChildren(new ArrayList(subFragments)); + lineBlock.adjustTypeFromChildrenTypes(); + } } return lineBlocks; } diff --git a/platform/platform-resources-en/src/messages/CommonBundle.properties b/platform/platform-resources-en/src/messages/CommonBundle.properties index a07d1631bad5..e027bc32a12d 100644 --- a/platform/platform-resources-en/src/messages/CommonBundle.properties +++ b/platform/platform-resources-en/src/messages/CommonBundle.properties @@ -175,4 +175,5 @@ This may lead to incorrect behaviour. Proxy should be set in Settings | HTTP Pro This JVM property is old and its usage is not recommended by Oracle.\n\ \n(Note: It could have been assigned by some code dynamically.) label.proxy.exceptions.text=Example\: *.domain.com, 192.168.* -checkbox.automatic.proxy.configuration.url=Automatic proxy configuration URL\: \ No newline at end of file +checkbox.automatic.proxy.configuration.url=Automatic proxy configuration URL\: +diff.acton.highlight.mode.action.name=Highlighting Mode \ No newline at end of file diff --git a/platform/platform-resources-en/src/messages/DiffBundle.properties b/platform/platform-resources-en/src/messages/DiffBundle.properties index cb6a0d72819b..b0515df7f6f2 100644 --- a/platform/platform-resources-en/src/messages/DiffBundle.properties +++ b/platform/platform-resources-en/src/messages/DiffBundle.properties @@ -83,3 +83,7 @@ diff.content.selected.value=Selected Value diff.clipboard.vs.value.dialog.title=Clipboard vs Selected Value diff.can.not.show.unknown=Can not show diff for unknown file type +diff.acton.highlight.mode.action.by.word=By Word +diff.acton.highlight.mode.action.by.line=By Line +diff.acton.highlight.mode.action.no.highlighting=No Highlighting +diff.acton.highlight.mode.not.available.action.name= diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index c2e5c4aafaac..ab70a8603df4 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -550,6 +550,8 @@ + + diff --git a/platform/util/src/com/intellij/openapi/diff/impl/processing/HighlightMode.java b/platform/util/src/com/intellij/openapi/diff/impl/processing/HighlightMode.java new file mode 100644 index 000000000000..441aca3517eb --- /dev/null +++ b/platform/util/src/com/intellij/openapi/diff/impl/processing/HighlightMode.java @@ -0,0 +1,20 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.diff.impl.processing; + +public enum HighlightMode { + BY_WORD, BY_LINE, NO_HIGHLIGHTING +} From bb497d31bd1095e63f179ee6f904de371f7ff948 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 3 Feb 2014 16:36:18 +0400 Subject: [PATCH 32/44] added test for 'null' values in @Attribute --- .../util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java b/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java index b7ba2b988e97..b3bfabe91664 100644 --- a/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java +++ b/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java @@ -809,6 +809,8 @@ public class XmlSerializerTest extends TestCase { public int COUNT = 3; @Attribute("name") public String name = "James"; + @Attribute("occupation") + public String occupation; } public void testBeanWithPrimitivePropertyBoundToAttribute() { final BeanWithPropertiesBoundToAttribute bean = new BeanWithPropertiesBoundToAttribute(); From 8a8aeaa452d9f7a11c394f13107cef814ba32be4 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 3 Feb 2014 16:37:43 +0400 Subject: [PATCH 33/44] cleanup --- .../testSrc/com/intellij/util/xmlb/XmlSerializerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java b/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java index b3bfabe91664..d70588834481 100644 --- a/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java +++ b/platform/util/testSrc/com/intellij/util/xmlb/XmlSerializerTest.java @@ -853,7 +853,7 @@ public class XmlSerializerTest extends TestCase { bean.STRING_V = "skip"; - assertSerializer(bean, "", "Serialization failure", null); + assertSerializer(bean, "", null); } public static class BeanWithJDOMElement { @@ -1147,13 +1147,13 @@ public class XmlSerializerTest extends TestCase { } //--------------------------------------------------------------------------------------------------- - private static void assertSerializer(Object bean, String expected, SerializationFilter filter) { - assertSerializer(bean, expected, "Serialization failure", filter); + private static Element assertSerializer(Object bean, String expected, SerializationFilter filter) { + return assertSerializer(bean, expected, "Serialization failure", filter); } private static Object doSerializerTest(String expectedText, Object bean) { try { - Element element = assertSerializer(bean, expectedText, "Serialization failure", null); + Element element = assertSerializer(bean, expectedText, null); //test deserializer From f4433d40c3fe130890b83c5a210dc47ca5195225 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Mon, 3 Feb 2014 16:36:11 +0400 Subject: [PATCH 34/44] Check that item is in list model before addition/removal by event --- .../util/net/ssl/CertificateConfigurable.java | 20 ++++++++++++------- .../util/net/ssl/CertificateUtil.java | 7 +++++++ .../util/net/ssl/ConfirmingTrustManager.java | 6 +++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java index f28b103a5cd8..8c706bc59283 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java @@ -27,7 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import static com.intellij.util.net.ssl.CertificateWrapper.CommonField.COMMON_NAME; +import static com.intellij.util.net.ssl.CertificateUtil.getCommonName; import static com.intellij.util.net.ssl.ConfirmingTrustManager.MutableTrustManager; /** @@ -63,7 +63,7 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur if (!new CertificateWrapper(certificate).isValid()) { setForeground(UIUtil.getLabelDisabledForeground()); } - setText(new CertificateWrapper(certificate).getSubjectField(COMMON_NAME)); + setText(getCommonName(certificate)); } }); @@ -136,7 +136,7 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur myDetailsPanel.add(scrollPane, uniqueName); } - private String getCardName(X509Certificate certificate) { + private static String getCardName(X509Certificate certificate) { return certificate.getSubjectX500Principal().getName(); } @@ -203,13 +203,13 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur for (X509Certificate certificate : added) { if (!myTrustManager.addCertificate(certificate)) { - throw new ConfigurationException("Cannot add certificate", "Cannot Add Certificate"); + throw new ConfigurationException("Cannot add certificate for " + getCommonName(certificate), "Cannot Add Certificate"); } } for (X509Certificate certificate : removed) { if (!myTrustManager.removeCertificate(certificate)) { - throw new ConfigurationException("Cannot remove certificate", "Cannot Remove Certificate"); + throw new ConfigurationException("Cannot remove certificate for " + getCommonName(certificate), "Cannot Remove Certificate"); } } @@ -256,12 +256,18 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur @Override public void certificateAdded(X509Certificate certificate) { - getListModel().add(certificate); + CollectionListModel model = getListModel(); + if (model.getElementIndex(certificate) < 0) { + model.add(certificate); + } addCertificatePanel(certificate); } @Override public void certificateRemoved(X509Certificate certificate) { - getListModel().remove(certificate); + CollectionListModel model = getListModel(); + if (model.getElementIndex(certificate) >= 0) { + model.remove(certificate); + } } } diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateUtil.java b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateUtil.java index c02a9382a721..a1e36236c0e4 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateUtil.java +++ b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateUtil.java @@ -63,4 +63,11 @@ public class CertificateUtil { StreamUtil.closeStream(stream); } } + + /** + * @return subjects common name, usually it's domain name pattern, e.g. *.github.com + */ + public static String getCommonName(@NotNull X509Certificate certificate) { + return new CertificateWrapper(certificate).getSubjectField(CertificateWrapper.CommonField.COMMON_NAME); + } } diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/ConfirmingTrustManager.java b/platform/platform-api/src/com/intellij/util/net/ssl/ConfirmingTrustManager.java index 8a8f05a44f0c..8d430ebe7c7b 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/ConfirmingTrustManager.java +++ b/platform/platform-api/src/com/intellij/util/net/ssl/ConfirmingTrustManager.java @@ -260,7 +260,7 @@ public class ConfirmingTrustManager extends ClientOnlyTrustManager { } private static String createAlias(@NotNull X509Certificate certificate) { - return new CertificateWrapper(certificate).getSubjectField(CertificateWrapper.CommonField.COMMON_NAME); + return CertificateUtil.getCommonName(certificate); } /** @@ -287,6 +287,10 @@ public class ConfirmingTrustManager extends ClientOnlyTrustManager { } // for listeners X509Certificate certificate = getCertificate(alias); + if (certificate == null) { + LOG.error("No certificate found for alias: " + alias); + return false; + } myKeyStore.deleteEntry(alias); flushKeyStore(); // trust manager should be updated each time its key store was modified From 6ee3e2bce79e8b22f9b81353add030ea939e6f2f Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 3 Feb 2014 16:51:14 +0400 Subject: [PATCH 35/44] Refactoring (membersManager package introduced) to make PY-3450 Refactoring: pull up class variables/attributes easier --- .../PyClassMembersRefactoringSupport.java | 1 + .../classes/PyDependentMembersCollector.java | 1 + .../refactoring/classes/PyMemberInfo.java | 72 ----------- .../classes/PyMemberInfoStorage.java | 9 +- .../PyExtractSuperclassDialog.java | 2 +- .../PyExtractSuperclassHandler.java | 2 +- .../PyExtractSuperclassHelper.java | 2 +- .../membersManager/MembersManager.java | 118 ++++++++++++++++++ .../membersManager/MethodsManager.java | 67 ++++++++++ .../classes/membersManager/PyMemberInfo.java | 67 ++++++++++ .../membersManager/SuperClassesManager.java | 69 ++++++++++ .../classes/membersManager/package-info.java | 12 ++ .../classes/pullUp/PullUpViewSwingImpl.java | 2 +- .../classes/pullUp/PyPullUpConflictsUtil.java | 2 +- .../classes/pullUp/PyPullUpHelper.java | 40 ++---- .../classes/pullUp/PyPullUpPresenterImpl.java | 2 +- .../classes/pullUp/PyPullUpView.java | 2 +- .../classes/pushDown/PyPushDownConflicts.java | 2 +- .../classes/pushDown/PyPushDownDialog.java | 2 +- .../classes/pushDown/PyPushDownProcessor.java | 2 +- .../classes/ui/PyMemberSelectionPanel.java | 2 +- .../classes/ui/PyMemberSelectionTable.java | 2 +- .../ui/UpDirectedMembersMovingDialog.java | 2 +- .../classes/PyExtractSuperclassTest.java | 8 +- .../refactoring/classes/PyPullUpTest.java | 3 +- .../refactoring/classes/PyPushDownTest.java | 4 +- .../classes/pullUp/PyPullUpPresenterTest.java | 2 +- 27 files changed, 373 insertions(+), 126 deletions(-) delete mode 100644 python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java create mode 100644 python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java create mode 100644 python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java create mode 100644 python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java create mode 100644 python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java create mode 100644 python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java index 71f920c8399e..17588e666e25 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java +++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java @@ -22,6 +22,7 @@ import com.intellij.refactoring.classMembers.DependentMembersCollectorBase; import com.intellij.refactoring.classMembers.MemberInfoBase; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; /** * @author Dennis.Ushakov diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java b/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java index 5c51118c0129..5efb3525d5ba 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java +++ b/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java @@ -29,6 +29,7 @@ public class PyDependentMembersCollector extends DependentMembersCollectorBase

{ - public PyMemberInfo(PyElement member) { - super(member); - final PyClass clazz = PyUtil.getContainingClassOrSelf(member); - assert clazz != null; - - if (member instanceof PyFunction) { - PyFunction function = (PyFunction)member; - displayName = buildDisplayMethodName(function); - for (PyClass aClass : clazz.getSuperClasses()) { - final PyFunction parentMethod = aClass.findMethodByName(function.getName(), true); - if (parentMethod != null) { - overrides = true; - } - } - } else if (member instanceof PyClass) { - displayName = RefactoringBundle.message("member.info.extends.0", PyClassCellRenderer.getClassText((PyClass)member)); - } - } - - private static String buildDisplayMethodName(PyFunction method) { - final StringBuilder builder = new StringBuilder(method.getName()); - builder.append("("); - final PyParameter[] arguments = method.getParameterList().getParameters(); - for (PyParameter parameter : arguments) { - builder.append(parameter.getName()); - if (arguments.length > 1 && parameter != arguments[arguments.length - 1]) { - builder.append(", "); - } - } - builder.append(")"); - return builder.toString(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof PyMemberInfo) { - return getMember().equals(((PyMemberInfo)obj).getMember()); - } - return false; - } - - @Override - public int hashCode() { - return getMember().hashCode(); - } -} diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java index 5c172e63b812..ae6d769f35ab 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java +++ b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java @@ -22,6 +22,8 @@ import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; import com.jetbrains.python.psi.PyFunction; import com.jetbrains.python.refactoring.PyRefactoringUtil; +import com.jetbrains.python.refactoring.classes.membersManager.MembersManager; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import java.util.ArrayList; @@ -60,12 +62,7 @@ public class PyMemberInfoStorage extends AbstractMemberInfoStorage temp) { - for (PyFunction function : aClass.getMethods()) { - temp.add(new PyMemberInfo(function)); - } - for (PyClass pyClass : aClass.getSuperClasses()) { - temp.add(new PyMemberInfo(pyClass)); - } + temp.addAll(MembersManager.getAllMembersCouldBeMoved(aClass)); } @Override diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java index c0bc437b9498..05dab4f7aa7f 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java +++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java @@ -34,7 +34,7 @@ import com.jetbrains.python.PyBundle; import com.jetbrains.python.PythonLanguage; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage; import com.jetbrains.python.refactoring.classes.ui.UpDirectedMembersMovingDialog; import org.jetbrains.annotations.NotNull; diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java index a68860d6e97f..8ed2fa8aef85 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java +++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java @@ -28,7 +28,7 @@ import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyUtil; import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport; import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage; import java.util.Collection; diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java index 0d8033704728..98d016e50fa3 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java +++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java @@ -37,7 +37,7 @@ import com.jetbrains.python.PythonFileType; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java new file mode 100644 index 000000000000..9a64a979e5d1 --- /dev/null +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java @@ -0,0 +1,118 @@ +package com.jetbrains.python.refactoring.classes.membersManager; + +import com.google.common.base.Function; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Collections2; +import com.google.common.collect.Multimap; +import com.jetbrains.python.psi.PyClass; +import com.jetbrains.python.psi.PyElement; +import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Moves members between classes via its plugins (managers). + * To move members use {@link #getAllMembersCouldBeMoved(com.jetbrains.python.psi.PyClass)} and {@link #moveMembers(com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass, java.util.Collection)} + * To add new manager, extend this class and add it to {@link #MANAGERS} + * + * @author Ilya.Kazakevich + */ +public abstract class MembersManager implements Function { + /** + * List of managers. Class delegates all logic to them. + */ + private static final Collection MANAGERS = Arrays.asList(new MethodsManager(), new SuperClassesManager()); + private static final PyMemberExtractor PY_MEMBER_EXTRACTOR = new PyMemberExtractor(); + + protected MembersManager() { + } + + /** + * Get all members that could be moved out of certain class + * @param pyClass class to find members + * @return list of members could be moved + */ + @NotNull + public static List getAllMembersCouldBeMoved(@NotNull final PyClass pyClass) { + final List result = new ArrayList(); + + for (final MembersManager manager : MANAGERS) { + result.addAll(Collections2.transform(manager.getMembersCouldBeMoved(pyClass), manager)); + } + return result; + } + + + /** + * Moves members from one class to another + * @param from source + * @param to destination + * @param memberInfos members to move + */ + public static void moveAllMembers(@NotNull final PyClass from, + @NotNull final PyClass to, + @NotNull final Collection memberInfos) { + final Multimap managerToMember = ArrayListMultimap.create(); + //Collect map (manager)->(list_of_memebers) + for (final PyMemberInfo memberInfo : memberInfos) { + managerToMember.put(memberInfo.getMembersManager(), memberInfo); + } + //Move members via manager + for (final MembersManager membersManager : managerToMember.keySet()) { + membersManager.moveMembers(from, to, Collections2.transform(managerToMember.get(membersManager), PY_MEMBER_EXTRACTOR)); + } + PyClassRefactoringUtil.insertPassIfNeeded(from); + } + + /** + * Finds member in class. It is here only for backward compatibility with some tests. + */ + //TODO: mark deprecated? + @TestOnly + @NotNull + public static PyMemberInfo findMember(@NotNull final PyClass pyClass, @NotNull final PyElement pyElement) { + for (final PyMemberInfo pyMemberInfo : getAllMembersCouldBeMoved(pyClass)) { + if (pyMemberInfo.getMember().equals(pyElement)) { + return pyMemberInfo; + } + } + throw new IllegalArgumentException(String.format("Element %s not found in class %s or can't be moved", pyElement, pyClass)); + } + + /** + * Get list of elements certain plugin could move out of the class + * @param pyClass class with members + * @return list of members + */ + @NotNull + protected abstract List getMembersCouldBeMoved(@NotNull PyClass pyClass); + + /** + * Moves element from one class to another + * @param from source + * @param to destination + * @param members collection of memebrs to move + */ + protected abstract void moveMembers(@NotNull PyClass from, @NotNull PyClass to, @NotNull Collection members); + + //TODO: Doc + @SuppressWarnings("NullableProblems") //IDEA-120100 + @NotNull + @Override + public abstract PyMemberInfo apply(@NotNull PyElement input); + + private static class PyMemberExtractor implements Function { + @SuppressWarnings("NullableProblems") //IDEA-120100 + @Override + public PyElement apply(@NotNull final PyMemberInfo input) { + return input.getMember(); + } + } +} + + diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java new file mode 100644 index 000000000000..96456cbea225 --- /dev/null +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java @@ -0,0 +1,67 @@ +package com.jetbrains.python.refactoring.classes.membersManager; + +import com.jetbrains.python.psi.*; +import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Plugin that moves class methods + * + * @author Ilya.Kazakevich + */ +class MethodsManager extends MembersManager { + @NotNull + @Override + protected List getMembersCouldBeMoved(@NotNull final PyClass pyClass) { + return Arrays.asList(pyClass.getMethods()); + } + + @Override + protected void moveMembers(@NotNull PyClass from, @NotNull PyClass to, @NotNull Collection members) { + //TODO: Use generics to prevent casting in each subclass + Collection members1 = (Collection)members; + PyClassRefactoringUtil.moveMethods(members1, to); + } + + @NotNull + @Override + public PyMemberInfo apply(@NotNull final PyElement input) { + //TODO: Use generics to prevent casting in each subclass + final PyFunction pyFunction = (PyFunction)input; + //TODO: Support static and classmethod functions + return new PyMemberInfo(input, false, buildDisplayMethodName(pyFunction), isOverrides(pyFunction), this); + } + + @Nullable + private static Boolean isOverrides(final PyFunction pyFunction) { + final PyClass clazz = PyUtil.getContainingClassOrSelf(pyFunction); + assert clazz != null : "Refactoring called on function, not method: " + pyFunction; + for (final PyClass parentClass : clazz.getSuperClasses()) { + final PyFunction parentMethod = parentClass.findMethodByName(pyFunction.getName(), true); + if (parentMethod != null) { + return true; + } + } + return null; + } + + @NotNull + private static String buildDisplayMethodName(@NotNull final PyFunction pyFunction) { + final StringBuilder builder = new StringBuilder(pyFunction.getName()); + builder.append('('); + final PyParameter[] arguments = pyFunction.getParameterList().getParameters(); + for (final PyParameter parameter : arguments) { + builder.append(parameter.getName()); + if (arguments.length > 1 && parameter != arguments[arguments.length - 1]) { + builder.append(", "); + } + } + builder.append(')'); + return builder.toString(); + } +} diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java new file mode 100644 index 000000000000..210326f28e81 --- /dev/null +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2013 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.jetbrains.python.refactoring.classes.membersManager; + +import com.intellij.refactoring.classMembers.MemberInfoBase; +import com.jetbrains.python.psi.PyElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Dennis.Ushakov + */ +public class PyMemberInfo extends MemberInfoBase { + @NotNull + private final MembersManager myMembersManager; + + /** + * @param member element itself + * @param isStatic is it static or not? + * @param displayName element display name + * @param overrides does it overrides something? TRUE if is overriden, FALSE if implemented, null if not implemented or overriden + * TODO: use primitive instead? "Implemeneted" has nothing to do with python duck-typing + * @param membersManager manager that knows how to handle this member + */ + PyMemberInfo(@NotNull final PyElement member, + final boolean isStatic, + @NotNull final String displayName, + @Nullable final Boolean overrides, + @NotNull final MembersManager membersManager) { + super(member); + this.isStatic = isStatic; + this.displayName = displayName; + this.overrides = overrides; + myMembersManager = membersManager; + } + + @NotNull + MembersManager getMembersManager() { + return myMembersManager; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PyMemberInfo) { + return getMember().equals(((PyMemberInfo)obj).getMember()); + } + return false; + } + + @Override + public int hashCode() { + return getMember().hashCode(); + } +} diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java new file mode 100644 index 000000000000..3335b1d76373 --- /dev/null +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java @@ -0,0 +1,69 @@ +package com.jetbrains.python.refactoring.classes.membersManager; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import com.google.common.collect.Sets; +import com.intellij.refactoring.RefactoringBundle; +import com.jetbrains.python.psi.PyClass; +import com.jetbrains.python.psi.PyElement; +import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; +import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * Plugin that moves superclasses from one class to another + * + * @author Ilya.Kazakevich + */ +class SuperClassesManager extends MembersManager { + + private static final NameExtractor NAME_EXTRACTOR = new NameExtractor(); + + @NotNull + @Override + protected List getMembersCouldBeMoved(@NotNull final PyClass pyClass) { + return Arrays.asList(pyClass.getSuperClasses()); + } + + @Override + protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { + final Set superClassesToMove = Sets.newHashSet(Collections2.filter(Collections2.transform(members, NAME_EXTRACTOR), NAME_EXTRACTOR)); + + for (final PyElement member : members) { + superClassesToMove.add(member.getName()); + } + + PyClassRefactoringUtil.moveSuperclasses(from, superClassesToMove, to); + //TODO: Use generics! + PyClassRefactoringUtil.insertImport(to, (Collection)members); + } + + @NotNull + @Override + public PyMemberInfo apply(@NotNull final PyElement input) { + final String name = RefactoringBundle.message("member.info.extends.0", PyClassCellRenderer.getClassText((PyClass)input)); + //TODO: Check for "overrides" + return new PyMemberInfo(input, false, name, false, this); + } + + private static class NameExtractor implements Predicate, Function { + @SuppressWarnings("NullableProblems") //We sure collection has no null + @Nullable + @Override + public String apply(@NotNull final PyElement input) { + return input.getName(); + } + + @Override + public boolean apply(@Nullable final String input) { + return input != null; + } + } +} diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java new file mode 100644 index 000000000000..b730fd4e3c06 --- /dev/null +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java @@ -0,0 +1,12 @@ +/** + * Incapsulates knowledge about class members that could be moved to some other class. + * To use (get list of members to move or actually move them) use {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager#getAllMembersCouldBeMoved(com.jetbrains.python.psi.PyClass)} + * and {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager#moveAllMembers(com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass, java.util.Collection)} + * + * This class delegates its behaviour to its managers (some kind of plugins). There is one for each member type (one for method, one for field etc). + * You need to extend {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager} to add some. See its javadoc for more info. + * + * + * @author Ilya.Kazakevich + */ +package com.jetbrains.python.refactoring.classes.membersManager; \ No newline at end of file diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpViewSwingImpl.java index 7707faab3f00..b0c38d31c8fa 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpViewSwingImpl.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpViewSwingImpl.java @@ -26,7 +26,7 @@ import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.util.containers.MultiMap; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer; import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel; import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionTable; diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java index 8d68255f1a1a..c1f5eeaa4240 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java @@ -21,7 +21,7 @@ import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.util.containers.MultiMap; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyFunction; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java index 0046ba2eef92..37f3718b84ed 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java @@ -17,49 +17,31 @@ package com.jetbrains.python.refactoring.classes.pullUp; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.psi.PsiNamedElement; import com.intellij.refactoring.RefactoringBundle; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.psi.PyFunction; -import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.MembersManager; -import java.util.*; +import java.util.Collection; /** * @author Dennis.Ushakov */ -public class PyPullUpHelper { - private static final Logger LOG = Logger.getInstance(PyPullUpHelper.class.getName()); - private PyPullUpHelper() {} +public final class PyPullUpHelper { + + private PyPullUpHelper() { + } public static PyElement pullUp(final PyClass clazz, final Collection selectedMemberInfos, final PyClass superClass) { - final Set superClasses = new HashSet(); - final Set extractedClasses = new HashSet(); - final List methods = new ArrayList(); - for (PyMemberInfo member : selectedMemberInfos) { - final PyElement element = member.getMember(); - if (element instanceof PyFunction) methods.add((PyFunction)element); - else if (element instanceof PyClass) { - superClasses.add(element.getName()); - extractedClasses.add((PyClass)element); - } - else LOG.error("unmatched member class " + element.getClass()); - } - + CommandProcessor.getInstance().executeCommand(clazz.getProject(), new Runnable() { + @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override public void run() { - // move methods - PyClassRefactoringUtil.moveMethods(methods, superClass); - - // move superclasses declarations - PyClassRefactoringUtil.moveSuperclasses(clazz, superClasses, superClass); - PyClassRefactoringUtil.insertImport(superClass, extractedClasses); - PyClassRefactoringUtil.insertPassIfNeeded(clazz); + MembersManager.moveAllMembers(clazz, superClass, selectedMemberInfos); } }); } diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java index 8ab80cf5603a..99295d9f607e 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java @@ -25,7 +25,7 @@ import com.intellij.util.containers.MultiMap; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; import com.jetbrains.python.psi.PyUtil; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage; import org.jetbrains.annotations.NotNull; diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java index 1f935ee8de1d..856b072ef236 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java @@ -21,7 +21,7 @@ import com.intellij.refactoring.classMembers.MemberInfoModel; import com.intellij.util.containers.MultiMap; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java index c159b2f27f00..7e4f93c5493e 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java @@ -25,7 +25,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.resolve.PyResolveContext; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import java.util.ArrayList; import java.util.Collection; diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java index 2235c574f9a8..73790938911f 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java @@ -23,7 +23,7 @@ import com.intellij.refactoring.classMembers.UsedByDependencyMemberInfoModel; import com.intellij.refactoring.ui.RefactoringDialog; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage; import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel; diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java index 1164c691eea8..ec321f7f5999 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java +++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java @@ -34,7 +34,7 @@ import com.jetbrains.python.psi.PyFunction; import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.psi.search.PyClassInheritorsSearch; import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import org.jetbrains.annotations.NotNull; import java.util.*; diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java index 7ee075424936..330575b9eabc 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java +++ b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java @@ -19,7 +19,7 @@ import com.intellij.refactoring.classMembers.MemberInfoModel; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ScrollPaneFactory; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import org.jetbrains.annotations.NotNull; import javax.swing.*; diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java index 11d3e4285b7c..e34cd591d343 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java +++ b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java @@ -22,7 +22,7 @@ import com.intellij.refactoring.ui.AbstractMemberSelectionTable; import com.intellij.ui.RowIcon; import com.jetbrains.python.psi.PyElement; import com.jetbrains.python.psi.PyFunction; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import javax.swing.*; import java.util.List; diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java b/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java index 7ac313d57101..81794643bb59 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java +++ b/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java @@ -23,7 +23,7 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; import com.jetbrains.python.psi.PyUtil; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import javax.swing.*; import java.awt.*; diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java index baab81cc5062..d143e966e077 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java @@ -24,6 +24,8 @@ import com.jetbrains.python.PyNames; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; import com.jetbrains.python.refactoring.classes.extractSuperclass.PyExtractSuperclassHelper; +import com.jetbrains.python.refactoring.classes.membersManager.MembersManager; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import java.io.File; import java.util.ArrayList; @@ -53,7 +55,7 @@ public class PyExtractSuperclassTest extends PyClassRefactoringTest { final List members = new ArrayList(); for (String memberName : membersName) { final PyElement member = findMember(className, memberName); - members.add(new PyMemberInfo(member)); + members.add(MembersManager.findMember(clazz, member)); } new WriteCommandAction.Simple(myFixture.getProject()) { @@ -81,7 +83,7 @@ public class PyExtractSuperclassTest extends PyClassRefactoringTest { final PyClass clazz = findClass(className); final List members = new ArrayList(); final PyElement member = findMember(className, ".foo"); - members.add(new PyMemberInfo(member)); + members.add(MembersManager.findMember(clazz, member)); final VirtualFile base_dir = myFixture.getFile().getVirtualFile().getParent(); new WriteCommandAction.Simple(myFixture.getProject()) { @@ -124,7 +126,7 @@ public class PyExtractSuperclassTest extends PyClassRefactoringTest { final PyClass clazz = findClass(className); final List members = new ArrayList(); final PyElement member = findMember(className, ".foo"); - members.add(new PyMemberInfo(member)); + members.add(MembersManager.findMember(clazz, member)); final VirtualFile base_dir = myFixture.getFile().getVirtualFile().getParent(); new WriteCommandAction.Simple(myFixture.getProject()) { diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java index 881dac2a9766..bd56a2c9fda1 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java @@ -17,6 +17,7 @@ package com.jetbrains.python.refactoring.classes; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; +import com.jetbrains.python.refactoring.classes.membersManager.MembersManager; import com.jetbrains.python.refactoring.classes.pullUp.PyPullUpHelper; import java.util.Collections; @@ -76,6 +77,6 @@ public class PyPullUpTest extends PyClassRefactoringTest { final PyClass clazz = findClass(className); final PyElement member = findMember(className, memberName); final PyClass superClass = findClass(superClassName); - PyPullUpHelper.pullUp(clazz, Collections.singleton(new PyMemberInfo(member)), superClass); + PyPullUpHelper.pullUp(clazz, Collections.singleton(MembersManager.findMember(clazz, member)), superClass); } } diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java index 72c3bfded44a..480e3a4b4bf7 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java @@ -18,6 +18,8 @@ package com.jetbrains.python.refactoring.classes; import com.intellij.openapi.command.WriteCommandAction; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; +import com.jetbrains.python.refactoring.classes.membersManager.MembersManager; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.pushDown.PyPushDownProcessor; import java.util.ArrayList; @@ -55,7 +57,7 @@ public class PyPushDownTest extends PyClassRefactoringTest { final List members = new ArrayList(); for (String memberName : membersName) { final PyElement member = findMember(className, memberName); - members.add(new PyMemberInfo(member)); + members.add(MembersManager.findMember(clazz, member)); } final PyPushDownProcessor processor = new PyPushDownProcessor(myFixture.getProject(), clazz, members); diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java index 02092d208518..a07e1d87dbec 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java @@ -7,7 +7,7 @@ import com.intellij.refactoring.classMembers.MemberInfoModel; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; -import com.jetbrains.python.refactoring.classes.PyMemberInfo; +import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo; import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage; import org.easymock.Capture; import org.easymock.EasyMock; From e67783cc5717472a1e1b4ef490dbb604f7ddd485 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Mon, 3 Feb 2014 17:06:04 +0400 Subject: [PATCH 36/44] 'properties' plugin layout should respect 'pluginFilter' (fixes failed WebStorm builds) --- build/scripts/layouts.gant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index d23727fb896d..df4487148e04 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -268,7 +268,7 @@ public def layoutCommunityPlugins(String home) { } } - dir("properties") { + pluginDir("properties") { dir("lib") { jar("properties.jar") { module("properties-psi-api") From 94b39890236f57eb64e4d8564b013feffc2fde15 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 3 Feb 2014 14:18:02 +0100 Subject: [PATCH 37/44] background of editorpane should be white --- .../src/com/intellij/ide/ui/laf/intellijlaf.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf.properties b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf.properties index 10113e560409..116adfe47398 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf.properties +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellijlaf.properties @@ -151,6 +151,8 @@ Tree.paintLines=false Tree.textBackground=ffffff Tree.selectionBorderColor=3875d6 +EditorPane.background=ffffff + List.background=ffffff Hyperlink.linkColor=589df6 From a6dcd8cab483b329e90e3c135ea5e745674aac17 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 3 Feb 2014 14:40:39 +0100 Subject: [PATCH 38/44] cleanup --- .../src/com/intellij/openapi/editor/Editor.java | 1 - .../src/com/intellij/ui/EditorComboBoxEditor.java | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java index 3a5d9d415257..bd63b43f1af3 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java @@ -22,7 +22,6 @@ import com.intellij.openapi.editor.event.EditorMouseMotionListener; import com.intellij.openapi.editor.markup.MarkupModel; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.UserDataHolder; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/platform/platform-impl/src/com/intellij/ui/EditorComboBoxEditor.java b/platform/platform-impl/src/com/intellij/ui/EditorComboBoxEditor.java index 2b9dce102509..f4dfb1059651 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorComboBoxEditor.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorComboBoxEditor.java @@ -38,6 +38,7 @@ public class EditorComboBoxEditor implements ComboBoxEditor{ myTextField.setName(NAME); } + @Override public void selectAll() { myTextField.selectAll(); myTextField.requestFocus(); @@ -48,18 +49,22 @@ public class EditorComboBoxEditor implements ComboBoxEditor{ return myTextField.getEditor(); } + @Override public EditorTextField getEditorComponent() { return myTextField; } + @Override public void addActionListener(ActionListener l) { } + @Override public void removeActionListener(ActionListener l) { } + @Override public Object getItem() { return getDocument(); } @@ -68,6 +73,7 @@ public class EditorComboBoxEditor implements ComboBoxEditor{ return myTextField.getDocument(); } + @Override public void setItem(Object anObject) { myTextField.setDocument((Document)anObject); } From 20a4f26ca85a2988b4257f2530f5c69e2198ef80 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 3 Feb 2014 14:45:12 +0100 Subject: [PATCH 39/44] fix "Invalid file" --- .../xdebugger/impl/XDebuggerUtilImpl.java | 8 ++++++-- .../impl/ui/XDebuggerExpressionComboBox.java | 15 ++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java index 4fbc23431a5e..76a360f748ab 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java @@ -262,9 +262,13 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { @Override @Nullable public PsiElement findContextElement(@NotNull VirtualFile virtualFile, int offset, @NotNull Project project, boolean checkXml) { + if (!virtualFile.isValid()) { + return null; + } + Document document = FileDocumentManager.getInstance().getDocument(virtualFile); - PsiFile file = PsiManager.getInstance(project).findFile(virtualFile); - if (file == null || document == null) { + PsiFile file = document == null ? null : PsiManager.getInstance(project).findFile(virtualFile); + if (file == null) { return null; } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java index 90469e5ffb95..694ef28f8b37 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java @@ -60,6 +60,7 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { return myComboBox; } + @Override public JComponent getComponent() { return myComboBox; } @@ -70,7 +71,7 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { } public JComponent getEditorComponent() { - return (JComponent)myEditor.getEditorComponent(); + return myEditor.getEditorComponent(); } public void setEnabled(boolean enable) { @@ -89,13 +90,12 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { private void initEditor() { myEditor = new EditorComboBoxEditor(getProject(), myDebuggerEditorsProvider.getFileType()) { + @Override public void setItem(Object anObject) { - if (anObject == null) { - anObject = ""; - } - super.setItem(createDocument((String)anObject)); + super.setItem(createDocument(StringUtil.notNullize((String)anObject))); } + @Override public Object getItem() { return ((Document)super.getItem()).getText(); } @@ -106,6 +106,7 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { myComboBox.setMaximumRowCount(XDebuggerHistoryManager.MAX_RECENT_EXPRESSIONS); } + @Override protected void onHistoryChanged() { fillComboBox(); } @@ -120,6 +121,7 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { } } + @Override protected void doSetText(String text) { if (myComboBox.getItemCount() > 0) { myComboBox.setSelectedIndex(0); @@ -133,15 +135,18 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { } } + @Override public String getText() { final Object value = myComboBox.isPopupVisible() ? myComboBox.getPopup().getList().getSelectedValue() : myEditor.getItem(); return StringUtil.notNullize((String)value); } + @Override public JComponent getPreferredFocusedComponent() { return (JComponent)myComboBox.getEditor().getEditorComponent(); } + @Override public void selectAll() { myComboBox.getEditor().selectAll(); } From 79e3da543bef15156b1aa65bfc6e875d8ad15aac Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Mon, 3 Feb 2014 18:03:10 +0400 Subject: [PATCH 40/44] Infer 'Iterable' as the type of tuples as default parameter values (PY-10967) It is too strict to infer 'tuple' as the type of default tuples, since they are often used as an immutable indicator, that a method expects a collection. --- .../com/jetbrains/python/psi/impl/PyNamedParameterImpl.java | 3 +++ .../PyTypeCheckerInspection/DefaultTupleParameter.py | 5 +++++ .../python/inspections/PyTypeCheckerInspectionTest.java | 5 +++++ 3 files changed, 13 insertions(+) create mode 100644 python/testData/inspections/PyTypeCheckerInspection/DefaultTupleParameter.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java index 9c34062d2f08..dd94006b0c7e 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java @@ -238,6 +238,9 @@ public class PyNamedParameterImpl extends PyPresentableElementImpl Date: Mon, 3 Feb 2014 17:28:05 +0400 Subject: [PATCH 41/44] [git] Don't read default commit message from .COMMIT_EDITMSG This actually reverts 07af6c9fa (apart from code style changes). It fixes IDEA-119753 and adding a newline after successful commit. The root cause is actually CommitChangeListDialog#setComment where the VCS CheckinEnvironment is asked even if we have some commit message in history, which is then overwritten by the message received from the VCS. It seems more logical to ask VCS _only_ if we have nothing to propose, but on the other hand, in such situations as merging it is very handy to use a pre-populated message from VCS, rather than the previous commit message as IDEA proposes. Implementing some sort of commit message provider priority seems to be an overhead for all of this => reverting commit which caused commit message to be read from the VCS more often looks like a better decision. --- .../src/git4idea/checkin/GitCheckinEnvironment.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java index cc8cce768f9a..d5c4b3fa8505 100644 --- a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java +++ b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java @@ -110,22 +110,16 @@ public class GitCheckinEnvironment implements CheckinEnvironment { for (VirtualFile root : GitUtil.gitRoots(Arrays.asList(filesToCheckin))) { VirtualFile mergeMsg = root.findFileByRelativePath(GitRepositoryFiles.GIT_MERGE_MSG); VirtualFile squashMsg = root.findFileByRelativePath(GitRepositoryFiles.GIT_SQUASH_MSG); - VirtualFile normalMsg = root.findFileByRelativePath(GitRepositoryFiles.GIT_COMMIT_EDITMSG); try { - if (mergeMsg == null && squashMsg == null && normalMsg == null) { + if (mergeMsg == null && squashMsg == null) { continue; } - String encoding = GitConfigUtil.getCommitEncoding(myProject, root); - if (mergeMsg != null) { messages.add(loadMessage(mergeMsg, encoding)); } - else if (squashMsg != null) { - messages.add(loadMessage(squashMsg, encoding)); - } else { - messages.add(loadMessage(normalMsg, encoding)); + messages.add(loadMessage(squashMsg, encoding)); } } catch (IOException e) { From 17d36f33c1f22a458a1c46cba235a33bff2a2d75 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Mon, 3 Feb 2014 18:04:54 +0400 Subject: [PATCH 42/44] Fixed potential NPE --- .../python/psi/impl/PyNamedParameterImpl.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java index dd94006b0c7e..6ad33d60569e 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java @@ -252,15 +252,18 @@ public class PyNamedParameterImpl extends PyPresentableElementImpl entry : mapping.getPlainMappedParams().entrySet()) { - if (entry.getValue() == PyNamedParameterImpl.this) { - final PyExpression argument = entry.getKey(); - if (argument != null) { - final PyType type = context.getType(argument); - if (type != null) { - types.add(type); - return true; + final PyArgumentList argumentList = call.getArgumentList(); + if (argumentList != null) { + final CallArgumentsMapping mapping = argumentList.analyzeCall(resolveContext); + for (Map.Entry entry : mapping.getPlainMappedParams().entrySet()) { + if (entry.getValue() == PyNamedParameterImpl.this) { + final PyExpression argument = entry.getKey(); + if (argument != null) { + final PyType type = context.getType(argument); + if (type != null) { + types.add(type); + return true; + } } } } From 7ae9d1d2b1b8e35e00e9ceea2023b10c7129e151 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 3 Feb 2014 18:35:53 +0400 Subject: [PATCH 43/44] PY-3450 Refactoring: pull up class variables/attributes: Fixed, but refactoring is required. --- .../classes/PyClassRefactoringUtil.java | 16 ++++++ .../membersManager/ClassFieldsManager.java | 53 +++++++++++++++++++ .../membersManager/MembersManager.java | 5 +- .../pullup/moveClassAttributesNoPass.after.py | 9 ++++ .../pullup/moveClassAttributesNoPass.py | 7 +++ .../pullup/moveClassAttributesSimple.after.py | 6 +++ .../pullup/moveClassAttributesSimple.py | 6 +++ .../refactoring/pullup/presenter/file.py | 2 + .../classes/PyClassRefactoringTest.java | 18 ++++++- .../refactoring/classes/PyPullUpTest.java | 7 +++ .../classes/pullUp/PyPullUpPresenterTest.java | 1 + 11 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java create mode 100644 python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py create mode 100644 python/testData/refactoring/pullup/moveClassAttributesNoPass.py create mode 100644 python/testData/refactoring/pullup/moveClassAttributesSimple.after.py create mode 100644 python/testData/refactoring/pullup/moveClassAttributesSimple.py diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java index eda33558779f..a92e3ad44a9a 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java +++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java @@ -139,6 +139,22 @@ public class PyClassRefactoringUtil { return false; } + /** + * Moves class field to another class + * @param expressions list of class fields + * @param superClass where to move them + */ + public static void moveFields(@NotNull final Collection expressions, @NotNull final PyClass superClass) { + for (final PyTargetExpression expression : expressions) { + final PyAssignmentStatement expAssignmentStatement = PsiTreeUtil.getParentOfType(expression, PyAssignmentStatement.class); + assert expAssignmentStatement != null: "Target expression has no assignment statement"; + final PyStatementList superClassStatement = superClass.getStatementList(); + PyUtil.addElementToStatementList(expAssignmentStatement.copy(), superClassStatement, true); + expAssignmentStatement.delete(); + PyPsiUtils.removeRedundantPass(superClassStatement); + } + + } public static void moveMethods(Collection methods, PyClass superClass) { if (methods.size() == 0) return; for (PsiElement e : methods) { diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java new file mode 100644 index 000000000000..ab899c9999b1 --- /dev/null +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java @@ -0,0 +1,53 @@ +package com.jetbrains.python.refactoring.classes.membersManager; + +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import com.intellij.psi.PsiElement; +import com.jetbrains.python.psi.PyAssignmentStatement; +import com.jetbrains.python.psi.PyClass; +import com.jetbrains.python.psi.PyElement; +import com.jetbrains.python.psi.PyTargetExpression; +import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Moves class attributes up + * @author Ilya.Kazakevich + */ +class ClassFieldsManager extends MembersManager { + @NotNull + @Override + protected List getMembersCouldBeMoved(@NotNull final PyClass pyClass) { + return new ArrayList(Collections2.filter(pyClass.getClassAttributes(), new SimpleAssignmentsOnly())); + } + + @Override + protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { + //TODO: Use generics to prevent casting + PyClassRefactoringUtil.moveFields((Collection)members, to); + } + + @NotNull + @Override + public PyMemberInfo apply(@NotNull final PyElement input) { + return new PyMemberInfo(input, true, input.getText(), false, this); //TODO: Check overrides + } + + private static class SimpleAssignmentsOnly implements Predicate { + //Support only simplest cases like CLASS_VAR = 42. + //Tuples (CLASS_VAR_1, CLASS_VAR_2) = "spam", "eggs" are not supported by now + @Override + public boolean apply(@Nullable final PyTargetExpression input) { + if (input == null) { + return false; //Filter out empties (which probably would never be here) + } + final PsiElement parent = input.getParent(); + return (parent != null) && PyAssignmentStatement.class.isAssignableFrom(parent.getClass()); + } + } +} diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java index 9a64a979e5d1..b0419fb58ec4 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java @@ -26,7 +26,10 @@ public abstract class MembersManager implements Function MANAGERS = Arrays.asList(new MethodsManager(), new SuperClassesManager()); + private static final Collection MANAGERS = Arrays.asList( + new MethodsManager(), + new SuperClassesManager(), + new ClassFieldsManager()); private static final PyMemberExtractor PY_MEMBER_EXTRACTOR = new PyMemberExtractor(); protected MembersManager() { diff --git a/python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py b/python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py new file mode 100644 index 000000000000..8732118af791 --- /dev/null +++ b/python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py @@ -0,0 +1,9 @@ +class Parent2: + CLASS_VAR = 42 + + def doo(self): + pass + + +class Child2(Parent2): + pass \ No newline at end of file diff --git a/python/testData/refactoring/pullup/moveClassAttributesNoPass.py b/python/testData/refactoring/pullup/moveClassAttributesNoPass.py new file mode 100644 index 000000000000..2454ab2d50f2 --- /dev/null +++ b/python/testData/refactoring/pullup/moveClassAttributesNoPass.py @@ -0,0 +1,7 @@ +class Parent2: + def doo(self): + pass + + +class Child2(Parent2): + CLASS_VAR = 42 diff --git a/python/testData/refactoring/pullup/moveClassAttributesSimple.after.py b/python/testData/refactoring/pullup/moveClassAttributesSimple.after.py new file mode 100644 index 000000000000..a77087153cd9 --- /dev/null +++ b/python/testData/refactoring/pullup/moveClassAttributesSimple.after.py @@ -0,0 +1,6 @@ +class Parent: + CLASS_VAR = 42 + + +class Child(Parent): + pass \ No newline at end of file diff --git a/python/testData/refactoring/pullup/moveClassAttributesSimple.py b/python/testData/refactoring/pullup/moveClassAttributesSimple.py new file mode 100644 index 000000000000..fbfef9f7ea13 --- /dev/null +++ b/python/testData/refactoring/pullup/moveClassAttributesSimple.py @@ -0,0 +1,6 @@ +class Parent: + pass + + +class Child(Parent): + CLASS_VAR = 42 diff --git a/python/testData/refactoring/pullup/presenter/file.py b/python/testData/refactoring/pullup/presenter/file.py index 6a2ef6f46fb9..0affd45fb7c3 100644 --- a/python/testData/refactoring/pullup/presenter/file.py +++ b/python/testData/refactoring/pullup/presenter/file.py @@ -30,6 +30,8 @@ class BadMro(MainParent, object, SubParent1, SubParent2): pass class SomeMembersDisabled(SubParent1, date): #SubParent1 is disabled + CLASS_FIELD = 42 + (CLASS_FIELD_A,CLASS_FIELD_B) = (42,100500) We do not support tuples in class assignments for now (see ClassFieldsManager) def foo(self): #should be disabled pass def bar(self): diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java index d6ebede4ac3d..64b6e8da0f08 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java @@ -34,17 +34,31 @@ public abstract class PyClassRefactoringTest extends PyTestCase { /** * @param className class where member should be found * @param memberName member that starts with dot (.) is treated as method. + * member that starts with dash (#) is treated as attribute. * It is treated parent class otherwise * @return member or null if not found */ @NotNull protected PyElement findMember(@NotNull String className, @NotNull String memberName) { - boolean findMethod = memberName.contains("."); - PyElement result = (findMethod ? findMethod(className, memberName.substring(1)) : findClass(memberName)); + final PyElement result; + //TODO: Get rid of this chain of copy pastes + if (memberName.contains(".")) { + result = findMethod(className, memberName.substring(1)); + } + else if (memberName.contains("#")) { + result = findField(className, memberName.substring(1)); + } + else { + result = findClass(memberName); + } Assert.assertNotNull(String.format("No member %s found in class %s", memberName, className), result); return result; } + private PyElement findField(final String className, final String memberName) { + return findClass(className).findClassAttribute(memberName, false); + } + private PyFunction findMethod(final String className, final String name) { final PyClass clazz = findClass(className); return clazz.findMethodByName(name, false); diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java index bd56a2c9fda1..c1bb6d033216 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java @@ -50,6 +50,13 @@ public class PyPullUpTest extends PyClassRefactoringTest { doHelperTest("Child", "Spam", "Parent_1"); } + public void testMoveClassAttributesSimple() { + doHelperTest("Child", "#CLASS_VAR", "Parent"); + } + public void testMoveClassAttributesNoPass() { + doHelperTest("Child2", "#CLASS_VAR", "Parent2"); + } + public void testMultiFile() { // PY-2810 doMultiFileTest(); } diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java index a07e1d87dbec..e8b7ed671b86 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java @@ -102,6 +102,7 @@ public class PyPullUpPresenterTest extends PyTestCase { @SuppressWarnings("unchecked") Matcher>> matcher = Matchers .containsInAnyOrder( Pair.create("date", true), + Pair.create("CLASS_FIELD", true), Pair.create("SubParent1", false), Pair.create("foo", false), Pair.create("bar", true)); From 6d8e028a6684c0819bf380ff82912317d7b58af3 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 3 Feb 2014 19:04:12 +0400 Subject: [PATCH 44/44] PY-3450 Refactoring: pull up class variables/attributes: Refactoring + compilation fix --- .../membersManager/ClassFieldsManager.java | 12 +++-- .../membersManager/MembersManager.java | 50 +++++++++++++------ .../membersManager/MethodsManager.java | 13 +++-- .../membersManager/SuperClassesManager.java | 23 +++++---- 4 files changed, 65 insertions(+), 33 deletions(-) diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java index ab899c9999b1..d5ef793fb961 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java @@ -19,7 +19,12 @@ import java.util.List; * Moves class attributes up * @author Ilya.Kazakevich */ -class ClassFieldsManager extends MembersManager { +class ClassFieldsManager extends MembersManager { + + ClassFieldsManager() { + super(PyTargetExpression.class); + } + @NotNull @Override protected List getMembersCouldBeMoved(@NotNull final PyClass pyClass) { @@ -27,9 +32,8 @@ class ClassFieldsManager extends MembersManager { } @Override - protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { - //TODO: Use generics to prevent casting - PyClassRefactoringUtil.moveFields((Collection)members, to); + protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { + PyClassRefactoringUtil.moveFields(members, to); } @NotNull diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java index b0419fb58ec4..93701ce13eb6 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java @@ -1,6 +1,7 @@ package com.jetbrains.python.refactoring.classes.membersManager; import com.google.common.base.Function; +import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Collections2; import com.google.common.collect.Multimap; @@ -22,21 +23,24 @@ import java.util.List; * * @author Ilya.Kazakevich */ -public abstract class MembersManager implements Function { +public abstract class MembersManager implements Function { /** * List of managers. Class delegates all logic to them. */ - private static final Collection MANAGERS = Arrays.asList( - new MethodsManager(), - new SuperClassesManager(), - new ClassFieldsManager()); + private static final Collection> MANAGERS = + Arrays.asList(new MethodsManager(), new SuperClassesManager(), new ClassFieldsManager()); private static final PyMemberExtractor PY_MEMBER_EXTRACTOR = new PyMemberExtractor(); - protected MembersManager() { + @NotNull + private final Class myExpectedClass; + + protected MembersManager(@NotNull final Class expectedClass) { + myExpectedClass = expectedClass; } /** * Get all members that could be moved out of certain class + * * @param pyClass class to find members * @return list of members could be moved */ @@ -44,7 +48,7 @@ public abstract class MembersManager implements Function getAllMembersCouldBeMoved(@NotNull final PyClass pyClass) { final List result = new ArrayList(); - for (final MembersManager manager : MANAGERS) { + for (final MembersManager manager : MANAGERS) { result.addAll(Collections2.transform(manager.getMembersCouldBeMoved(pyClass), manager)); } return result; @@ -53,25 +57,39 @@ public abstract class MembersManager implements Function memberInfos) { - final Multimap managerToMember = ArrayListMultimap.create(); + final Multimap, PyMemberInfo> managerToMember = ArrayListMultimap.create(); //Collect map (manager)->(list_of_memebers) for (final PyMemberInfo memberInfo : memberInfos) { managerToMember.put(memberInfo.getMembersManager(), memberInfo); } //Move members via manager - for (final MembersManager membersManager : managerToMember.keySet()) { - membersManager.moveMembers(from, to, Collections2.transform(managerToMember.get(membersManager), PY_MEMBER_EXTRACTOR)); + for (final MembersManager membersManager : managerToMember.keySet()) { + moveSafely(from, to, membersManager, Collections2.transform(managerToMember.get(membersManager), PY_MEMBER_EXTRACTOR)); } PyClassRefactoringUtil.insertPassIfNeeded(from); } + @SuppressWarnings({"unchecked", "rawtypes"}) //We check classes at runtime + private static void moveSafely(@NotNull final PyClass from, + @NotNull final PyClass to, + @NotNull final MembersManager manager, + @NotNull final Collection elementsToMove) { + for (final PyElement pyElement : elementsToMove) { + Preconditions.checkArgument(manager.myExpectedClass.isAssignableFrom(pyElement.getClass()), + String.format("Manager %s expected %s but got %s", manager, manager.myExpectedClass, pyElement)); + } + + manager.moveMembers(from, to, (Collection)elementsToMove); + } + /** * Finds member in class. It is here only for backward compatibility with some tests. */ @@ -89,6 +107,7 @@ public abstract class MembersManager implements Function members); + protected abstract void moveMembers(@NotNull PyClass from, @NotNull PyClass to, @NotNull Collection members); //TODO: Doc @SuppressWarnings("NullableProblems") //IDEA-120100 diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java index 96456cbea225..720b420b62ab 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java @@ -14,7 +14,12 @@ import java.util.List; * * @author Ilya.Kazakevich */ -class MethodsManager extends MembersManager { +class MethodsManager extends MembersManager { + + MethodsManager() { + super(PyFunction.class); + } + @NotNull @Override protected List getMembersCouldBeMoved(@NotNull final PyClass pyClass) { @@ -22,10 +27,8 @@ class MethodsManager extends MembersManager { } @Override - protected void moveMembers(@NotNull PyClass from, @NotNull PyClass to, @NotNull Collection members) { - //TODO: Use generics to prevent casting in each subclass - Collection members1 = (Collection)members; - PyClassRefactoringUtil.moveMethods(members1, to); + protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { + PyClassRefactoringUtil.moveMethods(members, to); } @NotNull diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java index 3335b1d76373..0caf927c9751 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java +++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java @@ -4,6 +4,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Sets; +import com.intellij.psi.PsiNamedElement; import com.intellij.refactoring.RefactoringBundle; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyElement; @@ -12,19 +13,20 @@ import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; /** * Plugin that moves superclasses from one class to another * * @author Ilya.Kazakevich */ -class SuperClassesManager extends MembersManager { +class SuperClassesManager extends MembersManager { + SuperClassesManager() { + super(PyClass.class); + } private static final NameExtractor NAME_EXTRACTOR = new NameExtractor(); + private static final NameFilter NAME_FILTER = new NameFilter(); @NotNull @Override @@ -33,8 +35,9 @@ class SuperClassesManager extends MembersManager { } @Override - protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { - final Set superClassesToMove = Sets.newHashSet(Collections2.filter(Collections2.transform(members, NAME_EXTRACTOR), NAME_EXTRACTOR)); + protected void moveMembers(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection members) { + final Set superClassesToMove = + Sets.newHashSet(Collections2.filter(Collections2.transform(members, NAME_EXTRACTOR), NAME_FILTER)); for (final PyElement member : members) { superClassesToMove.add(member.getName()); @@ -42,7 +45,7 @@ class SuperClassesManager extends MembersManager { PyClassRefactoringUtil.moveSuperclasses(from, superClassesToMove, to); //TODO: Use generics! - PyClassRefactoringUtil.insertImport(to, (Collection)members); + PyClassRefactoringUtil.insertImport(to, new ArrayList(members)); } @NotNull @@ -53,14 +56,16 @@ class SuperClassesManager extends MembersManager { return new PyMemberInfo(input, false, name, false, this); } - private static class NameExtractor implements Predicate, Function { + private static class NameExtractor implements Function { @SuppressWarnings("NullableProblems") //We sure collection has no null @Nullable @Override public String apply(@NotNull final PyElement input) { return input.getName(); } + } + private static class NameFilter implements Predicate { @Override public boolean apply(@Nullable final String input) { return input != null;