/**
* @author Martin Bravenboer <martin@cs.uu.nl>
*/
module dryad/reclassify/Bytecode
imports
dryad/reclassify/Main
dryad/reclassify/ClassOrInterfaceType
strategies
/**
* @type BytecodeMethod Object -> BytecodeMethod Object
*/
reclassify-method-signature = instanceof-JavaBytecodeMethod; ?this;
classes_get-instance-field(|GenericSignature())
; topdown(try(dryad-reclassify-type + bytecode-method-qualify-type-variable(|this)))
; ?result
; <classes_set-instance-field(|GenericSignature(), result)> this
/**
* @type BytecodeField Object -> BytecodeField Object
*/
reclassify-field-signature = instanceof-JavaBytecodeField; ?this;
classes_get-instance-field(|GenericSignature())
; topdown(try(dryad-reclassify-type + bytecode-class-qualify-type-variable(|<get-declaring-class> this)))
; ?result
; <classes_set-instance-field(|GenericSignature(), result)> this
/**
* @type BytecodeClass Object -> BytecodeClass Object
*/
reclassify-class-signature = instanceof-JavaBytecodeClass; ?this;
classes_get-instance-field(|GenericSignature())
; topdown(try(dryad-reclassify-type + bytecode-class-qualify-type-variable(|this)))
; ?result
; <classes_set-instance-field(|GenericSignature(), result)> this
strategies
bytecode-method-qualify-type-variable(|method) =
?var@TypeVar(Id(x));
if <has-formal-type-parameter(|x)> method then
!TypeVar(<get-name> method, Id(x))
else
<get-declaring-class> method => class
; <bytecode-class-qualify-type-variable(|class)> var
end
/**
* @todo Consider local classes (enclosing method)
* @todo Report an error if this is a top-level class and
* the type variable is still not found.
*/
bytecode-class-qualify-type-variable(|class) =
?var@TypeVar(Id(x));
if <has-formal-type-parameter(|x)> class then
!TypeVar(<get-name> class, Id(x))
else
<get-enclosing-class> class => enclosingclass
; <bytecode-class-qualify-type-variable(|enclosingclass)> var
end