From 2edcf0554497217df7238438bda99d56a9ec9d40 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 19 Aug 2016 09:54:01 +0200 Subject: [PATCH] remove IDEA-146300 (An inspection to report StubBasedPsiElementBase inheritors with default getParent implementation), now obsolete because of IDEA-156609 --- plugins/devkit/resources/META-INF/plugin.xml | 6 - .../StubBasedPsiElementBaseGetParent.html | 5 - ...asedPsiElementBaseGetParentInspection.java | 142 ------------------ ...PsiElementBaseGetParentInspectionTest.java | 81 ---------- 4 files changed, 234 deletions(-) delete mode 100644 plugins/devkit/resources/inspectionDescriptions/StubBasedPsiElementBaseGetParent.html delete mode 100644 plugins/devkit/src/inspections/StubBasedPsiElementBaseGetParentInspection.java delete mode 100644 plugins/devkit/testSources/inspections/StubBasedPsiElementBaseGetParentInspectionTest.java diff --git a/plugins/devkit/resources/META-INF/plugin.xml b/plugins/devkit/resources/META-INF/plugin.xml index 94397dfe351f..d6bde729eb1a 100644 --- a/plugins/devkit/resources/META-INF/plugin.xml +++ b/plugins/devkit/resources/META-INF/plugin.xml @@ -92,12 +92,6 @@ enabledByDefault="true" level="WARNING" implementationClass="org.jetbrains.idea.devkit.inspections.ExtensionPointBeanClassInspection"/> - - -Checks StubBasedPsiElementBase inheritors not overriding getParent(). - - \ No newline at end of file diff --git a/plugins/devkit/src/inspections/StubBasedPsiElementBaseGetParentInspection.java b/plugins/devkit/src/inspections/StubBasedPsiElementBaseGetParentInspection.java deleted file mode 100644 index 6be8b9844688..000000000000 --- a/plugins/devkit/src/inspections/StubBasedPsiElementBaseGetParentInspection.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * 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 org.jetbrains.idea.devkit.inspections; - -import com.intellij.codeInsight.generation.GenerateMembersUtil; -import com.intellij.codeInsight.generation.OverrideImplementUtil; -import com.intellij.codeInsight.generation.PsiGenerationInfo; -import com.intellij.codeInspection.InspectionManager; -import com.intellij.codeInspection.LocalQuickFixOnPsiElement; -import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.codeInspection.ProblemHighlightType; -import com.intellij.extapi.psi.StubBasedPsiElementBase; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.ReadonlyStatusHandler; -import com.intellij.psi.*; -import com.intellij.psi.impl.light.LightMethodBuilder; -import com.intellij.psi.util.InheritanceUtil; -import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.util.ObjectUtils; -import com.intellij.util.PsiNavigateUtil; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; - -public class StubBasedPsiElementBaseGetParentInspection extends DevKitInspectionBase { - - @Nullable - @Override - public ProblemDescriptor[] checkClass(@NotNull PsiClass psiClass, @NotNull InspectionManager manager, boolean isOnTheFly) { - if (psiClass.isInterface() || - psiClass.isEnum() || - !psiClass.hasModifierProperty(PsiModifier.PUBLIC) || - psiClass.hasModifierProperty(PsiModifier.STATIC) || - psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || - psiClass.getContainingClass() != null) { - return ProblemDescriptor.EMPTY_ARRAY; - } - - if (!InheritanceUtil.isInheritor(psiClass, true, StubBasedPsiElementBase.class.getName())) { - return ProblemDescriptor.EMPTY_ARRAY; - } - - PsiMethod myParentTemplate = createGetParentTemplateMethod(psiClass); - - final PsiMethod overriddenGetParentMethod = psiClass.findMethodBySignature(myParentTemplate, true); - if (overriddenGetParentMethod != null && - overriddenGetParentMethod.getContainingClass() != null && - !StubBasedPsiElementBase.class.getName().equals(overriddenGetParentMethod.getContainingClass().getQualifiedName())) { - return ProblemDescriptor.EMPTY_ARRAY; - } - - final ProblemDescriptor descriptor = - manager.createProblemDescriptor(ObjectUtils.assertNotNull(psiClass.getNameIdentifier()), - "Default getParent() implementation is slow", - new InsertGetParentByStubOverrideQuickFix(psiClass, isOnTheFly), - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly); - return new ProblemDescriptor[]{descriptor}; - } - - private static LightMethodBuilder createGetParentTemplateMethod(@NotNull PsiClass psiClass) { - return new LightMethodBuilder(psiClass.getManager(), "getParent") - .setMethodReturnType(PsiElement.class.getName()); - } - - private static class InsertGetParentByStubOverrideQuickFix extends LocalQuickFixOnPsiElement { - - private final boolean myOnTheFly; - - private InsertGetParentByStubOverrideQuickFix(@NotNull PsiClass psiClass, boolean isOnTheFly) { - super(psiClass); - myOnTheFly = isOnTheFly; - } - - @NotNull - @Override - public String getText() { - return "Override with calling getParentByStub()"; - } - - @Nls - @NotNull - @Override - public String getFamilyName() { - return getText(); - } - - @Override - public void invoke(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { - if (!ReadonlyStatusHandler.ensureFilesWritable(project, file.getVirtualFile())) return; - - final PsiClass psiClass = (PsiClass)startElement; - - final PsiClass stubBasedPsiElementClass = - JavaPsiFacade.getInstance(project).findClass(StubBasedPsiElementBase.class.getName(), psiClass.getResolveScope()); - assert stubBasedPsiElementClass != null; - - final PsiMethod methodToOverride = - stubBasedPsiElementClass.findMethodBySignature(createGetParentTemplateMethod(stubBasedPsiElementClass), false); - final List methods = OverrideImplementUtil.overrideOrImplementMethod(psiClass, methodToOverride, false); - if (methods.size() != 1) { - return; - } - - PsiMethod getParentMethod = ContainerUtil.getFirstItem(methods); - assert getParentMethod != null; - final PsiCodeBlock originalCodeBlock = getParentMethod.getBody(); - assert originalCodeBlock != null; - - final PsiCodeBlock optimizedCodeBlock = - JavaPsiFacade.getElementFactory(project).createCodeBlockFromText("{ return getParentByStub(); }", getParentMethod); - originalCodeBlock.replace(optimizedCodeBlock); - - PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(stubBasedPsiElementClass, psiClass, PsiSubstitutor.EMPTY); - final PsiElement anchor = OverrideImplementUtil.getDefaultAnchorToOverrideOrImplement(psiClass, methodToOverride, substitutor); - final List> generationInfos = - GenerateMembersUtil.insertMembersBeforeAnchor(psiClass, anchor, - Collections.singletonList(new PsiGenerationInfo<>(getParentMethod))); - - if (myOnTheFly) { - final PsiGenerationInfo item = ContainerUtil.getFirstItem(generationInfos); - if (item != null) PsiNavigateUtil.navigate(item.getPsiMember()); - } - } - } -} diff --git a/plugins/devkit/testSources/inspections/StubBasedPsiElementBaseGetParentInspectionTest.java b/plugins/devkit/testSources/inspections/StubBasedPsiElementBaseGetParentInspectionTest.java deleted file mode 100644 index ca584005c541..000000000000 --- a/plugins/devkit/testSources/inspections/StubBasedPsiElementBaseGetParentInspectionTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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 org.jetbrains.idea.devkit.inspections; - -import com.intellij.codeInsight.intention.IntentionAction; - -import java.util.List; - -public class StubBasedPsiElementBaseGetParentInspectionTest extends PluginModuleTestCase { - - @Override - protected void setUp() throws Exception { - super.setUp(); - - myFixture.addClass("package com.intellij.psi; public class PsiElement {}"); - myFixture.addClass("package com.intellij.extapi.psi; " + - "public class StubBasedPsiElementBase {" + - " public com.intellij.psi.PsiElement getParent() { return null; }" + - "}"); - - myFixture.enableInspections(new StubBasedPsiElementBaseGetParentInspection()); - } - - public void testOverridesGetParent() { - myFixture.configureByText("MyStub.java", - "public class MyStub extends com.intellij.extapi.psi.StubBasedPsiElementBase {" + - " public com.intellij.psi.PsiElement getParent() { return null; }" + - "}"); - myFixture.testHighlighting(); - } - - public void testOverridesGetParentInHierarchy() { - myFixture.configureByText("MyStubBase.java", - "public class MyStubBase extends com.intellij.extapi.psi.StubBasedPsiElementBase {" + - " public com.intellij.psi.PsiElement getParent() { return null; }" + - "}"); - myFixture.configureByText("MyStub.java", - "public class MyStub extends MyStubBase {" + - "}"); - myFixture.testHighlighting(); - } - - public void testDoesNotOverrideGetParent() { - myFixture.configureByText("MyStub.java", - "public class MyStub" + - " extends com.intellij.extapi.psi.StubBasedPsiElementBase {" + - "}"); - myFixture.testHighlighting(); - final List fixes = myFixture.getAllQuickFixes(); - final IntentionAction quickFix = assertOneElement(fixes); - myFixture.launchAction(quickFix); - myFixture.checkResult("import com.intellij.psi.PsiElement;\n" + - "\n" + - "public class MyStub extends com.intellij.extapi.psi.StubBasedPsiElementBase {\n" + - " @Override\n" + - " public PsiElement getParent() {\n" + - " return getParentByStub();\n" + - " }\n" + - "}"); - } - - public void testDoesNotOverrideGetParentNoHighlightInAbstractClass() { - myFixture.configureByText("MyStub.java", - "public abstract class MyStub extends com.intellij.extapi.psi.StubBasedPsiElementBase {" + - "}"); - myFixture.testHighlighting(); - } -}