import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReferenceExpression; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Query; import org.apache.log4j.Logger; import org.jetbrains.annotations.NotNull; /** * TODO: Fill in documentation * Inserted by IntelliJ. To change this template use File | Settings | File Templates. *
* Originally created by: lars * Date: Mar 25, 2009 * Time: 12:30:23 PM */ public class StaticToConstructor implements ApplicationComponent { public static int foo = 1; public void initComponent() { } public void disposeComponent() { } @NotNull public String getComponentName() { return "StaticToConstructor"; } public static void test() {} public void transformStaticToConstructor(@NotNull PsiElement element) throws Throwable { System.out.println("Starting to transform"); System.out.println("Current element is " + element); // Find the current class final PsiClass currentClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); // Find static accesses to the class // Find or create constructor if (currentClass != null) { PsiMethod[] constructors = currentClass.getConstructors(); PsiMethod zeroArgConstructor = null; for (PsiMethod m : constructors) { if (m.getParameterList().getParametersCount() == 0) { zeroArgConstructor = m; } } System.out.println("Zero-arg constructor for " + currentClass + " is " + zeroArgConstructor); Project project = element.getProject(); final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); if (zeroArgConstructor == null && constructors.length > 0) { final PsiMethod newConstructor = zeroArgConstructor = elementFactory.createConstructor(); new WriteCommandAction.Simple(project, currentClass.getContainingFile()) { protected void run() throws Throwable { currentClass.add(newConstructor); } }.run(); System.out.println("Adding zero-arg constructor"); } // Change accesses to use constructor Query