/**
* Source Method
*
* @todo The distinction between methods and abstract methods is annoying. Normalize?
* @author Martin Bravenboer <martin@cs.uu.nl>
*/
module dryad/model/source-method
/**
* Constructors
*/
strategies
/**
* Constructs a new source method.
*
* @type _ -> Source Method Object
*/
new-source-method(|ast) =
<classes_get-class> JavaSourceMethod()
; classes_new-instance
; classes_set-instance-field(|"reference-ast", ast)
/**
* AST representation
*/
strategies
get-ast = instanceof-JavaSourceMethod;
get-reference-ast
get-reference-ast = instanceof-JavaSourceMethod;
classes_get-instance-field(|"reference-ast")
set-reference-ast(|refast) = instanceof-JavaSourceMethod;
classes_set-instance-field(|"reference-ast", refast)
strategies
/**
* Returns the simple name of this method.
*
* @type Method Object -> String
*/
get-simple-name = instanceof-JavaSourceMethod;
get-ast
; ( ?MethodDec(MethodDecHead(_, _, _, Id(<id>), _, _), _)
<+ ?AbstractMethodDec(_, _, _, Id(<id>), _, _)
)
strategies
/**
* @type Method Object -> Access Modifier
*/
get-access = instanceof-JavaSourceMethod; ?this;
get-modifiers
; ( fetch-elem(?Public() + ?Private() + ?Protected())
<+ if <get-declaring-class> this; is-interface then
!Public()
else
!DefaultAccess()
end
)
/**
* Succeeds if a method is static
*
* @type Method Object -> Method Object
*/
is-static = instanceof-JavaSourceMethod;
where(
get-modifiers
; fetch(?Static())
)
/**
* @type Method Object -> List(Modifier)
*/
get-modifiers = instanceof-JavaSourceMethod;
get-reference-ast
; ( ?MethodDec(MethodDecHead(<id>, _, _, _, _, _), _)
<+ ?AbstractMethodDec(<id>, _, _, _, _, _)
)
strategies
/**
* @todo Deprecated method dec head (array after head)
* @type Method Object -> Source Type
*/
get-return-type = instanceof-JavaSourceMethod;
get-reference-ast
; ( ?MethodDec(MethodDecHead(_, _, <id>, _, _, _), _)
<+ ?AbstractMethodDec(_, _, <id>, _, _, _)
)
/**
* Returns a list of exceptions declared to be thrown by this method.
*
* @type Method Object -> List(Source type)
*/
get-declared-exception-types = instanceof-JavaSourceMethod;
get-reference-ast
; ( ?MethodDec(MethodDecHead(_, _, _, _, _, Some(ThrowsDec(<id>))), _)
<+ ?MethodDec(MethodDecHead(_, _, _, _, _, None()), _)
; ![]
<+ ?AbstractMethodDec(_, _, _, _, _, Some(ThrowsDec(<id>)))
<+ ?AbstractMethodDec(_, _, _, _, _, None())
; ![]
)
/**
* Returns the arity (number of arguments) of this method
*/
get-arity = instanceof-JavaSourceMethod;
get-ast
; ( ?MethodDec(MethodDecHead(_, _, _, _, <length>, _), _)
<+ ?AbstractMethodDec(_, _, _, _, <length>, _)
)
/**
* Succeeds if this method takes a variable number of arguments.
*/
is-variable-arity-method = instanceof-JavaSourceMethod;
where(
get-ast
; ( ?MethodDec(MethodDecHead(_, _, _, _, <id>, _), _)
+ ?AbstractMethodDec(_, _, _, _, <id>, _)
)
; fetch(is-variable-arity-param)
)
/**
* Returns the formal parameters types of a method as source types.
*
* @todo Handle VarArityParam. What is its type?
* @type Method -> List(Source Type)
*/
get-formal-parameter-types = instanceof-JavaSourceMethod;
get-ast
; ( ?MethodDec(MethodDecHead(_, _, _, _, <id>, _), _)
+ ?AbstractMethodDec(_, _, _, _, <id>, _)
)
; map(get-type-of-param)
/**
* Succeeds if this FormalParam has a variable arity.
*
* @type FormalParam -> ?
*/
is-variable-arity-param =
?VarArityParam(_, _, _)
strategies
/**
* @type SourceClass Object -> List(TypeParam)
*/
get-formal-type-parameters = instanceof-JavaSourceMethod;
get-reference-ast
; ( ?MethodDec(MethodDecHead(_, Some(TypeParams(<id>)), _, _, _, _), _)
<+ ?MethodDec(MethodDecHead(_, None(), _, _, _, _), _)
; ![]
<+ ?AbstractMethodDec(_, Some(TypeParams(<id>)), _, _, _, _)
<+ ?AbstractMethodDec(_, None(), _, _, _, _)
; ![]
)
/**
* Stratego class support for source methods
*/
signature
constructors
JavaSourceMethod : ClassName
strategies
/**
* Succeeds if the current term is an instance of Java source method
*/
instanceof-JavaSourceMethod =
classes_instanceof(|JavaSourceMethod())
/**
* Succeeds if the current term is an instance of a Java method.
*
* This alternative declares a JavaSourceMethod to be a JavaMethod.
*/
instanceof-JavaMethod =
classes_instanceof(|JavaSourceMethod())