Skip to content

Commit

Permalink
Add exception type parsing
Browse files Browse the repository at this point in the history
Exception types are now parsed from MethodModels.

Signed-off-by: Matthew Gill <matthew.gill@live.co.uk>
  • Loading branch information
MattGill98 authored and Pandrex247 committed May 21, 2024
1 parent e860f9a commit 3c058fe
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ public interface MethodModel extends Member, AnnotatedElement {
*/
String[] getArgumentTypes();

/**
* @return the checked exception types, or an empty array if the method doesn't
* declare any thrown exceptions
*/
String[] getExceptionTypes();

/**
* Returns the list of parameter
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
public class MethodModelImpl extends AnnotatedElementImpl implements MethodModel {

private List<Parameter> parameters;
private List<ParameterizedType> exceptionTypes;
private ParameterizedType returnType;
final ExtensibleType<?> owner;
private final String signature;
Expand Down Expand Up @@ -74,6 +75,24 @@ public String[] getArgumentTypes() {
return stringTypes;
}

@Override
public String[] getExceptionTypes() {
String[] stringTypes;
if (exceptionTypes != null) {
stringTypes = new String[exceptionTypes.size()];
for (int i = 0; i < exceptionTypes.size(); i++) {
stringTypes[i] = exceptionTypes.get(i).getTypeName();
}
} else {
stringTypes = new String[0];
}
return stringTypes;
}

public void setExceptionTypes(List<ParameterizedType> exceptionTypes) {
this.exceptionTypes = exceptionTypes;
}

@Override
public List<Parameter> getParameters() {
return parameters;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class MethodSignatureVisitorImpl extends SignatureVisitor {
private final MethodModel methodModel;

private final List<Parameter> parameters = new ArrayList<>();
private final List<ParameterizedType> exceptionTypes = new ArrayList<>();
private final ParameterizedType returnType = new ParameterizedTypeImpl();
private final ArrayDeque<ParameterizedType> parentType = new ArrayDeque<>();

Expand All @@ -50,6 +51,10 @@ public List<Parameter> getParameters() {
return parameters;
}

public List<ParameterizedType> getExceptionTypes() {
return exceptionTypes;
}

public ParameterizedType getReturnType() {
return returnType;
}
Expand All @@ -62,6 +67,11 @@ public SignatureVisitor visitParameterType() {
return this;
}

@Override
public SignatureVisitor visitExceptionType() {
return this;
}

@Override
public SignatureVisitor visitReturnType() {
parentType.add(returnType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,17 @@ public MethodVisitor visitMethod(int access, String name, String desc, String si
org.objectweb.asm.Type type = org.objectweb.asm.Type.getReturnType(desc);
returnType.setType(type);

final List<ParameterizedType> exceptionTypes = new ArrayList<>();
if (exceptions != null) {
for (int i = 0; i < exceptions.length; i++) {
final String exception = exceptions[i];
final ParameterizedTypeImpl exceptionType = new ParameterizedTypeImpl(exception);
exceptionType.setType(org.objectweb.asm.Type.getObjectType(exception));
exceptionTypes.add(exceptionType);
}
}
methodModel.setExceptionTypes(exceptionTypes);

org.objectweb.asm.Type[] types = org.objectweb.asm.Type.getArgumentTypes(desc);
for (int i = 0; i < methodModel.getParameters().size(); i++) {
ParameterImpl parameter = (ParameterImpl) methodModel.getParameter(i);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public void simpleTest() throws IOException, InterruptedException {
Assert.assertEquals("yellow", gradientColor2.get(0).getValues().get("name"));
Assert.assertEquals("orange", gradientColor2.get(1).getValues().get("name"));

// Exception types
final String[] exceptionTypes = mm.getExceptionTypes();
Assert.assertEquals(1, exceptionTypes.length);
Assert.assertEquals(IllegalArgumentException.class.getName(), exceptionTypes[0]);

// Parameter annotations, type and generic types check
Assert.assertEquals(5, mm.getParameters().size());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public SampleType<Integer, Character, Boolean> setFoo(
List<String> input,
SampleType<Double, String, SampleType<Short, Float, Long>> sampleType,
int count,
Object value) {
Object value) throws IllegalArgumentException {
return null;
}
}
Expand Down

0 comments on commit 3c058fe

Please sign in to comment.