/**
* Bytecode Field
*
* @author Martin Bravenboer <martin@cs.uu.nl>
*/
module dryad/model/bytecode-field
imports
dryad/bytecode/util
dryad/model/field
strategies
/**
* Constructs a new bytecode field.
*
* @type _ -> Bytecode Field
*/
new-bytecode-field(|bytecode) =
<classes_get-class> JavaBytecodeField()
; classes_new-instance
; classes_set-instance-field(|"reference-ast", bytecode)
; classes_set-instance-field(|"simple-name", <?Field(_, Name(<id>), _, _)> bytecode)
/**
* Bytecode representation
*/
strategies
get-ast = instanceof-JavaBytecodeField;
get-reference-ast
get-reference-ast = instanceof-JavaBytecodeField;
classes_get-instance-field(|"reference-ast")
set-reference-ast(|refast) = instanceof-JavaBytecodeField;
classes_set-instance-field(|"reference-ast", refast)
strategies
/**
* Succeeds if a field is static
*
* @type Field -> Field
*/
is-static = instanceof-JavaBytecodeField;
where(
get-access-flags
; fetch(?Static())
)
/**
* @type Field Object -> Access Modifier
* @todo Default access in interface is public: do we need to handle that for bytecode?
*/
get-access = instanceof-JavaBytecodeField;
get-access-flags
; (fetch-elem(?Public() + ?Private() + ?Protected())
<+ !DefaultAccess())
/**
* Returns the access flags of a field.
*
* @type Field -> List(AccessFlag)
*/
get-access-flags = instanceof-JavaBytecodeField;
get-reference-ast
; ?Field(AccessFlags(<id>), _, _, _)
strategies
/**
* Returns the type of a field.
*
* @type Field -> Source Type
*/
get-type = instanceof-JavaBytecodeField;
if-signature(
?FieldSignature(<id>)
, get-reference-ast
; ?Field(_, _, FieldDescriptor(<id>), _)
; bytecode-type-to-source-type
)
strategies
/**
* Returns the generic signature of this field.
*
* @type BytecodeField Object -> FieldSignature
*/
get-signature = instanceof-JavaBytecodeField;
?this; (
classes_get-instance-field(|GenericSignature())
<+ get-attributes
; if fetch(?FieldSignature(_); ?sig) then
!Some(sig)
else
!None()
end
; ?result
; <classes_set-instance-field(|GenericSignature(), result)> this
; reclassify-field-signature
; classes_get-instance-field(|GenericSignature())
)
; ?Some(<id>)
strategies
/**
* Returns the attributes of this bytecode field.
*
* Note: attributes are a bytecode-level construct and are not
* directly related to Java source annotations. This strategy returns
* the *bytecode* attributes.
*
* @type BytecodeField Object -> List(Attribute)
*/
get-attributes = instanceof-JavaBytecodeField;
get-reference-ast
; ?Field(_, _, _, Attributes(<id>))
/**
* Stratego class support for bytecode fields
*/
signature
constructors
JavaBytecodeField : ClassName
strategies
/**
* Succeeds if the current term is an instance of Java bytecode method
*/
instanceof-JavaBytecodeField =
classes_instanceof(|JavaBytecodeField())
/**
* Succeeds if the current term is an instance of a Java field.
*
* This alternative declares a JavaBytecodeField to be a JavaField.
*/
instanceof-JavaField =
classes_instanceof(|JavaBytecodeField())