binary method signature: use utilities; fix escaping; deprecate to keep plugin compatible

GitOrigin-RevId: d012cd7c06c7b7cdb4ea6688488df8cc7848a64e
This commit is contained in:
Anna.Kozlova
2019-11-08 10:34:40 +00:00
committed by intellij-monorepo-bot
parent 881c8edf0d
commit 91da2f3f5e
3 changed files with 33 additions and 129 deletions
@@ -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<String> createAsmSignatureVisitor() {
private static PsiTypeVisitor<String> createBinarySignatureVisitor(boolean slashes) {
return new PsiTypeVisitor<String>() {
@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;
}
@@ -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<MemberSignature> {
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<MemberSignature> {
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) {
@@ -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(')');