def doTransform(MutableClassDeclaration cls, MethodDeclaration method, TypeReference originalCls, extension TransformationContext context) {
cls.addMethod(method.simpleName) [
val newMethod = it
static = method.static
final = method.final
varArgs = method.varArgs
visibility = method.visibility
deprecated = method.deprecated
docComment = method.docComment
exceptions = method.exceptions
synchronized = method.synchronized
returnType = method.returnType
val types = method.typeParameters.map [ newMethod.addTypeParameter(simpleName, upperBounds) ].toList
for(parameter : method.parameters) {
addParameter(parameter.simpleName, parameter.type)
}
body = ['''
«IF !method.returnType.isVoid»return «ENDIF»«originalCls.name».«method.simpleName»(«FOR parameter : method.parameters SEPARATOR ', '»«parameter.simpleName»«ENDFOR»);
''']
]
}
def static <IN> complete(IN from) {
new Deferred<IN, Boolean> => [
value(from, true)
]
}
public static <IN extends Object> Deferred<?, Boolean> complete(final ? from) {
return nl.kii.async.promise.PromiseExtensions.complete(from);
}
Also, methods parameters that have generic types will not work:
def static <IN, OUT> Task start(Promise<IN, OUT> promise) {
promise.next
promise.asTask
}
public static <IN extends Object, OUT extends Object> Task start(final Promise<?, ?> promise) {
return nl.kii.async.promise.PromiseExtensions.start(promise);
}
val newMethodTypeParams = originalMethod.typeParameters
.map [ newMethod.addTypeParameter(simpleName, upperBounds) ]
.toList
def static TypeReference newGenericTypeReference(TypeReference originalType, List<MutableTypeParameterDeclaration> newMethodTypeParams, extension TransformationContext context) {
// is it a direct type reference?
val t = newMethodTypeParams.findFirst [ simpleName == originalType.simpleName ]
if(t != null) return t.newTypeReference
// try subtype reference
val subtypes = originalType.actualTypeArguments.map [ newGenericTypeReference(newMethodTypeParams, context) ]
originalType.type.newTypeReference(subtypes)
}
for(parameter : originalMethod.parameters) {
addParameter(parameter.simpleName, parameter.type.newGenericTypeReference(newMethodTypeParams, context))
}
returnType = originalMethod.returnType.newGenericTypeReference(newMethodTypeParams, context)
def static TypeReference newGenericTypeReference(TypeReference originalType, List<MutableTypeParameterDeclaration> newMethodTypeParams, extension TransformationContext context) {
// is it a wildcard?
if(originalType.isWildCard) return originalType