summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-05-08 16:34:57 +0000
committerMartin Odersky <odersky@gmail.com>2006-05-08 16:34:57 +0000
commit00afa24fb6f2621e02e6ecd8ef86db56dd3913b5 (patch)
treef0240f5daed36699de1e928c780fb16744dbc22a /src
parentff1c68655acee7faf1227337ce444d2d08ca2a9a (diff)
downloadscala-00afa24fb6f2621e02e6ecd8ef86db56dd3913b5.tar.gz
scala-00afa24fb6f2621e02e6ecd8ef86db56dd3913b5.tar.bz2
scala-00afa24fb6f2621e02e6ecd8ef86db56dd3913b5.zip
Bug fixes
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala5
-rw-r--r--src/compiler/scala/tools/nsc/Main.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/StdNames.scala1
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala23
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala4
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala17
6 files changed, 45 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 4fd5404a91..da135674a1 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -343,6 +343,11 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
genJVM,
sampleTransform);
+ protected def insertBefore(c: SubComponent, cs: List[SubComponent], before: SubComponent): List[SubComponent] = cs match {
+ case List() => List(c)
+ case c1 :: cs1 => if (c1 == before) c :: cs else c1 :: insertBefore(c, cs1, before)
+ }
+
private var curRun: Run = NoRun;
override def currentRun: Run = curRun;
diff --git a/src/compiler/scala/tools/nsc/Main.scala b/src/compiler/scala/tools/nsc/Main.scala
index ff23178c4a..41345083e1 100644
--- a/src/compiler/scala/tools/nsc/Main.scala
+++ b/src/compiler/scala/tools/nsc/Main.scala
@@ -24,7 +24,7 @@ object Main extends Object with EvalLoop {
val versionMsg = PRODUCT + " " + VERSION + " -- " + COPYRIGHT
val prompt = "\nnsc> "
- private var reporter: ConsoleReporter = _
+ var reporter: ConsoleReporter = _
def error(msg: String): unit =
reporter.error(new Position(PRODUCT),
diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
index e841813272..1d64005f58 100644
--- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala
+++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
@@ -234,6 +234,7 @@ trait StdNames requires SymbolTable {
val elements = newTermName("elements");
val eq = newTermName("eq");
val equals_ = newTermName("equals");
+ val _equals = newTermName("_equals");
val ex = newTermName("ex");
val fail = newTermName("fail");
val false_ = newTermName("false");
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 2702a42057..0b3c16e56d 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -979,6 +979,15 @@ trait Types requires SymbolTable {
} else sym
}
+ /** Convert a `super' prefix to a this-type if `sym' is abstract or final */
+ private def removeSuper(tp: Type, sym: Symbol): Type = tp match {
+ case SuperType(thistp, _) =>
+ if (sym.isFinal || sym.hasFlag(DEFERRED)) thistp
+ else tp
+ case _ =>
+ tp
+ }
+
/** The canonical creator for this-types */
def ThisType(sym: Symbol): Type =
if (phase.erasedTypes) sym.tpe else unique(new ThisType(sym) with UniqueType);
@@ -989,8 +998,12 @@ trait Types requires SymbolTable {
sym.tpe.resultType
else if (checkMalformedSwitch && !pre.isStable && !pre.isError)
throw new MalformedType(pre, sym.name.toString())
- else
- unique(new SingleType(pre, rebind(pre, sym)) with UniqueType)
+ else {
+ var sym1 = rebind(pre, sym)
+ val pre1 = removeSuper(pre, sym1)
+ if (pre1 ne pre) sym1 = rebind(pre1, sym1)
+ unique(new SingleType(pre1, sym1) with UniqueType)
+ }
}
/** The canonical creator for super-types */
@@ -1024,7 +1037,7 @@ trait Types requires SymbolTable {
/** The canonical creator for typerefs */
def typeRef(pre: Type, sym: Symbol, args: List[Type]): Type = {
- val sym1 = if (sym.isAbstractType) rebind(pre, sym) else sym;
+ var sym1 = if (sym.isAbstractType) rebind(pre, sym) else sym;
if (checkMalformedSwitch && sym1.isAbstractType && !pre.isStable && !pre.isError)
throw new MalformedType(pre, sym.nameString);
// if (sym1.hasFlag(LOCKED))
@@ -1039,7 +1052,9 @@ trait Types requires SymbolTable {
sym1.resetFlag(LOCKED);
result
} else {
- rawTypeRef(pre, sym1, args)
+ val pre1 = removeSuper(pre, sym1)
+ if ((pre1 ne pre) && sym1.isAbstractType) sym1 = rebind(pre1, sym1)
+ rawTypeRef(pre1, sym1, args)
}
}
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 13d39c70e5..bb8ebb8cd4 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -392,7 +392,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
* but their erased types are the same.
*/
private def checkNoDoubleDefs(root: Symbol): unit = {
- def doubleDefError(sym1: Symbol, sym2: Symbol) = {
+ def doubleDefError(sym1: Symbol, sym2: Symbol): unit = {
val tpe1 = atPhase(currentRun.refchecksPhase.next)(root.thisType.memberType(sym1));
val tpe2 = atPhase(currentRun.refchecksPhase.next)(root.thisType.memberType(sym2));
unit.error(
@@ -406,8 +406,10 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
(if (sym2.owner == root) " at line " + Position.line(unit.source, sym2.pos) else sym2.locationString) +
"\nhave same type" +
(if (tpe1 =:= tpe2) "" else " after erasure: " + atPhase(phase.next)(sym1.tpe)))
+ sym2.setInfo(ErrorType)
}
+
val decls = root.info.decls;
var e = decls.elems;
while (e != null) {
diff --git a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
index 6b11c5818f..7f06291c7c 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
@@ -86,6 +86,21 @@ trait SyntheticMethods requires Analyzer {
Apply(gen.mkAttributedRef(target), This(clazz) :: (vparamss.head map Ident))));
}
+ def equalsMethod: Tree = {
+ val target = getMember(ScalaRunTimeModule, nme._equals);
+ val method = syntheticMethod(
+ nme.equals_, 0, MethodType(target.tpe.paramTypes.tail, target.tpe.resultType));
+ typed(DefDef(method, vparamss =>
+ Apply(
+ Select(
+ TypeApply(
+ Select(Ident(vparamss.head.head), Any_isInstanceOf),
+ List(TypeTree(clazz.tpe))),
+ Boolean_and),
+ List(
+ Apply(gen.mkAttributedRef(target), This(clazz) :: (vparamss.head map Ident))))));
+ }
+
def isSerializable(clazz: Symbol): Boolean =
!clazz.getAttributes(definitions.SerializableAttr).isEmpty
@@ -169,7 +184,7 @@ trait SyntheticMethods requires Analyzer {
} else {
if (!hasImplementation(nme.hashCode_)) ts += forwardingMethod(nme.hashCode_);
if (!hasImplementation(nme.toString_)) ts += forwardingMethod(nme.toString_);
- if (!hasImplementation(nme.equals_)) ts += forwardingMethod(nme.equals_);
+ if (!hasImplementation(nme.equals_)) ts += equalsMethod //forwardingMethod(nme.equals_);
}
if (!hasImplementation(nme.caseElement)) ts += caseElementMethod;
if (!hasImplementation(nme.caseArity)) ts += caseArityMethod;