--- /dev/null
+package org.simantics.scl.compiler.internal.parsing.types;\r
+\r
+import java.util.List;\r
+\r
+import org.simantics.scl.compiler.elaboration.contexts.TypeTranslationContext;\r
+import org.simantics.scl.compiler.internal.types.TypeElaborationContext;\r
+import org.simantics.scl.compiler.types.Type;\r
+import org.simantics.scl.compiler.types.Types;\r
+import org.simantics.scl.compiler.types.kinds.Kind;\r
+import org.simantics.scl.compiler.types.kinds.Kinds;\r
+\r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+\r
+\r
+public class TTupleAst extends TypeAst {\r
+ public final TypeAst[] components;\r
+ \r
+ public TTupleAst(TypeAst ... components) {\r
+ this.components = components;\r
+ }\r
+ \r
+ public TTupleAst(List<TypeAst> components) {\r
+ this(components.toArray(new TypeAst[components.size()]));\r
+ }\r
+\r
+ @Override\r
+ public void toString(StringBuilder b) {\r
+ b.append('(');\r
+ for(int i=0;i<components.length;++i) {\r
+ if(i > 0)\r
+ b.append(", ");\r
+ components[i].toString(b);\r
+ }\r
+ b.append(')');\r
+ }\r
+\r
+ @Override\r
+ public Type toType(TypeTranslationContext context, Kind expectedKind) {\r
+ if(components.length == 1) {\r
+ return components[0].toType(context, expectedKind);\r
+ }\r
+ else {\r
+ context.unify(location, Kinds.STAR, expectedKind);\r
+ return Types.tuple(toTypes(context, components));\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public Type toType(TypeElaborationContext context) {\r
+ if(components.length == 1) {\r
+ return components[0].toType(context);\r
+ }\r
+ else {\r
+ return Types.tuple(toTypes(context, components));\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int getPrecedence() {\r
+ return 0;\r
+ }\r
+\r
+ @Override\r
+ public void collectReferences(TObjectIntHashMap<String> typeNameMap,\r
+ TIntHashSet set) {\r
+ for(TypeAst component : components)\r
+ component.collectReferences(typeNameMap, set);\r
+ }\r
+}\r