summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2007-01-30 18:24:55 +0000
committerBurak Emir <emir@epfl.ch>2007-01-30 18:24:55 +0000
commit9e9adeedf0a39b022b8089a5702491e9d5f8c7de (patch)
tree304e268800934860be2f8df0f57a1af1ce4d3beb /src/compiler
parente3099c24bda372424ac46df258f798240a6224bc (diff)
downloadscala-9e9adeedf0a39b022b8089a5702491e9d5f8c7de.tar.gz
scala-9e9adeedf0a39b022b8089a5702491e9d5f8c7de.tar.bz2
scala-9e9adeedf0a39b022b8089a5702491e9d5f8c7de.zip
1.hacked Typer::typedSelect for unapply, Martin...
1.hacked Typer::typedSelect for unapply, Martin please review (pattern like "Stream.cons" works now) 2.fixed Sean's broken change in Trees
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/ast/Trees.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala19
2 files changed, 15 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala
index 41d54c3426..e3c4f629e4 100644
--- a/src/compiler/scala/tools/nsc/ast/Trees.scala
+++ b/src/compiler/scala/tools/nsc/ast/Trees.scala
@@ -436,7 +436,7 @@ trait Trees requires Global {
vparamss map (.map (vd => {
val ret = ValDef(Modifiers(vd.mods.flags & IMPLICIT | PARAM) setAttr vd.mods.attributes,
vd.name, vd.tpt.duplicate, EmptyTree).setPos(vd.pos)
- if (inIDE && vd.symbol != NoSymbol)
+ if (true /*(bq) was: inIDE*/ && vd.symbol != NoSymbol)
ret.symbol = vd.symbol
ret
}));
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 58f8e369a4..7a2a7dc708 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -576,7 +576,7 @@ trait Typers requires Analyzer {
case ErrorType =>
setError(tree)
}
- } else if (settings.Xunapply.value) { /*unapply (5.3beta) */
+ } else if (settings.Xunapply.value) { /*unapply (5.3) */
// fix symbol -- we are using the module not the class
val consp = if (clazz.isModule) clazz else {
val obj = clazz.linkedModuleOfClass
@@ -627,10 +627,15 @@ trait Typers requires Analyzer {
tree
} else {
if ((mode & PATTERNmode) != 0) {
- if ((tree.symbol ne null) && tree.symbol.isModule)
- inferModulePattern(tree, pt)
- if (isPopulated(tree.tpe, approximateAbstracts(pt)))
- return tree
+ if ((tree.symbol ne null) && tree.symbol.isModule) {
+ if (definitions.unapplyMember(tree.symbol.tpe).exists) { // bq:unapply, typedSelect § Stream.cons
+ return tree
+ } else {
+ inferModulePattern(tree, pt)
+ if (isPopulated(tree.tpe, approximateAbstracts(pt)))
+ return tree
+ }
+ }
}
val tree1 = constfold(tree, pt) // (10) (11)
if (tree1.tpe <:< pt) adapt(tree1, mode, pt)
@@ -1663,6 +1668,10 @@ trait Typers requires Analyzer {
val qual1 = adaptToName(qual, name)
if (qual1 ne qual) return typed(copy.Select(tree, qual1, name), mode, pt)
}
+ if (sym == NoSymbol && name != nme.CONSTRUCTOR && name.isTypeName && (mode & PATTERNmode) != 0) { // look for unapply
+ // bq: this hack is analogous to the hack in unapply
+ return typedSelect(qual, name.toTermName)
+ }
if (!sym.exists) {
if (settings.debug.value) Console.err.println("qual = "+qual+":"+qual.tpe+"\nSymbol="+qual.tpe.symbol+"\nsymbol-info = "+qual.tpe.symbol.info+"\nscope-id = "+qual.tpe.symbol.info.decls.hashCode()+"\nmembers = "+qual.tpe.members+"\nname = "+name+"\nfound = "+sym+"\nowner = "+context.enclClass.owner)
if (!qual.tpe.widen.isErroneous) {