1 package org.simantics.scl.compiler.types;
3 import gnu.trove.map.hash.THashMap;
4 import gnu.trove.set.hash.THashSet;
6 import java.util.ArrayList;
8 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
9 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
10 import org.simantics.scl.compiler.internal.types.ast.TConAst;
11 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
12 import org.simantics.scl.compiler.types.util.Polarity;
13 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
15 public class TUnion extends Type {
16 public final Type[] effects;
18 public TUnion(Type ... effects) {
20 for(Type effect : effects)
22 throw new InternalCompilerError();
24 this.effects = effects;
28 public Type replace(TVar var, Type replacement) {
29 for(int i=0;i<effects.length;++i) {
30 Type effect = effects[i];
31 Type newEffect = effect.replace(var, replacement);
32 if(newEffect != effect) {
33 Type[] newEffects = new Type[effects.length];
35 newEffects[j] = effects[j];
36 newEffects[i] = newEffect;
37 for(int j=i+1;j<effects.length;++j)
38 newEffects[j] = effects[j].replace(var, replacement);
39 return new TUnion(newEffects);
46 public TypeAst toTypeAst(TypeUnparsingContext context) {
47 StringBuilder b = new StringBuilder();
49 for(int i=0;i<effects.length;++i) {
52 b.append(effects[i].toString(context));
55 return new TConAst(b.toString());
59 public void toName(TypeUnparsingContext context, StringBuilder b) {
61 for(Type effect : effects) {
66 effect.toName(context, b);
71 public void updateHashCode(TypeHashCodeContext context) {
72 context.append(TypeHashCodeContext.UNION);
73 for(Type effect : effects)
74 effect.updateHashCode(context);
78 public void collectFreeVars(ArrayList<TVar> vars) {
79 for(Type effect : effects)
80 effect.collectFreeVars(vars);
84 public void collectMetaVars(ArrayList<TMetaVar> vars) {
85 for(Type effect : effects)
86 effect.collectMetaVars(vars);
90 public void collectMetaVars(THashSet<TMetaVar> vars) {
91 for(Type effect : effects)
92 effect.collectMetaVars(vars);
96 public boolean isGround() {
97 for(Type effect : effects)
98 if(!effect.isGround())
104 public boolean containsMetaVars() {
105 for(Type effect : effects)
106 if(effect.containsMetaVars())
112 public int getClassId() {
117 public boolean contains(TMetaVar other) {
118 for(Type type : effects)
119 if(type.contains(other))
125 public Type convertMetaVarsToVars() {
126 for(int i=0;i<effects.length;++i)
127 effects[i] = effects[i].convertMetaVarsToVars();
132 public boolean isMinimal() {
133 return effects.length == 0;
137 public boolean isMaximal() {
142 public void addPolarity(Polarity polarity) {
143 for(Type effect : effects)
144 effect.addPolarity(polarity);
148 public void collectEffectMetaVars(ArrayList<TMetaVar> vars) {
149 throw new UnsupportedOperationException();
153 public void collectConcreteEffects(ArrayList<TCon> concreteEffects) {
154 for(Type effect : effects)
155 effect.collectConcreteEffects(concreteEffects);
160 throw new UnsupportedOperationException();
164 public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
165 return Types.NO_EFFECTS;