diff options
author | Martin Odersky <odersky@gmail.com> | 2006-05-08 16:34:57 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-05-08 16:34:57 +0000 |
commit | 00afa24fb6f2621e02e6ecd8ef86db56dd3913b5 (patch) | |
tree | f0240f5daed36699de1e928c780fb16744dbc22a /src | |
parent | ff1c68655acee7faf1227337ce444d2d08ca2a9a (diff) | |
download | scala-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.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/Main.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/StdNames.scala | 1 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 23 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 4 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala | 17 |
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; |