Skip to content

Commit

Permalink
Support for inner Enum
Browse files Browse the repository at this point in the history
Fixes redhat-developer#963

Signed-off-by: azerr <azerr@redhat.com>
  • Loading branch information
angelozerr committed Jul 12, 2024
1 parent c46f4f9 commit 8237c69
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ public List<String> resolveExtendedType() {
try {
String superTypeSignature = primaryType.getSuperclassTypeSignature();
if (superTypeSignature != null) {
extendedTypes.add(resolveTypeSignature(superTypeSignature));
extendedTypes.add(resolveTypeSignature(superTypeSignature, primaryType));
}
String[] superInterfaceTypeSignature = primaryType.getSuperInterfaceTypeSignatures();
if (superInterfaceTypeSignature != null) {
for (String string : superInterfaceTypeSignature) {
extendedTypes.add(resolveTypeSignature(string));
extendedTypes.add(resolveTypeSignature(string, primaryType));
}
}

Expand All @@ -89,7 +89,7 @@ public String resolveFieldSignature(IField field) {
StringBuilder signature = new StringBuilder(field.getElementName());
signature.append(" : ");
try {
signature.append(resolveTypeSignature(field.getTypeSignature(), false));
signature.append(resolveTypeSignature(field.getTypeSignature(), false, field.getDeclaringType()));
} catch (JavaModelException e) {
LOGGER.log(Level.SEVERE, "Error while resolving field type '" + field.getElementName() + "'", e);
}
Expand All @@ -111,8 +111,7 @@ public String resolveMethodSignature(IMethod method) {
ILocalVariable parameter = parameters[i];
signature.append(parameter.getElementName());
signature.append(" : ");
signature.append(
resolveLocalVariableSignature(parameter, varargs && i == parameters.length - 1));
signature.append(resolveLocalVariableSignature(parameter, varargs && i == parameters.length - 1));
}
}
} catch (JavaModelException e) {
Expand All @@ -121,7 +120,7 @@ public String resolveMethodSignature(IMethod method) {
}
signature.append(')');
try {
String returnType = resolveTypeSignature(method.getReturnType(), false);
String returnType = resolveTypeSignature(method.getReturnType(), false, method.getDeclaringType());
signature.append(" : ");
signature.append(returnType);
} catch (JavaModelException e) {
Expand All @@ -133,23 +132,24 @@ public String resolveMethodSignature(IMethod method) {

@Override
public String resolveLocalVariableSignature(ILocalVariable parameter, boolean varargs) {
return resolveTypeSignature(parameter.getTypeSignature(), varargs);
return resolveTypeSignature(parameter.getTypeSignature(), varargs,
parameter.getDeclaringMember().getDeclaringType());
}

@Override
public String resolveTypeSignature(String typeSignature) {
return resolveTypeSignature(typeSignature, false);
public String resolveTypeSignature(String typeSignature, IType declaringType) {
return resolveTypeSignature(typeSignature, false, declaringType);
}

private String resolveTypeSignature(String typeSignature, boolean varargs) {
private String resolveTypeSignature(String typeSignature, boolean varargs, IType declaringType) {
if (typeSignature.charAt(0) == '[') {
return doResolveTypeSignature(typeSignature.substring(1, typeSignature.length()))
return doResolveTypeSignature(typeSignature.substring(1, typeSignature.length()), declaringType)
+ (varargs ? "..." : "[]");
}
return doResolveTypeSignature(typeSignature);
return doResolveTypeSignature(typeSignature, declaringType);
}

private String doResolveTypeSignature(String typeSignature) {
private String doResolveTypeSignature(String typeSignature, IType declaringType) {
// Example: for 'class A<A1, A2> extends B<A2, String>' the type signature is
// 'QB<QA2;QString;>;'
// The method should return 'B<A2,java.lang.String>'
Expand All @@ -162,30 +162,41 @@ private String doResolveTypeSignature(String typeSignature) {
}
case Signature.C_RESOLVED: {
if (typeSignature.indexOf('$') != -1) {
// We cannot use Signature.toString(typeSignature); from JDT because it replaces '$' (for inner class) with '.'
// ex : Ljava.util.Set<Ljava.util.Map$Entry<TK;TV;>;>; the JDT Signature.toString returns java.util.Set<java.util.Map.Entry<K,V>>
// We cannot use Signature.toString(typeSignature); from JDT because it replaces
// '$' (for inner class) with '.'
// ex : Ljava.util.Set<Ljava.util.Map$Entry<TK;TV;>;>; the JDT
// Signature.toString returns java.util.Set<java.util.Map.Entry<K,V>>
// and not java.util.Set<java.util.Map$Entry<K,V>>
return doResolveTypeSignatureWithoutJDT(typeSignature);
return doResolveTypeSignatureWithoutJDT(typeSignature, declaringType);
}
return Signature.toString(typeSignature);
}
case Signature.C_UNRESOLVED:
return doResolveTypeSignatureWithoutJDT(typeSignature);
return doResolveTypeSignatureWithoutJDT(typeSignature, declaringType);
}
// ex :
// - Ljava.lang.Long;
// - Ljava.util.Set<Ljava.util.Map$Entry<TK;TV;>;>;
return Signature.toString(typeSignature);
}

public String doResolveTypeSignatureWithoutJDT(String typeSignature) {
public String doResolveTypeSignatureWithoutJDT(String typeSignature, IType declaringType) {
int startGeneric = typeSignature.indexOf('<');
boolean hasGeneric = startGeneric != -1;
if (!hasGeneric) {
// Example : 'QString';
// Remove the 'Q' start and the ';' end.
boolean endsWithColon = typeSignature.charAt(typeSignature.length() - 1) == Signature.C_NAME_END;
return resolveSimpleType(typeSignature.substring(1, typeSignature.length() - (endsWithColon ? 1 : 0)));
String simpleType = typeSignature.substring(1, typeSignature.length() - (endsWithColon ? 1 : 0));
String resolved = resolveSimpleType(simpleType);
;
if (resolved.equals(simpleType)) {
IType type = declaringType.getType(simpleType);
if (type != null && type.exists()) {
return resolveJavaTypeSignature(type);
}
}
return resolved;
}

// Example :
Expand All @@ -195,7 +206,7 @@ public String doResolveTypeSignatureWithoutJDT(String typeSignature) {

String typeErasure = typeSignature.substring(0, startGeneric); // ex : List
StringBuilder result = new StringBuilder();
result.append(doResolveTypeSignature(typeErasure + Signature.C_NAME_END));
result.append(doResolveTypeSignature(typeErasure + Signature.C_NAME_END, declaringType));
result.append('<');

int bracket = 0;
Expand All @@ -216,7 +227,7 @@ public String doResolveTypeSignatureWithoutJDT(String typeSignature) {
result.append(",");
}
String s = typeSignature.substring(start, i);
result.append(doResolveTypeSignature(s + Signature.C_NAME_END));
result.append(doResolveTypeSignature(s + Signature.C_NAME_END, declaringType));
nbTypeParams++;
start = i + 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ILocalVariable;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;

/**
* Type resolver API.
Expand Down Expand Up @@ -85,7 +86,7 @@ default String resolveSignature(IJavaElement javaElement) {
* @return the resolved Java type signature from the given String
* <code>typeSignature</code>.
*/
String resolveTypeSignature(String typeSignature);
String resolveTypeSignature(String typeSignature, IType declaringType);

/**
* Returns the Java field signature from the given JDT <code>field</code>.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ private static DataModelTemplate<DataModelParameter> createTemplateDataModel(ITy
for (IField field : type.getRecordComponents()) {
DataModelParameter parameter = new DataModelParameter();
parameter.setKey(field.getElementName());
parameter.setSourceType(typeResolver.resolveTypeSignature(field.getTypeSignature()));
parameter.setSourceType(typeResolver.resolveTypeSignature(field.getTypeSignature(), field.getDeclaringType()));
template.getParameters().add(parameter);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,6 @@ private static RegisterForReflectionAnnotation createRegisterForReflection(

private static String resolveTarget(String target, ITypeResolver typeResolver) {
//
return typeResolver.resolveTypeSignature(Signature.C_UNRESOLVED + target + Signature.C_NAME_END);
return typeResolver.resolveTypeSignature(Signature.C_UNRESOLVED + target + Signature.C_NAME_END, null);
}
}

0 comments on commit 8237c69

Please sign in to comment.