]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/types/TTupleAst.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / types / TTupleAst.java
1 package org.simantics.scl.compiler.internal.parsing.types;\r
2 \r
3 import java.util.List;\r
4 \r
5 import org.simantics.scl.compiler.elaboration.contexts.TypeTranslationContext;\r
6 import org.simantics.scl.compiler.internal.types.TypeElaborationContext;\r
7 import org.simantics.scl.compiler.types.Type;\r
8 import org.simantics.scl.compiler.types.Types;\r
9 import org.simantics.scl.compiler.types.kinds.Kind;\r
10 import org.simantics.scl.compiler.types.kinds.Kinds;\r
11 \r
12 import gnu.trove.map.hash.TObjectIntHashMap;\r
13 import gnu.trove.set.hash.TIntHashSet;\r
14 \r
15 \r
16 \r
17 public class TTupleAst extends TypeAst {\r
18     public final TypeAst[] components;\r
19     \r
20     public TTupleAst(TypeAst ... components) {\r
21         this.components = components;\r
22     }\r
23     \r
24     public TTupleAst(List<TypeAst> components) {\r
25         this(components.toArray(new TypeAst[components.size()]));\r
26     }\r
27 \r
28     @Override\r
29     public void toString(StringBuilder b) {\r
30         b.append('(');\r
31         for(int i=0;i<components.length;++i) {\r
32             if(i > 0)\r
33                 b.append(", ");\r
34             components[i].toString(b);\r
35         }\r
36         b.append(')');\r
37     }\r
38 \r
39     @Override\r
40     public Type toType(TypeTranslationContext context, Kind expectedKind) {\r
41         if(components.length == 1) {\r
42             return components[0].toType(context, expectedKind);\r
43         }\r
44         else {\r
45             context.unify(location, Kinds.STAR, expectedKind);\r
46             return Types.tuple(toTypes(context, components));\r
47         }\r
48     }\r
49     \r
50     @Override\r
51     public Type toType(TypeElaborationContext context) {\r
52         if(components.length == 1) {\r
53             return components[0].toType(context);\r
54         }\r
55         else {\r
56             return Types.tuple(toTypes(context, components));\r
57         }\r
58     }\r
59 \r
60     @Override\r
61     public int getPrecedence() {\r
62         return 0;\r
63     }\r
64 \r
65     @Override\r
66     public void collectReferences(TObjectIntHashMap<String> typeNameMap,\r
67             TIntHashSet set) {\r
68         for(TypeAst component : components)\r
69             component.collectReferences(typeNameMap, set);\r
70     }\r
71 }\r