summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/typechecker/Analyzer.java69
-rw-r--r--sources/scalac/typechecker/DeSugarize.java5
-rw-r--r--sources/scalac/typechecker/RefCheck.java11
3 files changed, 46 insertions, 39 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index 4efa24a268..e72365ab16 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -1551,6 +1551,12 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
}
}
+ // desugarizing ident patterns
+ if (params.length == 1 && (params[0].flags & REPEATED) != 0) {
+ assert (args.length != 1 || !(args[0] instanceof Tree.Sequence));
+ if (( mode & PATTERNmode ) != 0 )
+ desug_allIdentPatterns( args, context.owner );
+ }
return argtypes;
case PolyType(Symbol[] tparams1, Type restp):
@@ -1732,42 +1738,14 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
.setType(owntype);
case Sequence( Tree[] trees ):
- //System.err.println("sequence with pt "+pt);
- /*
- Symbol seqSym = definitions.getType( Name.fromString("scala.Seq") ).symbol();
- assert seqSym != Symbol.NONE : "did not find Seq";
-
- Type seqType = pt.baseType( seqSym );
- Type elemType;
- switch( seqType ) {
- case TypeRef(_, _, Type[] args):
- assert args.length == 1;
- elemType = args[ 0 ];
- break;
- default:
- // make a sequence type
- elemType = pt;
- seqType = new Type.TypeRef(definitions.SCALA_TYPE, seqSym, new Type[] { pt });
- break;
- }
- */
-
for( int i = 0; i < trees.length; i++ ) {
- /*
- Type tpe = revealSeqOrElemType( trees[ i ],
- pt,
- pt,
- elemType);
- */
- //System.err.println("subtree ["+i+"] has tpe "+tpe);
trees[ i ] = transform( trees[ i ],
this.mode | SEQUENCEmode,
- pt/*tpe*/);
+ pt);
}
return copy.Sequence( tree, trees ).setType( pt );
case Alternative(Tree[] choices):
- //System.err.println("alternative with pt "+pt);
boolean save = this.inAlternative;
this.inAlternative = true;
@@ -1780,7 +1758,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
this.inAlternative = save;
return copy.Alternative( tree, newts )
- .setType( pt /*tpe*/ );
+ .setType( pt );
case Bind( Name name, Tree body ):
Symbol vble = new TermSymbol(tree.pos,
@@ -2178,12 +2156,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
context.owner,
0).setType( pt );
- if((( mode & SEQUENCEmode) != 0)&&( name != Names.WILDCARD )) {// x => x @ _ in sequence patterns
+ if((( mode & SEQUENCEmode) != 0)&&( name != Names.WILDCARD )) {
+ // x => x @ _ in sequence patterns
tree = desugarize.IdentPattern( tree );
}
}
- if (name != Names.WILDCARD) enterInScope(vble);
+ if ( name != Names.WILDCARD ) enterInScope(vble);
return tree.setSymbol(vble).setType(pt);
} else {
return transformIdent(tree, name);
@@ -2257,6 +2236,32 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
// sequence helper function
// ///////////////
+ /** calls IdentPattern for every Ident(x) with x != _ in trees.
+ * does *not* recurse through the trees
+ * pre: Ident nodes are already attributed, symbol is in scope
+ * post: all variables in trees are replaced by (attributed) binds.
+ */
+
+ public void desug_allIdentPatterns( Tree trees[], Symbol currentOwner ) {
+ for( int i = 0; i < trees.length; i ++ )
+ switch( trees[ i ] ) {
+ case Ident( Name name ):
+ if( name != Names.WILDCARD )
+ {
+ Symbol vble = context.scope.lookup( name );
+ /*
+ Symbol vble = new TermSymbol( trees[ i ].pos, name, currentOwner, 0)
+ .setType( trees[ i ].type() );
+
+ vble = enterInScope( vble );
+ */
+ trees[ i ] = desugarize.IdentPattern( trees[ i ] ).setSymbol( vble )
+ .setType( vble.type() );
+ }
+ }
+ }
+
+
// get first elementary type in a sequence
// precondition: tree is successor of a sequence node
diff --git a/sources/scalac/typechecker/DeSugarize.java b/sources/scalac/typechecker/DeSugarize.java
index 14ad9cc781..58b40ec390 100644
--- a/sources/scalac/typechecker/DeSugarize.java
+++ b/sources/scalac/typechecker/DeSugarize.java
@@ -616,7 +616,8 @@ public class DeSugarize implements Kinds, Modifiers {
/** x => x @ _
* only within sequence patterns, for now. BE
- * precondition: name != '_'
+ * precondition: name != '_'
+ * post: returns *unattributed* Bind tree
*/
public Tree IdentPattern( Tree tree ) {
@@ -625,7 +626,7 @@ public class DeSugarize implements Kinds, Modifiers {
if( name == Names.WILDCARD ) throw new ApplicationError("nothing to desugarize");
return make.Bind( tree.pos,
name,
- make.Ident( tree.pos, Name.fromString("_") )).setType( tree.type );
+ make.Ident( tree.pos, Names.WILDCARD ).setType( tree.type )).setType( tree.type );
default:
throw new ApplicationError("ident expected");
}
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index 656af0d4d8..d7f3cf2c02 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -898,9 +898,12 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
return elimTypeNode(super.transform(tree));
case Ident(Name name):
- //System.out.println("name: "+name);
+ if( TreeInfo.isWildcardPattern( tree ) )
+ return elimTypeNode(tree);
+
+ //System.out.println("name: "+name);
Scope.Entry e = scopes[level].lookupEntry(name);
- //System.out.println("sym: "+sym);
+ //System.out.println("sym: "+sym);
if (sym.isLocal() && sym == e.sym) {
int i = level;
while (scopes[i] != e.owner) i--;
@@ -912,11 +915,9 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
}
}
return elimTypeNode(tree);
-
default:
return elimTypeNode(super.transform(tree));
}
- }
+ }
}
-