Changeset 3114
- Timestamp:
- 11/26/08 20:01:54 (12 months ago)
- Location:
- trunk/ProjectFortress
- Files:
-
- 19 modified
-
astgen/Fortress.ast (modified) (3 diffs)
-
src/com/sun/fortress/compiler/Types.java (modified) (5 diffs)
-
src/com/sun/fortress/compiler/disambiguator/TypeDisambiguator.java (modified) (3 diffs)
-
src/com/sun/fortress/compiler/typechecker/SubtypeChecker.java (modified) (1 diff)
-
src/com/sun/fortress/compiler/typechecker/TypeAnalyzer.java (modified) (7 diffs)
-
src/com/sun/fortress/compiler/typechecker/TypeAnalyzerJUTest.java (modified) (5 diffs)
-
src/com/sun/fortress/compiler/typechecker/TypeAnalyzerUtil.java (modified) (1 diff)
-
src/com/sun/fortress/compiler/typechecker/TypeCheckerTestCase.java (modified) (1 diff)
-
src/com/sun/fortress/compiler/typechecker/TypeEnv.java (modified) (3 diffs)
-
src/com/sun/fortress/interpreter/evaluator/EvalType.java (modified) (1 diff)
-
src/com/sun/fortress/interpreter/evaluator/MakeInferenceSpecific.java (modified) (3 diffs)
-
src/com/sun/fortress/interpreter/evaluator/types/FTypeArrow.java (modified) (2 diffs)
-
src/com/sun/fortress/nodes_util/ErrorMsgMaker.java (modified) (2 diffs)
-
src/com/sun/fortress/nodes_util/NodeComparator.java (modified) (2 diffs)
-
src/com/sun/fortress/nodes_util/NodeFactory.java (modified) (3 diffs)
-
src/com/sun/fortress/parser/Function.rats (modified) (1 diff)
-
src/com/sun/fortress/parser/Type.rats (modified) (3 diffs)
-
src/com/sun/fortress/parser_util/precedence_resolver/TypeResolver.java (modified) (2 diffs)
-
src/com/sun/fortress/tools/FortressAstToConcrete.java (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ProjectFortress/astgen/Fortress.ast
r3113 r3114 1356 1356 * e.g.) (ZZ32, String) 1357 1357 * 1358 * <varargs>1359 * It has a varargs parameter if the varargs field is set.1360 */1361 TupleType(List<Type> elements,1362 Option<Type> varargs = Option.<Type>none());1363 /**1364 1358 * domain of an arrow type 1365 1359 * ArgType ::= … … 1369 1363 * e.g.) ZZ32 1370 1364 * e.g.) (String, ZZ32, String..., foo=ZZ32) 1371 */ 1372 Domain(List<Type> args, 1373 Option<Type> varargs = Option.<Type>none(), 1374 List<KeywordType> keywords = Collections.<KeywordType>emptyList()); 1365 * 1366 * <varargs> 1367 * It has a varargs parameter if the varargs field is set. 1368 */ 1369 TupleType(List<Type> elements, 1370 Option<Type> varargs = Option.<Type>none(), 1371 List<KeywordType> keywords = Collections.<KeywordType>emptyList()); 1375 1372 /** 1376 1373 * void type … … 1382 1379 * arrow type 1383 1380 */ 1384 abstract AbstractArrowType( Domaindomain, Type range,1381 abstract AbstractArrowType(Type domain, Type range, 1385 1382 Effect effect = FortressUtil.emptyEffect()); 1386 1383 /** -
trunk/ProjectFortress/src/com/sun/fortress/compiler/Types.java
r3109 r3114 58 58 public static final TraitType OBJECT = makeTraitType(fortressBuiltin, "Object"); 59 59 60 public static final Domain BOTTOM_DOMAIN = NodeFactory.makeDomain(BOTTOM);60 public static final Type BOTTOM_DOMAIN = BOTTOM; 61 61 62 62 public static final VoidType VOID = new VoidType(span); … … 241 241 * representing a singleton argument. 242 242 */ 243 public static Type stripKeywords(Domain d) { 244 if (d.getVarargs().isSome()) { 245 return new TupleType(NodeFactory.makeSpan(d.getArgs(), d.getVarargs().unwrap()), d.getArgs(), d.getVarargs()); 246 } 247 else { 248 List<Type> args = d.getArgs(); 249 switch (args.size()) { 250 case 0: return VOID; 251 case 1: return args.get(0); 252 default: return new TupleType(NodeFactory.makeSpan("impossible", args), args); 253 } 254 } 243 public static Type stripKeywords(Type d) { 244 if ( d instanceof TupleType ) { 245 TupleType _d = (TupleType)d; 246 if (_d.getVarargs().isSome()) { 247 return new TupleType(NodeFactory.makeSpan(_d.getElements(), _d.getVarargs().unwrap()), _d.getElements(), _d.getVarargs()); 248 } 249 else { 250 List<Type> args = _d.getElements(); 251 switch (args.size()) { 252 case 0: return VOID; 253 case 1: return args.get(0); 254 default: return new TupleType(NodeFactory.makeSpan("impossible", args), args); 255 } 256 } 257 } else 258 return d; 255 259 } 256 260 … … 259 263 * map is identical to that of the KeywordType list. 260 264 */ 261 public static Map<Id, Type> extractKeywords(Domain d) { 262 // Don't waste time allocating a map if it will be empty (the usual case) 263 if (d.getKeywords().isEmpty()) { return Collections.<Id, Type>emptyMap(); } 264 else { 265 Map<Id, Type> result = new LinkedHashMap<Id, Type>(8); 266 for (KeywordType k : d.getKeywords()) { 267 result.put(k.getName(), k.getType()); 268 } 269 return result; 270 } 265 public static Map<Id, Type> extractKeywords(Type d) { 266 if ( d instanceof TupleType ) { 267 TupleType _d = (TupleType)d; 268 // Don't waste time allocating a map if it will be empty (the usual case) 269 if (_d.getKeywords().isEmpty()) { return Collections.<Id, Type>emptyMap(); } 270 else { 271 Map<Id, Type> result = new LinkedHashMap<Id, Type>(8); 272 for (KeywordType k : _d.getKeywords()) { 273 result.put(k.getName(), k.getType()); 274 } 275 return result; 276 } 277 } else 278 return Collections.<Id, Type>emptyMap(); 271 279 } 272 280 … … 275 283 * and a keywords map representing the keyword arguments. 276 284 */ 277 public static DomainmakeDomain(Type argsType, Map<Id, Type> keywords) {285 public static Type makeDomain(Type argsType, Map<Id, Type> keywords) { 278 286 List<KeywordType> keywordList = new ArrayList<KeywordType>(keywords.size()); 279 287 for (Map.Entry<Id, Type> entry : keywords.entrySet()) { … … 288 296 * not assume that {@code argsType} was produced by the parser. 289 297 */ 290 public static Domain makeDomain(Type argsType, final List<KeywordType> keywords) { 291 return argsType.accept(new NodeAbstractVisitor<Domain>() { 292 @Override public Domain forVoidType(VoidType t) { 293 return new Domain(NodeFactory.makeSpan("Types_bogus_span_for_empty_list", keywords), Collections.<Type>emptyList(), keywords); 294 } 295 @Override public Domain forTupleType(TupleType t) { 298 public static Type makeDomain(Type argsType, final List<KeywordType> keywords) { 299 return argsType.accept(new NodeAbstractVisitor<Type>() { 300 @Override public Type forVoidType(VoidType t) { 301 if ( keywords.isEmpty() ) 302 return t; 303 else 304 return new TupleType(NodeFactory.makeSpan("Types_bogus_span_for_empty_list", keywords), 305 Collections.<Type>emptyList(), keywords); 306 } 307 @Override public Type forTupleType(TupleType t) { 296 308 if ( t.getVarargs().isNone() ) 297 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), keywords);309 return new TupleType(NodeFactory.makeSpan(t, keywords), t.getElements(), keywords); 298 310 else 299 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), t.getVarargs(), 300 keywords); 301 } 302 @Override public Domain forType(Type t) { 303 return new Domain(NodeFactory.makeSpan(t, keywords), Collections.singletonList(t), keywords); 311 return new TupleType(NodeFactory.makeSpan(t, keywords), t.getElements(), t.getVarargs(), 312 keywords); 313 } 314 @Override public Type forType(Type t) { 315 if ( keywords.isEmpty() ) 316 return t; 317 else 318 return new TupleType(NodeFactory.makeSpan(t, keywords), Collections.singletonList(t), keywords); 304 319 } 305 320 }); -
trunk/ProjectFortress/src/com/sun/fortress/compiler/disambiguator/TypeDisambiguator.java
r3098 r3114 32 32 import com.sun.fortress.nodes.ObjectDecl; 33 33 import com.sun.fortress.nodes.AnyType; 34 import com.sun.fortress.nodes.TupleType; 34 35 import com.sun.fortress.nodes.ArrowType; 35 36 import com.sun.fortress.nodes.BoolArg; … … 39 40 import com.sun.fortress.nodes.DimParam; 40 41 import com.sun.fortress.nodes.DimRef; 41 import com.sun.fortress.nodes.Domain;42 42 import com.sun.fortress.nodes.Effect; 43 43 import com.sun.fortress.nodes.Expr; … … 189 189 190 190 @Override public Node forArrowType(final ArrowType that) { 191 // make sure this.forDomain is *not* called 192 Domain domainResult = (Domain) super.forDomain(that.getDomain()); 191 Type domain = that.getDomain(); 192 Type domainResult; 193 if ( domain instanceof TupleType ) 194 domainResult = (Type) super.forTupleType( (TupleType)domain ); 195 else 196 domainResult = (Type) domain.accept(this); 193 197 Type rangeResult = (Type) that.getRange().accept(this); 194 198 Effect effectResult = (Effect) that.getEffect().accept(this); 195 199 return forArrowTypeOnly(that, domainResult, rangeResult, effectResult); 196 }197 198 @Override public Node forDomain(final Domain that) {199 // valid occurrences of Domain are recognized before this recursive200 // call takes place201 error("Tuple types are not allowed to have varargs or keyword types.", that);202 return that;203 200 } 204 201 -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/SubtypeChecker.java
r3109 r3114 836 836 } 837 837 838 private Boolean subdomain( Domain s, Domaint, SubtypeHistory history) {838 private Boolean subdomain(Type s, Type t, SubtypeHistory history) { 839 839 if (subtype(stripKeywords(s), stripKeywords(t), history)) { 840 840 Map<Id, Type> sMap = extractKeywords(s); -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzer.java
r3109 r3114 254 254 255 255 @Override public Type forTupleTypeOnly(TupleType t, List<Type> normalElements, 256 Option<Type> normalVarargs) { 256 Option<Type> normalVarargs, 257 List<KeywordType> keywords) { 257 258 if ( normalVarargs.isNone() ) { 258 259 Type result = handleAbstractTuple(normalElements, MAKE_TUPLE); … … 283 284 } 284 285 286 @Override public Type forTupleType(TupleType that) { 287 if ( that.getKeywords().isEmpty() ) { 288 List<Type> args_result = recurOnListOfType(that.getElements()); 289 Option<Type> varargs_result = recurOnOptionOfType(that.getVarargs()); 290 List<KeywordType> keywords_result = recurOnListOfKeywordType(that.getKeywords()); 291 return forTupleTypeOnly(that, args_result, varargs_result, keywords_result); 292 } else { 293 // recur on a single args type rather than each element individually 294 Type args = stripKeywords(that); 295 Type argsNorm = (Type) args.accept(this); 296 List<KeywordType> ks = that.getKeywords(); 297 List<KeywordType> ksNorm = recurOnListOfKeywordType(ks); 298 if (args == argsNorm && ks == ksNorm) { return that; } 299 else { return makeDomain(argsNorm, ksNorm); } 300 } 301 } 302 285 303 private Type handleAbstractTuple(Iterable<Type> normalElements, 286 304 final Lambda<Iterable<Type>, Type> factory) { … … 299 317 } 300 318 301 @Override public Type forArrowTypeOnly(ArrowType t, DomainnormalDomain, Type normalRange,319 @Override public Type forArrowTypeOnly(ArrowType t, Type normalDomain, Type normalRange, 302 320 final Effect normalEffect) { 303 321 Type domainArg = stripKeywords(normalDomain); … … 305 323 Iterable<Type> domainTs = compose(domainArg, domainKeys.values()); 306 324 // map a list of the length of domainTs back to a Domain: 307 Lambda<Iterable<Type>, Domain> domainFactory = new Lambda<Iterable<Type>, Domain>() {308 public Domainvalue(Iterable<Type> ts) {325 Lambda<Iterable<Type>, Type> domainFactory = new Lambda<Iterable<Type>, Type>() { 326 public Type value(Iterable<Type> ts) { 309 327 List<KeywordType> ks = new ArrayList<KeywordType>(domainKeys.size()); 310 328 for (Pair<Id, Type> p : zip(domainKeys.keySet(), skipFirst(ts))) { … … 314 332 } 315 333 }; 316 Iterable< Domain> domains = map(cross(map(domainTs, DISJUNCTS)), domainFactory);334 Iterable<Type> domains = map(cross(map(domainTs, DISJUNCTS)), domainFactory); 317 335 Iterable<Type> ranges = liftConjuncts(normalRange, history); 318 Iterable<Type> overloads = cross(domains, ranges, new Lambda2< Domain, Type, Type>() {319 public Type value( Domaind, Type r) {336 Iterable<Type> overloads = cross(domains, ranges, new Lambda2<Type, Type, Type>() { 337 public Type value(Type d, Type r) { 320 338 return new ArrowType(NodeFactory.makeSetSpan(d,r), d, r, normalEffect); 321 339 } … … 324 342 Type result = makeIntersection(overloads); 325 343 return t.equals(result) ? t : result; 326 }327 328 @Override public Domain forDomain(Domain d) {329 // recur on a single args type rather than each element individually330 Type args = stripKeywords(d);331 Type argsNorm = (Type) args.accept(this);332 List<KeywordType> ks = d.getKeywords();333 List<KeywordType> ksNorm = recurOnListOfKeywordType(ks);334 if (args == argsNorm && ks == ksNorm) { return d; }335 else { return makeDomain(argsNorm, ksNorm); }336 344 } 337 345 … … 1090 1098 1091 1099 /** Subtyping for Domains. */ 1092 private ConstraintFormula sub( Domain s, Domaint, SubtypeHistory h) {1100 private ConstraintFormula sub(TupleType s, TupleType t, SubtypeHistory h) { 1093 1101 Map<Id, Type> sMap = extractKeywords(s); 1094 1102 Map<Id, Type> tMap = extractKeywords(t); -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzerJUTest.java
r3112 r3114 111 111 assertEquals(type("(C->A)&(D->A)"), norm(t, "(C|D)->A")); 112 112 assertEquals(type("C->A"), norm(t, "(B&C)->A")); 113 assertEquals(type(" (C&D)->A"), norm(t, "(C&D)->A"));113 assertEquals(type("C&D->A"), norm(t, "C&D->A")); 114 114 assertEquals(type("&{C->C,C->D,D->C,D->D}"), norm(t, "(C|D)->(C&D)")); 115 115 assertEquals(type("&{A->(C|E),A->(C|F),A->(D|E),A->(D|F)}"), norm(t, "A->(C&D)|(E&F)")); … … 117 117 assertEquals(type("Any"), norm(t, "Bottom->C throws E io")); 118 118 assertEquals(type("&{(A,C...)->E,(A,D...)->E}"), norm(t, "(A, (C|D)...)->E")); 119 assertEquals(type("( (A,C...)&(A,D...))->E"), norm(t, "(A, (C&D)...)->E"));119 assertEquals(type("(A,C...)&(A,D...)->E"), norm(t, "(A, (C&D)...)->E")); 120 120 assertEquals(type("(C&D, foo=E&F, bar=G)->A"), norm(t, "(C&D, foo=E&F, bar=G)->A")); 121 121 assertEquals(type("&{(C,foo=E,bar=G)->A,(C,foo=F,bar=G)->A,(D,foo=E,bar=G)->A,(D,foo=F,bar=G)->A}"), … … 520 520 int effectStart = findAtTop(s, " throws ", " io "); 521 521 if (effectStart == -1) { effectStart = s.length(); } 522 Domaind = parseDomain(s.substring(0, opIndex));522 Type d = parseDomain(s.substring(0, opIndex)); 523 523 Type r = parseType(s.substring(opIndex+2, effectStart)); 524 524 Effect e = parseEffect(s.substring(effectStart)); … … 577 577 } 578 578 579 private static DomainparseDomain(String s) {579 private static Type parseDomain(String s) { 580 580 s = s.trim(); 581 581 // check whether this is entirely enclosed in parens … … 599 599 } 600 600 } 601 return new Domain(span, args, varargs, keys);601 return new TupleType(span, args, varargs, keys); 602 602 } 603 603 else { 604 return new Domain(span, Collections.singletonList(parseType(s)));604 return parseType(s); 605 605 } 606 606 } -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzerUtil.java
r3109 r3114 163 163 } 164 164 @Override public Boolean forArrowType(ArrowType t) { 165 Domaind = t.getDomain();165 Type d = t.getDomain(); 166 166 Effect e = t.getEffect(); 167 return recurOnList(d.getArgs()) || 168 (d.getVarargs().isSome() && d.getVarargs().unwrap().accept(this)) || 169 recurOnKeywords(d.getKeywords()) || 170 t.getRange().accept(this) || 171 recurOnList(t.getEffect().getThrowsClause().unwrap(Collections.<BaseType>emptyList())); 167 if ( d instanceof TupleType ) { 168 TupleType _d = (TupleType)d; 169 return recurOnList(_d.getElements()) || 170 (_d.getVarargs().isSome() && _d.getVarargs().unwrap().accept(this)) || 171 recurOnKeywords(_d.getKeywords()) || 172 t.getRange().accept(this) || 173 recurOnList(t.getEffect().getThrowsClause().unwrap(Collections.<BaseType>emptyList())); 174 } else 175 return d.accept(this) || 176 t.getRange().accept(this) || 177 recurOnList(t.getEffect().getThrowsClause().unwrap(Collections.<BaseType>emptyList())); 172 178 } 173 179 @Override public Boolean forTupleType(TupleType t) { -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeCheckerTestCase.java
r3096 r3114 66 66 Type left = parseType(s.substring(0, arrowIndex)); 67 67 Type right = parseType(s.substring(arrowIndex+2)); 68 return new ArrowType(span, NodeFactory.makeDomain(left), right);68 return new ArrowType(span, left, right); 69 69 } 70 70 if (s.startsWith("(")) { -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeEnv.java
r3107 r3114 47 47 import com.sun.fortress.nodes.DimParam; 48 48 import com.sun.fortress.nodes.DimRef; 49 import com.sun.fortress.nodes.Domain;50 49 import com.sun.fortress.nodes.Enclosing; 51 50 import com.sun.fortress.nodes.FnDecl; … … 155 154 * Get a domain from a list of params. 156 155 */ 157 protected static DomaindomainFromParams(List<Param> params) {156 protected static Type domainFromParams(List<Param> params) { 158 157 List<Type> paramTypes = new ArrayList<Type>(); 159 158 List<KeywordType> keywordTypes = new ArrayList<KeywordType>(); … … 182 181 } 183 182 184 return newDomain(NodeFactory.makeSpan("TypeEnv_bogus_span_for_empty_list", params), paramTypes, varargsType, keywordTypes);183 return NodeFactory.makeDomain(NodeFactory.makeSpan("TypeEnv_bogus_span_for_empty_list", params), paramTypes, varargsType, keywordTypes); 185 184 } 186 185 -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/EvalType.java
r3109 r3114 401 401 @Override 402 402 public FType forArrowType(ArrowType at) { 403 Domain domain = at.getDomain(); 404 if (!domain.getKeywords().isEmpty()) { 403 Type domain = at.getDomain(); 404 if ( domain instanceof TupleType && 405 ! ((TupleType)domain).getKeywords().isEmpty()) { 405 406 return NI.nyi("Can't interpret a type with keywords"); 406 407 } -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/MakeInferenceSpecific.java
r3109 r3114 24 24 import com.sun.fortress.nodes.AbstractNode; 25 25 import com.sun.fortress.nodes.ArrayType; 26 import com.sun.fortress.nodes.Type; 26 27 import com.sun.fortress.nodes.ArrowType; 27 28 import com.sun.fortress.nodes.VarType; … … 32 33 import com.sun.fortress.nodes.TupleType; 33 34 import com.sun.fortress.nodes.VoidType; 34 import com.sun.fortress.nodes.Domain;35 35 import com.sun.fortress.nodes_util.NodeUtil; 36 36 import com.sun.fortress.compiler.Types; … … 118 118 public void forArrowType(ArrowType that) { 119 119 that.getRange().accept(this); 120 Domaindomain = that.getDomain();120 Type domain = that.getDomain(); 121 121 // TODO: handle keywords 122 if (!domain.getKeywords().isEmpty()) { 122 if ( domain instanceof TupleType && 123 ! ((TupleType)domain).getKeywords().isEmpty()) { 123 124 NI.nyi("Can't yet handle keywords in arrow domains"); 124 125 } -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/types/FTypeArrow.java
r2618 r3114 26 26 import com.sun.fortress.interpreter.evaluator.Environment; 27 27 import com.sun.fortress.nodes.ArrowType; 28 import com.sun.fortress.nodes. Domain;28 import com.sun.fortress.nodes.TupleType; 29 29 import com.sun.fortress.nodes.Type; 30 30 import com.sun.fortress.useful.BoundingMap; … … 168 168 range.unify(env, tp_set, abm, arr.getRange()); 169 169 BoundingMap<String, FType, TypeLatticeOps> dual = abm.dual(); 170 Domain valdom = arr.getDomain(); 171 if (!valdom.getKeywords().isEmpty()) { 170 Type valdom = arr.getDomain(); 171 if ( valdom instanceof TupleType && 172 ! ((TupleType)valdom).getKeywords().isEmpty()) { 172 173 return false; 173 174 // TODO: handle domains containing keywords -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/ErrorMsgMaker.java
r3109 r3114 80 80 } 81 81 82 public String for Domain(Domainnode) {82 public String forTupleType(TupleType node) { 83 83 StringBuilder result = new StringBuilder(); 84 84 result.append("("); 85 85 boolean first = true; 86 for (Type t : node.get Args()) {86 for (Type t : node.getElements()) { 87 87 if (first) { first = false; } 88 88 else { result.append(", "); } … … 356 356 } 357 357 358 public String forTupleType(TupleType node) {359 if ( node.getVarargs().isNone() )360 return Useful.listInDelimiters("(", mapSelf(node.getElements()), ")");361 else362 return363 "(" +364 Useful.listInDelimiters("", mapSelf(node.getElements()), "") +365 node.getVarargs().unwrap().accept(this) + "..." +366 ")";367 }368 369 358 public String forTypeArg(TypeArg node) { 370 359 return String.valueOf(node.getType().accept(this)); -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/NodeComparator.java
r3109 r3114 287 287 } 288 288 289 static int compare( Domain left, Domainright) {290 int x = typeListComparer.compare(left.get Args(), right.getArgs());289 static int compare(TupleType left, TupleType right) { 290 int x = typeListComparer.compare(left.getElements(), right.getElements()); 291 291 if (x != 0) return x; 292 292 x = compareOptionalType(left.getVarargs(), right.getVarargs()); … … 379 379 static int compare(StaticParam left, StaticParam right) { 380 380 return NodeUtil.getName(left).compareTo(NodeUtil.getName(right)); 381 }382 383 static int compare(TupleType left, TupleType right) {384 if ( left.getVarargs().isSome() && right.getVarargs().isSome() ) {385 int x = typeListComparer.compare(left.getElements(), right.getElements());386 if (x != 0) return x;387 return compare(left.getVarargs().unwrap(), right.getVarargs().unwrap());388 } else389 return typeListComparer.compare(left.getElements(), right.getElements());390 381 } 391 382 -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/NodeFactory.java
r3109 r3114 284 284 } 285 285 286 // public static ArrowType makeArrowType(ArrowType t, Domain domain, Type range, Effect effect) {287 // return new ArrowType(t.getSpan(), t.isParenthesized(), domain, range, effect);288 // }289 290 286 public static TraitType makeTraitType(TraitType t, 291 287 List<StaticArg> args) { … … 436 432 437 433 public static ArrowType makeArrowType(Span span, Type domain, Type range) { 438 return new ArrowType(span, makeDomain(domain), range, makeEffect(range.getSpan().getEnd()));434 return new ArrowType(span, domain, range, makeEffect(range.getSpan().getEnd())); 439 435 } 440 436 … … 468 464 // } 469 465 470 /** If args is a tuple or void, extract a list; otherwise, make a singleton */471 public static Domain makeDomain(Type args) {472 List<Type> argsList;473 if ( args instanceof VoidType) {474 argsList = Collections.emptyList();475 }476 else if (args instanceof TupleType) {477 argsList = ((TupleType) args).getElements();478 }479 else {480 argsList = Collections.singletonList(args);481 } 482 return new Domain(args.getSpan(), argsList);466 public static Type makeDomain(Span span, List<Type> elements, 467 Option<Type> varargs, 468 List<KeywordType> keywords) { 469 if ( varargs.isNone() && keywords.isEmpty() ) { 470 int size = elements.size(); 471 if ( size == 0 ) 472 return makeVoidType(span); 473 else if ( size == 1 ) 474 return elements.get(0); 475 else 476 return new TupleType(span, elements); 477 } else 478 return new TupleType(span, elements, varargs, keywords); 483 479 } 484 480 -
trunk/ProjectFortress/src/com/sun/fortress/parser/Function.rats
r3095 r3114 58 58 "Abstract function declaration should have an arrow type."); 59 59 } 60 Domain d = ((ArrowType) a2).getDomain(); 61 for (Type argT : d.getArgs()) { 62 Id name = new Id(argT.getSpan(), "_"); 63 params.add(NodeFactory.makeParam(argT.getSpan(), mods, name, argT)); 60 Type d = ((ArrowType) a2).getDomain(); 61 if ( d instanceof TupleType ) { 62 TupleType _d = (TupleType)d; 63 for (Type argT : _d.getElements()) { 64 Id name = new Id(argT.getSpan(), "_"); 65 params.add(NodeFactory.makeParam(argT.getSpan(), mods, name, argT)); 66 } 67 if (_d.getVarargs().isSome()) { 68 Type argT = _d.getVarargs().unwrap(); 69 Id name = new Id(argT.getSpan(), "_"); 70 params.add(NodeFactory.makeVarargsParam(argT.getSpan(), mods, name, argT)); 71 } 72 assert(_d.getKeywords().isEmpty()): "Keyword parameters present" 73 + " in a FnSig: " + _d; 74 75 } else { 76 Id name = new Id(d.getSpan(), "_"); 77 params.add(NodeFactory.makeParam(d.getSpan(), mods, name, d)); 64 78 } 65 if (d.getVarargs().isSome()) { 66 Type argT = d.getVarargs().unwrap(); 67 Id name = new Id(argT.getSpan(), "_"); 68 params.add(NodeFactory.makeVarargsParam(argT.getSpan(), mods, name, argT)); 69 } 70 assert(d.getKeywords().isEmpty()): "Keyword parameters present" 71 + " in a FnSig: " + d; 79 72 80 /* 73 81 We could do this, if we had a suitable value for bottomExpr: -
trunk/ProjectFortress/src/com/sun/fortress/parser/Type.rats
r3113 r3114 162 162 | ( w (Type w , w)* Type w ... w ) 163 163 */ 164 DomainDomain =164 Type Domain = 165 165 openparen w a1s:(Type w comma w)* a2:(Type w void:ellipses w comma w)? 166 166 a3:KeywordType a4s:(w comma w KeywordType)* w closeparen … … 170 170 List<KeywordType> ts3 = a4s.list(); 171 171 ts3.add(0, a3); 172 yyValue = newDomain(span, ts1, ts2, ts3);172 yyValue = NodeFactory.makeDomain(span, ts1, ts2, ts3); 173 173 } 174 174 / openparen w a1s:(Type w comma w)* a2:Type w ellipses w closeparen … … 176 176 Span span = createSpan(yyStart,yyCount); 177 177 Option<Type> ts2 = Option.some(a2); 178 yyValue = new Domain(span, ts1, ts2); 178 yyValue = NodeFactory.makeDomain(span, ts1, ts2, 179 Collections.<KeywordType>emptyList()); 179 180 }; 180 181 -
trunk/ProjectFortress/src/com/sun/fortress/parser_util/precedence_resolver/TypeResolver.java
r3113 r3114 243 243 if (isTypeOp(op)) { 244 244 return new ArrowType(spanTwo(first, last), true, 245 typeToDomain(first),245 first, 246 246 typeToType(last), frame.getEffect()); 247 247 } else { // !(isTypeOp(op)) … … 611 611 } 612 612 613 private static Domain typeToDomain(Type type) {614 if (type instanceof Domain) { return (Domain) type; }615 else { // type instanceof Type616 List<Type> args;617 if (type instanceof VoidType) {618 args = Collections.emptyList();619 }620 else if (type instanceof TupleType) {621 TupleType tup = (TupleType) type;622 args = new ArrayList<Type>(tup.getElements().size());623 for (Type t : tup.getElements()) {624 args.add(typeToType(t));625 }626 }627 else {628 args = Collections.singletonList(typeToType(type));629 }630 return new Domain(type.getSpan(), args);631 }632 }633 634 613 public static DimExpr typeToDim(Type type) throws TypeConvertFailure { 635 614 try { -
trunk/ProjectFortress/src/com/sun/fortress/tools/FortressAstToConcrete.java
r3112 r3114 2179 2179 } 2180 2180 2181 @Override public String forTupleTypeOnly(TupleType that,2182 List<String> elements_result,2183 Option<String> varargs_result) {2184 StringBuilder s = new StringBuilder();2185 2186 s.append( "(" );2187 s.append( join(elements_result, ", ") );2188 if ( varargs_result.isSome() ) {2189 s.append( "(* " );2190 s.append( ", " );2191 s.append( varargs_result.unwrap() );2192 s.append( "...)" );2193 s.append( " *)" );2194 }2195 s.append( ")" );2196 2197 return s.toString();2198 }2199 2200 2181 @Override public String forVoidTypeOnly(VoidType that) { 2201 2182 return "()"; … … 2279 2260 } 2280 2261 2281 @Override public String for DomainOnly(Domainthat,2282 List<String> args_result,2283 Option<String> varargs_result,2284 List<String> keywords_result) {2262 @Override public String forTupleTypeOnly(TupleType that, 2263 List<String> args_result, 2264 Option<String> varargs_result, 2265 List<String> keywords_result) { 2285 2266 StringBuilder s = new StringBuilder(); 2286 2267

