package org.simantics.graph.compiler.internal.translation; import java.util.Collection; import org.antlr.runtime.tree.Tree; import org.simantics.databoard.Bindings; import org.simantics.databoard.binding.ArrayBinding; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.BooleanBinding; import org.simantics.databoard.binding.ByteBinding; import org.simantics.databoard.binding.DoubleBinding; import org.simantics.databoard.binding.FloatBinding; import org.simantics.databoard.binding.IntegerBinding; import org.simantics.databoard.binding.LongBinding; import org.simantics.databoard.binding.MapBinding; import org.simantics.databoard.binding.OptionalBinding; import org.simantics.databoard.binding.RecordBinding; import org.simantics.databoard.binding.StringBinding; import org.simantics.databoard.binding.UnionBinding; import org.simantics.databoard.binding.VariantBinding; import org.simantics.databoard.binding.error.BindingException; import org.simantics.databoard.type.Datatype; import org.simantics.graph.compiler.internal.parsing.GraphParser; import org.simantics.ltk.ISource; import org.simantics.ltk.Problem; import org.simantics.ltk.antlr.ANTLRUtils; public class DataValueTranslator { ISource source; Collection problems; public DataValueTranslator(ISource source, Collection problems) { this.source = source; this.problems = problems; } public Object translate(Tree _tree, Binding binding) { while(_tree.getType() == GraphParser.TUPLE && _tree.getChildCount()==1) _tree = _tree.getChild(0); final Tree tree = _tree; return binding.accept(new Binding.Visitor() { @Override public Object visit(ArrayBinding b) { if(tree.getType() == GraphParser.ARRAY) { int count = tree.getChildCount(); Object[] components = new Object[count]; Binding componentBinding = b.getComponentBinding(); for(int i=0;i= 6) return b.createUnchecked(str.substring(3, str.length()-3)); else return b.createUnchecked(str.substring(1, str.length()-1)); } typeError(tree, b); return b.createDefaultUnchecked(); } @Override public Object visit(UnionBinding b) { if(tree.getType() == GraphParser.TAGGED_VALUE) { String tag = tree.getChild(0).getText(); Integer comp = b.type().getComponentIndex(tag); if(comp != null) { if(tree.getChildCount() == 2) return b.createUnchecked(comp, translate( tree.getChild(1), b.getComponentBinding(comp) )); else { Binding binding = b.getComponentBinding(comp); if(binding instanceof RecordBinding && ((RecordBinding)binding).getComponentCount() == 0) return b.createUnchecked(comp, ((RecordBinding)binding).createUnchecked()); else typeError(tree, binding); } } } typeError(tree, b); return b.createDefaultUnchecked(); } @Override public Object visit(VariantBinding b) { if(tree.getType() == GraphParser.VARIANT) { Datatype type = new DataTypeTranslator(source, problems).translate(tree.getChild(0)); Binding binding = Bindings.getBinding(type); Object value = translate(tree.getChild(1), binding); return b.createUnchecked(binding, value); } typeError(tree, b); return b.createDefaultUnchecked(); } @Override public Object visit(MapBinding b) { if(tree.getType() == GraphParser.MAP) { int count = tree.getChildCount(); Object[] keys = new Object[count]; Object[] values = new Object[count]; Binding keyBinding = b.getKeyBinding(); Binding valueBinding = b.getValueBinding(); for(int i=0;i