|
|
|
@@ -616,7 +616,7 @@ public class ASTToTargetAST {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static TargetExpression generateCall(TargetMethod method, List<TargetLocalVar> params, TargetType classType, boolean isInterface) {
|
|
|
|
|
private static TargetExpression generateCall(TargetMethod method, List<TargetLocalVar> params, TargetType classType) {
|
|
|
|
|
var mParams = new ArrayList<TargetExpression>();
|
|
|
|
|
for (var i = 0; i < params.size(); i++) {
|
|
|
|
|
var tpe = method.signature().parameters().get(i).pattern().type();
|
|
|
|
@@ -624,11 +624,11 @@ public class ASTToTargetAST {
|
|
|
|
|
}
|
|
|
|
|
TargetExpression caseBody = new TargetMethodCall(
|
|
|
|
|
method.signature().returnType(),
|
|
|
|
|
method.isStatic() ? new TargetClassName(classType) : new TargetThis(classType),
|
|
|
|
|
new TargetThis(classType),
|
|
|
|
|
mParams,
|
|
|
|
|
classType,
|
|
|
|
|
method.name(),
|
|
|
|
|
method.isStatic(), isInterface, method.isPrivate()
|
|
|
|
|
false, false, method.isPrivate()
|
|
|
|
|
);
|
|
|
|
|
if (method.signature().returnType() != null) {
|
|
|
|
|
caseBody = new TargetReturn(caseBody);
|
|
|
|
@@ -636,11 +636,11 @@ public class ASTToTargetAST {
|
|
|
|
|
return caseBody;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private TargetExpression generatePatternOverloadsRec(int offset, TargetExpression switchExpr, List<TargetLocalVar> params, List<TargetPattern> patterns, List<TargetMethod> methods, TargetType classType, boolean isInterface) {
|
|
|
|
|
private TargetExpression generatePatternOverloadsRec(int offset, TargetExpression switchExpr, List<TargetLocalVar> params, List<TargetPattern> patterns, List<TargetMethod> methods, TargetType classType) {
|
|
|
|
|
if (methods.isEmpty()) throw new DebugException("Couldn't find a candidate for switch overloading");
|
|
|
|
|
if (methods.size() == 1) {
|
|
|
|
|
var method = methods.getFirst();
|
|
|
|
|
return generateCall(method, params, classType, isInterface);
|
|
|
|
|
return generateCall(method, params, classType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var cases = new ArrayList<TargetSwitch.Case>();
|
|
|
|
@@ -689,11 +689,11 @@ public class ASTToTargetAST {
|
|
|
|
|
}).toList();
|
|
|
|
|
|
|
|
|
|
if (candidates.isEmpty()) {
|
|
|
|
|
var body = new TargetBlock(List.of(generateCall(method, params, classType, isInterface)));
|
|
|
|
|
var body = new TargetBlock(List.of(generateCall(method, params, classType)));
|
|
|
|
|
cases.add(new TargetSwitch.Case(List.of(lastPattern), body));
|
|
|
|
|
} else {
|
|
|
|
|
//candidates.forEach(m -> Target.logger.info(m.getSignature()));
|
|
|
|
|
var caseBody = generatePatternOverloadsRec(offset + 1, expr, params, patternsRec, candidates, classType, isInterface);
|
|
|
|
|
var caseBody = generatePatternOverloadsRec(offset + 1, expr, params, patternsRec, candidates, classType);
|
|
|
|
|
var body = new TargetBlock(List.of(caseBody));
|
|
|
|
|
var case_ = new TargetSwitch.Case(List.of(lastPattern), body);
|
|
|
|
|
|
|
|
|
@@ -746,7 +746,7 @@ public class ASTToTargetAST {
|
|
|
|
|
|
|
|
|
|
private Optional<TargetMethod> generateBridgeMethod(ClassOrInterface clazz, List<TargetMethod> methods) {
|
|
|
|
|
// If there's only one method we don't need a bridge
|
|
|
|
|
//if (clazz.isInterface()) return Optional.empty();
|
|
|
|
|
if (clazz.isInterface()) return Optional.empty();
|
|
|
|
|
if (methods.size() <= 1) return Optional.empty();
|
|
|
|
|
|
|
|
|
|
var firstMethod = methods.getFirst();
|
|
|
|
@@ -785,7 +785,7 @@ public class ASTToTargetAST {
|
|
|
|
|
var parameters = resParams.stream().map( p -> new TargetLocalVar(p.pattern().type(), p.pattern().name())).toList();
|
|
|
|
|
|
|
|
|
|
var classType = new TargetRefType(clazz.getClassName().toString());
|
|
|
|
|
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(resParams.getFirst().pattern().type(), resParams.getFirst().pattern().name()), parameters, List.of(), methods, classType, clazz.isInterface());
|
|
|
|
|
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(resParams.getFirst().pattern().type(), resParams.getFirst().pattern().name()), parameters, List.of(), methods, classType);
|
|
|
|
|
var block = new TargetBlock(List.of(stmt));
|
|
|
|
|
|
|
|
|
|
var generics = new HashSet<>(firstMethod.signature().generics());
|
|
|
|
@@ -868,7 +868,7 @@ public class ASTToTargetAST {
|
|
|
|
|
|
|
|
|
|
// Generate dispatch method
|
|
|
|
|
var classType = new TargetRefType(clazz.getClassName().toString());
|
|
|
|
|
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(signatureParams.getFirst().pattern().type(), signatureParams.getFirst().pattern().name()), parameters, List.of(), res, classType, clazz.isInterface());
|
|
|
|
|
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(signatureParams.getFirst().pattern().type(), signatureParams.getFirst().pattern().name()), parameters, List.of(), res, classType);
|
|
|
|
|
var block = new TargetBlock(List.of(stmt));
|
|
|
|
|
|
|
|
|
|
var bridgeMethod = new TargetMethod(firstMethod.access(), firstMethod.name(), block, group.signature.java, group.signature.tx, firstMethod.base(), null);
|
|
|
|
|