Changeset 3109
- Timestamp:
- 11/26/08 12:46:49 (12 months ago)
- Location:
- trunk/ProjectFortress
- Files:
-
- 15 modified
-
astgen/Fortress.ast (modified) (2 diffs)
-
src/com/sun/fortress/compiler/Types.java (modified) (5 diffs)
-
src/com/sun/fortress/compiler/typechecker/SubtypeChecker.java (modified) (5 diffs)
-
src/com/sun/fortress/compiler/typechecker/TypeAnalyzer.java (modified) (5 diffs)
-
src/com/sun/fortress/compiler/typechecker/TypeAnalyzerJUTest.java (modified) (1 diff)
-
src/com/sun/fortress/compiler/typechecker/TypeAnalyzerUtil.java (modified) (1 diff)
-
src/com/sun/fortress/compiler/typechecker/TypeChecker.java (modified) (1 diff)
-
src/com/sun/fortress/interpreter/evaluator/EvalType.java (modified) (1 diff)
-
src/com/sun/fortress/interpreter/evaluator/MakeInferenceSpecific.java (modified) (2 diffs)
-
src/com/sun/fortress/interpreter/evaluator/ScoutVisitor.java (modified) (2 diffs)
-
src/com/sun/fortress/interpreter/evaluator/types/FTypeTuple.java (modified) (2 diffs)
-
src/com/sun/fortress/nodes_util/ErrorMsgMaker.java (modified) (1 diff)
-
src/com/sun/fortress/nodes_util/NodeComparator.java (modified) (2 diffs)
-
src/com/sun/fortress/nodes_util/NodeFactory.java (modified) (1 diff)
-
src/com/sun/fortress/tools/FortressAstToConcrete.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ProjectFortress/astgen/Fortress.ast
r3107 r3109 653 653 * e.g.) self 654 654 * e.g.) x: String... 655 * 656 * <varargsType> 657 * It is a varargs parameter if the varargsType field is set. 655 658 */ 656 659 Param(List<Modifier> mods = Collections.<Modifier>emptyList(), … … 1357 1360 /** 1358 1361 * tuple-like types 1359 */ 1360 abstract AbstractTupleType(List<Type> elements); 1361 /** 1362 * tuple type 1363 * TupleType ::= ( Type, TypeList ) 1364 * e.g.) (ZZ32, String) 1365 */ 1366 TupleType(); 1367 /** 1368 * Used internally to represent an infinite union of 1369 * TupleTypes. 1370 */ 1371 VarargTupleType(Type varargs); 1362 * TupleType ::= ( Type, TypeList ) 1363 * e.g.) (ZZ32, String) 1364 * 1365 * <varargs> 1366 * It has a varargs parameter if the varargs field is set. 1367 */ 1368 TupleType(List<Type> elements, 1369 Option<Type> varargs = Option.<Type>none()); 1372 1370 /** 1373 1371 * void type -
trunk/ProjectFortress/src/com/sun/fortress/compiler/Types.java
r3071 r3109 45 45 46 46 private Types() {} 47 47 48 48 private static Span span = NodeFactory.makeSpan("If you see this, it is a bug."); 49 49 … … 53 53 // ImmutableHeapSequence is put into the libraries. 54 54 public static final Id IMMUTABLE_HEAP_SEQ_NAME = makeId(fortressLibrary, "ImmutableArray"); 55 55 56 56 public static final AnyType ANY = new AnyType(span); 57 57 public static final BottomType BOTTOM = new BottomType(span); … … 226 226 * Bottom. 227 227 */ 228 public static Type varargDisjunct( VarargTupleType t, int arity) {228 public static Type varargDisjunct(TupleType t, int arity) { 229 229 List<Type> base = t.getElements(); 230 230 int baseSize = base.size(); 231 231 if (baseSize > arity) { return BOTTOM; } 232 232 else { 233 Iterable<Type> rest = IterUtil.copy(t.getVarargs() , arity-baseSize);233 Iterable<Type> rest = IterUtil.copy(t.getVarargs().unwrap(), arity-baseSize); 234 234 return makeTuple(IterUtil.compose(base, rest)); 235 235 } … … 238 238 /** 239 239 * Produce a type representing a Domain with any keyword types removed. 240 * May return a TupleType, a VoidType, a VarargTupleType, or a type240 * May return a TupleType, a VoidType, a TupleType with varargs, or a type 241 241 * representing a singleton argument. 242 242 */ 243 243 public static Type stripKeywords(Domain d) { 244 244 if (d.getVarargs().isSome()) { 245 return new VarargTupleType(NodeFactory.makeSpan(d.getArgs(), d.getVarargs().unwrap()), d.getArgs(), d.getVarargs().unwrap());245 return new TupleType(NodeFactory.makeSpan(d.getArgs(), d.getVarargs().unwrap()), d.getArgs(), d.getVarargs()); 246 246 } 247 247 else { … … 294 294 } 295 295 @Override public Domain forTupleType(TupleType t) { 296 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), keywords);297 }298 @Override public Domain forVarargTupleType(VarargTupleType t) {299 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), Option.some(t.getVarargs()),300 keywords);296 if ( t.getVarargs().isNone() ) 297 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), keywords); 298 else 299 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), t.getVarargs(), 300 keywords); 301 301 } 302 302 @Override public Domain forType(Type t) { -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/SubtypeChecker.java
r3071 r3109 379 379 } 380 380 private boolean isTuple(Type t) { 381 return (t instanceof AbstractTupleType);381 return (t instanceof TupleType); 382 382 } 383 383 private boolean isInst(Type t) { … … 397 397 } 398 398 private boolean isVarargTupleType(Type t) { 399 return (t instanceof VarargTupleType); 399 return (t instanceof TupleType && 400 ((TupleType)t).getVarargs().isSome()); 400 401 } 401 402 … … 598 599 * 599 600 * _InferenceVarType(Object id, int index = -1); 600 * VarargTupleType(Type varargs);601 601 * abstract DimExpr(); 602 602 * ExponentType(Type base, IntExpr power); … … 719 719 // p; Delta |- (s, ...) <: (t, ...) 720 720 if (isTuple(s) && isTuple(t)) { 721 if (s instanceof VarargTupleType && t instanceof VarargTupleType) {722 VarargTupleType ss = (VarargTupleType)s;723 VarargTupleType tt = (VarargTupleType)t;721 TupleType ss = (TupleType)s; 722 TupleType tt = (TupleType)t; 723 if (ss.getVarargs().isSome() && tt.getVarargs().isSome()) { 724 724 List<Type> stypes = ss.getElements(); 725 725 List<Type> ttypes = tt.getElements(); 726 726 int padLength = Math.max(stypes.size(), ttypes.size()); 727 List<Type> spadded = pad(stypes, ss.getVarargs() , padLength);728 List<Type> tpadded = pad(ttypes, tt.getVarargs() , padLength);727 List<Type> spadded = pad(stypes, ss.getVarargs().unwrap(), padLength); 728 List<Type> tpadded = pad(ttypes, tt.getVarargs().unwrap(), padLength); 729 729 for (Pair<Type, Type> p : IterUtil.zip(spadded, tpadded)) { 730 730 if (!subtype(p.first(), p.second(), history)) { … … 733 733 } 734 734 // Check that varargs are subtypes 735 if (!subtype(ss.getVarargs() , tt.getVarargs())) {735 if (!subtype(ss.getVarargs().unwrap(), tt.getVarargs().unwrap())) { 736 736 return FALSE; 737 737 } 738 738 return TRUE; 739 } else if (s instanceof VarargTupleType || t instanceof VarargTupleType) {740 // only one is a VarargTupleType739 } else if (ss.getVarargs().isSome() || tt.getVarargs().isSome()) { 740 // only one has a varargs parameter 741 741 return FALSE; 742 742 } else { // s instanceof TupleType && s instanceof TupleType 743 TupleType ss = (TupleType)s;744 TupleType tt = (TupleType)t;745 743 List<Type> types = tt.getElements(); 746 744 if (ss.getElements().size() != types.size()) { -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzer.java
r3071 r3109 253 253 } 254 254 255 @Override public Type forTupleTypeOnly(TupleType t, List<Type> normalElements) { 256 Type result = handleAbstractTuple(normalElements, MAKE_TUPLE); 257 return t.equals(result) ? t : result; 258 } 259 260 @Override public Type forVarargTupleTypeOnly(VarargTupleType t, List<Type> normalElements, 261 Type normalVarargs) { 262 // the varargs type can be treated like just another tuple element, as far as 263 // normalization is concerned, unless the varargs type is Bottom 264 if (normalVarargs.equals(BOTTOM)) { 265 return handleAbstractTuple(normalElements, MAKE_TUPLE); 266 } 267 else { 268 Lambda<Iterable<Type>, Type> factory = new Lambda<Iterable<Type>, Type>() { 269 public Type value(Iterable<Type> ts) { 270 if (IterUtil.isEmpty(ts)) { return VOID; } 271 else { 272 List<Type> elts = makeList(skipLast(ts)); 273 Type varargs = last(ts); 274 return new VarargTupleType(NodeFactory.makeSpan(elts, varargs), elts, varargs); 275 } 276 } 277 }; 278 Type result = handleAbstractTuple(compose(normalElements, normalVarargs), 279 factory); 280 return t.equals(result) ? t : result; 281 } 282 } 255 @Override public Type forTupleTypeOnly(TupleType t, List<Type> normalElements, 256 Option<Type> normalVarargs) { 257 if ( normalVarargs.isNone() ) { 258 Type result = handleAbstractTuple(normalElements, MAKE_TUPLE); 259 return t.equals(result) ? t : result; 260 } else { 261 // the varargs type can be treated like just another tuple element, as far as 262 // normalization is concerned, unless the varargs type is Bottom 263 if (normalVarargs.unwrap().equals(BOTTOM)) { 264 return handleAbstractTuple(normalElements, MAKE_TUPLE); 265 } 266 else { 267 Lambda<Iterable<Type>, Type> factory = new Lambda<Iterable<Type>, Type>() { 268 public Type value(Iterable<Type> ts) { 269 if (IterUtil.isEmpty(ts)) { return VOID; } 270 else { 271 List<Type> elts = makeList(skipLast(ts)); 272 Type varargs = last(ts); 273 return new TupleType(NodeFactory.makeSpan(elts, varargs), 274 elts, Option.<Type>some(varargs)); 275 } 276 } 277 }; 278 Type result = handleAbstractTuple(compose(normalElements, normalVarargs.unwrap()), 279 factory); 280 return t.equals(result) ? t : result; 281 } 282 } 283 } 283 284 284 285 private Type handleAbstractTuple(Iterable<Type> normalElements, … … 455 456 456 457 @Override public 457 ConstraintFormula forVarargTupleType(final VarargTupleType t) { 458 ConstraintFormula forTupleType(final TupleType t) { 459 if ( t.getVarargs().isSome() ) { 460 458 461 return s.accept(new NodeAbstractVisitor<ConstraintFormula>() { 459 462 @Override public ConstraintFormula forType(Type s) { … … 471 474 } 472 475 @Override public ConstraintFormula forTupleType(TupleType s) { 473 return tupleSubVararg(s, t, h); 474 } 475 @Override public 476 ConstraintFormula forVarargTupleType(VarargTupleType s) { 477 return varargSubVararg(s, t, h); 476 if ( s.getVarargs().isSome() ) 477 return varargSubVararg(s, t, h); 478 else return tupleSubVararg(s, t, h); 478 479 } 479 480 }); 481 } else 482 return null; 480 483 } 481 484 … … 658 661 } 659 662 660 private ConstraintFormula voidSubVararg(VoidType s, VarargTupleType t, SubtypeHistory h) {663 private ConstraintFormula voidSubVararg(VoidType s, TupleType t, SubtypeHistory h) { 661 664 return sub(s, varargDisjunct(t, 0), h); 662 665 } 663 666 664 private ConstraintFormula traitSubVararg(TraitType s, VarargTupleType t, SubtypeHistory h) {667 private ConstraintFormula traitSubVararg(TraitType s, TupleType t, SubtypeHistory h) { 665 668 return sub(s, varargDisjunct(t, 1), h); 666 669 } 667 670 668 private ConstraintFormula anySubVararg(AnyType s, VarargTupleType t, SubtypeHistory h) {671 private ConstraintFormula anySubVararg(AnyType s, TupleType t, SubtypeHistory h) { 669 672 return sub(s, varargDisjunct(t, 1), h); 670 673 } 671 674 672 private ConstraintFormula tupleSubVararg(TupleType s, VarargTupleType t, SubtypeHistory h) {675 private ConstraintFormula tupleSubVararg(TupleType s, TupleType t, SubtypeHistory h) { 673 676 return sub(s, varargDisjunct(t, s.getElements().size()), h); 674 677 } 675 678 676 private ConstraintFormula varargSubVararg( VarargTupleType s, VarargTupleType t,679 private ConstraintFormula varargSubVararg(TupleType s, TupleType t, 677 680 SubtypeHistory h) { 678 681 int n = s.getElements().size(); … … 680 683 ConstraintFormula f = sub(varargDisjunct(s, n), varargDisjunct(t, n), h); 681 684 if (!f.isFalse()) { 682 f = f.and(sub(s.getVarargs() , t.getVarargs(), h), h);685 f = f.and(sub(s.getVarargs().unwrap(), t.getVarargs().unwrap(), h), h); 683 686 } 684 687 return f; -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzerJUTest.java
r3096 r3109 550 550 if (varargs) { s = s.substring(0, s.length()-4) + ")"; } 551 551 List<Type> ts = parseTypeList(s, "(", ")"); 552 if (varargs) { return new VarargTupleType(span, ts, ts.remove(ts.size()-1)); }552 if (varargs) { return new TupleType(span, ts, Option.<Type>some(ts.remove(ts.size()-1))); } 553 553 else if (ts.size() == 0) { return VOID; } 554 554 else if (ts.size() == 1) { return ts.get(0); } -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzerUtil.java
r2448 r3109 172 172 } 173 173 @Override public Boolean forTupleType(TupleType t) { 174 return recurOnList(t.getElements());175 }176 @Override public Boolean forVarargTupleType(VarargTupleType t) {177 return recurOnList(t.getElements()) || t.getVarargs().accept(this);174 if ( t.getVarargs().isNone() ) 175 return recurOnList(t.getElements()); 176 else 177 return recurOnList(t.getElements()) || t.getVarargs().unwrap().accept(this); 178 178 } 179 179 @Override public Boolean forAnyType(AnyType t) { return false; } -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeChecker.java
r3107 r3109 2395 2395 } 2396 2396 } 2397 AbstractTupleType domain;2397 TupleType domain; 2398 2398 if(varargs){ 2399 2399 Type var = dlist.remove(dlist.size()-1); 2400 domain = new VarargTupleType(that.getSpan(), dlist,var);2400 domain = new TupleType(that.getSpan(), dlist, Option.<Type>some(var)); 2401 2401 } 2402 2402 else{ -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/EvalType.java
r3107 r3109 410 410 411 411 @Override 412 public FType forVarargTupleType(VarargTupleType tt) {413 List<FType> elts = getFTypeListFromList(tt.getElements());414 elts.add(FTypeRest.make(tt.getVarargs().accept(this)));415 return FTypeTuple.make(elts);416 }417 418 @Override419 412 public FType forTupleType(TupleType tt) { 420 List<FType> elts = getFTypeListFromList(tt.getElements()); 421 return FTypeTuple.make(elts); 413 if ( tt.getVarargs().isNone() ) { 414 List<FType> elts = getFTypeListFromList(tt.getElements()); 415 return FTypeTuple.make(elts); 416 } else { 417 List<FType> elts = getFTypeListFromList(tt.getElements()); 418 elts.add(FTypeRest.make(tt.getVarargs().unwrap().accept(this))); 419 return FTypeTuple.make(elts); 420 } 422 421 } 423 422 -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/MakeInferenceSpecific.java
r2649 r3109 30 30 import com.sun.fortress.nodes.NodeAbstractVisitor_void; 31 31 import com.sun.fortress.nodes.TraitType; 32 import com.sun.fortress.nodes.VarargTupleType;33 32 import com.sun.fortress.nodes.TupleType; 34 33 import com.sun.fortress.nodes.VoidType; … … 136 135 137 136 /* (non-Javadoc) 138 * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forVarargTupleType(com.sun.fortress.nodes.VarargTupleType)139 */140 @Override141 public void forVarargTupleType(VarargTupleType that) {142 // TODO: implement143 NI.nyi("Can't yet handle varargs tuples");144 }145 146 /* (non-Javadoc)147 137 * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forTupleType(com.sun.fortress.nodes.TupleType) 148 138 */ 149 139 @Override 150 140 public void forTupleType(TupleType that) { 151 acceptList(that.getElements(), this); 141 if ( that.getVarargs().isSome() ) { 142 // TODO: implement 143 NI.nyi("Can't yet handle varargs tuples"); 144 } else { 145 acceptList(that.getElements(), this); 146 } 152 147 } 153 148 -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/ScoutVisitor.java
r3096 r3109 35 35 import com.sun.fortress.nodes.BaseType; 36 36 import com.sun.fortress.nodes.TraitTypeWhere; 37 import com.sun.fortress.nodes.VarargTupleType;38 37 import com.sun.fortress.nodes.TupleType; 39 38 import com.sun.fortress.nodes.Type; … … 151 150 152 151 /* (non-Javadoc) 153 * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forVarargTupleType(com.sun.fortress.nodes.VarargTupleType)154 */155 @Override156 public void forVarargTupleType(VarargTupleType that) {157 // TODO Auto-generated method stub158 super.forVarargTupleType(that);159 }160 161 /* (non-Javadoc)162 152 * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forTupleType(com.sun.fortress.nodes.TupleType) 163 153 */ -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/types/FTypeTuple.java
r2618 r3109 34 34 import com.sun.fortress.nodes.TupleType; 35 35 import com.sun.fortress.nodes.Type; 36 import com.sun.fortress.nodes.VarargTupleType;37 36 import com.sun.fortress.nodes.VoidType; 38 37 import com.sun.fortress.useful.BoundingMap; … … 382 381 } 383 382 else if (val instanceof TupleType) { 384 elements = ((TupleType) val).getElements(); 385 vargs = Option.none(); 386 } 387 else if (val instanceof VarargTupleType) { 388 VarargTupleType tup = (VarargTupleType) val; 389 elements = tup.getElements(); 390 vargs = Option.some(tup.getVarargs()); 383 TupleType _val = (TupleType) val; 384 if ( _val.getVarargs().isNone() ) { 385 elements = _val.getElements(); 386 vargs = Option.none(); 387 } else { 388 elements = _val.getElements(); 389 vargs = Option.some(_val.getVarargs().unwrap()); 390 } 391 391 } 392 392 else { return false; } -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/ErrorMsgMaker.java
r3107 r3109 356 356 } 357 357 358 public String forVarargTupleType(VarargTupleType node) {359 return360 "(" +361 Useful.listInDelimiters("", mapSelf(node.getElements()), "") +362 node.getVarargs().accept(this) + "..." +363 ")";364 }365 366 358 public String forTupleType(TupleType node) { 367 return Useful.listInDelimiters("(", mapSelf(node.getElements()), ")"); 359 if ( node.getVarargs().isNone() ) 360 return Useful.listInDelimiters("(", mapSelf(node.getElements()), ")"); 361 else 362 return 363 "(" + 364 Useful.listInDelimiters("", mapSelf(node.getElements()), "") + 365 node.getVarargs().unwrap().accept(this) + "..." + 366 ")"; 368 367 } 369 368 -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/NodeComparator.java
r3107 r3109 381 381 } 382 382 383 static int compare(VarargTupleType left, VarargTupleType right) {384 int x = typeListComparer.compare(left.getElements(), right.getElements());385 if (x != 0) return x;386 return compare(left.getVarargs(), right.getVarargs());387 }388 389 383 static int compare(TupleType left, TupleType right) { 390 return typeListComparer.compare(left.getElements(), right.getElements()); 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 } else 389 return typeListComparer.compare(left.getElements(), right.getElements()); 391 390 } 392 391 … … 424 423 } else if (left instanceof VoidType) { 425 424 return 0; 426 } else if (left instanceof VarargTupleType) {427 return compare((VarargTupleType) left, (VarargTupleType) right);428 425 } else if (left instanceof TupleType) { 429 426 return compare((TupleType) left, (TupleType) right); -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/NodeFactory.java
r3107 r3109 1272 1272 t.getArgs()); 1273 1273 } 1274 public Type forVarargTupleType(VarargTupleType t) {1275 return new VarargTupleType(t.getSpan(), true, t.getElements(),1276 t.getVarargs());1277 }1278 1274 public Type forTupleType(TupleType t) { 1279 return new TupleType(t.getSpan(), true, t.getElements()); 1275 return new TupleType(t.getSpan(), true, t.getElements(), 1276 t.getVarargs()); 1280 1277 } 1281 1278 public Type forVoidType(VoidType t) { -
trunk/ProjectFortress/src/com/sun/fortress/tools/FortressAstToConcrete.java
r3107 r3109 2173 2173 2174 2174 @Override public String forTupleTypeOnly(TupleType that, 2175 List<String> elements_result) { 2175 List<String> elements_result, 2176 Option<String> varargs_result) { 2176 2177 StringBuilder s = new StringBuilder(); 2177 2178 2178 2179 s.append( "(" ); 2179 2180 s.append( join(elements_result, ", ") ); 2181 if ( varargs_result.isSome() ) { 2182 s.append( "(* " ); 2183 s.append( ", " ); 2184 s.append( varargs_result.unwrap() ); 2185 s.append( "...)" ); 2186 s.append( " *)" ); 2187 } 2180 2188 s.append( ")" ); 2181 2189 2182 2190 return s.toString(); 2183 }2184 2185 @Override public String forVarargTupleTypeOnly(VarargTupleType that,2186 List<String> elements_result,2187 String varargs_result) {2188 StringBuilder s = new StringBuilder();2189 2190 s.append( "(" );2191 s.append( join(elements_result, ", ") );2192 s.append( ", " );2193 s.append( varargs_result );2194 s.append( "...)" );2195 2196 return "(* " + s.toString() + " *)";2197 2191 } 2198 2192

