From 02dafea28d04a7e5d36b9ec2ceb7608129fe5f5b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 22 Apr 2010 20:29:12 +0400 Subject: [PATCH] fix stack overflow; remove some unnecessary indirection via PsiAdapter --- .../tostring/GenerateToStringUtils.java | 4 +- .../tostring/GenerateToStringWorker.java | 2 +- .../tostring/element/ElementFactory.java | 28 +-- .../ClassHasNoToStringMethodInspection.java | 8 +- .../FieldNotUsedInToStringInspection.java | 4 +- .../generate/tostring/psi/PsiAdapter.java | 180 +----------------- 6 files changed, 29 insertions(+), 197 deletions(-) diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringUtils.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringUtils.java index f547a44e338a..765148834b2f 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringUtils.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringUtils.java @@ -71,7 +71,7 @@ public class GenerateToStringUtils { List availableFields = new ArrayList(); // performs til filtering process - PsiField[] fields = psi.getFields(clazz); + PsiField[] fields = clazz.getFields(); for (PsiField field : fields) { FieldElement fe = ElementFactory.newFieldElement(project, field, psi); if (log.isDebugEnabled()) log.debug("Field being filtered: " + fe); @@ -103,7 +103,7 @@ public class GenerateToStringUtils { List availableMethods = new ArrayList(); PsiElementFactory elementFactory = JavaPsiFacade.getInstance(clazz.getProject()).getElementFactory(); - PsiMethod[] methods = psi.getMethods(clazz); + PsiMethod[] methods = clazz.getMethods(); for (PsiMethod method : methods) { MethodElement me = ElementFactory.newMethodElement(method, elementFactory, psi); diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringWorker.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringWorker.java index 2df8a1dd4bb6..d55dddb4e6e5 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringWorker.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/GenerateToStringWorker.java @@ -65,7 +65,7 @@ public class GenerateToStringWorker { this.psi = PsiAdapterFactory.getPsiAdapter(); this.editor = editor; this.elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); - this.codeStyleManager = psi.getCodeStyleManager(project); + this.codeStyleManager = CodeStyleManager.getInstance(project); this.containingFile = clazz.getContainingFile(); this.config = GenerateToStringContext.getConfig(); this.hasOverrideAnnotation = insertAtOverride; diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/element/ElementFactory.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/element/ElementFactory.java index 1cbeee5ce08e..88b1d7809bfd 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/element/ElementFactory.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/element/ElementFactory.java @@ -55,9 +55,9 @@ public class ElementFactory { ce.setImplementNames(psi.getImplementsClassnames(clazz)); // other - ce.setEnum(psi.isEnumClass(clazz)); - ce.setDeprecated(psi.isDeprecatedClass(clazz)); - ce.setException(psi.isExceptionClass(clazz)); + ce.setEnum(clazz.isEnum()); + ce.setDeprecated(clazz.isDeprecated()); + ce.setException(PsiAdapter.isExceptionClass(clazz)); ce.setAbstract(psi.isAbstractClass(clazz)); return ce; @@ -83,8 +83,8 @@ public class ElementFactory { if (psi.isEnumField(field)) fe.setEnum(true); PsiModifierList modifiers = field.getModifierList(); if (modifiers != null) { - if (psi.isModifierTransient(modifiers)) fe.setModifierTransient(true); - if (psi.isModifierVolatile(modifiers)) fe.setModifierVolatile(true); + if (modifiers.hasModifierProperty(PsiModifier.TRANSIENT)) fe.setModifierTransient(true); + if (modifiers.hasModifierProperty(PsiModifier.VOLATILE)) fe.setModifierVolatile(true); } setElementInfo(fe, factory, type, modifiers, psi); @@ -126,11 +126,11 @@ public class ElementFactory { // misc me.setReturnTypeVoid(psi.isTypeOfVoid(method.getReturnType())); - me.setDeprecated(psi.isDeprecatedMethod(method)); + me.setDeprecated(method.isDeprecated()); // modifiers - if (psi.isModifierAbstract(modifiers)) me.setModifierAbstract(true); - if (psi.isModifierSynchronized(modifiers)) me.setModifierSynchronzied(true); + if (modifiers.hasModifierProperty(PsiModifier.ABSTRACT)) me.setModifierAbstract(true); + if (modifiers.hasModifierProperty(PsiModifier.SYNCHRONIZED)) me.setModifierSynchronzied(true); return me; } @@ -184,18 +184,18 @@ public class ElementFactory { // modifiers if (modifiers != null) { - if (psi.isModifierStatic(modifiers)) element.setModifierStatic(true); - if (psi.isModifierFinal(modifiers)) element.setModifierFinal(true); - if (psi.isModifierPublic(modifiers)) { + if (modifiers.hasModifierProperty(PsiModifier.STATIC)) element.setModifierStatic(true); + if (modifiers.hasModifierProperty(PsiModifier.FINAL)) element.setModifierFinal(true); + if (modifiers.hasModifierProperty(PsiModifier.PUBLIC)) { element.setModifierPublic(true); } - else if (psi.isModifierProtected(modifiers)) { + else if (modifiers.hasModifierProperty(PsiModifier.PROTECTED)) { element.setModifierProtected(true); } - else if (psi.isModifierPackageLocal(modifiers)) { + else if (modifiers.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) { element.setModifierPackageLocal(true); } - else if (psi.isModifierPrivate(modifiers)) element.setModifierPrivate(true); + else if (modifiers.hasModifierProperty(PsiModifier.PRIVATE)) element.setModifierPrivate(true); } } diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java index eb6085aff51b..41cc263c8591 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java @@ -85,19 +85,19 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti PsiAdapter psi = PsiAdapterFactory.getPsiAdapter(); // must not be an exception - if (excludeException && psi.isExceptionClass(clazz)) { + if (excludeException && PsiAdapter.isExceptionClass(clazz)) { log.debug("This class is an exception"); return; } // must not be deprecated - if (excludeDeprecated && psi.isDeprecatedClass(clazz)) { + if (excludeDeprecated && clazz.isDeprecated()) { log.debug("Class is deprecated"); return; } // must not be enum - if (excludeEnum && psi.isEnumClass(clazz)) { + if (excludeEnum && clazz.isEnum()) { log.debug("Class is an enum"); return; } @@ -117,7 +117,7 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti } // must have fields - PsiField[] fields = psi.getFields(clazz); + PsiField[] fields = clazz.getFields(); if (fields.length == 0) { log.debug("Class does not have any fields"); return; diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/FieldNotUsedInToStringInspection.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/FieldNotUsedInToStringInspection.java index 0319d7af3f5a..62893233c6ba 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/FieldNotUsedInToStringInspection.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/FieldNotUsedInToStringInspection.java @@ -83,7 +83,7 @@ public class FieldNotUsedInToStringInspection extends AbstractToStringInspection // must have fields PsiAdapter psi = PsiAdapterFactory.getPsiAdapter(); - PsiField[] fields = psi.getFields(clazz); + PsiField[] fields = clazz.getFields(); if (fields.length == 0) { log.debug("Class does not have any fields"); return; @@ -181,7 +181,7 @@ public class FieldNotUsedInToStringInspection extends AbstractToStringInspection } // must have methods - PsiMethod[] methods = psi.getMethods(clazz); + PsiMethod[] methods = clazz.getMethods(); if (methods.length == 0) { log.debug("Class does not have any methods"); return; diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/psi/PsiAdapter.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/psi/PsiAdapter.java index b456cf0c774f..18ccdb7eb898 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/psi/PsiAdapter.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/psi/PsiAdapter.java @@ -22,6 +22,7 @@ import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.Nullable; @@ -39,16 +40,6 @@ public abstract class PsiAdapter { } /** - * Get's the fields for the class. - * - * @param clazz class. - * @return the fields for the class. If the class doesn't have any fields the array's size is 0. - */ - public PsiField[] getFields(PsiClass clazz) { - return clazz.getFields(); - } - - /** * Finds the class for the given element. *

* Will look in the element's parent hieracy. @@ -271,116 +262,6 @@ public abstract class PsiAdapter { } } - /** - * Is there a transient modifier? - *

eg: private transient String myField;. - * - * @param modifiers the modifiers - */ - public boolean isModifierTransient(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.TRANSIENT); - } - - /** - * Is there a volatile modifier? - *

eg: private volatile Image screen;. - * - * @param modifiers the modifiers - */ - public boolean isModifierVolatile(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.VOLATILE); - } - - /** - * Is there a public modifier? - *

eg: public String myField;. - * - * @param modifiers the modifiers - */ - public boolean isModifierPublic(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.PUBLIC); - } - - /** - * Is there a protected modifier? - *

eg: public String myField;. - * - * @param modifiers the modifiers - */ - public boolean isModifierProtected(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.PROTECTED); - } - - /** - * Is there a package-local modifier? - *

eg: String myField;. - * - * @param modifiers the modifiers - */ - public boolean isModifierPackageLocal(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.PACKAGE_LOCAL); - } - - /** - * Is there a private modifier? - *

eg: private static String myField;. - * - * @param modifiers the modifiers - */ - public boolean isModifierPrivate(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.PRIVATE); - } - - /** - * Is there a abstract modifier? - *

eg: public abstract String getConfiguration(). - * - * @param modifiers the modifiers - */ - public boolean isModifierAbstract(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.ABSTRACT); - } - - /** - * Is there a final modifier? - *

eg: final static boolean DEBUG = false;. - * - * @param modifiers the modifiers - */ - public boolean isModifierFinal(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.FINAL); - } - - /** - * Is there a static modifier? - *

eg: private static String getMyField(). - * - * @param modifiers the modifiers - */ - public boolean isModifierStatic(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.STATIC); - } - - /** - * Is there a synchronized modifier? - *

eg: public synchronized void putInCache(). - * - * @param modifiers the modifiers - */ - public boolean isModifierSynchronized(PsiModifierList modifiers) { - return modifiers.hasModifierProperty(PsiModifier.SYNCHRONIZED); - } - - /** - * Get's the CodeStyleManager for the project. - * - * @param project project. - * @return the CodeStyleManager. - */ - public CodeStyleManager getCodeStyleManager(Project project) { - return CodeStyleManager.getInstance(project); - } - /** * Does the javafile have the import statement? * @@ -592,17 +473,7 @@ public abstract class PsiAdapter { } } - /** - * Get's the methods for the class. - * - * @param clazz class. - * @return the methods for the class. If the class doesn't have any methods the array's size is 0. - */ - public PsiMethod[] getMethods(PsiClass clazz) { - return clazz.getMethods(); - } - - /** + /** * Find's an existing field with the given name. * If there isn't a field with the name, null is returned. * @@ -725,38 +596,8 @@ public abstract class PsiAdapter { return false; } - return isEnumClass(clazz); - } - - /** - * Returns true if the class is enum (JDK1.5). - * - * @param clazz class to check if it's a enum - * @return true if enum. - */ - public boolean isEnumClass(PsiClass clazz) { return clazz.isEnum(); - } - - /** - * Returns true if the class is deprecated. - * - * @param clazz class to check if it's deprecated - * @return true if deprecated. - */ - public boolean isDeprecatedClass(PsiClass clazz) { - return clazz.isDeprecated(); - } - - /** - * Returns true if the method is deprecated. - * - * @param method method to check if it's deprecated - * @return true if deprecated. - */ - public boolean isDeprecatedMethod(PsiMethod method) { - return method.isDeprecated(); - } + } /** * Is the class an exception - extends Throwable (will check super). @@ -764,17 +605,8 @@ public abstract class PsiAdapter { * @param clazz class to check. * @return true if class is an exception. */ - public boolean isExceptionClass(PsiClass clazz) { - PsiClass[] supers = clazz.getSupers(); - for (PsiClass sup : supers) { - if ("java.lang.Throwable".equals(sup.getQualifiedName())) { - return true; - } else if (isExceptionClass(sup)) { - return true; - } - } - - return false; + public static boolean isExceptionClass(PsiClass clazz) { + return InheritanceUtil.isInheritor(clazz, CommonClassNames.JAVA_LANG_THROWABLE); } /** @@ -788,7 +620,7 @@ public abstract class PsiAdapter { if (list == null) { return false; } - return isModifierAbstract(clazz.getModifierList()); + return clazz.getModifierList().hasModifierProperty(PsiModifier.ABSTRACT); } /**