summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-03-23 18:11:12 +0000
committerMartin Odersky <odersky@gmail.com>2007-03-23 18:11:12 +0000
commit98f2f761c7ab896c4ac682f35116b0a88408e45a (patch)
tree899551f0ed7e03a45c4da3701dffe3ab58c871a6 /src
parentb7cd34eda4a72102e119a373e3efa54c07d8b489 (diff)
downloadscala-98f2f761c7ab896c4ac682f35116b0a88408e45a.tar.gz
scala-98f2f761c7ab896c4ac682f35116b0a88408e45a.tar.bz2
scala-98f2f761c7ab896c4ac682f35116b0a88408e45a.zip
fixed bug1014
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala19
2 files changed, 9 insertions, 12 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index e265d2e9c5..f4e99e0007 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -521,7 +521,7 @@ trait Namers requires Analyzer {
thisMethodType(
if (tpt.isEmpty) {
val pt = resultPt.substSym(tparamSyms, tparams map (.symbol))
- tpt.tpe = deconstIfNotFinal(meth, typer.computeType(rhs, WildcardType/*pt*/))
+ tpt.tpe = deconstIfNotFinal(meth, typer.computeType(rhs, pt))
tpt.tpe
} else typer.typedType(tpt).tpe)
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 7e8f49ad2f..df3ede8eca 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -305,7 +305,7 @@ trait Typers requires Analyzer {
* @return ...
*/
def privates[T <: Tree](owner: Symbol, tree: T): T =
- check(owner, EmptyScope, tree)
+ check(owner, EmptyScope, WildcardType, tree)
/** Check that type <code>tree</code> does not refer to entities
* defined in scope <code>scope</code>.
@@ -316,16 +316,18 @@ trait Typers requires Analyzer {
* @return ...
*/
def locals[T <: Tree](scope: Scope, pt: Type, tree: T): T =
- if (isFullyDefined(pt)) tree setType pt else check(NoSymbol, scope, tree)
+ check(NoSymbol, scope, pt, tree)
- def check[T <: Tree](owner: Symbol, scope: Scope, tree: T): T = {
+ def check[T <: Tree](owner: Symbol, scope: Scope, pt: Type, tree: T): T = {
this.owner = owner
this.scope = scope
badSymbol = NoSymbol
- assert(tree.tpe ne null, tree)//debug
apply(tree.tpe)
if (badSymbol == NoSymbol) tree
else if (badSymbol.isErroneous) setError(tree)
+ else if (isFullyDefined(pt)) tree setType pt
+ else if (tree.tpe.symbol.isAnonymousClass)
+ check(owner, scope, pt, tree setType anonymousClassRefinement(tree.tpe.symbol))
else {
val tp1 = try {
heal(tree.tpe)
@@ -341,7 +343,7 @@ trait Typers requires Analyzer {
" escapes its defining scope as part of type "+tree.tpe)
setError(tree)
} else
- check(owner, scope, tree setType tp1)
+ check(owner, scope, pt, tree setType tp1)
}
}
@@ -1196,12 +1198,7 @@ trait Typers requires Analyzer {
val expr1 = typed(block.expr, mode & ~(FUNmode | QUALmode), pt)
val block1 = copy.Block(block, stats1, expr1)
.setType(if (treeInfo.isPureExpr(block)) expr1.tpe else expr1.tpe.deconst)
- if (isFullyDefined(pt)) block1
- else {
- if (block1.tpe.symbol.isAnonymousClass)
- block1 setType anonymousClassRefinement(block1.tpe.symbol)
- checkNoEscaping.locals(context.scope, pt, block1)
- }
+ checkNoEscaping.locals(context.scope, pt, block1)
}
/**