/**
* Bytecode Method
*/
module dryad/model/bytecode-method
imports
dryad/reclassify/Bytecode
strategies
/**
* Constructs a new bytecode method.
*
* @type _ -> Bytecode Method
*/
new-bytecode-method(|bytecode) =
<classes_get-class> JavaBytecodeMethod()
; classes_new-instance
; classes_set-instance-field(|"reference-ast", bytecode)
/**
* Bytecode representation
*/
strategies
get-ast = instanceof-JavaBytecodeMethod;
get-reference-ast
get-reference-ast = instanceof-JavaBytecodeMethod;
classes_get-instance-field(|"reference-ast")
set-reference-ast(|refast) = instanceof-JavaBytecodeMethod;
classes_set-instance-field(|"reference-ast", refast)
/**
* Access and modifiers.
*/
strategies
/**
* @type Method Object -> Access Modifier
* @todo Default access in interface is public: do we need to handle that for bytecode?
*/
get-access = instanceof-JavaBytecodeMethod;
get-access-flags
; (fetch-elem(?Public() + ?Private() + ?Protected())
<+ !DefaultAccess())
get-access-flags = instanceof-JavaBytecodeMethod;
get-reference-ast
; ?Method(AccessFlags(<id>), _, _, _)
/**
* Succeeds if a method is static
*
* @type Method Object -> Method Object
*/
is-static = instanceof-JavaBytecodeMethod;
where(
get-access-flags
; fetch(?Static())
)
strategies
/**
* Returns the return type of this method, considering the
* generic signature if it is available.
*
* @type Method -> Source type
*/
get-return-type = instanceof-JavaBytecodeMethod;
if-signature(
?MethodSignature(_, _, Returns(<id>), _)
, get-reference-ast
; ?Method(_, _, MethodDescriptor(_, <id>), _)
; bytecode-type-to-source-type
)
/**
* Returns a list of exceptions declared to be thrown by this
* method.
*
* @todo Consider generic exceptions declared in a signature.
* @type Method -> List(Source type)
*/
get-declared-exception-types = instanceof-JavaBytecodeMethod;
get-reference-ast
; if ?Method(_, _, _, Attributes(<fetch(?Exceptions(es))>)) then
!es
; map(?Class(<!ObjectType(<id>); bytecode-type-to-source-type>))
else
![]
end
/**
* @type Method -> String
*/
get-simple-name = instanceof-JavaBytecodeMethod;
get-reference-ast
; ?Method(_, Name(<id>), _, _)
/**
* Returns the arity (number of arguments) of this method
*/
get-arity = instanceof-JavaBytecodeMethod;
get-reference-ast
; ?Method(_, _, MethodDescriptor(<length>, _), _)
/**
* Succeeds if this method takes a variable number of arguments.
*/
is-variable-arity-method = instanceof-JavaBytecodeMethod;
where(
get-reference-ast
; ?Method(<id>, _, _, _)
; fetch(?Varargs())
)
/**
* Returns the formal parameters types of a method as source types,
* considering the generic signature if it is available.
*
* @type Method -> List(Source Type)
*/
get-formal-parameter-types = instanceof-JavaBytecodeMethod;
if-signature(
?MethodSignature(_, Params(<id>), _, _)
, get-reference-ast
; ?Method(_, _, MethodDescriptor(<id>, _), _)
; map(bytecode-type-to-source-type)
)
strategies
/**
* Returns the list of formal parameter types of this method.
* If this is not a generic method, then the empty list is returned.
*
* @type BytecodeMethod Object -> List(TypeParam)
*/
get-formal-type-parameters = instanceof-JavaBytecodeMethod;
if-signature(
?MethodSignature(TypeParams(<id>), _, _, _)
, ![]
)
/**
* Returns the generic signature of this method.
*
* @type BytecodeMethod Object -> MethodSignature
*/
get-signature = instanceof-JavaBytecodeMethod;
?this; (
classes_get-instance-field(|GenericSignature())
<+ get-attributes
; if fetch(?MethodSignature(_, _, _, _); ?sig) then
!Some(sig)
else
!None()
end
; ?result
; <classes_set-instance-field(|GenericSignature(), result)> this
; reclassify-method-signature
; classes_get-instance-field(|GenericSignature())
)
; ?Some(<id>)
if-signature(then, else) =
get-signature < then + else
strategies
/**
* Returns the attributes of this bytecode method.
*
* Note: attributes are a bytecode-level construct and are not
* directly related to Java source annotations. This strategy returns
* the *bytecode* attributes.
*
* @type BytecodeMethod Object -> List(Attribute)
*/
get-attributes = instanceof-JavaBytecodeMethod;
get-reference-ast
; ?Method(_, _, _, Attributes(<id>))
/**
* Stratego class support for bytecode methods
*/
signature
constructors
JavaBytecodeMethod : ClassName
GenericSignature : FieldName
strategies
/**
* Succeeds if the current term is an instance of Java bytecode method
*/
instanceof-JavaBytecodeMethod =
classes_instanceof(|JavaBytecodeMethod())
/**
* Succeeds if the current term is an instance of a Java method.
*
* This alternative declares a JavaBytecodeMethod to be a JavaMethod.
*/
instanceof-JavaMethod =
classes_instanceof(|JavaBytecodeMethod())