summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-11-10 15:06:47 +0000
committerMartin Odersky <odersky@gmail.com>2005-11-10 15:06:47 +0000
commit222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3 (patch)
treefc15707256c403db6d21acfd6d2b8cc724955ab8
parentd888c78872d9170ee5627f8f435c261ac6df70e5 (diff)
downloadscala-222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3.tar.gz
scala-222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3.tar.bz2
scala-222cbc2dea024584855bf3b5f8c2a5c0ba07cfc3.zip
*** empty log message ***
-rwxr-xr-xsources/scala/tools/nsc/symtab/Symbols.scala8
-rwxr-xr-xsources/scala/tools/nsc/symtab/Types.scala13
-rwxr-xr-xsources/scala/tools/nsc/transform/ExplicitOuter.scala2
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Infer.scala1
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Namers.scala15
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Typers.scala3
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
}