root / trunk / JavaChecker / jsrc / ua / gradsoft / javachecker / models / JavaTermEnumConstantModel.java @ 15107

1
/*
2
 * JavaTermEnumConstantModel.java
3
 *
4
 * Copyright (c) 2006 GradSoft  Ukraine
5
 * All Rights Reserved
6
 */
7
8
9
package ua.gradsoft.javachecker.models;
10
11
import java.util.Collections;
12
import java.util.LinkedList;
13
import java.util.List;
14
import java.util.Map;
15
import ua.gradsoft.javachecker.EntityNotFoundException;
16
import ua.gradsoft.termware.Term;
17
import ua.gradsoft.termware.TermHelper;
18
import ua.gradsoft.termware.TermWareException;
19
import ua.gradsoft.termware.exceptions.AssertException;
20
21
/**
22
 *Model of enum constant
23
 * @author Ruslan Shevchenko
24
 */
25
public class JavaTermEnumConstantModel extends JavaEnumConstantModel
26
{
27
    
28
    JavaTermEnumConstantModel(Term enumConstantTerm, JavaTermEnumModel owner) throws TermWareException
29
    {      
30
      owner_=owner;
31
      identifierTerm_ = enumConstantTerm.getSubtermAt(IDENTIFIER_TERM_INDEX);
32
      name_ = identifierTerm_.getSubtermAt(0).getString();
33
      if (enumConstantTerm.getArity()>=ARGUMENTS_TERM_INDEX+1) {
34
          argumentsTerm_ = enumConstantTerm.getSubtermAt(ARGUMENTS_TERM_INDEX);
35
      }else{
36
          argumentsTerm_ = TermUtils.createNil();
37
      }
38
      //System.err.println("enum constant "+name_+", arity="+enumConstantTerm.getArity());  
39
      if (enumConstantTerm.getArity()>=CLASSORINTERFACE_BODY_TERM_INDEX+1) {
40
          subtype_=new JavaTermEnumAnonimousTypeModel(name_,enumConstantTerm.getSubtermAt(CLASSORINTERFACE_BODY_TERM_INDEX),owner); 
41
      }
42
    }
43
    
44
    public String getName()
45
    {
46
      return name_;  
47
    }
48
    
49
    
50
    public JavaTypeModel getType()
51
    {
52
      return (subtype_==null) ? owner_ : subtype_;  
53
    }
54
    
55
    public JavaTypeModel getOwnerType()
56
    { return owner_; }
57
58
    public List<JavaTermExpressionModel>  getArgumentModels() throws TermWareException
59
    {          
60
      if (arguments_==null) {
61
          Term at = argumentsTerm_;
62
          if (!at.isNil()) {
63
              at = at.getSubtermAt(0);
64
          }
65
            arguments_=new LinkedList<JavaTermExpressionModel>();
66
            while(!at.isNil()) {
67
              Term argterm = at.getSubtermAt(0);
68
              at = at.getSubtermAt(1);
69
              JavaTermExpressionModel expr = JavaTermExpressionModel.create(argterm,null,owner_);
70
              arguments_.add(expr);
71
            }
72
      }  
73
      
74
      return arguments_;
75
    }
76
    
77
    public Map<String,JavaAnnotationInstanceModel> getAnnotationsMap()
78
    { return Collections.emptyMap(); }
79
    
80
    /**
81
     * EnumConstantModel(identifierTerm,arguments,subtype)
82
     */
83
    public Term getModelTerm() throws TermWareException, EntityNotFoundException
84
    {
85
       Term argumentsModelTerm = TermUtils.createNil();
86
       for(JavaTermExpressionModel expr: getArgumentModels()) {
87
           Term argm = expr.getModelTerm();
88
           argumentsModelTerm = TermUtils.createTerm("cons",argm,argumentsModelTerm);
89
       }
90
       argumentsModelTerm = TermUtils.reverseListTerm(argumentsModelTerm);
91
       Term subtypeModelTerm = (subtype_==null) ? TermUtils.createNil() : subtype_.getModelTerm();
92
       
93
       return TermUtils.createTerm("EnumConstantModel",identifierTerm_,argumentsModelTerm,subtypeModelTerm);
94
    }
95
        
96
    public Term getIdentifierTerm()
97
    { return identifierTerm_; }
98
    
99
    public boolean isSupportInitializerExpression()
100
    { return false;}
101
    
102
    public JavaExpressionModel getInitializerExpression()
103
    { return null; }
104
105
    public boolean isConstant()
106
    { return true; }
107
    
108
    private String               name_;
109
    private Term                 identifierTerm_;
110
    private Term                 argumentsTerm_;
111
    private List<JavaTermExpressionModel>  arguments_=null;
112
    private JavaTermEnumModel    owner_;
113
    private JavaTermEnumAnonimousTypeModel subtype_=null;
114
    
115
    public static final int IDENTIFIER_TERM_INDEX=0;
116
    public static final int ARGUMENTS_TERM_INDEX=1;
117
    public static final int CLASSORINTERFACE_BODY_TERM_INDEX=2;
118
}