Changeset 4289 for trunk/ProjectFortress/src
- Timestamp:
- 10/26/09 07:55:47 (4 weeks ago)
- Location:
- trunk/ProjectFortress/src/com/sun/fortress/scala_src
- Files:
-
- 3 modified
-
typechecker/AbstractMethodChecker.scala (modified) (2 diffs)
-
typechecker/OverloadingChecker.scala (modified) (1 diff)
-
useful/STypesUtil.scala (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ProjectFortress/src/com/sun/fortress/scala_src/typechecker/AbstractMethodChecker.scala
r4286 r4289 25 25 import com.sun.fortress.compiler.GlobalEnvironment 26 26 import com.sun.fortress.compiler.index.ComponentIndex 27 import com.sun.fortress.compiler.index.{Functional => JavaFunctional} 27 28 import com.sun.fortress.compiler.index.TraitIndex 28 29 import com.sun.fortress.compiler.typechecker.StaticTypeReplacer … … 67 68 checkObject(span, List(), name, extendsC, 68 69 walk(decls).asInstanceOf[List[Decl]]) 69 val inherited = inheritedMethods(traits, extendsC).map(t => t.first.asInstanceOf[IdOrOp].getText) 70 val inherited = inheritedMethods(traits, extendsC, Set(), typeAnalyzer) 71 .map(t => t.first.asInstanceOf[IdOrOp].getText) 70 72 for ( d <- decls ; if d.isInstanceOf[FnDecl] ) { 71 73 if ( NU.isFunctionalMethod(NU.getParams(d.asInstanceOf[FnDecl])) && -
trunk/ProjectFortress/src/com/sun/fortress/scala_src/typechecker/OverloadingChecker.scala
r4275 r4289 474 474 /* Returns the type of the given list of parameters. */ 475 475 private def paramsToType(params: JavaList[Param], span: Span): Type = 476 params.size match { 477 case 0 => NodeFactory.makeVoidType(span) 478 case 1 => paramToType(params.get(0)) 479 case _ => 480 NodeFactory.makeTupleType(NodeUtil.spanAll(params), 481 Lists.toJavaList(Lists.toList(params).map(p => paramToType(p)))) 482 } 483 484 /* Returns the type of the given parameter. */ 485 private def paramToType(param: Param): Type = 486 toOption(param.getIdType) match { 487 case Some(ty) => ty 488 case _ => 489 toOption(param.getVarargsType) match { 490 case Some(ty) => ty 491 case _ => 492 val span = NodeUtil.getSpan(param) 493 error(span, 494 "Type checking couldn't infer the type of " + param) 495 NodeFactory.makeVoidType(span) 496 } 497 } 476 STypesUtil.paramsToType(toList(params), span) match { 477 case Some(ty) => ty 478 case _ => 479 val span = NodeUtil.spanAll(params) 480 error(span, 481 "Type checking couldn't infer the type of " + params) 482 NodeFactory.makeVoidType(span) 483 } 498 484 499 485 private def error(loc: Span, msg: String) = -
trunk/ProjectFortress/src/com/sun/fortress/scala_src/useful/STypesUtil.scala
r4286 r4289 35 35 import com.sun.fortress.nodes_util.{NodeFactory => NF} 36 36 import com.sun.fortress.nodes_util.{NodeUtil => NU} 37 import com.sun.fortress.nodes_util.Span 37 38 import com.sun.fortress.scala_src.nodes._ 38 39 import com.sun.fortress.scala_src.typechecker.ConstraintFormula … … 874 875 } 875 876 877 // Invariant: Parameter types of all the methods should exist. 876 878 def inheritedMethods(traits: TraitTable, 877 extendedTraits: List[TraitTypeWhere]) = { 879 extendedTraits: List[TraitTypeWhere], 880 initial: Set[Pair[IdOrOpOrAnonymousName, Functional]], 881 analyzer: TypeAnalyzer) = { 878 882 // Return all of the methods from super-traits 879 883 def inheritedMethodsHelper(history: HierarchyHistory, 880 extended_traits: List[TraitTypeWhere]) 881 : Set[Pair[IdOrOpOrAnonymousName, Function]] = { 882 var methods = Set[Pair[IdOrOpOrAnonymousName, Function]]() 883 var done = false 884 extended_traits: List[TraitTypeWhere], 885 given: Set[Pair[IdOrOpOrAnonymousName, Functional]]) 886 : Set[Pair[IdOrOpOrAnonymousName, Functional]] = { 887 var allMethods = given 888 var methods = Set[Pair[IdOrOpOrAnonymousName, Functional]]() 884 889 var h = history 885 for ( trait_ <- extended_traits ; if (! done)) {890 for (trait_ <- extended_traits) { 886 891 val type_ = trait_.getBaseType 887 892 if ( ! h.hasExplored(type_) ) { 888 893 h.explore(type_) 889 894 type_ match { 890 case ty@STraitType(_, name, _, params) =>895 case ty@STraitType(_, name, trait_args, params) => 891 896 toOption(traits.typeCons(name)) match { 892 897 case Some(ti) => 893 898 if ( ti.isInstanceOf[TraitIndex] ) { 894 val trait_params = ti.staticParameters895 val trait_args = ty.getArgs896 899 // Instantiate methods with static args 897 var collected: Collection[Pair[IdOrOpOrAnonymousName, Function]] = 898 toSet(ti.asInstanceOf[TraitIndex].dottedMethods).asInstanceOf[CSet[Pair[IdOrOpOrAnonymousName, Function]]] 900 val paramsToArgs = new StaticTypeReplacer(ti.staticParameters, 901 toJavaList(trait_args)) 902 var collected: Collection[Pair[IdOrOpOrAnonymousName, Functional]] = 903 toSet(ti.asInstanceOf[TraitIndex].dottedMethods) 904 .asInstanceOf[CSet[Pair[IdOrOpOrAnonymousName, Functional]]] 899 905 collected ++= 900 toSet(ti.asInstanceOf[TraitIndex].functionalMethods).asInstanceOf[CSet[Pair[IdOrOpOrAnonymousName, Function]]] 906 toSet(ti.asInstanceOf[TraitIndex].functionalMethods) 907 .asInstanceOf[CSet[Pair[IdOrOpOrAnonymousName, Functional]]] 901 908 for ( pair <- collected ; if pair.first.isInstanceOf[IdOrOp] ) { 902 methods += pair 909 val fname = pair.first.asInstanceOf[IdOrOp].getText 910 val span = NU.getSpan(pair.first) 911 val paramTy = paramsToType(toList(pair.second.parameters), 912 span) match { 913 case Some(t) => paramsToArgs.replaceIn(t) 914 case _ => NF.makeVoidType(span) 915 } 916 if (!isOverride(fname, paramTy, allMethods, analyzer)) { 917 methods += pair 918 allMethods += pair 919 } 903 920 } 904 val paramsToArgs = new StaticTypeReplacer(trait_params, trait_args)905 921 val instantiated_extends_types = 906 922 toList(ti.asInstanceOf[TraitIndex].extendsTypes).map( (t:TraitTypeWhere) => 907 923 t.accept(paramsToArgs).asInstanceOf[TraitTypeWhere] ) 908 924 val old_hist = h 909 methods ++= inheritedMethodsHelper(h, instantiated_extends_types) 925 val inherited = inheritedMethodsHelper(h, instantiated_extends_types, 926 allMethods) 927 methods ++= inherited 928 allMethods ++= inherited 910 929 h = old_hist 911 } else done = true912 case _ => done = true930 } else return methods 931 case _ => return methods 913 932 } 914 case _ => done = true933 case _ => return methods 915 934 } 916 935 } … … 918 937 methods 919 938 } 920 inheritedMethodsHelper(new HierarchyHistory(), extendedTraits) 921 } 922 939 inheritedMethodsHelper(new HierarchyHistory(), extendedTraits, initial) 940 } 941 942 private def isOverride(fname: String, paramTy: Type, 943 allMethods: Set[Pair[IdOrOpOrAnonymousName, Functional]], 944 analyzer: TypeAnalyzer): Boolean = { 945 for (f <- allMethods; 946 if fname.equals(f.first.asInstanceOf[IdOrOp].getText)) { 947 val span = NU.getSpan(f.first) 948 val otherParamTy = paramsToType(toList(f.second.parameters), span) match { 949 case Some(t) => t 950 case _ => NF.makeVoidType(span) 951 } 952 if (analyzer.equivalent(paramTy, otherParamTy).isTrue) return true 953 } 954 false 955 } 956 957 /* Returns the type of the given list of parameters. */ 958 def paramsToType(params: List[Param], span: Span): Option[Type] = 959 params.size match { 960 case 0 => Some(NF.makeVoidType(span)) 961 case 1 => paramToType(params.head) 962 case _ => 963 val elems = params.map(paramToType) 964 if (elems.forall(_.isDefined)) 965 Some(NF.makeTupleType(NU.spanAll(toJavaList(params)), 966 Lists.toJavaList(elems.map(_.get)))) 967 else None 968 } 969 970 /* Returns the type of the given parameter. */ 971 def paramToType(param: Param): Option[Type] = 972 toOption(param.getIdType) match { 973 case Some(ty) => Some(ty) 974 case _ => toOption(param.getVarargsType) match { 975 case Some(ty) => Some(ty) 976 case _ => None 977 } 978 } 923 979 }

