From 5c456c2e38b2add2e2a5a6d089bfe3f042cafa51 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 17 Nov 2009 23:45:03 +0100 Subject: [PATCH] =?UTF-8?q?IDEADEV-41420=20(convert=20to=20junit4:=20bette?= =?UTF-8?q?r=20handling=20of=20@=E2=80=8BTest=20methods=20in=20class=20ext?= =?UTF-8?q?ending=20TestCase)=20IDEADEV-41421=20(convert=20to=20junit4:=20?= =?UTF-8?q?remove=20obsolete=20super=E2=80=8B.=E2=80=8BsetUp=E2=80=8B()=20?= =?UTF-8?q?calls)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...onvertJUnit3TestCaseToJUnit4Intention.java | 83 +++++++++++++++---- 1 file changed, 67 insertions(+), 16 deletions(-) diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/junit/ConvertJUnit3TestCaseToJUnit4Intention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/junit/ConvertJUnit3TestCaseToJUnit4Intention.java index e8e8ecd4c21f..a4a0a4117ebf 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/junit/ConvertJUnit3TestCaseToJUnit4Intention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/junit/ConvertJUnit3TestCaseToJUnit4Intention.java @@ -15,11 +15,10 @@ */ package com.siyeh.ipp.junit; +import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.util.IncorrectOperationException; -import com.intellij.openapi.project.Project; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.NotNull; @@ -39,14 +38,11 @@ public class ConvertJUnit3TestCaseToJUnit4Intention extends Intention { if (!(parent instanceof PsiClass)) { return; } - PsiClass aClass = (PsiClass) parent; + final PsiClass aClass = (PsiClass) parent; final PsiReferenceList extendsList = aClass.getExtendsList(); if (extendsList == null) { return; } - final Project project = element.getProject(); - final JavaCodeStyleManager codeStyleManager = - JavaCodeStyleManager.getInstance(project); final PsiMethod[] methods = aClass.getMethods(); for (PsiMethod method : methods) { final String name = method.getName(); @@ -59,18 +55,14 @@ public class ConvertJUnit3TestCaseToJUnit4Intention extends Intention { } final PsiModifierList modifierList = method.getModifierList(); if (name.startsWith("test")) { - final PsiAnnotation annotation = - modifierList.addAnnotation("org.junit.Test"); - codeStyleManager.shortenClassReferences(annotation); + addAnnotationIfNotPresent(modifierList, "org.junit.Test"); method.accept(new MethodCallModifier()); } else if (name.equals("setUp")) { - final PsiAnnotation annotation = - modifierList.addAnnotation("org.junit.Before"); - codeStyleManager.shortenClassReferences(annotation); + transformSetUpOrTearDownMethod(method); + addAnnotationIfNotPresent(modifierList, "org.junit.Before"); } else if (name.equals("tearDown")) { - final PsiAnnotation annotation = - modifierList.addAnnotation("org.junit.After"); - codeStyleManager.shortenClassReferences(annotation); + transformSetUpOrTearDownMethod(method); + addAnnotationIfNotPresent(modifierList, "org.junit.After"); } } final PsiJavaCodeReferenceElement[] referenceElements = @@ -80,7 +72,66 @@ public class ConvertJUnit3TestCaseToJUnit4Intention extends Intention { } } - private class MethodCallModifier extends JavaRecursiveElementVisitor { + private static void addAnnotationIfNotPresent( + PsiModifierList modifierList, String qualifiedAnnotationName) { + if (modifierList.findAnnotation(qualifiedAnnotationName) != null) { + return; + } + final PsiAnnotation annotation = + modifierList.addAnnotation(qualifiedAnnotationName); + final Project project = modifierList.getProject(); + final JavaCodeStyleManager codeStyleManager = + JavaCodeStyleManager.getInstance(project); + codeStyleManager.shortenClassReferences(annotation); + } + + private static void transformSetUpOrTearDownMethod(PsiMethod method) { + final PsiModifierList modifierList = method.getModifierList(); + if (modifierList.hasModifierProperty(PsiModifier.PROTECTED)) { + modifierList.setModifierProperty(PsiModifier.PROTECTED, false); + } + if (!modifierList.hasModifierProperty(PsiModifier.PUBLIC)) { + modifierList.setModifierProperty(PsiModifier.PUBLIC, true); + } + final PsiAnnotation overrideAnnotation = + modifierList.findAnnotation("java.lang.Override"); + if (overrideAnnotation != null) { + overrideAnnotation.delete(); + } + + method.accept(new SuperLifeCycleCallRemover(method.getName())); + } + + private static class SuperLifeCycleCallRemover + extends JavaRecursiveElementVisitor { + + @NotNull private final String myLifeCycleMethodName; + + private SuperLifeCycleCallRemover(@NotNull String lifeCycleMethodName) { + myLifeCycleMethodName = lifeCycleMethodName; + } + + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!myLifeCycleMethodName.equals(methodName)) { + return; + } + final PsiExpression target = + methodExpression.getQualifierExpression(); + if (!(target instanceof PsiSuperExpression)) { + return; + } + expression.delete(); + } + } + + private static class MethodCallModifier + extends JavaRecursiveElementVisitor { @Override public void visitMethodCallExpression(