source: java/Framclipse/com.framsticks.framclipse/src/com/framsticks/framclipse/script/ExpressionTraverser.java @ 437

Last change on this file since 437 was 437, checked in by Mateusz Poszwa, 9 years ago

Added Framclipse as developed by Bartosz Kukawka and Tomek Maciejewski in 2010

  • Property svn:eol-style set to native
File size: 3.4 KB
Line 
1package com.framsticks.framclipse.script;
2
3import java.util.ArrayDeque;
4import java.util.Queue;
5
6import org.eclipse.emf.ecore.EObject;
7
8import com.framsticks.framclipse.framScript.ArrayElementExpression;
9import com.framsticks.framclipse.framScript.Invocation;
10import com.framsticks.framclipse.framScript.QualifiedExpression;
11import com.framsticks.framclipse.framScript.VariableRef;
12import com.framsticks.framclipse.script.model.Element;
13import com.framsticks.framclipse.script.model.Type;
14import com.google.inject.Inject;
15
16public class ExpressionTraverser {
17
18        @Inject
19        private ConstantProvider provider;
20
21        public Type getLastType(QualifiedExpression expr) {
22                String ext = getExtension(expr);
23                Queue<String> fragments = getExpressionFragments(expr);
24                Type type = provider.getType(fragments.poll(), ext);
25
26                while (!fragments.isEmpty() && type != null) {
27                        Element element = type.getElement(fragments.poll());
28                        type = element != null ? provider.getType(element.getType(), ext) : null;
29                }
30                return type;
31        }
32
33        public Element getLastElement(QualifiedExpression expression) {
34                if (expression.eContainer() instanceof QualifiedExpression) {
35                        QualifiedExpression container = (QualifiedExpression) expression.eContainer();
36                        if (expression == container.getChild()) { // last part of complex expression
37                                String last = getFragmentName(expression);
38                                Type type = getLastType(container);
39                                return type != null ? type.getElement(last) : null;
40                        } else {
41                                Element element = getLastElement(container);
42                                if (element != null) {
43                                        return element;
44                                }
45                        }
46                }
47                return null;
48        }
49
50        public Element getLastElementFromContainer(QualifiedExpression container) {
51                String ext = getExtension(container);
52                Queue<String> fragments = getExpressionFragments(container);
53                Type type = provider.getType(fragments.poll(), ext);
54                Element element = type != null ? type.getElement(fragments.poll()) : null;
55
56                while (!fragments.isEmpty() && element != null) {
57                        type = element != null ? provider.getType(element.getType(), ext) : null;
58                        element = type.getElement(fragments.poll());
59                }
60                return element;
61        }
62
63        public Queue<String> getExpressionFragments(QualifiedExpression expr) {
64                return getExpressionFragments(expr, new ArrayDeque<String>());
65        }
66
67        protected Queue<String> getExpressionFragments(QualifiedExpression expr, Queue<String> fragments) {
68                QualifiedExpression parent = expr.getParent();
69                if (expr != null && parent != null) {
70                        EObject eContainer = expr.eContainer();
71                        if (eContainer instanceof QualifiedExpression) {
72                                getExpressionFragments((QualifiedExpression) eContainer, fragments);
73                        }
74                        if (parent instanceof ArrayElementExpression) {
75                                ArrayElementExpression ae = (ArrayElementExpression) parent;
76                                if (ae.getArray() != null) {
77                                        fragments.add(getFragmentName(ae.getArray()));
78                                        for (int i = 0; i < ae.getIndexes().size(); i++) {
79                                                fragments.add("get");
80                                        }
81                                }
82                        }
83                        String name = getFragmentName(parent);
84                        if (name != null) {
85                                fragments.add(name);
86                        }
87                }
88                return fragments;
89        }
90
91        public String getFragmentName(QualifiedExpression expr) {
92                if (expr instanceof VariableRef) {
93                        return ((VariableRef) expr).getVar().getName();
94                } else if (expr instanceof Invocation) {
95                        return ((Invocation) expr).getFunction().getName();
96                }
97                return null; // FIXME azer staf
98        }
99       
100        private String getExtension(EObject object) {
101                return object.eResource().getURI().fileExtension();
102        }
103
104}
Note: See TracBrowser for help on using the repository browser.