diff --git a/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java b/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java index 95ac35881683..c8493c6cf6a9 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java @@ -274,10 +274,10 @@ public class ClassUtil { StringBuilder signature = new StringBuilder(); signature.append("("); for (PsiParameter param : method.getParameterList().getParameters()) { - signature.append(toAsm(param.getType())); + signature.append(getBinaryPresentation(param.getType())); } signature.append(")"); - signature.append(toAsm(Optional.ofNullable(method.getReturnType()).orElse(PsiType.VOID))); + signature.append(getBinaryPresentation(Optional.ofNullable(method.getReturnType()).orElse(PsiType.VOID))); return signature.toString(); } @@ -322,14 +322,24 @@ public class ClassUtil { } @NotNull - private static String toAsm(@NotNull PsiType psiType) { + public static String getClassObjectPresentation(@NotNull PsiType psiType) { + return toBinary(psiType, false); + } + + @NotNull + public static String getBinaryPresentation(@NotNull PsiType psiType) { + return toBinary(psiType, true); + } + + @NotNull + private static String toBinary(@NotNull PsiType psiType, final boolean slashes) { return Optional.of(psiType) .map(type -> TypeConversionUtil.erasure(type)) - .map(type -> type.accept(createAsmSignatureVisitor())) + .map(type -> type.accept(createBinarySignatureVisitor(slashes))) .orElseGet(() -> psiType.getPresentableText()); } - private static PsiTypeVisitor createAsmSignatureVisitor() { + private static PsiTypeVisitor createBinarySignatureVisitor(boolean slashes) { return new PsiTypeVisitor() { @Override public String visitPrimitiveType(PsiPrimitiveType primitiveType) { @@ -344,7 +354,7 @@ public class ClassUtil { } String jvmClassName = getJVMClassName(aClass); if (jvmClassName != null) { - jvmClassName = "L" + jvmClassName.replace(".", "/") + ";"; + jvmClassName = "L" + (slashes ? jvmClassName.replace(".", "/") : jvmClassName) + ";"; } return jvmClassName; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/MemberSignature.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/MemberSignature.java index e2a0f5ac2a2e..70dbf40af085 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/MemberSignature.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/MemberSignature.java @@ -16,6 +16,7 @@ package com.siyeh.ig.fixes; import com.intellij.psi.*; +import com.intellij.psi.util.ClassUtil; import org.jetbrains.annotations.NonNls; import java.lang.reflect.Modifier; @@ -39,12 +40,12 @@ public class MemberSignature implements Comparable { public MemberSignature(PsiField field) { modifiers = calculateModifierBitmap(field.getModifierList()); name = field.getName(); - signature = createTypeSignature(field.getType()); + signature = ClassUtil.getBinaryPresentation(field.getType()); } public MemberSignature(PsiMethod method) { modifiers = calculateModifierBitmap(method.getModifierList()); - signature = createMethodSignature(method).replace('/', '.'); + signature = ClassUtil.getAsmMethodSignature(method).replace('/', '.'); name = method.isConstructor() ? CONSTRUCTOR_NAME : method.getName(); } @@ -101,113 +102,12 @@ public class MemberSignature implements Comparable { return signature.compareTo(other.signature); } - public static String createMethodSignature(PsiMethod method) { - final PsiParameterList parameterList = method.getParameterList(); - final PsiParameter[] parameters = parameterList.getParameters(); - final StringBuilder signatureBuffer = new StringBuilder(); - signatureBuffer.append('('); - for (final PsiParameter parameter : parameters) { - final PsiType type = parameter.getType(); - signatureBuffer.append(createTypeSignature(type)); - } - signatureBuffer.append(')'); - final PsiType returnType = method.getReturnType(); - final String returnTypeSignature; - if (returnType == null) { - // constructors have void return type. - returnTypeSignature = createTypeSignature(PsiType.VOID); - } - else { - returnTypeSignature = createTypeSignature(returnType); - } - signatureBuffer.append(returnTypeSignature); - return signatureBuffer.toString(); - } - - public static String createPrimitiveTypeSignature(PsiPrimitiveType primitiveType) { - if (primitiveType.equals(PsiType.INT)) { - return "I"; - } - else if (primitiveType.equals(PsiType.BYTE)) { - return "B"; - } - else if (primitiveType.equals(PsiType.LONG)) { - return "J"; - } - else if (primitiveType.equals(PsiType.FLOAT)) { - return "F"; - } - else if (primitiveType.equals(PsiType.DOUBLE)) { - return "D"; - } - else if (primitiveType.equals(PsiType.SHORT)) { - return "S"; - } - else if (primitiveType.equals(PsiType.CHAR)) { - return "C"; - } - else if (primitiveType.equals(PsiType.BOOLEAN)) { - return "Z"; - } - else if (primitiveType.equals(PsiType.VOID)) { - return "V"; - } - else { - throw new InternalError(); - } - } - + /** + * @deprecated use {@link ClassUtil#getBinaryPresentation(PsiType)} instead + */ + @Deprecated public static String createTypeSignature(PsiType type) { - final StringBuilder buffer = new StringBuilder(); - PsiType internalType = type; - while (internalType instanceof PsiArrayType) { - buffer.append('['); - final PsiArrayType arrayType = (PsiArrayType)internalType; - internalType = arrayType.getComponentType(); - } - if (internalType instanceof PsiPrimitiveType) { - final PsiPrimitiveType primitiveType = (PsiPrimitiveType)internalType; - buffer.append(createPrimitiveTypeSignature(primitiveType)); - } - else { - buffer.append('L'); - if (internalType instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)internalType; - PsiClass psiClass = classType.resolve(); - if (psiClass instanceof PsiTypeParameter) { - final PsiTypeParameter typeParameter = (PsiTypeParameter)psiClass; - final PsiReferenceList extendsList = typeParameter.getExtendsList(); - final PsiClassType[] types = extendsList.getReferencedTypes(); - if (types.length > 0) { - psiClass = types[0].resolve(); - } - } - if (psiClass != null) { - final StringBuilder postFix = new StringBuilder(); - PsiClass containingClass = psiClass.getContainingClass(); - while (containingClass != null) { - // construct name for inner classes - postFix.insert(0, psiClass.getName()).insert(0, '$'); - psiClass = containingClass; - containingClass = psiClass.getContainingClass(); - } - final String qualifiedName = psiClass.getQualifiedName(); - if (qualifiedName == null) { - // for type parameters - buffer.append(CommonClassNames.JAVA_LANG_OBJECT); - } - else { - buffer.append(qualifiedName.replace('.', '/')).append(postFix); - } - } - } - else { - // todo test this code path - buffer.append(internalType.getCanonicalText().replace('.', '/')); - } - buffer.append(';'); - } - return buffer.toString(); + return ClassUtil.getBinaryPresentation(type); } public boolean equals(Object object) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/SerialVersionUIDBuilder.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/SerialVersionUIDBuilder.java index 2da9c0f0d7dc..38b8e2057801 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/SerialVersionUIDBuilder.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/SerialVersionUIDBuilder.java @@ -20,6 +20,7 @@ import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.SuperMethodsSearch; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiUtil; import com.siyeh.ig.psiutils.ClassUtils; @@ -83,7 +84,7 @@ public class SerialVersionUIDBuilder extends JavaRecursiveElementVisitor { nonPrivateMethods.add(methodSignature); SuperMethodsSearch.search(method, null, true, false).forEach(method1 -> { final MemberSignature superSignature = new MemberSignature(methodSignature.getName(), methodSignature.getModifiers(), - MemberSignature.createMethodSignature(method1.getMethod())); + ClassUtil.getAsmMethodSignature(method1.getMethod()).replace('/', '.')); nonPrivateMethods.add(superSignature); return true; }); @@ -397,8 +398,8 @@ public class SerialVersionUIDBuilder extends JavaRecursiveElementVisitor { isStatic = true; } final String returnTypeSignature = - MemberSignature.createTypeSignature(type).replace('/', - '.'); + ClassUtil.getBinaryPresentation(type).replace('/', + '.'); final String className = clazz.getQualifiedName(); @NonNls final StringBuilder signatureBuffer = new StringBuilder("("); @@ -459,25 +460,18 @@ public class SerialVersionUIDBuilder extends JavaRecursiveElementVisitor { if (method.hasModifierProperty(PsiModifier.PRIVATE) && clazz.equals(method.getContainingClass())) { final String signature; if (method.hasModifierProperty(PsiModifier.STATIC)) { - signature = - MemberSignature.createMethodSignature(method) - .replace('/', '.'); + signature = ClassUtil.getAsmMethodSignature(method).replace('/', '.'); } else { - final String returnTypeSignature = - MemberSignature.createTypeSignature(method.getReturnType()) - .replace('/', '.'); + final String returnTypeSignature = ClassUtil.getBinaryPresentation(method.getReturnType()).replace('/', '.'); @NonNls final StringBuilder signatureBuffer = new StringBuilder(); signatureBuffer.append("(L"); - signatureBuffer.append(clazz.getQualifiedName()) - .append(';'); - final PsiParameter[] parameters = method.getParameterList() - .getParameters(); + signatureBuffer.append(clazz.getQualifiedName()).append(';'); + final PsiParameter[] parameters = method.getParameterList().getParameters(); for (final PsiParameter parameter : parameters) { final PsiType type = parameter.getType(); - final String typeSignature = MemberSignature.createTypeSignature(type) - .replace('/', '.'); + final String typeSignature = ClassUtil.getBinaryPresentation(type).replace('/', '.'); signatureBuffer.append(typeSignature); } signatureBuffer.append(')');