Project

General

Profile

root / trunk / compiler / ooasCompiler / src / org / momut / ooas / ast / types / OoActionSystemType.java @ 12

1
/**
2
  *
3
  *                      OOAS Compiler
4
  *
5
  *       Copyright 2015, AIT Austrian Institute of Technology.
6
  * This code is based on the C# Version of the OOAS Compiler, which is
7
  * copyright 2015 by the Institute of Software Technology, Graz University
8
  * of Technology with portions copyright by the AIT Austrian Institute of
9
  * Technology. All rights reserved.
10
  *
11
  * SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED.
12
  *
13
  * If you modify the file please update the list of contributors below to in-
14
  * clude your name. Please also stick to the coding convention of using TABs
15
  * to do the basic (block-level) indentation and spaces for anything after
16
  * that. (Enable the display of special chars and it should be pretty obvious
17
  * what this means.) Also, remove all trailing whitespace.
18
  *
19
  * Contributors:
20
  *               Willibald Krenn (AIT)
21
  *               Stephan Zimmerer (AIT)
22
  *               Markus Demetz (AIT)
23
  *               Christoph Czurda (AIT)
24
  *
25
  */
26

    
27

    
28
package org.momut.ooas.ast.types;
29

    
30
import java.util.ArrayList;
31

    
32
import org.momut.ooas.ast.IAstVisitor;
33
import org.momut.ooas.ast.IScope;
34
import org.momut.ooas.ast.identifiers.Identifier;
35
import org.momut.ooas.ast.identifiers.TypeIdentifier;
36
import org.momut.ooas.ast.statements.Block;
37
import org.momut.ooas.parser.SymbolTable;
38
import org.momut.ooas.utils.exceptions.ArgumentException;
39
import org.momut.ooas.utils.exceptions.InternalCompilerException;
40

    
41
public class OoActionSystemType extends Type implements IScope
42
{
43
        private final boolean m_autoCons;
44
        private OoActionSystemType m_baseType;
45
        private Block m_doOdBlock;
46
        private IScope m_parentScope;
47
        private final SymbolTable m_symbols;
48
        private final ArrayList<OoActionSystemInstance> m_objects;
49
        private final ArrayList<OoActionSystemInstance> m_derivedObjects;
50
        private boolean m_isInSystemDescription;
51

    
52
        public Block doOdBlock() { return m_doOdBlock; }
53
        public boolean autoConstruction() { return m_autoCons; }
54
        public OoActionSystemType baseType() { return m_baseType; }
55
        public SymbolTable symbols() { return m_symbols; }
56
        public ArrayList<OoActionSystemInstance> objects() { return m_objects; }
57
        public ArrayList<OoActionSystemInstance> derivedObjects() { return m_derivedObjects; }
58
        public boolean isInSystemDescription() { return m_isInSystemDescription; }
59

    
60
        public OoActionSystemType(
61
                        boolean autoCons,
62
                        OoActionSystemType refinedSystem,
63
                        TypeIdentifier typeName)
64
        {
65
                super(TypeKind.OoActionSystemType, typeName);
66
                m_symbols = new SymbolTable();
67
                m_autoCons = autoCons;
68
                m_baseType = refinedSystem;
69
                m_objects = new ArrayList<OoActionSystemInstance>();
70
                m_derivedObjects = new ArrayList<OoActionSystemInstance>();
71
                m_isInSystemDescription = false;
72
        }
73

    
74
        public final void SetDoOdBlock(Block anArg)
75
        {
76
                m_doOdBlock = anArg;
77
                if (anArg.GetParentScope() == null)
78
                        anArg.SetParentScope(this);
79
                else if (anArg.GetParentScope() != this)
80
                        throw new InternalCompilerException("Internal Error: Do-Od block has different parent set.");
81
        }
82

    
83

    
84
        @Override
85
        public IScope GetParentScope()
86
        {
87
                return m_parentScope;
88
        }
89

    
90
        @Override
91
        public void SetParentScope(IScope parentScope)
92
        {
93
                m_parentScope = parentScope;
94
        }
95

    
96
        public Identifier ResolveLocal(String aName)
97
        {
98
                if (m_symbols.Defined(aName))
99
                        return m_symbols.Get(aName);
100
                else
101
                        return null;
102
        }
103

    
104
        @Override
105
        public Identifier ResolveIdentifier(String aName)
106
        {
107
                Identifier result = ResolveLocal(aName);
108
                if ((result == null) && (m_baseType != null))
109
                        result = m_baseType.ResolveIdentifier(aName);
110
                return result;
111
        }
112

    
113
        @Override
114
        public void AddIdentifier(Identifier anIdentifier, Object tag)
115
        {
116
                m_symbols.AddIdentifier(anIdentifier);
117
        }
118

    
119
        @Override
120
        public void Accept(IAstVisitor visitor)
121
        {
122
                visitor.visit(this);
123
        }
124

    
125
        public void SetBaseType(OoActionSystemType newType)
126
        {
127
                if (newType == null)
128
                        throw new ArgumentException();
129
                m_baseType = newType;
130
        }
131

    
132
        public SymbolTable getAllSymbols()
133
        {
134
                OoActionSystemType system;
135
                final ArrayList<OoActionSystemType> inheritance = new ArrayList<OoActionSystemType>();
136
                system = this;
137
                while (system != null)
138
                {
139
                        inheritance.add(0, system);
140
                        system = system.baseType();
141
                }
142
                final SymbolTable result = new SymbolTable();
143
                for (final OoActionSystemType ooas: inheritance)
144
                        result.AddSymbolTable(ooas.symbols());
145
                result.Replace("self", this.symbols().Get("self"));
146
                return result;
147
        }
148

    
149
        @Override
150
        public /*override*/ String AnonymousName()
151
        {
152
                return String.format("class_%s", Math.abs((long) this.hashCode())); //FIXME: should be unit!
153
        }
154

    
155
        public final void SetIsInSystemDescription(boolean p)
156
        {
157
                m_isInSystemDescription = p;
158
        }
159

    
160
        @Override
161
        public int valueCount() {
162
                return m_objects.size() + m_derivedObjects.size() + 1;
163
        }
164

    
165
}