/**
 * Source Field
 *
 * @author Martin Bravenboer <martin@cs.uu.nl>
 */
module dryad/model/source-field
imports
  dryad/model/field
   
strategies

  /**
   * Constructs a new source field.
   *
   * @todo A name is required here, since the fielddec can declare multiple fields.
   * @type  _ -> SourceField Object
   */
  new-source-field(|simple-name, ast) =
    <classes_get-class> JavaSourceField()
    ; classes_new-instance
    ; classes_set-instance-field(|"reference-ast", ast)
    ; classes_set-instance-field(|"simple-name", simple-name)

  /**
   * Succeeds if a field is static
   *
   * @type Field Object -> Field Object
   */
  is-static =  instanceof-JavaSourceField; 
    where(
      get-modifiers
      ; fetch(?Static())
    )

/**
 * Modifiers.
 */
strategies

  /**
   * @type Field Object -> Access Modifier
   */
  get-access = instanceof-JavaSourceField; ?this;
    get-modifiers
    ; ( fetch-elem(?Public() + ?Private() + ?Protected())
     <+ if <get-declaring-class> this; is-interface then
          !Public()
        else
          !DefaultAccess()
        end
      )

  /**
   * Returns the modifiers of a field.
   *
   * @type Field Object -> List(Modifier)
   */
  get-modifiers =  instanceof-JavaSourceField;
    get-reference-ast
    ; ( ?FieldDec(<id>, _, _)
      + ?ConstantDec(<id>, _, _)
      )

strategies

  /**
   * @type Field Object -> Type
   */
  get-type = instanceof-JavaSourceField; ?this;
    get-reference-ast
    ; get-type-of-field(|<get-simple-name> this)

/**
 * AST representation
 */
strategies

  get-ast = instanceof-JavaSourceField;
    get-reference-ast
    
  get-reference-ast = instanceof-JavaSourceField;
    classes_get-instance-field(|"reference-ast")  
    
  set-reference-ast(|refast) =  instanceof-JavaSourceField;
    classes_set-instance-field(|"reference-ast", refast)

/**
 * Stratego class support for source fields
 */
signature
  constructors
    JavaSourceField : ClassName
 
strategies

  /**
   * Succeeds if the current term is an instance of Java source field
   */
  instanceof-JavaSourceField =
    classes_instanceof(|JavaSourceField())

  /**
   * Succeeds if the current term is an instance of a Java field.
   *
   * This alternative declares a JavaSourceField to be a JavaField.
   */
  instanceof-JavaField =
    classes_instanceof(|JavaSourceField())