source: branches/dev-mj-1626/Compiler/ModelicaFrontEnd/src/jastadd/source/SourceTraversal.jrag @ 13095

Last change on this file since 13095 was 13095, checked in by tgutzmann, 5 months ago

Merge from trunk

File size: 13.0 KB
Line 
1/*
2    Copyright (C) 2017 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 org.jmodelica.util.collections.SubClassIterator;
18import org.jmodelica.util.collections.SingleIterable;
19import org.jmodelica.util.collections.ChainedIterable;
20import org.jmodelica.util.collections.FilteredIterator;
21import org.jmodelica.util.collections.FilteredIterable;
22import org.jmodelica.util.collections.NestledIterator;
23import org.jmodelica.util.collections.NestledIterable;
24import org.jmodelica.util.collections.SubClassIterable;
25import org.jmodelica.util.Criteria;
26
27aspect SourceTraversal {
28
29
30    syn Iterable<SrcAbstractEquation> SrcClassDecl.equations();
31    eq SrcClassDecl.equations()     = Collections.<SrcAbstractEquation>emptyList();
32    eq SrcLibNode.equations()       = myClass().equations();
33    eq SrcFullClassDecl.equations() = new Iterable<SrcAbstractEquation>() {
34        public Iterator<SrcAbstractEquation> iterator() {
35            return new ClauseElementIterator<SrcAbstractEquation>() {
36                protected Iterator<SrcAbstractEquation> subIterator(SrcClause c) {
37                    return c.equationIterator();
38                }
39            };
40        }
41    };
42
43    syn Iterable<SrcExtendsClause> SrcClassDecl.superClasses();
44    eq SrcClassDecl.superClasses()       = Collections.<SrcExtendsClause>emptyList();
45    eq SrcShortClassDecl.superClasses()  = 
46        Collections.<SrcExtendsClause>singletonList(getSrcExtendsClauseShortClass());
47    eq SrcLibNode.superClasses()         = myClass().superClasses();
48    eq SrcExtendClassDecl.superClasses() = new ChainedIterable(
49            new SingleIterable(getSrcInlineExtendsClause()), super.superClasses());
50    eq SrcFullClassDecl.superClasses()   = new Iterable<SrcExtendsClause>() {
51        public Iterator<SrcExtendsClause> iterator() {
52            return new ClauseElementIterator<SrcExtendsClause>() {
53                protected Iterator<SrcExtendsClause> subIterator(SrcClause c) {
54                    return c.extendsIterator();
55                }
56            };
57        }
58    };
59   
60    syn Iterable<SrcComponentClause> SrcClassDecl.componentClauses();
61    eq SrcClassDecl.componentClauses()     = Collections.<SrcComponentClause>emptyList();
62    eq SrcLibNode.componentClauses()       = myClass().componentClauses();
63    eq SrcFullClassDecl.componentClauses() = new Iterable<SrcComponentClause>() {
64        public Iterator<SrcComponentClause> iterator() {
65            return new ClauseElementIterator<SrcComponentClause>() {
66                protected Iterator<SrcComponentClause> subIterator(SrcClause c) {
67                    return c.componentClauseIterator();
68                }
69            };
70        }
71    };
72   
73    syn Iterable<SrcComponentDecl> SrcClassDecl.components() = 
74        new NestledIterable<SrcComponentDecl,SrcComponentClause>(componentClauses()) {
75            protected Iterable<SrcComponentDecl> subIterable(SrcComponentClause c) {
76                return c.getSrcComponentDecls();
77            }
78        };
79    eq SrcEnumClassDecl.components() = 
80        new ChainedIterable(componentsIterable(), enumBase().componentsIterable());
81   
82    syn Iterable<SrcComponentDecl> SrcEnumClassDecl.componentsIterable() = super.components();
83    syn SrcEnumClassDecl SrcEnumClassDecl.enumBase() = 
84        ((SourceRoot) root()).getProgram().getEnumBaseDecl();
85   
86    syn Iterable<SrcModificationOrRedeclareElement> SrcClassDecl.elementModifications();
87    eq SrcClassDecl.elementModifications()     = 
88        Collections.<SrcModificationOrRedeclareElement>emptyList();
89    eq SrcLibNode.elementModifications()       = myClass().elementModifications();
90    eq SrcFullClassDecl.elementModifications() = 
91        new FilteredIterable(
92            components(),
93            new Criteria<SrcModificationOrRedeclareElement>() {
94                public boolean test(SrcModificationOrRedeclareElement elem) {
95                    return elem.hasRedeclare();
96                }
97            });
98
99    syn Iterable<SrcImportClause> SrcClassDecl.imports();
100    eq SrcClassDecl.imports()     = Collections.<SrcImportClause>emptyList();
101    eq SrcFullClassDecl.imports() = new Iterable<SrcImportClause>() {
102        public Iterator<SrcImportClause> iterator() {
103            return new ClauseElementIterator<SrcImportClause>() {
104                protected Iterator<SrcImportClause> subIterator(SrcClause c) {
105                    return c.importIterator();
106                }
107            };
108        }
109    };
110
111    syn Iterable<SrcClassDecl> SrcClassDecl.classes();
112    eq SrcClassDecl.classes()     = Collections.<SrcClassDecl>emptyList();
113    eq SrcLibNode.classes()       = myClass().classes();
114    eq SrcFullClassDecl.classes() = new Iterable<SrcClassDecl>() {
115        public Iterator<SrcClassDecl> iterator() {
116            return new ClauseElementIterator<SrcClassDecl>() {
117                protected Iterator<SrcClassDecl> subIterator(SrcClause c) {
118                    return c.classIterator();
119                }
120            };
121        }
122    };
123    syn lazy Iterable<SrcClassDecl> SrcLibClassDecl.classes() {
124        // Imposes ordering specified in SrcLibClassDecl.order
125        Map<String,SrcClassDecl> map = new LinkedHashMap<String,SrcClassDecl>();
126        for (SrcClassDecl cd : super.classes())
127            map.put(cd.name(), cd);
128        for (SrcLibNode ln : getSrcLibNodes()) {
129            map.put(ln.name(), ln);
130        }
131       
132        ArrayList<SrcClassDecl> l = new ArrayList<SrcClassDecl>();
133        for (String name : order) {
134            SrcClassDecl cd = map.get(name);
135            if (cd != null) {
136                l.add(cd);
137                map.remove(name);
138            }
139        }
140        for (SrcClassDecl cd : map.values())
141            l.add(cd);
142
143        return l;
144    }
145    syn Iterable<SrcClassDecl> Program.classes() {
146        ArrayList<SrcClassDecl> l = new ArrayList<SrcClassDecl>();
147        for (SrcStoredDefinition sd : getUnstructuredEntitys()) {
148            for (SrcClassDecl cd : sd.getSrcClassDecls()) {
149                if (!cd.isError()) {
150                    l.add(cd);
151                }
152            }
153        }
154        // Libraries are loaded when needed in instance lookup instead
155        return l;
156    } 
157
158    public class SrcFullClassDecl {
159
160        protected abstract class ClauseElementIterator<T> extends NestledIterator<T,SrcClause> {
161            public ClauseElementIterator() {
162                super(getSrcClauses().iterator());
163            }
164        }
165
166    }
167
168    syn Iterator<SrcAbstractEquation> SrcClause.equationIterator() = null;
169    eq SrcEquationClause.equationIterator()                     = getSrcAbstractEquations().iterator();
170
171    syn Iterator<SrcAlgorithm> SrcClause.algorithmIterator() = null;
172    eq SrcAlgorithm.algorithmIterator()                   = new SingleIterator(this);
173
174    syn Iterator<SrcExtendsClause> SrcClause.extendsIterator() = null;
175    eq SrcElementList.extendsIterator()                     = 
176        new SubClassIterator(SrcExtendsClause.class, getSrcElements().iterator());
177
178    syn Iterator<SrcComponentClause> SrcClause.componentClauseIterator() = null;
179    eq SrcElementList.componentClauseIterator()                       = 
180        new SubClassIterator(SrcComponentClause.class, getSrcElements().iterator());
181
182    syn Iterator<SrcImportClause> SrcClause.importIterator() = null;
183    eq SrcElementList.importIterator()                     = 
184        new SubClassIterator(SrcImportClause.class, getSrcElements().iterator());
185
186    syn Iterator<SrcClassDecl> SrcClause.classIterator() = null;
187    eq SrcElementList.classIterator()                     = 
188        new FilteredIterator(
189            new SubClassIterator(SrcClassDecl.class, getSrcElements().iterator()), 
190            NOT_ERROR_NODE_CRITERIA);
191
192
193    public interface SrcModificationOrRedeclareElement {
194        public InstModification newInstModification();
195        public boolean hasRedeclare();
196    }
197
198    SrcModification  implements SrcModificationOrRedeclareElement;
199    SrcComponentDecl implements SrcModificationOrRedeclareElement;
200// TODO: Handle class redeclares through this interface as well
201//       (will need to update SrcFullClassDecl.elementModifications() then)
202//    SrcBaseClassDecl implements SrcModificationOrRedeclareElement;
203
204    syn SrcForIndexDecl SrcForIndex.getSrcForIndexDecl() = (SrcForIndexDecl) getSrcComponentDecl(0);
205
206    syn SrcComponentDecl SrcComponentRedeclare.getSrcComponentDecl() = 
207        getSrcComponentClause().getSrcComponentDecl(0);
208
209    syn boolean SrcModification.hasRedeclare() = false;
210    eq SrcElementRedeclare.hasRedeclare()      = true;
211
212    inh SrcComponentClause SrcComponentDecl.myComponentClause();
213    eq SrcComponentClause.getSrcComponentDecl().myComponentClause() = this;
214
215    syn SrcComponentClause InstComponentDecl.myComponentClause() = 
216        getSrcComponentDecl().myComponentClause();
217
218    /**
219     * Get the string comment a.k.a. description string that applies to this element,
220     * or null if there is none.
221     */
222    syn SrcStringComment SrcClassDecl.myStringComment()               = null;
223    eq SrcBaseClassDecl.myStringComment()                          = 
224        selectStringComment(getConstrainingClauseComment());
225    eq SrcFullClassDecl.myStringComment()                          = 
226        selectStringComment(getConstrainingClauseComment(), this);
227    syn SrcStringComment SrcExtendsClauseShortClass.myStringComment() = 
228        selectStringComment(getSrcComment());
229    syn SrcStringComment SrcImportClause.myStringComment()            = 
230        selectStringComment(getSrcComment());
231    syn SrcStringComment SrcComponentClause.myStringComment()         = 
232        selectStringComment(getSrcComment());
233    syn SrcStringComment SrcComponentDecl.myStringComment()           = 
234        selectStringComment(myComponentClause().getSrcComment(), getSrcComment());
235    syn SrcStringComment SrcElementModification.myStringComment()     = 
236        selectStringComment(getSrcComment());
237    syn SrcStringComment SrcAbstractEquation.myStringComment()        = 
238        selectStringComment(getSrcComment());
239    syn SrcStringComment SrcStatement.myStringComment()               = 
240        selectStringComment(getSrcComment());
241
242    syn SrcStringComment InstClassDecl.myStringComment()     = getSrcClassDecl().myStringComment();
243    syn SrcStringComment InstComponentDecl.myStringComment() = getSrcComponentDecl().myStringComment();
244
245    public interface StringCommentSource {
246        public boolean hasSrcStringComment();
247        public SrcStringComment getSrcStringComment();
248    }
249    SrcComment implements StringCommentSource;
250    SrcFullClassDecl implements StringCommentSource;
251
252    /**
253     * Helper method for myStringComment() methods.
254     * Selects the first found among the arguments.
255     */
256    protected static SrcStringComment ASTNode.selectStringComment(StringCommentSource... sources) {
257        for (StringCommentSource src : sources) {
258            if (src != null && src.hasSrcStringComment()) {
259                return src.getSrcStringComment();
260            }
261        }
262        return null;
263    }
264
265    /**
266     * Iterable over each part of a qualified name.
267     */
268    syn Iterable<? extends SrcAccess> SrcAccess.nameParts();
269    eq SrcAccess.nameParts()       = new SingleIterable(this);
270    eq SrcGlobalAccess.nameParts() = getSrcAccess().nameParts();
271    eq SrcDot.nameParts()          = getSrcNamedAccesss();
272
273    public <T extends SrcClause> Iterable<T> SrcClassDecl.clauses(Class<T> type) {
274        return Collections.<T>emptyList();
275    }
276    @Override
277    public <T extends SrcClause> Iterable<T> SrcLibNode.clauses(Class<T> type) {
278        return myClass().clauses(type);
279    }
280    @Override
281    public <T extends SrcClause> Iterable<T> SrcFullClassDecl.clauses(Class<T> type) {
282        return new SubClassIterable<SrcClause, T>(type, getSrcClauses());
283    }
284    syn Iterable<SrcElementList>    SrcClassDecl.elementLists()    = clauses(SrcElementList.class);
285    syn Iterable<SrcEquationClause> SrcClassDecl.equationClauses() = clauses(SrcEquationClause.class);
286    syn Iterable<SrcAlgorithm>      SrcClassDecl.algorithms()      = clauses(SrcAlgorithm.class);
287
288    public <T extends SrcElement> Iterable<T> SrcElementList.elements(Class<T> type) {
289        return new SubClassIterable<SrcElement, T>(type, getSrcElements());
290    }
291    syn Iterable<SrcClassDecl>       SrcElementList.classDecls()       = elements(SrcClassDecl.class);
292    syn Iterable<SrcComponentClause> SrcElementList.componentClauses() = elements(SrcComponentClause.class);
293    syn Iterable<SrcExtendsClause>   SrcElementList.extendsClauses()   = elements(SrcExtendsClause.class);
294    syn Iterable<SrcImportClause>    SrcElementList.importClauses()    = elements(SrcImportClause.class);
295}
Note: See TracBrowser for help on using the repository browser.