/**
* Array class.
(
* Array classes are stored in a global hashtable. They should never be created
* explicitly by users.
*
* @author Martin Bravenboer <martin@cs.uu.nl>
*/
module dryad/model/array-class
imports
dryad/lib-ext/oo/classes
dryad/model/class
dryad/model/source-field
dryad/model/source-constructor
dryad/model/source-method
dryad/util/jtree
dryad/util/jtree-overlays
strategies
/**
* Succeeds if this class represents an array class.
*
* @type Class Object -> Class Object
*/
is-array-class =
instanceof-JavaArrayClass
/**
* Returns the array class for the given component type.
*
* @type Type -> Class Object
*/
get-array-class =
?type
; get-array-class-hashtable
; hashtable-get(new-array-class(|type) | type)
/**
* Returns the hashtable of array classes.
*
* @type _ -> Hashtable(Type, Class Object)
*/
get-array-class-hashtable =
table-hashtable
; hashtable-get(new-hashtable | ArrayClasses())
/**
* @todo The fully qualified name of an array is currently a type, not a name. This
* is a bit of a hack: do we need an explicit representation for names
* of array types?
*
* @todo See 6.7: in which cases does a component type not have a fully qualified name?
*/
get-canonical-name = instanceof-JavaArrayClass;
!ArrayType(<get-component-type; fully-qualified-name>)
strategies
/**
* @type Type -> Name
*/
fully-qualified-name =
is-reference-type
; lookup-class
; get-fully-qualified-name
/**
* @type Type -> Name
*/
fully-qualified-name =
is-primitive-type
strategies
/**
* Returns the component type of this array class.
* For example, the component type of int[][] is int[].
*
* @type ArrayClass Object -> Type
*/
get-component-type = instanceof-JavaArrayClass;
classes_get-instance-field(|ComponentTypeField())
/**
* Returns the element type of this array class.
* For example, the element type of int[][] is int.
*
* @type ArrayClass Object -> Type
*/
get-element-type = instanceof-JavaArrayClass;
get-component-type
; repeat(?ArrayType(<id>))
strategies
/**
* Returns the superclass of this array class.
*
* @type ArrayClass Object -> Source Type
*/
get-superclass-as-type = instanceof-JavaArrayClass;
!TypeObject()
/**
* Returns the interfaces implemented by this array class.
*
* @type ArrayClass Object -> List(Source Type)
*/
get-superinterfaces-as-type = instanceof-JavaArrayClass;
![TypeCloneable(), TypeSerializable()]
/**
* Succeeds if this class is an interface.
*/
is-interface = instanceof-JavaArrayClass;
fail
/**
* Constructors
*/
strategies
/**
* Initializes the declared constructors list of the array class.
*
* @type ArrayClass Object -> ArrayClass Object
*/
init-declared-constructor-list = instanceof-JavaArrayClass;
classes_set-instance-field(|"declared-constructor-list", [])
/**
* Fields
*/
strategies
/**
* Initializes the field table of an array class.
*
* @todo Maybe use a different field subclass here.
* @todo The fields can be shared between all array classes.
* @type ArrayClass Object -> ArrayClass Object
*/
init-declared-field-table = instanceof-JavaArrayClass;
?this; where(
<new-hashtable> () => fieldtbl
; new-source-field(|"length", FieldDec([Public,Final],Int,[VarDec(Id("length"))]))
; set-declaring-class(|this)
; ?field
; <hashtable-put(|"length", field)> fieldtbl
)
; classes_set-instance-field(|"declared-field-table", fieldtbl)
/**
* Methods
*/
strategies
/**
* Initializes the declared method table of an array class.
*
* @todo Maybe use a different method subclass here.
* @todo Add the clone method
* @type ArrayClass Object -> ArrayClass Object
*/
init-declared-method-table = instanceof-JavaArrayClass;
?this; where(new-hashtable => methodtbl)
; classes_set-instance-field(|"declared-method-table", methodtbl)
/**
* Stratego class support for array classes.
*/
strategies
/**
* Constructs a new array class.
*
* @param Component type of this array class.
* @type _ -> Class
*/
new-array-class(|component-type) =
<classes_get-class> JavaArrayClass()
; classes_new-instance
; classes_set-instance-field(|ComponentTypeField(), component-type)
/**
* Succeeds if the current term is an instance of a Java array class
*/
instanceof-JavaArrayClass =
classes_instanceof(|JavaArrayClass())
/**
* Succeeds if the current term is an instance of a Java class.
*
* This alternative declares a JavaArrayClass to be a JavaClass.
*/
instanceof-JavaClass =
classes_instanceof(|JavaArrayClass())
signature
constructors
JavaArrayClass : ClassName
ArrayClasses : HashtableKey
ComponentTypeField : ObjectField