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

1
/*
2
 * JavaTermLocalVariableModel.java
3
 *
4
 *
5
 * Copyright (c) 2006 GradSoft  Ukraine
6
 * All Rights Reserved
7
 */
8
9
10
package ua.gradsoft.javachecker.models;
11
12
import java.lang.annotation.ElementType;
13
import java.util.Map;
14
import ua.gradsoft.javachecker.EntityNotFoundException;
15
import ua.gradsoft.javachecker.JUtils;
16
import ua.gradsoft.javachecker.attributes.AttributedEntity;
17
import ua.gradsoft.termware.Term;
18
import ua.gradsoft.termware.TermWareException;
19
20
/**
21
 *Model of local variable.
22
 */
23
public class JavaTermLocalVariableModel implements JavaLocalVariableModel
24
{
25
    
26
    public JavaTermLocalVariableModel(Term identifierTerm,JavaLocalVariableKind kind, 
27
                                      Term modifiersTerm, Term typeTerm, 
28
                                      Term initOrIterateExpressionTerm,
29
                                      JavaTermExpressionModel initExpression,
30
                                      JavaTermStatementModel statement) throws TermWareException
31
    {
32
      identifierTerm_=identifierTerm;
33
      //kind_=kind;
34
      typeTerm_=typeTerm;
35
      initOrIterateExpressionTerm_=initOrIterateExpressionTerm;
36
      initExpression_=initExpression;
37
      statement_=statement;
38
      resolvedType_=null;
39
      modifiers_=new JavaTermModifiersModel(modifiersTerm,ElementType.LOCAL_VARIABLE,this);
40
    }
41
    
42
    public String getName()
43
    { return identifierTerm_.getSubtermAt(0).getString(); }
44
    
45
    public JavaVariableKind getKind()
46
    { return JavaVariableKind.LOCAL_VARIABLE; }
47
    
48
    /**
49
     * get type model.  
50
     */
51
    public JavaTypeModel getType() throws TermWareException, EntityNotFoundException
52
    { return resolveType(); }
53
    
54
    public JavaStatementModel getStatement()
55
    { return statement_; }
56
    
57
    public boolean isForHead()
58
    { return statement_.getKind()==JavaStatementKind.FOR_STATEMENT; }
59
    
60
    public JavaExpressionModel  getInitExpressionModel()
61
    { return initExpression_; }
62
            
63
    /**
64
     * LocalVariableModel(Modifiers,TypeRef(),Identifier,Init, ctx)
65
     */
66
    public Term getModelTerm() throws TermWareException, EntityNotFoundException
67
    {
68
        JavaTypeModel type=resolveType();
69
        Term modifiersTerm = modifiers_.getModelTerm();
70
        Term typeRef=TermUtils.createTerm("TypeRef",typeTerm_,TermUtils.createJTerm(type));
71
        Term identifier=identifierTerm_;
72
        Term initTerm = TermUtils.createNil();
73
        if (initExpression_!=null) {
74
            initTerm = initExpression_.getModelTerm();
75
        }
76
        JavaPlaceContext ctx = JavaPlaceContextFactory.createNewStatementContext(statement_);
77
        Term tctx = TermUtils.createJTerm(ctx);
78
        Term retval = TermUtils.createTerm("LocalVariableModel",modifiersTerm,typeRef,identifier,initTerm,tctx);
79
        return retval;
80
    }
81
    
82
83
    public Term getTypeTerm()
84
    { return typeTerm_; }
85
    
86
    public Term getInitOrIterateTerm()
87
    { return initOrIterateExpressionTerm_; }
88
    
89
    public Map<String,JavaAnnotationInstanceModel> getAnnotationsMap()
90
    { return modifiers_.getAnnotationsMap(); }
91
    
92
    public JavaModifiersModel getModifiers()
93
    { return modifiers_; }
94
    
95
    public JavaTypeModel getOwnerType()
96
    {
97
        return getTopLevelBlockOwner().getTypeModel(); 
98
    }
99
    
100
    public JavaTopLevelBlockOwnerModel getTopLevelBlockOwner()
101
    { return statement_.getTopLevelBlockModel().getOwnerModel(); }
102
    
103
    
104
    private JavaTypeModel resolveType() throws TermWareException, EntityNotFoundException
105
    {
106
      if (resolvedType_==null) {  
107
        try {  
108
          resolvedType_ = JavaResolver.resolveTypeToModel(typeTerm_,statement_);
109
        }catch(EntityNotFoundException ex){          
110
          ex.setFileAndLine(JUtils.getFileAndLine(identifierTerm_));
111
          throw ex;
112
        }
113
      }
114
      return resolvedType_;
115
    }
116
    
117
   
118
    private AttributedEntity getLocalVariableAttributesRoot() throws TermWareException
119
    {
120
        return statement_.getTopLevelBlockModel().getOwnerModel().getChildAttributes("*LocalVariables");
121
    }
122
    
123
    public Term getAttribute(String name) throws TermWareException
124
    {
125
       return getLocalVariableAttributesRoot().getAttribute(name);
126
    }
127
    
128
    public void setAttribute(String name, Term value) throws TermWareException
129
    {
130
       getLocalVariableAttributesRoot().setAttribute(name,value);
131
    }
132
    
133
    public AttributedEntity getChildAttributes(String childName)
134
    { return null; }
135
136
    public boolean isConstant() throws TermWareException, EntityNotFoundException
137
    {
138
      if (modifiers_.isFinal()) {
139
         if (initExpression_!=null) {
140
             return initExpression_.isConstantExpression();
141
         }
142
      }
143
      return false;
144
    }
145
    
146
    private Term identifierTerm_;
147
    private Term typeTerm_;   
148
    private Term initOrIterateExpressionTerm_;
149
    private JavaTermExpressionModel initExpression_;
150
    //private JavaLocalVariableKind  kind_;
151
    private JavaTermStatementModel statement_;
152
153
    private JavaTypeModel resolvedType_;
154
    private JavaTermModifiersModel modifiers_;    
155
    
156
}