diff options
author | Martin Odersky <odersky@gmail.com> | 2006-04-25 14:01:59 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-04-25 14:01:59 +0000 |
commit | 88cd71a283f25b20414b1a22b9fded83692ffc14 (patch) | |
tree | 921d9a72ae56ac70d11ba1a58ee274cb8808a60d /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | 8e1da29a68f7d494a89a1922e3b30e39b245da63 (diff) | |
download | scala-88cd71a283f25b20414b1a22b9fded83692ffc14.tar.gz scala-88cd71a283f25b20414b1a22b9fded83692ffc14.tar.bz2 scala-88cd71a283f25b20414b1a22b9fded83692ffc14.zip |
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 8b151063db..5a150c3dcd 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -846,6 +846,19 @@ trait Typers requires Analyzer { copy.LabelDef(ldef, ldef.name, ldef.params, rhs1) setType restpe } + def anonymousClassRefinement(clazz: Symbol): Type = { + val tp = refinedType(clazz.info.parents, clazz.owner) + val thistp = tp.symbol.thisType + for (val sym <- clazz.info.decls.toList) { + if (!sym.hasFlag(PRIVATE) && !sym.isClass && !sym.isConstructor && + tp.nonPrivateMember(sym.name).filter(other => + !other.isTerm || (thistp.memberType(other) matches thistp.memberType(sym))) + != NoSymbol) + addMember(thistp, tp, sym) + } + tp + } + def typedBlock(block: Block, mode: int, pt: Type): Block = { namer.enterSyms(block.stats) block.stats foreach enterLabelDef @@ -854,9 +867,9 @@ trait Typers requires Analyzer { val block1 = copy.Block(block, stats1, expr1) .setType(if (treeInfo.isPureExpr(block)) expr1.tpe else expr1.tpe.deconst) if (isFullyDefined(pt)) block1 - else { //todo: correct? + else { if (block1.tpe.symbol.isAnonymousClass) - block1 setType intersectionType(block1.tpe.parents, block1.tpe.symbol.owner) + block1 setType anonymousClassRefinement(block1.tpe.symbol) checkNoEscaping.locals(context.scope, pt, block1) } } |