diff options
author | Martin Odersky <odersky@gmail.com> | 2005-11-10 15:06:47 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2005-11-10 15:06:47 +0000 |
commit | 222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3 (patch) | |
tree | fc15707256c403db6d21acfd6d2b8cc724955ab8 | |
parent | d888c78872d9170ee5627f8f435c261ac6df70e5 (diff) | |
download | scala-222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3.tar.gz scala-222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3.tar.bz2 scala-222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3.zip |
*** empty log message ***
-rwxr-xr-x | sources/scala/tools/nsc/symtab/Symbols.scala | 8 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/symtab/Types.scala | 13 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/transform/ExplicitOuter.scala | 2 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/typechecker/Infer.scala | 1 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/typechecker/Namers.scala | 15 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/typechecker/Typers.scala | 3 |
6 files changed, 20 insertions, 22 deletions
diff --git a/sources/scala/tools/nsc/symtab/Symbols.scala b/sources/scala/tools/nsc/symtab/Symbols.scala index 396f733ca3..29204237db 100755 --- a/sources/scala/tools/nsc/symtab/Symbols.scala +++ b/sources/scala/tools/nsc/symtab/Symbols.scala @@ -84,12 +84,10 @@ import Flags._; new TypeSymbol(this, pos, name).setFlag(DEFERRED); final def newTypeParameter(pos: int, name: Name) = newAbstractType(pos, name).setFlag(PARAM); - final def newSkolem(tparam: Symbol) = tparam;// for now -/* + final def newSkolem(tparam: Symbol) = new TypeSkolem(this, tparam.pos, tparam.name, tparam) .setFlag(tparam.flags) .setInfo(tparam.rawInfo); -*/ final def newClass(pos: int, name: Name) = new ClassSymbol(this, pos, name); final def newModuleClass(pos: int, name: Name) = @@ -672,7 +670,7 @@ import Flags._; * E.g. $eq => =. * If settings.uniquId adds id. */ - final def nameString: String = + def nameString: String = //todo: should be final simpleName.decode + idString; /** String representation of symbol's full name with `separator' @@ -874,7 +872,7 @@ import Flags._; override def cloneSymbolImpl(owner: Symbol): Symbol = { throw new Error("should not clone a type skolem"); } - override def toString(): String = super.toString() + "&"; + override def nameString: String = super.nameString + "&"; } /** A class for class symbols */ diff --git a/sources/scala/tools/nsc/symtab/Types.scala b/sources/scala/tools/nsc/symtab/Types.scala index 5aa43e088e..bff269e8f2 100755 --- a/sources/scala/tools/nsc/symtab/Types.scala +++ b/sources/scala/tools/nsc/symtab/Types.scala @@ -1125,7 +1125,8 @@ import Flags._; if (constr.inst != NoType) this(constr.inst) else tp case _ => - throw new Error("mapOver inapplicable for " + tp); + tp + // throw new Error("mapOver inapplicable for " + tp); } /** Map this function over given scope */ @@ -1352,9 +1353,7 @@ import Flags._; * 2. The skolem is a method parameter which appears in parameter `tparams' */ class DeSkolemizeMap(tparams: List[Symbol]) extends TypeMap { - def apply(tp: Type): Type = tp;//for now - /* - tp match { + def apply(tp: Type): Type = tp match { case TypeRef(pre, sym, args) => val tparam = sym.deSkolemize; mapOver( @@ -1363,12 +1362,12 @@ import Flags._; case PolyType(tparams1, restpe) => assert(tparams.isEmpty); new DeSkolemizeMap(tparams1).mapOver(tp) - case ClassInfoType(_, _, _) => - tp + case ClassInfoType(parents, decls, clazz) => + val parents1 = List.mapConserve(parents)(this); + if (parents1 eq parents) tp else ClassInfoType(parents1, decls, clazz); case _ => mapOver(tp) } - */ } val deSkolemize = new DeSkolemizeMap(List()); diff --git a/sources/scala/tools/nsc/transform/ExplicitOuter.scala b/sources/scala/tools/nsc/transform/ExplicitOuter.scala index f3ac8d3c0a..5c1f2c30ae 100755 --- a/sources/scala/tools/nsc/transform/ExplicitOuter.scala +++ b/sources/scala/tools/nsc/transform/ExplicitOuter.scala @@ -262,7 +262,7 @@ abstract class ExplicitOuter extends InfoTransform { val outerVal = atPos(tree.pos) { if (qual.isInstanceOf[This]) { assert(outerParam != NoSymbol); outerValue } // (8) - else if (qual.tpe.prefix == NoPrefix) gen.This(currentOwner.enclClass) + else if (qual.tpe.prefix == NoPrefix) gen.This(currentOwner.enclClass.owner.enclClass) else gen.mkQualifier(qual.tpe.prefix); // (7) } copy.Apply(tree, sel, args ::: List(outerVal)) diff --git a/sources/scala/tools/nsc/typechecker/Infer.scala b/sources/scala/tools/nsc/typechecker/Infer.scala index e010c600b5..903e42b976 100755 --- a/sources/scala/tools/nsc/typechecker/Infer.scala +++ b/sources/scala/tools/nsc/typechecker/Infer.scala @@ -511,6 +511,7 @@ package scala.tools.nsc.typechecker; } def instError = { System.out.println("ici " + tree + " " + undetparams + " " + pt);//debug + if (settings.explaintypes.value) explainTypes(restpe.subst(undetparams, tvars), pt); errorTree(tree, "constructor cannot be instantiated to expected type" + foundReqMsg(restpe, pt)) } diff --git a/sources/scala/tools/nsc/typechecker/Namers.scala b/sources/scala/tools/nsc/typechecker/Namers.scala index abe7d05a32..8c6f91e51b 100755 --- a/sources/scala/tools/nsc/typechecker/Namers.scala +++ b/sources/scala/tools/nsc/typechecker/Namers.scala @@ -126,7 +126,7 @@ trait Namers: Analyzer { def finish = finishWith(List()); def skolemize(tparams: List[AbsTypeDef]): unit = { - for (val tp <- tparams) tp.symbol = context.owner.newSkolem(tp.symbol) + for (val tp <- tparams) tp.symbol = tp.symbol.owner.newSkolem(tp.symbol) } if (tree.symbol == NoSymbol) { @@ -146,7 +146,6 @@ trait Namers: Analyzer { val mods1: int = if (impl.body forall treeInfo.isInterfaceMember) mods | INTERFACE else mods; tree.symbol = enterClassSymbol(tree.pos, mods1, name); finishWith(tparams); - skolemize(tparams); case ModuleDef(mods, name, _) => tree.symbol = enterModuleSymbol(tree.pos, mods | MODULE | FINAL, name); tree.symbol.moduleClass.setInfo(innerNamer.typeCompleter(tree)); @@ -308,10 +307,11 @@ trait Namers: Analyzer { if (!vparams.isEmpty && vparams.head.hasFlag(IMPLICIT)) ImplicitMethodType(formals, restpe) else MethodType(formals, restpe); } - makePolyType( - tparamSyms, - if (vparamSymss.isEmpty) PolyType(List(), restype) - else (vparamSymss :\ restype)(mkMethodType)) + deSkolemize( + makePolyType( + tparamSyms, + if (vparamSymss.isEmpty) PolyType(List(), restype) + else (vparamSymss :\ restype)(mkMethodType))) } /** If `sym' is an implicit value, check that its type signature `tp' is contractive. @@ -353,7 +353,7 @@ trait Namers: Analyzer { private def aliasTypeSig(tpsym: Symbol, tparams: List[AbsTypeDef], rhs: Tree): Type = makePolyType(typer.reenterTypeParams(tparams), typer.typedType(rhs).tpe); - private def typeSig(tree: Tree): Type = deSkolemize { + private def typeSig(tree: Tree): Type = try { val sym: Symbol = tree.symbol; tree match { @@ -414,7 +414,6 @@ trait Namers: Analyzer { typer.reportTypeError(tree.pos, ex); ErrorType } - } /** Check that symbol's definition is well-formed. This means: * - no conflicting modifiers diff --git a/sources/scala/tools/nsc/typechecker/Typers.scala b/sources/scala/tools/nsc/typechecker/Typers.scala index 520272920c..c28cd4a3c7 100755 --- a/sources/scala/tools/nsc/typechecker/Typers.scala +++ b/sources/scala/tools/nsc/typechecker/Typers.scala @@ -509,7 +509,8 @@ import collection.mutable.HashMap; val tpt1 = checkNoEscaping.privates(clazz.thisSym, typedType(cdef.tpt)); val impl1 = newTyper(context.make(cdef.impl, clazz, new Scope())) .typedTemplate(cdef.impl, parentTypes(cdef.impl)); - copy.ClassDef(cdef, cdef.mods, cdef.name, tparams1, tpt1, addSyntheticMethods(impl1, clazz)) + val impl2 = addSyntheticMethods(impl1, clazz); + copy.ClassDef(cdef, cdef.mods, cdef.name, tparams1, tpt1, impl2) setType NoType } |