diff options
author | Burak Emir <emir@epfl.ch> | 2007-01-30 18:24:55 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2007-01-30 18:24:55 +0000 |
commit | 9e9adeedf0a39b022b8089a5702491e9d5f8c7de (patch) | |
tree | 304e268800934860be2f8df0f57a1af1ce4d3beb | |
parent | e3099c24bda372424ac46df258f798240a6224bc (diff) | |
download | scala-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
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/Trees.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 19 |
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) { |