From cb4190de40d03f1bdec963ad74da37dbbf55c993 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 16:41:13 +0300 Subject: [PATCH 1/9] separate ignore message from everything else (IDEA-161181) --- .../sm/runner/states/TestIgnoredState.java | 2 +- .../sm/runner/SMTRunnerConsoleTest.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/states/TestIgnoredState.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/states/TestIgnoredState.java index f2363a236b46..f19c59a5a2fb 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/states/TestIgnoredState.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/states/TestIgnoredState.java @@ -33,7 +33,7 @@ public class TestIgnoredState extends AbstractState { myText = null; } else { - myText = CompositePrintable.NEW_LINE + ignoredMsg; + myText = CompositePrintable.NEW_LINE + ignoredMsg + CompositePrintable.NEW_LINE; } myStacktrace = stackTrace == null ? null : stackTrace + CompositePrintable.NEW_LINE; } diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java index 2d58845ae008..4a638a9149c8 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java @@ -394,11 +394,11 @@ public class SMTRunnerConsoleTest extends BaseSMTRunnerTestCase { myEventsProcessor.onTestOutput(new TestOutputEvent("my_test", "stdout1 ", true)); myEventsProcessor.onTestOutput(new TestOutputEvent("my_test", "stderr1 ", false)); - assertAllOutputs(myMockResettablePrinter, "stdout1 ", "stderr1 ", "\nignored msg"); + assertAllOutputs(myMockResettablePrinter, "stdout1 ", "stderr1 ", "\nignored msg\n"); final MockPrinter mockPrinter1 = new MockPrinter(true); mockPrinter1.onNewAvailable(myTest1); - assertAllOutputs(mockPrinter1, "stdout1 ", "stderr1 ", "\nignored msg"); + assertAllOutputs(mockPrinter1, "stdout1 ", "stderr1 ", "\nignored msg\n"); //other output order final SMTestProxy myTest2 = startTestWithPrinter("my_test2"); @@ -406,10 +406,10 @@ public class SMTRunnerConsoleTest extends BaseSMTRunnerTestCase { myEventsProcessor.onTestOutput(new TestOutputEvent("my_test2", "stderr1 ", false)); myEventsProcessor.onTestIgnored(new TestIgnoredEvent("my_test2", "ignored msg", null)); - assertAllOutputs(myMockResettablePrinter, "stdout1 ", "stderr1 ", "\nignored msg"); + assertAllOutputs(myMockResettablePrinter, "stdout1 ", "stderr1 ", "\nignored msg\n"); final MockPrinter mockPrinter2 = new MockPrinter(true); mockPrinter2.onNewAvailable(myTest2); - assertAllOutputs(mockPrinter2, "stdout1 ", "stderr1 ", "\nignored msg"); + assertAllOutputs(mockPrinter2, "stdout1 ", "stderr1 ", "\nignored msg\n"); } public void testProcessor_OnIgnored_WithStacktrace() { @@ -421,14 +421,14 @@ public class SMTRunnerConsoleTest extends BaseSMTRunnerTestCase { assertAllOutputs(myMockResettablePrinter, "stdout1 ", "\nmethod1:1\nmethod2:2\nstderr1 ", - "\nignored2 msg"); + "\nignored2 msg\n"); final MockPrinter mockPrinter1 = new MockPrinter(true); mockPrinter1.onNewAvailable(myTest1); assertAllOutputs(mockPrinter1, "stdout1 ", "stderr1 \nmethod1:1\nmethod2:2\n", - "\nignored2 msg"); + "\nignored2 msg\n"); //other output order final SMTestProxy myTest2 = startTestWithPrinter("my_test2"); @@ -439,13 +439,13 @@ public class SMTRunnerConsoleTest extends BaseSMTRunnerTestCase { assertAllOutputs(myMockResettablePrinter, "stdout1 ", "stderr1 \nmethod1:1\nmethod2:2\n", - "\nignored msg"); + "\nignored msg\n"); final MockPrinter mockPrinter2 = new MockPrinter(true); mockPrinter2.onNewAvailable(myTest2); assertAllOutputs(mockPrinter2, "stdout1 ", "stderr1 \nmethod1:1\nmethod2:2\n", - "\nignored msg"); + "\nignored msg\n"); } public void testOnUncapturedOutput_BeforeProcessStarted() { From 2428e128faa1aa26cfa2b78c03fe63fce8ef854d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 17:21:39 +0300 Subject: [PATCH 2/9] move: don't create UsageInfo for non-physical elements (IDEA-161228) --- .../MoveClassesOrPackagesProcessor.java | 48 +++---------------- .../PackageLocalsUsageCollector.java | 3 +- 2 files changed, 8 insertions(+), 43 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index ff604e7896ef..4fe261b153de 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -49,7 +49,6 @@ import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; @@ -73,6 +72,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { protected @NotNull final MoveDestination myMoveDestination; protected NonCodeUsageInfo[] myNonCodeUsages; private boolean myOpenInEditor; + private MultiMap myConflicts; public MoveClassesOrPackagesProcessor(Project project, PsiElement[] elements, @@ -159,7 +159,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { protected UsageInfo[] findUsages() { final List allUsages = new ArrayList<>(); final List usagesToSkip = new ArrayList<>(); - MultiMap conflicts = new MultiMap<>(); + myConflicts = new MultiMap<>(); for (PsiElement element : myElementsToMove) { String newName = getNewQName(element); if (newName == null) continue; @@ -179,17 +179,11 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } } } - myMoveDestination.analyzeModuleConflicts(Arrays.asList(myElementsToMove), conflicts, + myMoveDestination.analyzeModuleConflicts(Arrays.asList(myElementsToMove), myConflicts, allUsages.toArray(new UsageInfo[allUsages.size()])); final UsageInfo[] usageInfos = allUsages.toArray(new UsageInfo[allUsages.size()]); - detectPackageLocalsMoved(usageInfos, conflicts); - detectPackageLocalsUsed(conflicts); - if (!conflicts.isEmpty()) { - for (PsiElement element : conflicts.keySet()) { - allUsages.add(new ConflictsUsageInfo(element, conflicts.get(element))); - } - } - + detectPackageLocalsMoved(usageInfos, myConflicts); + detectPackageLocalsUsed(myConflicts); allUsages.removeAll(usagesToSkip); return UsageViewUtil.removeDuplicatedUsages(allUsages.toArray(new UsageInfo[allUsages.size()])); } @@ -206,19 +200,6 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { myOpenInEditor = openInEditor; } - protected static class ConflictsUsageInfo extends UsageInfo { - private final Collection myConflicts; - - public ConflictsUsageInfo(PsiElement pseudoElement, Collection conflicts) { - super(pseudoElement); - myConflicts = conflicts; - } - - public Collection getConflicts() { - return myConflicts; - } - } - @Nullable @Override protected String getRefactoringId() { @@ -244,21 +225,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { protected boolean preprocessUsages(@NotNull Ref refUsages) { final UsageInfo[] usages = refUsages.get(); - final MultiMap conflicts = new MultiMap<>(); - ArrayList filteredUsages = new ArrayList<>(); - for (UsageInfo usage : usages) { - if (usage instanceof ConflictsUsageInfo) { - final ConflictsUsageInfo info = (ConflictsUsageInfo)usage; - final PsiElement element = info.getElement(); - conflicts.putValues(element, info.getConflicts()); - } - else { - filteredUsages.add(usage); - } - } - - refUsages.set(filteredUsages.toArray(new UsageInfo[filteredUsages.size()])); - return showConflicts(conflicts, usages); + return showConflicts(myConflicts, usages); } private boolean isInsideMoved(PsiElement place) { @@ -295,8 +262,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { if (!movedClasses.contains(aClass)) { movedClasses.add(aClass); } - String visibility = VisibilityUtil.getVisibilityModifier(aClass.getModifierList()); - if (PsiModifier.PACKAGE_LOCAL.equals(visibility)) { + if (aClass != null && aClass.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) { if (PsiTreeUtil.getParentOfType(element, PsiImportStatement.class) != null) continue; PsiElement container = ConflictsUtil.getContainer(element); HashSet reported = reportedClassToContainers.get(aClass); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java index 27d07d15bd06..ad74be8cd85e 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java @@ -53,8 +53,7 @@ class PackageLocalsUsageCollector extends JavaRecursiveElementWalkingVisitor { private void visitResolvedReference(PsiElement resolved, PsiJavaCodeReferenceElement reference) { if (resolved instanceof PsiModifierListOwner) { - final PsiModifierList modifierList = ((PsiModifierListOwner)resolved).getModifierList(); - if (PsiModifier.PACKAGE_LOCAL.equals(VisibilityUtil.getVisibilityModifier(modifierList))) { + if (((PsiModifierListOwner)resolved).hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) { PsiFile aFile = resolved.getContainingFile(); if (aFile != null && !isInsideMoved(resolved)) { final PsiDirectory containingDirectory = aFile.getContainingDirectory(); From 10c23747ee38dd0c09b7d662368868557dc13360 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 17:32:28 +0300 Subject: [PATCH 3/9] inline: limit occurrences search for project files --- .../com/intellij/refactoring/inline/InlineOptionsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java b/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java index 827808cf0f4c..1175ca1452b8 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java @@ -133,7 +133,7 @@ public abstract class InlineOptionsDialog extends RefactoringDialog implements I final String name = nameIdentifierOwner.getName(); final boolean isCheapToSearch = name != null && searchHelper.isCheapEnoughToSearch(name, scope, null, progressManager.getProgressIndicator()) != PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES; - return isCheapToSearch ? ReferencesSearch.search(nameIdentifierOwner).findAll().size() : - 1; + return isCheapToSearch ? ReferencesSearch.search(nameIdentifierOwner, scope).findAll().size() : - 1; } } From 8e0f0522d3b20511a96e45993acaa7466fd74b56 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 17:58:36 +0300 Subject: [PATCH 4/9] inline method: serach for usages inside project only, allow to inline all refs in the project (IDEA-161203) --- .../intellij/refactoring/inline/InlineMethodDialog.java | 9 ++++++--- .../refactoring/inline/InlineMethodProcessor.java | 7 ++++--- .../intellij/refactoring/inline/InlineOptionsDialog.java | 6 +++++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodDialog.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodDialog.java index 83ada1807a2f..9d632cd26ece 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodDialog.java @@ -51,6 +51,11 @@ public class InlineMethodDialog extends InlineOptionsWithSearchSettingsDialog { init(); } + @Override + protected boolean allowInlineAll() { + return true; + } + @Override protected String getNameLabelText() { String methodText = PsiFormatUtil.formatMethod(myMethod, @@ -72,9 +77,7 @@ public class InlineMethodDialog extends InlineOptionsWithSearchSettingsDialog { @Override protected String getInlineAllText() { final String occurrencesString = myOccurrencesNumber > -1 ? " (" + myOccurrencesNumber + " occurrence" + (myOccurrencesNumber == 1 ? ")" : "s)") : ""; - return (myMethod.isWritable() - ? RefactoringBundle.message("all.invocations.and.remove.the.method") - : RefactoringBundle.message("all.invocations.in.project")) + occurrencesString; + return (RefactoringBundle.message(myMethod.isWritable() ? "all.invocations.and.remove.the.method" : "all.invocations.in.project")) + occurrencesString; } @Override diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index a9145b3bf604..37c292fa0732 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -132,11 +132,12 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { if (myReference != null) { usages.add(new UsageInfo(myReference)); } - for (PsiReference reference : ReferencesSearch.search(myMethod)) { + GlobalSearchScope searchScope = GlobalSearchScope.projectScope(myProject); + for (PsiReference reference : ReferencesSearch.search(myMethod, searchScope)) { usages.add(new UsageInfo(reference.getElement())); } - OverridingMethodsSearch.search(myMethod, false).forEach(method -> { + OverridingMethodsSearch.search(myMethod, searchScope, false).forEach(method -> { if (AnnotationUtil.isAnnotated(method, Override.class.getName(), false)) { usages.add(new UsageInfo(method)); } @@ -159,7 +160,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { if (mySearchForTextOccurrences) { String stringToSearch = ElementDescriptionUtil.getElementDescription(myMethod, NonCodeSearchDescriptionLocation.NON_JAVA); TextOccurrencesUtil - .addTextOccurences(myMethod, stringToSearch, GlobalSearchScope.projectScope(myProject), usages, infoFactory); + .addTextOccurences(myMethod, stringToSearch, searchScope, usages, infoFactory); } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java b/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java index 1175ca1452b8..211ee8a6e3b2 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java @@ -75,7 +75,7 @@ public abstract class InlineOptionsDialog extends RefactoringDialog implements I new RadioUpDownListener(myRbInlineAll, myRbInlineThisOnly); myRbInlineThisOnly.setEnabled(myInvokedOnReference); - final boolean writable = myElement.isWritable(); + final boolean writable = allowInlineAll(); myRbInlineAll.setEnabled(writable); if(myInvokedOnReference) { if (canInlineThisOnly()) { @@ -112,6 +112,10 @@ public abstract class InlineOptionsDialog extends RefactoringDialog implements I return optionsPanel; } + protected boolean allowInlineAll() { + return myElement.isWritable(); + } + protected abstract String getNameLabelText(); protected abstract String getBorderTitle(); protected abstract String getInlineAllText(); From 7f76d7a1012000df8d577e5f5fc9c7b63f36b21f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 19:07:32 +0300 Subject: [PATCH 5/9] turn refs to super: ensure cls super classes are processed (IDEA-160913) --- .../turnRefsToSuper/TurnRefsToSuperProcessorBase.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java index 027bfa5182f4..9352ed5e62d8 100644 --- a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java +++ b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java @@ -358,11 +358,10 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces final LocalSearchScope derivedScope = new LocalSearchScope(inheritingClass); final PsiSubstitutor substitutor = TypeConversionUtil.getClassSubstitutor(ownerClass, inheritingClass, PsiSubstitutor.EMPTY); if (substitutor == null) return; - final LocalSearchScope baseScope = new LocalSearchScope(ownerClass); - ReferencesSearch.search(typeParameter, baseScope).forEach(ref -> { - final PsiElement element = ref.getElement(); - final PsiElement parent = element.getParent(); - if (parent instanceof PsiTypeElement) { + ownerClass.accept(new JavaRecursiveElementVisitor() { + @Override + public void visitTypeElement(PsiTypeElement parent) { + super.visitTypeElement(parent); final PsiElement pparent = parent.getParent(); if (pparent instanceof PsiMethod && parent.equals(((PsiMethod)pparent).getReturnTypeElement())) { final PsiMethod method = (PsiMethod)pparent; @@ -393,8 +392,6 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces } } } - - return true; }); } } From ca0109df460c1886166228ca8ae77c3b63e70bc3 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 20:01:37 +0300 Subject: [PATCH 6/9] extract constant: allow class-constants to be used from enum constant initializer outside argument list (IDEA-161237) --- .../introduceField/BaseExpressionToFieldHandler.java | 3 ++- .../FromEnumConstantInitializer2.java | 9 +++++++++ .../FromEnumConstantInitializer2_after.java | 10 ++++++++++ .../intellij/refactoring/IntroduceConstantTest.java | 6 ++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2.java create mode 100644 java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index 8d8599cfbd13..00dd78459d44 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -737,7 +737,8 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase } PsiMember anchorMember = finalAnchorElement instanceof PsiMember ? (PsiMember)finalAnchorElement : null; - if (anchorMember instanceof PsiEnumConstant && destClass == anchorMember.getContainingClass()) { + if (anchorMember instanceof PsiEnumConstant && destClass == anchorMember.getContainingClass() && + PsiTreeUtil.isAncestor(((PsiEnumConstant)anchorMember).getArgumentList(), initializer, false)) { final String initialName = "Constants"; String constantsClassName = initialName; diff --git a/java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2.java b/java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2.java new file mode 100644 index 000000000000..ff6407f3e96c --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2.java @@ -0,0 +1,9 @@ + +enum Foo { + + FOO1 { + public String bar() { + return "bar"; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2_after.java b/java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2_after.java new file mode 100644 index 000000000000..bc8c7b8eb1b9 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/FromEnumConstantInitializer2_after.java @@ -0,0 +1,10 @@ + +enum Foo { + + FOO1 { + public String bar() { + return xxx; + } + }; + public static final String xxx = "bar"; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java index c2edd708904d..0849a773e2d8 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java @@ -48,6 +48,12 @@ public class IntroduceConstantTest extends LightCodeInsightTestCase { checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); } + public void testFromEnumConstantInitializer2() throws Exception { + configureByFile(BASE_PATH + getTestName(false) + ".java"); + new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), getFile(), null); + checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); + } + public void testEnumConstant() throws Exception { doTest(true); } From e2e3d947119bd3eded682bdf2c90e14b76443fd2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 20:37:43 +0300 Subject: [PATCH 7/9] provide accessibility fixes for problems inside annotations (IDEA-148864) --- .../analysis/AnnotationsHighlightUtil.java | 5 ++-- .../ClassObjectAccessibility.java | 2 +- .../makePublic/afterInnerInAnnotation.java | 12 ++++++++++ .../makePublic/beforeInnerInAnnotation.java | 12 ++++++++++ .../quickFix/AccessibilityFixesTest.java | 24 +++++++++++++++++++ 5 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/afterInnerInAnnotation.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/beforeInnerInAnnotation.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AccessibilityFixesTest.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java index ca0bdef14229..c847534a7de1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java @@ -465,7 +465,7 @@ public class AnnotationsHighlightUtil { final PsiTypeElement operand = expression.getOperand(); final PsiClass classType = PsiUtil.resolveClassInType(operand.getType()); if (classType != null) { - checkAccessibility(expression, classType, HighlightUtil.formatClass(classType)); + checkAccessibility(operand.getInnermostComponentReferenceElement(), classType, HighlightUtil.formatClass(classType)); } } @@ -478,7 +478,7 @@ public class AnnotationsHighlightUtil { } } - private void checkAccessibility(PsiExpression expression, PsiMember resolve, String memberString) { + private void checkAccessibility(PsiJavaCodeReferenceElement expression, PsiMember resolve, String memberString) { if (resolve.hasModifierProperty(PsiModifier.PRIVATE) && PsiTreeUtil.isAncestor(parent, resolve, true)) { String description = JavaErrorMessages.message("private.symbol", @@ -486,6 +486,7 @@ public class AnnotationsHighlightUtil { HighlightUtil.formatClass((PsiClass)parent)); infos[0] = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(description).create(); + HighlightUtil.registerAccessQuickFixAction(resolve, expression, infos[0], null); } } }); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java index de912bc9cd05..929b107d53f6 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java @@ -1,4 +1,4 @@ -@SomeAnnotation(Foo.Bar.class) +@SomeAnnotation(Foo.Bar.class) public class Foo{ private static class Bar { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/afterInnerInAnnotation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/afterInnerInAnnotation.java new file mode 100644 index 000000000000..ca28bcbb0af9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/afterInnerInAnnotation.java @@ -0,0 +1,12 @@ +// "Make 'Inner' protected" "true" +@MyAnnotation(Outer.Inner.class) +public class Outer { + + protected static class Inner { + + } +} + +@interface MyAnnotation { + Class value(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/beforeInnerInAnnotation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/beforeInnerInAnnotation.java new file mode 100644 index 000000000000..aedf91b21f49 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/makePublic/beforeInnerInAnnotation.java @@ -0,0 +1,12 @@ +// "Make 'Inner' protected" "true" +@MyAnnotation(Outer.Inner.class) +public class Outer { + + private static class Inner { + + } +} + +@interface MyAnnotation { + Class value(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AccessibilityFixesTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AccessibilityFixesTest.java new file mode 100644 index 000000000000..9f7981c03ee7 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AccessibilityFixesTest.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2016 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.codeInsight.daemon.quickFix; + +public class AccessibilityFixesTest extends LightQuickFixParameterizedTestCase { + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/makePublic"; + } +} From d01a0823e727484f7bc1d2319bffabb82709266c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Sep 2016 21:26:09 +0300 Subject: [PATCH 8/9] tests: hide auto test delay for java configurations which are compiler based --- .../intellij/execution/JavaTestFrameworkRunnableState.java | 5 +++++ .../autotest/AdjustAutotestDelayActionGroup.java | 2 +- .../testframework/autotest/ToggleAutoTestAction.java | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java index 5e766ddcc5cc..f46e857e71b4 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -175,6 +175,11 @@ public abstract class JavaTestFrameworkRunnableState Date: Thu, 15 Sep 2016 10:42:44 +0300 Subject: [PATCH 9/9] junit 5: filter by tag --- .../intellij/junit5/JUnit5TestRunnerUtil.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java index f993398bca9a..b486868f81ad 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java @@ -19,6 +19,7 @@ import org.junit.platform.commons.util.AnnotationUtils; import org.junit.platform.engine.DiscoverySelector; import org.junit.platform.engine.discovery.DiscoverySelectors; import org.junit.platform.launcher.LauncherDiscoveryRequest; +import org.junit.platform.launcher.TagFilter; import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder; import java.io.BufferedReader; @@ -27,6 +28,10 @@ import java.io.IOException; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; public class JUnit5TestRunnerUtil { @@ -48,8 +53,7 @@ public class JUnit5TestRunnerUtil { final String packageName = reader.readLine(); if (packageName == null) return null; - //todo category? - reader.readLine(); + String tagName = reader.readLine(); String line; List selectors = new ArrayList<>(); @@ -57,8 +61,12 @@ public class JUnit5TestRunnerUtil { selectors.add(createSelector(line)); } packageNameRef[0] = packageName.length() == 0 ? "" : packageName; - return (selectors.isEmpty() ? builder.selectors(DiscoverySelectors.selectPackage(packageName)) - : builder.selectors(selectors)).build(); + builder = selectors.isEmpty() ? builder.selectors(DiscoverySelectors.selectPackage(packageName)) + : builder.selectors(selectors); + if (tagName != null && !tagName.isEmpty()) { + builder = builder.filters(TagFilter.includeTags(tagName)); + } + return builder.build(); } finally { reader.close(); @@ -74,6 +82,7 @@ public class JUnit5TestRunnerUtil { if (disableDisabledCondition) { builder = builder.configurationParameter("junit.conditions.deactivate", "org.junit.*DisabledCondition"); } + return builder.selectors(createSelector(suiteClassNames[0])).build(); }