mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
binary method signature: use utilities; fix escaping; deprecate to keep plugin compatible
GitOrigin-RevId: d012cd7c06c7b7cdb4ea6688488df8cc7848a64e
This commit is contained in:
committed by
intellij-monorepo-bot
parent
881c8edf0d
commit
91da2f3f5e
@@ -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;
|
||||
}
|
||||
|
||||
+8
-108
@@ -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) {
|
||||
|
||||
+9
-15
@@ -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(')');
|
||||
|
||||
Reference in New Issue
Block a user