source: trunk/Compiler/ModelicaFrontEnd/src/jastadd/instance/InnerOuter.jrag @ 10841

Last change on this file since 10841 was 10841, checked in by jsten, 21 months ago

Renamed all source AST classes by adding a Src prefix to them. This is done so that we align them with Inst and F classes. This should also avoid several name collisions with other java classes from other common packages. Ticket #5490.

File size: 6.5 KB
Line 
1/*
2    Copyright (C) 2015 Modelon AB
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, version 3 of the License.
7
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12
13    You should have received a copy of the GNU General Public License
14    along with this program.  If not, see <http://www.gnu.org/licenses/>.
15*/
16
17import java.util.Set;
18
19aspect InnerOuterComponents {
20
21    inh boolean InstNode.inOuter();
22    eq InstRoot.getChild().inOuter()          = false;
23    eq Root.getChild().inOuter()              = false;
24    eq InstClassDecl.getChild().inOuter()     = false;
25    eq InstComponentDecl.getChild().inOuter() = inOrIsOuter();
26   
27    inh boolean InstNode.inInner();
28    eq InstRoot.getChild().inInner()          = false;
29    eq Root.getChild().inInner()              = false;
30    eq InstClassDecl.getChild().inInner()     = false;
31    eq InstComponentDecl.getChild().inInner() = inOrIsInner();
32
33    inh InstComponentDecl InstComponentDecl.surroundingOuterComponentDecl();
34    eq InstRoot.getChild().surroundingOuterComponentDecl()          = null;
35    eq Root.getChild().surroundingOuterComponentDecl()              = null;
36    eq InstComponentDecl.getChild().surroundingOuterComponentDecl() = isOuter() ? this : surroundingOuterComponentDecl();
37
38    syn boolean InstComponentDecl.inOrIsOuter() = isOuter() || inOuter();
39    syn boolean InstComponentDecl.inOrIsInner() = isInner() || inInner();
40   
41    syn lazy InstComponentDecl InstComponentDecl.myInnerInstComponentDecl() {
42        InstComponentDecl res = null;
43        if (isOuter()) {
44            res = lookupInnerInstComponent(this, true);
45        }
46        return (res == null) ? unknownInstComponentDecl() : res;
47    }
48
49    inh InstComponentDecl InstNode.lookupInnerInstComponent(InstComponentDecl outer, boolean firstScope);
50
51    eq InstRoot.getChild().lookupInnerInstComponent(InstComponentDecl outer, boolean firstScope)    = null;
52    eq Root.getChild().lookupInnerInstComponent(InstComponentDecl outer, boolean firstScope)        = null;
53    eq InstExtends.getChild().lookupInnerInstComponent(InstComponentDecl outer, boolean firstScope) = 
54        lookupInnerInstComponent(outer, firstScope);
55
56    eq InstNode.getChild().lookupInnerInstComponent(InstComponentDecl outer, boolean firstScope) {
57        InstComponentDecl res = genericLookupInstComponent(outer.name()).unresolved().targetOrNull();
58        if (!firstScope && res != null && res.isInner()) {
59            return res;
60        } else if (res != null && res.isOuter() && !res.isInner()) {
61            res = null;
62        }
63        return lookupInnerInstComponentNoLocal(outer, res);
64    }
65
66    /**
67     * Lookup upwards in tree for matching inner declaration.
68     *
69     * @param outer  outer declaration we are searching for
70     */
71    syn InstComponentDecl InstNode.lookupInnerInstComponentNoLocal(InstComponentDecl outer, InstComponentDecl nonInner) = 
72        lookupInnerInstComponent(outer, false);
73    eq InstClassDecl.lookupInnerInstComponentNoLocal(InstComponentDecl outer, InstComponentDecl nonInner) {
74        String name = outer.name();
75        InstGeneratedInner res = null;
76        List<InstGeneratedInner> inners = getInstGeneratedInners();
77        for (InstGeneratedInner node : inners) {
78            if (node.matches(name)) {
79                res = node;
80            }
81        }
82       
83        if (res != null) {
84            res.addOuter(outer);
85        } else {
86            res = new InstGeneratedInner(this, outer, nonInner);
87            inners.add(res);
88            inners.getChild(inners.getNumChild() - 1);  // Make sure res is final
89        }
90        return res.getInstComponentDecl();
91    }
92
93    syn nta List<InstGeneratedInner> InstClassDecl.getInstGeneratedInners() = new List<InstGeneratedInner>();
94
95    eq InstGeneratedInner.getChild().myEnvironment() = new Environment();
96    eq InstGeneratedInner.getChild().myEnvironment(String name) = new Environment();
97
98    public InstGeneratedInner.InstGeneratedInner(InstClassDecl parent, InstComponentDecl outer, InstComponentDecl nonInner) {
99        this(parent.createInstComponentDecl(outer.getSrcComponentDecl()), outer, nonInner);
100        addOuter(outer);
101    }
102
103    eq InstGeneratedInner.matches(String str) = getCopiedOuter().matches(str);
104
105    private Set<InstComponentDecl> InstGeneratedInner.outers = new HashSet<InstComponentDecl>();
106
107    public void InstGeneratedInner.addOuter(InstComponentDecl outer) {
108        outers.add(outer);
109    }
110
111    inh boolean InstComponentDecl.isGeneratedInner();
112    eq InstGeneratedInner.getInstComponentDecl().isGeneratedInner() = true;
113    eq BaseNode.getChild().isGeneratedInner()                       = false;
114
115}
116
117aspect InnerOuterClasses {
118
119    syn boolean InstClassDecl.inOrIsOuter() = isOuter() || inOuter();
120    syn boolean InstClassDecl.inOrIsInner() = isInner() || inInner();
121
122    syn InstClassDecl InstClassDecl.myInnerInstClassDecl() {
123        InstClassDecl res = null;
124        if (isOuter()) 
125            res = lookupInnerInstClass(name(), true);
126        else if (inOuter())
127            res = lookupInInnerInstClass(name());
128        return res;
129    }
130
131    inh InstClassDecl InstNode.lookupInnerInstClass(String name, boolean firstScope);
132
133    eq InstRoot.getChild().lookupInnerInstClass(String name, boolean firstScope)    = null;
134    eq Root.getChild().lookupInnerInstClass(String name, boolean firstScope)        = null;
135    eq InstExtends.getChild().lookupInnerInstClass(String name, boolean firstScope) = lookupInnerInstClass(name, firstScope);
136
137    eq InstNode.getChild().lookupInnerInstClass(String name, boolean firstScope) {
138        if (!firstScope) {
139            InstClassDecl icd = genericLookupInstClass(name).target();
140            if (icd != null && icd.isInner())
141                return icd;
142        }
143        return lookupInnerInstClass(name, false);
144    }
145
146    inh InstClassDecl InstNode.lookupInInnerInstClass(String name);
147    eq InstRoot.getChild().lookupInInnerInstClass(String name)          = null;
148    eq Root.getChild().lookupInInnerInstClass(String name)              = null;
149    eq InstComponentDecl.getChild().lookupInInnerInstClass(String name) = myInnerInstComponentDecl().memberInstClass(name).targetOrNull();
150    eq InstClassDecl.getChild().lookupInInnerInstClass(String name)     = myInnerInstClassDecl().memberInstClass(name).targetOrNull();
151
152}
Note: See TracBrowser for help on using the repository browser.