1 /*******************************************************************************
\r
2 * Copyright (c) 2010 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.databoard.parser.unparsing;
14 import gnu.trove.map.hash.THashMap;
\r
15 import gnu.trove.procedure.TObjectObjectProcedure;
\r
16 import gnu.trove.set.hash.THashSet;
\r
18 import org.simantics.databoard.type.ArrayType;
\r
19 import org.simantics.databoard.type.BooleanType;
\r
20 import org.simantics.databoard.type.ByteType;
\r
21 import org.simantics.databoard.type.Component;
\r
22 import org.simantics.databoard.type.Datatype;
\r
23 import org.simantics.databoard.type.Datatype.Visitor;
\r
24 import org.simantics.databoard.type.DoubleType;
\r
25 import org.simantics.databoard.type.FloatType;
\r
26 import org.simantics.databoard.type.IntegerType;
\r
27 import org.simantics.databoard.type.LongType;
\r
28 import org.simantics.databoard.type.MapType;
\r
29 import org.simantics.databoard.type.OptionalType;
\r
30 import org.simantics.databoard.type.RecordType;
\r
31 import org.simantics.databoard.type.StringType;
\r
32 import org.simantics.databoard.type.UnionType;
\r
33 import org.simantics.databoard.type.VariantType;
\r
37 * @author Hannu Niemistö
39 public class DataTypePrinter2 {
42 int indentation = 0;
\r
43 THashMap<Datatype, String> refs = new THashMap<Datatype, String>();
45 private DataTypePrinter2(StringBuilder sb) {
\r
51 for(int i=0;i<indentation;++i)
\r
55 boolean useRef = true;
\r
56 Visitor<Object> printVisitor = new Visitor<Object>() {
\r
59 public Object visit(ArrayType b) {
\r
61 sb.append("Array(");
\r
62 b.componentType.accept(printVisitor);
\r
68 public Object visit(BooleanType b) {
\r
70 sb.append("Boolean");
\r
75 public Object visit(DoubleType b) {
\r
77 sb.append("Double");
\r
82 public Object visit(FloatType b) {
\r
89 public Object visit(IntegerType b) {
\r
91 sb.append("Integer");
\r
96 public Object visit(ByteType b) {
\r
103 public Object visit(LongType b) {
\r
110 public Object visit(OptionalType b) {
\r
112 sb.append("Optional(");
\r
113 b.componentType.accept(printVisitor);
\r
119 public Object visit(RecordType b) {
\r
120 if(refs.containsKey(b) && useRef)
\r
121 sb.append(refs.get(b));
\r
126 for(int i=0;i<b.getComponentCount();++i) {
\r
129 Component c = b.getComponent(i);
\r
133 c.type.accept(printVisitor);
\r
143 public Object visit(StringType b) {
\r
145 sb.append("String");
\r
150 public Object visit(UnionType b) {
\r
151 if(refs.containsKey(b) && useRef)
\r
152 sb.append(refs.get(b));
\r
156 for(int i=0;i<b.getComponentCount();++i) {
\r
159 Component c = b.getComponent(i);
\r
162 c.type.accept(printVisitor);
\r
170 public Object visit(VariantType b) {
\r
172 sb.append("Variant");
\r
177 public Object visit(MapType b) {
\r
180 b.keyType.accept(printVisitor);
\r
182 b.valueType.accept(printVisitor);
\r
189 THashSet<Datatype> seen = new THashSet<Datatype>();
\r
191 private void collectRefs(Datatype dt) {
\r
192 if(dt instanceof RecordType || dt instanceof UnionType) {
\r
193 if(!seen.add(dt)) {
\r
194 if(!refs.containsKey(dt))
\r
195 refs.put(dt, "T" + refs.size());
\r
199 dt.accept(refCollectVisitor);
\r
202 Visitor<Object> refCollectVisitor = new Visitor<Object>() {
\r
205 public Object visit(ArrayType b) {
\r
206 collectRefs(b.componentType);
\r
211 public Object visit(BooleanType b) {
\r
216 public Object visit(DoubleType b) {
\r
221 public Object visit(FloatType b) {
\r
226 public Object visit(IntegerType b) {
\r
231 public Object visit(ByteType b) {
\r
236 public Object visit(LongType b) {
\r
241 public Object visit(OptionalType b) {
\r
242 collectRefs(b.componentType);
\r
247 public Object visit(RecordType b) {
\r
248 for(Component c : b.getComponents())
\r
249 collectRefs(c.type);
\r
254 public Object visit(StringType b) {
\r
259 public Object visit(UnionType b) {
\r
260 for(Component c : b.getComponents())
\r
261 collectRefs(c.type);
\r
266 public Object visit(VariantType b) {
\r
271 public Object visit(MapType b) {
\r
272 collectRefs(b.keyType);
\r
273 collectRefs(b.valueType);
\r
279 void printDt(Datatype dt) {
\r
281 dt.accept(printVisitor);
\r
282 if(!refs.isEmpty()) {
\r
284 sb.append("where");
\r
286 refs.forEachEntry(new TObjectObjectProcedure<Datatype, String>() {
\r
288 public boolean execute(Datatype a, String b) {
\r
290 sb.append(b).append(" = ");
\r
292 a.accept(printVisitor);
\r
301 public static String print(Datatype dt) {
\r
302 StringBuilder sb = new StringBuilder();
\r
303 new DataTypePrinter2(sb).printDt(dt);
\r
304 return sb.toString();
\r