1 | package com.framsticks.framclipse.script; |
---|
2 | |
---|
3 | import java.util.ArrayDeque; |
---|
4 | import java.util.Queue; |
---|
5 | |
---|
6 | import org.eclipse.emf.ecore.EObject; |
---|
7 | |
---|
8 | import com.framsticks.framclipse.framScript.ArrayElementExpression; |
---|
9 | import com.framsticks.framclipse.framScript.Invocation; |
---|
10 | import com.framsticks.framclipse.framScript.QualifiedExpression; |
---|
11 | import com.framsticks.framclipse.framScript.VariableRef; |
---|
12 | import com.framsticks.framclipse.script.model.Element; |
---|
13 | import com.framsticks.framclipse.script.model.Type; |
---|
14 | import com.google.inject.Inject; |
---|
15 | |
---|
16 | public 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 | } |
---|