Project

General

Profile

root / trunk / compiler / ooasCompiler / src / org / momut / ooas / ast / types / FunctionType.java @ 9

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.LinkedList;
31

    
32
import org.momut.ooas.ast.IAstVisitor;
33

    
34
///////////////////////////////////////////////
35
///  Complex Type: Function
36
///
37
public final class FunctionType extends Type
38
{
39
        public enum FunctionTypeEnum {
40
                Observable (0),
41
                Controllable (1),
42
                Continuous (2),
43
                Internal (3),
44
                Method (4);
45

    
46
                public final int integerValue; // do not change, this is needed by the backends! i.e. public API
47

    
48
                private FunctionTypeEnum(int val) {
49
                        integerValue = val;
50
                }
51
        }
52

    
53
        private Boolean m_miracleSafe = null;
54
        private boolean m_pure;
55
        private LinkedList<Type> m_parameter;
56
        private Type m_returnType;
57
        private final FunctionTypeEnum m_functionType;
58

    
59
        public Boolean isMiracleSafe() { return m_miracleSafe; }
60
        public boolean isPureFunction() { return m_pure; }
61
        public LinkedList<Type> parameter() { return m_parameter; }
62
        public Type returnType() { return m_returnType; }
63
        public FunctionTypeEnum functionType() { return m_functionType; }
64

    
65
        public FunctionType(FunctionTypeEnum functionType, LinkedList<Type> parameter, Type returnType)
66
        {
67
                super (TypeKind.FunctionType, null);
68
                if (parameter != null)
69
                        m_parameter = parameter;
70
                else
71
                        m_parameter = new LinkedList<Type>();
72
                m_returnType = returnType;
73
                m_functionType = functionType;
74
                m_miracleSafe = null;
75
                m_pure = false;
76
        }
77

    
78

    
79
        public void AddParameterType(Type aType)
80
        {
81
                m_parameter.addLast(aType);
82
        }
83

    
84
        public void SetReturnType(Type aType)
85
        {
86
                m_returnType = aType;
87
        }
88

    
89
        public void SetMiracleSafe(boolean newValue)
90
        {
91
                m_miracleSafe = newValue;
92
        }
93

    
94
        public void SetIsPureFunction(boolean newValue)
95
        {
96
                m_pure = newValue;
97
        }
98

    
99
        @Override
100
        public void Accept(IAstVisitor visitor)
101
        {
102
                visitor.visit(this);
103
        }
104

    
105
        @Override
106
        public /*override*/ String AnonymousName()
107
        {
108
                final StringBuilder result = new StringBuilder();
109
                result.append("fun_");
110
                result.append(m_functionType.toString());
111
                result.append("_");
112
                for (final Type sym: m_parameter)
113
                {
114
                        result.append(sym.toString());
115
                        result.append("_");
116
                }
117
                result.append("_");
118
                if (m_returnType != null)
119
                        result.append(m_returnType.toString());
120
                else
121
                        result.append("void");
122
// the anonymous name MUST stay the same!
123
//                result.append("_");
124
//                result.append(m_pure);
125
                return result.toString();
126
        }
127
}