[437] | 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 | } |
---|