From 094d0b26fe6addfe0e9427921ad38e43c593a4b9 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Sun, 14 May 2017 08:10:10 +0200 Subject: [PATCH 1/5] Stray swap file in intellij-community (IDEA-172846) --- .../AmbigousParm2/src/.AmbigousParm2.java.swp | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 java/java-tests/testData/inspection/redundantCast/AmbigousParm2/src/.AmbigousParm2.java.swp diff --git a/java/java-tests/testData/inspection/redundantCast/AmbigousParm2/src/.AmbigousParm2.java.swp b/java/java-tests/testData/inspection/redundantCast/AmbigousParm2/src/.AmbigousParm2.java.swp deleted file mode 100644 index 17471d1ee90b7fdc8399d3a270061fdc695a97b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&%}?7f7zS{|h1wTv};LD3f-Xpi0Yy0}>Kq_cyLL862mwogP4A|2nTj zCoxsP8T43s+UBw2D8FNq`tax3IejliO2(#Af5Iu3>7Iu_O^ zuUrKM1R(I7z_+8(;lchM?QCB?w*)-|AOHafKmY;|fB*y_@Jz3j+cWfB*y_009U<00Izz00bZafp;RnGkNC!L8&hv<%Z<>fBp|(EWcmM zUzxv`u;fxQk&Gk$3y{0uX=z1Rwwb2tWV=5P$##An+Ch{wN~qKZu&apc?Y< zN3Mt}Vmc;i^s?xuedpZ26@8%}kLF$Ntfob4XQbIV69!Y#L%LIWx4v!$6RM@@ueNOD wB7L(wT|17Ep1cyzjY%ftT^^^VWShA&jqyp=eWgj>PUSc9!!Oom<+#f85AG#*o&W#< From 18e81c7127259e2c873fbfc6e95a2aa9a9ba9227 Mon Sep 17 00:00:00 2001 From: Alexander Koshevoy Date: Sun, 14 May 2017 09:47:30 +0300 Subject: [PATCH 2/5] CommunityProjectConsistencyTest test fail fixed "CommunityProjectConsistencyTest.common libraries have the same roots" test fail fixed. --- .idea/libraries/jsch_agent_proxy.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/.idea/libraries/jsch_agent_proxy.xml b/.idea/libraries/jsch_agent_proxy.xml index e3675a6d4608..5ec46680ffb8 100644 --- a/.idea/libraries/jsch_agent_proxy.xml +++ b/.idea/libraries/jsch_agent_proxy.xml @@ -7,6 +7,7 @@ + From ac13cb0cc4aa7dbe6213a9dad73d718b7e819ce2 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Sat, 13 May 2017 19:14:18 +0300 Subject: [PATCH 3/5] javadoc --- .../src/com/intellij/util/containers/PeekableIterator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/containers/PeekableIterator.java b/platform/util/src/com/intellij/util/containers/PeekableIterator.java index 563d4ce643e3..780c06cfc112 100644 --- a/platform/util/src/com/intellij/util/containers/PeekableIterator.java +++ b/platform/util/src/com/intellij/util/containers/PeekableIterator.java @@ -20,9 +20,13 @@ import java.util.NoSuchElementException; /** * An iterator with additional ability to {@link #peek()} the current element without moving the cursor. - * Upon creation, {@link #peek()} returns the first element, after {@link #hasNext()} returns false might throw {@link NoSuchElementException}. */ public interface PeekableIterator extends Iterator { + /** + * @return the current element. + * Upon iterator creation should return the first element. + * After {@link #hasNext()} returned false might throw {@link NoSuchElementException}. + */ T peek() throws NoSuchElementException; PeekableIterator EMPTY = new PeekableIterator() { From e53e3338ce40751e86cbc4961b5674fee91160c3 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Sun, 14 May 2017 14:33:07 +0300 Subject: [PATCH 4/5] Yes/No dialogs considered harmful, provide more immediate and descriptive button texts instead (for the most blatant bloopers) --- .../ui/header/InspectionProfileSchemesPanel.java | 7 ++++--- .../testframework/export/ExportTestResultsAction.java | 10 +++++----- .../openapi/diff/impl/patch/formove/PathsVerifier.java | 8 +++++--- .../vcs/changes/patch/CreatePatchCommitExecutor.java | 4 +++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/InspectionProfileSchemesPanel.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/InspectionProfileSchemesPanel.java index ceb80624db82..d7bee78e7bc0 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/InspectionProfileSchemesPanel.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/InspectionProfileSchemesPanel.java @@ -157,9 +157,10 @@ public class InspectionProfileSchemesPanel extends AbstractDescriptionAwareSchem } final SingleInspectionProfilePanel existed = InspectionProfileSchemesPanel.this.getModel().getProfilePanel(profile); if (existed != null) { - if (Messages.showOkCancelDialog(myProject, "Profile with name \'" + - profile.getName() + - "\' already exists. Do you want to overwrite it?", "Warning", + if (Messages.showOkCancelDialog(myProject, "Profile with name \'" + profile.getName() + + "\' already exists. Do you want to overwrite it?", + "Overwrite Warning", + "Overwrite", "Cancel", Messages.getInformationIcon()) != Messages.OK) { return; } diff --git a/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java b/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java index bc4a0f9c98ba..3bd78524e06f 100644 --- a/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java +++ b/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java @@ -116,11 +116,11 @@ public class ExportTestResultsAction extends DumbAwareAction { } filename = d.getFileName(); showDialog = getOutputFile(config, project, filename).exists() - && Messages.showOkCancelDialog( - project, - ExecutionBundle.message("export.test.results.file.exists.message", filename), - ExecutionBundle.message("export.test.results.file.exists.title"), - Messages.getQuestionIcon() + && Messages.showOkCancelDialog(project, + ExecutionBundle.message("export.test.results.file.exists.message", filename), + ExecutionBundle.message("export.test.results.file.exists.title"), + "Overwrite", "Cancel", + Messages.getQuestionIcon() ) != Messages.OK; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PathsVerifier.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PathsVerifier.java index 70b0c5993586..b9278a6fa981 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PathsVerifier.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PathsVerifier.java @@ -637,11 +637,13 @@ public class PathsVerifier { final List result = new LinkedList<>(); if (! myOverrideExisting.isEmpty()) { final String title = "Overwrite Existing Files"; - final Collection selected = AbstractVcsHelper.getInstance(myProject).selectFilePathsToProcess( - new ArrayList<>(myOverrideExisting.keySet()), title, + List files = new ArrayList<>(myOverrideExisting.keySet()); + Collection selected = AbstractVcsHelper.getInstance(myProject).selectFilePathsToProcess( + files, title, "\nThe following files should be created by patch, but they already exist.\nDo you want to overwrite them?\n", title, "The following file should be created by patch, but it already exists.\nDo you want to overwrite it?\n{0}", - VcsShowConfirmationOption.STATIC_SHOW_CONFIRMATION); + VcsShowConfirmationOption.STATIC_SHOW_CONFIRMATION, + "Overwrite", "Cancel"); if (selected != null) { for (FilePath path : selected) { myOverrideExisting.remove(path); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java index b2aa755f6fce..28781af8177f 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java @@ -157,7 +157,9 @@ public class CreatePatchCommitExecutor extends LocalCommitExecutor implements Pr WaitForProgressToShow.runOrInvokeAndWaitAboveProgress( () -> result[0] = Messages.showYesNoDialog(myProject, "File " + file.getName() + " (" + file.getParent() + ")" + " already exists.\nDo you want to overwrite it?", - CommonBundle.getWarningTitle(), Messages.getWarningIcon())); + CommonBundle.getWarningTitle(), + "Overwrite", "Cancel", + Messages.getWarningIcon())); if (Messages.NO == result[0]) return; } if (file.getParentFile() == null) { From a0a41eca6ea774ce07eaeae42c09fa695f89729f Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sun, 14 May 2017 20:34:58 +0200 Subject: [PATCH 5/5] IG: don't warn when listener methods are default or adapater is deprecated (IDEA-172852) --- .../ListenerMayUseAdapterInspection.java | 91 ++++++++----------- .../ListenerMayUseAdapter.java | 67 ++++++++++++++ .../ListenerMayUseAdapterInspectionTest.java | 36 ++++++++ 3 files changed, 143 insertions(+), 51 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/listener_may_use_adapter/ListenerMayUseAdapter.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspection.java index c33989298539..6c5c7d736e83 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2009-2015 Bas Leijdekkers + * Copyright 2009-2017 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -49,8 +48,7 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { protected String buildErrorString(Object... infos) { final PsiClass aClass = (PsiClass)infos[0]; final String className = aClass.getName(); - final PsiClass adapterClass = (PsiClass)infos[1]; - final String adapterName = adapterClass.getName(); + final String adapterName = (String)infos[1]; return InspectionGadgetsBundle.message( "listener.may.use.adapter.problem.descriptor", className, adapterName); @@ -58,31 +56,28 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { @Override public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( - "listener.may.use.adapter.emtpy.methods.option"), this, + return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message("listener.may.use.adapter.emtpy.methods.option"), this, "checkForEmptyMethods"); } @Override protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiClass adapterClass = (PsiClass)infos[1]; - return new ListenerMayUseAdapterFix(adapterClass); + final String adapterName = (String)infos[1]; + return new ListenerMayUseAdapterFix(adapterName); } private static class ListenerMayUseAdapterFix extends InspectionGadgetsFix { - private final PsiClass adapterClass; + private final String adapterName; - ListenerMayUseAdapterFix(@NotNull PsiClass adapterClass) { - this.adapterClass = adapterClass; + ListenerMayUseAdapterFix(@NotNull String adapterName) { + this.adapterName = adapterName; } @Override @NotNull public String getName() { - return InspectionGadgetsBundle.message( - "listener.may.use.adapter.quickfix", - adapterClass.getName()); + return InspectionGadgetsBundle.message("listener.may.use.adapter.quickfix", adapterName); } @NotNull @@ -92,12 +87,9 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiJavaCodeReferenceElement element = - (PsiJavaCodeReferenceElement)descriptor.getPsiElement(); - final PsiClass aClass = PsiTreeUtil.getParentOfType(element, - PsiClass.class); + protected void doFix(Project project, ProblemDescriptor descriptor) { + final PsiJavaCodeReferenceElement element = (PsiJavaCodeReferenceElement)descriptor.getPsiElement(); + final PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); if (aClass == null) { return; } @@ -124,10 +116,11 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { } element.delete(); final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory elementFactory = - psiFacade.getElementFactory(); - final PsiJavaCodeReferenceElement referenceElement = - elementFactory.createClassReferenceElement(adapterClass); + final PsiClass adapterClass = psiFacade.findClass(adapterName, aClass.getResolveScope()); + if (adapterClass == null) { + return; + } + final PsiJavaCodeReferenceElement referenceElement = psiFacade.getElementFactory().createClassReferenceElement(adapterClass); extendsList.add(referenceElement); } } @@ -145,8 +138,7 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { if (extendsList == null) { return; } - final PsiJavaCodeReferenceElement[] extendsReferences = - extendsList.getReferenceElements(); + final PsiJavaCodeReferenceElement[] extendsReferences = extendsList.getReferenceElements(); if (extendsReferences.length > 0) { return; } @@ -154,17 +146,13 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { if (implementsList == null) { return; } - final PsiJavaCodeReferenceElement[] implementsReferences = - implementsList.getReferenceElements(); - for (PsiJavaCodeReferenceElement implementsReference : - implementsReferences) { + final PsiJavaCodeReferenceElement[] implementsReferences = implementsList.getReferenceElements(); + for (PsiJavaCodeReferenceElement implementsReference : implementsReferences) { checkReference(aClass, implementsReference); } } - private void checkReference( - @NotNull PsiClass aClass, - @NotNull PsiJavaCodeReferenceElement implementsReference) { + private void checkReference(@NotNull PsiClass aClass, @NotNull PsiJavaCodeReferenceElement implementsReference) { final PsiElement target = implementsReference.resolve(); if (!(target instanceof PsiClass)) { return; @@ -174,33 +162,34 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { if (className == null || !className.endsWith("Listener")) { return; } - final String adapterName = className.substring(0, - className.length() - 8) + "Adapter"; - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance( - aClass.getProject()); - final GlobalSearchScope scope = - implementsClass.getResolveScope(); - final PsiClass adapterClass = psiFacade.findClass(adapterName, - scope); - if (adapterClass == null) { + final PsiMethod[] interfaceMethods = implementsClass.getMethods(); + if (interfaceMethods.length < 2) { return; } - if (aClass.equals(adapterClass)) { + boolean allDefault = true; + for (PsiMethod interfaceMethod : interfaceMethods) { + if (!interfaceMethod.hasModifierProperty(PsiModifier.DEFAULT)) { + allDefault = false; + break; + } + } + if (allDefault) { return; } - if (!adapterClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + final String adapterName = className.substring(0, className.length() - 8) + "Adapter"; + final GlobalSearchScope scope = implementsClass.getResolveScope(); + final PsiClass adapterClass = JavaPsiFacade.getInstance(aClass.getProject()).findClass(adapterName, scope); + if (adapterClass == null || adapterClass.equals(aClass) || !adapterClass.hasModifierProperty(PsiModifier.ABSTRACT) || + adapterClass.isDeprecated()) { return; } - final PsiReferenceList implementsList = - adapterClass.getImplementsList(); + final PsiReferenceList implementsList = adapterClass.getImplementsList(); if (implementsList == null) { return; } - final PsiJavaCodeReferenceElement[] referenceElements = - implementsList.getReferenceElements(); + final PsiJavaCodeReferenceElement[] referenceElements = implementsList.getReferenceElements(); boolean adapterImplementsListener = false; - for (PsiJavaCodeReferenceElement referenceElement : - referenceElements) { + for (PsiJavaCodeReferenceElement referenceElement : referenceElements) { final PsiElement implementsTarget = referenceElement.resolve(); if (!implementsClass.equals(implementsTarget)) { continue; @@ -229,7 +218,7 @@ public class ListenerMayUseAdapterInspection extends BaseInspection { return; } } - registerError(implementsReference, aClass, adapterClass); + registerError(implementsReference, aClass, adapterName); } } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/listener_may_use_adapter/ListenerMayUseAdapter.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/listener_may_use_adapter/ListenerMayUseAdapter.java new file mode 100644 index 000000000000..fdfcc5b47e35 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/listener_may_use_adapter/ListenerMayUseAdapter.java @@ -0,0 +1,67 @@ +class ListenerMayUseAdapter implements Listener { + + @Override + public void one() { + } +} +class ListenerMayUseAdapter2 implements MyListener { + + @Override + public void one() { + + } + + @Override + public void two() { + + } +} +class ListenerMayUseAdapter3 implements GoodListener { + @Override + public void one() { + } + + @Override + public void two() { + } +} +interface Listener { + default void one() {} + default void two() {} +} +abstract class Adapter implements Listener { + @Override + public void one() { + } + + @Override + public void two() { + } +} +interface MyListener { + void one(); + void two(); +} +@Deprecated +abstract class MyAdapter implements MyListener { + @Override + public void one() { + } + + @Override + public void two() { + } +} +interface GoodListener { + void one(); + void two(); +} +abstract class GoodAdapter implements GoodListener { + @Override + public void one() { + } + + @Override + public void two() { + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspectionTest.java new file mode 100644 index 000000000000..0fb97de6cab1 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/ListenerMayUseAdapterInspectionTest.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2017 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.siyeh.ig.classlayout; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class ListenerMayUseAdapterInspectionTest extends LightInspectionTestCase { + + public void testListenerMayUseAdapter() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new ListenerMayUseAdapterInspection(); + } +} \ No newline at end of file