summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-09-11 12:03:13 +0000
committerpaltherr <paltherr@epfl.ch>2003-09-11 12:03:13 +0000
commitc4b7a33f58721756974e79f6df392f9f90825cfe (patch)
tree9cd774cdf215bcdb95e0979264c9942fa5f5ab08 /sources/scalac/transformer
parent3551973214371050c0517d65c1c0371ad37785aa (diff)
downloadscala-c4b7a33f58721756974e79f6df392f9f90825cfe.tar.gz
scala-c4b7a33f58721756974e79f6df392f9f90825cfe.tar.bz2
scala-c4b7a33f58721756974e79f6df392f9f90825cfe.zip
- Reviewed and cleaned TreeGen.
- Fixed some errors. - Removed "dangerous" methods in TreeGen. - Renamed some methods in TreeGen.
Diffstat (limited to 'sources/scalac/transformer')
-rw-r--r--sources/scalac/transformer/AddAccessors.java16
-rw-r--r--sources/scalac/transformer/AddConstructors.java21
-rw-r--r--sources/scalac/transformer/AddInterfaces.java14
-rw-r--r--sources/scalac/transformer/Erasure.java8
-rw-r--r--sources/scalac/transformer/ExpandMixins.java2
-rw-r--r--sources/scalac/transformer/ExpandMixinsPhase.java2
-rw-r--r--sources/scalac/transformer/ExplicitOuterClassesPhase.java16
-rw-r--r--sources/scalac/transformer/LambdaLift.java11
-rw-r--r--sources/scalac/transformer/UnCurry.java2
-rw-r--r--sources/scalac/transformer/matching/AlgebraicMatcher.java5
-rw-r--r--sources/scalac/transformer/matching/Autom2Scala.java8
-rw-r--r--sources/scalac/transformer/matching/CodeFactory.java22
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java4
-rw-r--r--sources/scalac/transformer/matching/PatternMatcher.java2
14 files changed, 58 insertions, 75 deletions
diff --git a/sources/scalac/transformer/AddAccessors.java b/sources/scalac/transformer/AddAccessors.java
index e2dc69b7f1..14bf9c610a 100644
--- a/sources/scalac/transformer/AddAccessors.java
+++ b/sources/scalac/transformer/AddAccessors.java
@@ -44,8 +44,8 @@ public class AddAccessors extends Transformer {
accessor = new TermSymbol(sym.pos,
sym.name,
sym.classOwner(),
- Modifiers.STABLE
- | Modifiers.ACCESSOR
+ /* !!! Modifiers.STABLE
+ | */ Modifiers.ACCESSOR
| Modifiers.PRIVATE);
accessor.setType(Type.MethodType(Symbol.EMPTY_ARRAY, sym.type()));
accessorMap.put(sym, accessor);
@@ -82,18 +82,19 @@ public class AddAccessors extends Transformer {
for (int i = 0; i < params.length; ++i) {
Symbol paramSym = params[i].symbol();
if (accessorMap.containsKey(paramSym)) {
+ int pos = paramSym.pos;
Symbol accessorSym = (Symbol)accessorMap.get(paramSym);
- Symbol valSym = new TermSymbol(paramSym.pos,
+ Symbol valSym = new TermSymbol(pos,
valName(paramSym),
clsSym,
Modifiers.PRIVATE);
valSym.setType(paramSym.type());
- newBody.addFirst(gen.DefDef(accessorSym, gen.Ident(valSym)));
+ newBody.addFirst(gen.DefDef(accessorSym, gen.Ident(pos, valSym)));
newMembers.enter(accessorSym);
- newBody.addFirst(gen.ValDef(valSym, gen.Ident(paramSym)));
+ newBody.addFirst(gen.ValDef(valSym, gen.Ident(pos, paramSym)));
newMembers.enter(valSym);
}
}
@@ -120,8 +121,7 @@ public class AddAccessors extends Transformer {
Symbol sym = tree.symbol();
assert sym.kind != Kinds.NONE : tree;
if (sym.owner().isPrimaryConstructor())
- return gen.Apply(gen.Select(transform(qualifier), accessor(sym)),
- Tree.EMPTY_ARRAY);
+ return gen.Apply(gen.Select(tree.pos, transform(qualifier), accessor(sym)));
else
return copy.Select(tree, sym, transform(qualifier));
}
@@ -131,7 +131,7 @@ public class AddAccessors extends Transformer {
if (inClassContext
&& sym.name.isTermName()
&& sym.owner().isPrimaryConstructor())
- return gen.Apply(gen.Ident(accessor(sym)), Tree.EMPTY_ARRAY);
+ return gen.Apply(gen.Ident(tree.pos, accessor(sym)));
else
return copy.Ident(tree, sym);
}
diff --git a/sources/scalac/transformer/AddConstructors.java b/sources/scalac/transformer/AddConstructors.java
index 8fa3987b81..e8799ca51b 100644
--- a/sources/scalac/transformer/AddConstructors.java
+++ b/sources/scalac/transformer/AddConstructors.java
@@ -120,8 +120,7 @@ public class AddConstructors extends Transformer {
public Tree transform(Tree tree) {
final Symbol treeSym = tree.symbol();
switch (tree) {
- case ClassDef(_, _, _, ValDef[][] vparams, _, //:
- Template(Tree[] baseClasses, Tree[] body)):
+ case ClassDef(_, _, _, ValDef[][] vparams, _, Template impl):
assert treeSym.name.isTypeName();
@@ -154,8 +153,8 @@ public class AddConstructors extends Transformer {
Debug.show(constrSym.owner()) + "\n\texpected: " +
Debug.show(treeSym);
- for (int i = 0; i < body.length; i++) {
- Tree t = body[i];
+ for (int i = 0; i < impl.body.length; i++) {
+ Tree t = impl.body[i];
if (t.definesSymbol()) {
Symbol sym = t.symbol();
switch (t) {
@@ -191,24 +190,22 @@ public class AddConstructors extends Transformer {
classScope.enterOrOverload(sym);
} else {
// move class-level expressions into the constructor
- constrBody2.add(transform(body[i]));
+ constrBody2.add(transform(impl.body[i]));
}
}
// inline the call to the super constructor
if ( !forINT || !treeSym.parents()[0].symbol().isJava()) {
- switch (baseClasses[0]) {
+ switch (impl.parents[0]) {
case Apply(Tree fun, Tree[] args):
- int pos = baseClasses[0].pos;
+ int pos = impl.parents[0].pos;
Tree superConstr = gen.Select
(gen.Super(pos, treeSym),
getConstructor(fun.symbol()));
constrBody.add(gen.Apply(superConstr, transform(args)));
break;
default:
- new scalac.ast.printer.TextTreePrinter().
- print(baseClasses[0]).println().end();
- assert false;
+ throw Debug.abort("illegal case", impl.parents[0]);
}
}
@@ -248,7 +245,7 @@ public class AddConstructors extends Transformer {
toArray(new Tree[constrBody.size()])):
(Tree) constrBody.get(0);
- classBody.add(gen.DefDef(tree.pos, constrSym, constrTree));
+ classBody.add(gen.DefDef(constrSym, constrTree));
// strip off the class constructor from parameters
switch (treeSym.primaryConstructor().info()) {
@@ -269,7 +266,7 @@ public class AddConstructors extends Transformer {
for (int i = 0; i < newBody.length - 1; i ++)
newBody[i] = transform(newBody[i]);
- return gen.ClassDef(classSym, baseClasses, newBody);
+ return gen.ClassDef(classSym, impl.parents, impl.symbol(), newBody);
// Substitute the constructor into the 'new' expressions
case New(Template(Tree[] baseClasses, _)):
diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java
index 287cd7e6b4..15747cce48 100644
--- a/sources/scalac/transformer/AddInterfaces.java
+++ b/sources/scalac/transformer/AddInterfaces.java
@@ -183,7 +183,7 @@ class AddInterfaces extends Transformer {
Map memMap = phase.getClassMemberMap(realClsSym);
assert memMap != null
: Debug.show(clsSym) + " " + Debug.show(realClsSym);
- return gen.Select(qualifier, (Symbol)memMap.get(sym));
+ return gen.Select(tree.pos, qualifier, (Symbol)memMap.get(sym));
} else
return super.transform(tree);
} else {
@@ -197,13 +197,7 @@ class AddInterfaces extends Transformer {
Type qualifierType = qualifier.type().bound();
if (phase.needInterface(qualifierType.symbol())) {
Type castType = qualifierType.baseType(owner);
- qualifier =
- gen.Apply(
- gen.TypeApply(
- gen.Select(qualifier, defs.AS),
- new Tree[] {
- gen.mkType(tree.pos, castType)}),
- Tree.EMPTY_ARRAY);
+ qualifier = gen.mkAsInstanceOf(qualifier, castType);
}
}
return copy.Select(tree, sym, qualifier);
@@ -223,13 +217,13 @@ class AddInterfaces extends Transformer {
: Debug.show(clsSym) + " " + Debug.show(realClsSym);
assert memMap.containsKey(sym)
: Debug.show(sym) + " not in " + memMap;
- return gen.Ident((Symbol)memMap.get(sym));
+ return gen.Ident(tree.pos, (Symbol)memMap.get(sym));
} else
return super.transform(tree);
} else if (typeSubst != null) {
Symbol newSym = (Symbol)typeSubst.lookupSymbol(tree.symbol());
if (newSym != null)
- return gen.Ident(newSym);
+ return gen.Ident(tree.pos, newSym);
else
return super.transform(tree);
} else {
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
index e65e3c4a16..7f62094608 100644
--- a/sources/scalac/transformer/Erasure.java
+++ b/sources/scalac/transformer/Erasure.java
@@ -283,9 +283,9 @@ public class Erasure extends Transformer implements Modifiers {
assert params1.length == symparams.length;
Tree[] args = new Tree[params1.length];
for (int i = 0; i < args.length; i++) {
- args[i] = cast(gen.Ident(params1[i]), symparams[i].type().erasure());
+ args[i] = cast(gen.Ident(sym.pos, params1[i]), symparams[i].type().erasure());
}
- Tree fwd = make.Apply(sym.pos, gen.Ident(sym).setType(symtype), args)
+ Tree fwd = make.Apply(sym.pos, gen.Ident(sym.pos, sym).setType(symtype), args)
.setType(symrestp);
bridges.append(gen.DefDef(bridgeSym, coerce(fwd, restp)));
return;
@@ -518,7 +518,7 @@ public class Erasure extends Transformer implements Modifiers {
case LabelDef(Name name, Tree.Ident[] params,Tree body):
Tree.Ident[] new_params = new Tree.Ident[params.length];
for (int i = 0; i < params.length; i++) {
- new_params[i] = (Tree.Ident)gen.Ident(params[i].symbol());
+ new_params[i] = (Tree.Ident)gen.Ident(params[i].pos, params[i].symbol());
}
return copy.LabelDef(tree, new_params, transform(body)).setType(owntype);
@@ -595,7 +595,7 @@ public class Erasure extends Transformer implements Modifiers {
Tree tree1;
switch (tree) {
case Ident(Name name):
- if (name == Names.ZERO) tree1 = gen.Ident(definitions.NULL);
+ if (name == Names.ZERO) tree1 = gen.mkNullLit(tree.pos);
else tree1 = tree;
break;
case Select(Tree qual, _):
diff --git a/sources/scalac/transformer/ExpandMixins.java b/sources/scalac/transformer/ExpandMixins.java
index 8d761ca249..48d81ec4c3 100644
--- a/sources/scalac/transformer/ExpandMixins.java
+++ b/sources/scalac/transformer/ExpandMixins.java
@@ -157,7 +157,7 @@ public class ClassExpander {
for (int i = 0; i < params.length; i++) {
Symbol member = map.lookupSymbol(params[i]);
member.setType(map.apply(member.type()));
- body.append(gen.ValDef(args[i].pos, member, args[i]));
+ body.append(gen.ValDef(member, args[i]));
}
}
diff --git a/sources/scalac/transformer/ExpandMixinsPhase.java b/sources/scalac/transformer/ExpandMixinsPhase.java
index ba0f43bd25..0b5e34fc96 100644
--- a/sources/scalac/transformer/ExpandMixinsPhase.java
+++ b/sources/scalac/transformer/ExpandMixinsPhase.java
@@ -151,7 +151,7 @@ public class ExpandMixinsPhase extends Phase {
case ClassDef(_, _, _, _, _, _):
Symbol clasz = tree.symbol();
if (clasz.isInterface()) return super.transform(tree);
- return gen.ClassDef(tree.pos,clasz,getExpandedTemplate(clasz));
+ return gen.ClassDef(clasz, getExpandedTemplate(clasz));
case PackageDef(_, _):
return super.transform(tree);
case Template(_, _):
diff --git a/sources/scalac/transformer/ExplicitOuterClassesPhase.java b/sources/scalac/transformer/ExplicitOuterClassesPhase.java
index 3812e1d708..81ba49cf1c 100644
--- a/sources/scalac/transformer/ExplicitOuterClassesPhase.java
+++ b/sources/scalac/transformer/ExplicitOuterClassesPhase.java
@@ -250,7 +250,7 @@ public class ExplicitOuterClassesPhase extends Phase {
context = context.getConstructorContext(symbol);
rhs = transform(rhs);
context = backup;
- return gen.DefDef(tree.pos, symbol, rhs);
+ return gen.DefDef(symbol, rhs);
case This(_):
return genOuterRef(tree.pos, tree.symbol());
@@ -262,13 +262,13 @@ public class ExplicitOuterClassesPhase extends Phase {
// !!! A this node is missing here. This should
// never happen if all trees were correct.
Tree qualifier = genOuterRef(tree.pos, owner);
- return gen.mkStable(gen.Select(qualifier, symbol));
+ return gen.Select(qualifier, symbol);
}
if (!owner.isConstructor()) break;
Symbol clasz = owner.constructorClass();
if (clasz == context.clasz) break;
Tree qualifier = genOuterRef(tree.pos, clasz);
- return gen.mkStable(gen.Select(qualifier, symbol));
+ return gen.Select(qualifier, symbol);
case Select(Super(_, _), _):
Tree qualifier = ((Tree.Select)tree).qualifier;
@@ -276,7 +276,7 @@ public class ExplicitOuterClassesPhase extends Phase {
if (clasz == context.clasz) break;
Symbol symbol = getSuperMethod(clasz, tree.symbol());
qualifier = genOuterRef(qualifier.pos, clasz);
- return gen.mkStable(gen.Select(tree.pos, qualifier, symbol));
+ return gen.Select(tree.pos, qualifier, symbol);
case Apply(Tree vfun, Tree[] vargs):
switch (vfun) {
@@ -351,8 +351,8 @@ public class ExplicitOuterClassesPhase extends Phase {
Symbol method = (Symbol)entry.getKey();
Symbol forward = (Symbol)entry.getValue();
int pos = forward.pos;
- Tree[] targs = gen.mkTypeIdents(pos, nextTypeParams(forward));
- Tree[] vargs = gen.mkIdents(pos, nextValueParams(forward));
+ Tree[] targs = gen.mkTypeRefs(pos, nextTypeParams(forward));
+ Tree[] vargs = gen.mkRefs(pos, nextValueParams(forward));
Tree fun = gen.Select(gen.Super(pos, context.clasz), method);
trees[i] = gen.DefDef(forward, gen.mkApply(fun, targs, vargs));
}
@@ -362,11 +362,11 @@ public class ExplicitOuterClassesPhase extends Phase {
/** Returns a tree referencing the given outer class. */
private Tree genOuterRef(int pos, Symbol clasz) {
if (context.clasz == clasz) return gen.This(pos, clasz);
- Tree tree = gen.mkStable(gen.Ident(pos, context.link));
+ Tree tree = gen.Ident(pos, context.link);
for (Context context = this.context.outer;;context =context.outer){
assert context != null: Debug.show(clasz);
if (context.clasz == clasz) return tree;
- tree = gen.mkStable(gen.Select(tree, context.link));
+ tree = gen.Select(tree, context.link);
}
}
diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java
index af1881ea7d..f3d19647c6 100644
--- a/sources/scalac/transformer/LambdaLift.java
+++ b/sources/scalac/transformer/LambdaLift.java
@@ -398,14 +398,9 @@ public class LambdaLift extends OwnerTransformer
if ((sym.flags & CAPTURED) != 0) {
assert sym.isLocal();
Type boxedType = sym.nextType();
- Type unboxedType = boxedType.typeArgs()[0];
tpe1 = gen.mkType(tpe.pos, boxedType);
rhs1 = gen.New(
- rhs.pos,
- definitions.SCALA_TYPE,
- boxedType.symbol(),
- new Type[]{unboxedType},
- new Tree[]{rhs1});
+ gen.mkPrimaryConstr(rhs.pos, boxedType, new Tree[]{rhs1}));
}
return copy.ValDef(tree, sym, tpe1, rhs1);
@@ -451,7 +446,7 @@ public class LambdaLift extends OwnerTransformer
if (tree1 instanceof Ident) ((Ident)tree1).name = sym.name;
else ((Select)tree1).selector = sym.name;
}
- if ((sym.flags & CAPTURED) != 0) return gen.Select(tree1, Names.elem);
+ if ((sym.flags & CAPTURED) != 0) return gen.Select__(tree1, Names.elem);
else return tree1;
default:
@@ -621,7 +616,7 @@ public class LambdaLift extends OwnerTransformer
for (int i = 0; i < fparams.length; i++) {
Symbol farg = descr.proxy(fparams[i], currentOwner);
args1[args.length + i] =
- types ? gen.mkTypeIdent(pos, farg) : gen.Ident(pos, farg);
+ types ? gen.mkTypeRef(pos, farg) : gen.Ident(pos, farg);
}
return args1;
} else {
diff --git a/sources/scalac/transformer/UnCurry.java b/sources/scalac/transformer/UnCurry.java
index 6294631ce5..02df321e64 100644
--- a/sources/scalac/transformer/UnCurry.java
+++ b/sources/scalac/transformer/UnCurry.java
@@ -147,7 +147,7 @@ public class UnCurry extends OwnerTransformer
if (tree1.symbol().isDefParameter()) {
tree1.type = global.definitions.functionType(
Type.EMPTY_ARRAY, tree1.type.widen());
- return gen.Apply(gen.Select(tree1, Names.apply), new Tree[0]);
+ return gen.Apply(gen.Select__(tree1, Names.apply), new Tree[0]);
} else {
return tree1;
}
diff --git a/sources/scalac/transformer/matching/AlgebraicMatcher.java b/sources/scalac/transformer/matching/AlgebraicMatcher.java
index ea07730a1a..ea74702a99 100644
--- a/sources/scalac/transformer/matching/AlgebraicMatcher.java
+++ b/sources/scalac/transformer/matching/AlgebraicMatcher.java
@@ -358,9 +358,8 @@ public class AlgebraicMatcher extends PatternMatcher {
public Tree toTree() {
TreeList ts = new TreeList();
- ts.append( gen.ValDef(_m.pos, root.symbol(), _m.selector ));
- ts.append( gen.ValDef(_m.pos,
- resultVar,
+ ts.append( gen.ValDef(root.symbol(), _m.selector ));
+ ts.append( gen.ValDef(resultVar,
gen.mkDefaultValue(_m.pos, resultVar.info()) ));
ts.append( cf.If( toTree(root.and),
gen.Ident( _m.pos, resultVar ),
diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java
index abe5a6b35a..adcd929e43 100644
--- a/sources/scalac/transformer/matching/Autom2Scala.java
+++ b/sources/scalac/transformer/matching/Autom2Scala.java
@@ -154,11 +154,9 @@ public class Autom2Scala {
// overridden in TracerInScala
Tree loadCurrentElem( Tree body ) {
return cf.Block( Position.FIRSTPOS, new Tree[] {
- cf.gen.ValDef( Position.FIRSTPOS,
- this.hasnSym,
+ cf.gen.ValDef( this.hasnSym,
cf._hasNext( _iter() ) ),
- cf.gen.ValDef( Position.FIRSTPOS,
- this.curSym,
+ cf.gen.ValDef( this.curSym,
cf.If( _ref( hasnSym ),//cf._hasNext( _iter() ),
cf._next( _iter() ),
cf.ignoreValue( curSym.type() ))),
@@ -182,7 +180,7 @@ public class Autom2Scala {
/** creates an int variable
*/
Tree _intvar( Symbol sym, Tree init ) {
- return gen.ValDef( pos, sym, init );
+ return gen.ValDef( sym, init );
}
// the caller needs to set the type !
diff --git a/sources/scalac/transformer/matching/CodeFactory.java b/sources/scalac/transformer/matching/CodeFactory.java
index 96c3cd66ee..9800ff4eb1 100644
--- a/sources/scalac/transformer/matching/CodeFactory.java
+++ b/sources/scalac/transformer/matching/CodeFactory.java
@@ -281,21 +281,21 @@ class CodeFactory extends PatternTool {
}
Tree newSeqNil( Type tpe ) {
- return gen.Select(gen.Ident(pos, defs.SCALA), Names.Nil/*seqNilSym()*/);
+ return gen.Select__(gen.Ident(pos, defs.SCALA), Names.Nil/*seqNilSym()*/);
}
// EXPERIMENTAL
Tree newRef( Tree init ) {
//System.out.println( "hello:"+refSym().type() );
- return gen.New( pos, defs.SCALA_TYPE, refSym(),
- new Type[] { init.type() },
- new Tree[] { init } );
+ return gen.New(gen.mkPrimaryConstr(pos, refSym(),
+ new Type[] { init.type() },
+ new Tree[] { init } ));
}
Tree newSeqCons( Tree head, Tree tail ) {
- return gen.New( pos, defs.SCALA_TYPE, seqConsSym(),
- new Type[] { head.type() },
- new Tree[] { head, tail });
+ return gen.New(gen.mkPrimaryConstr(pos, seqConsSym(),
+ new Type[] { head.type() },
+ new Tree[] { head, tail }));
}
/** returns A for T <: Sequence[ A ]
@@ -440,7 +440,7 @@ class CodeFactory extends PatternTool {
}
return make.Apply(
tree.pos,
- gen.Select(tree, NOT_N),
+ gen.Select__(tree, NOT_N),
Tree.EMPTY_ARRAY).setType(defs.BOOLEAN_TYPE);
}
@@ -579,9 +579,9 @@ class CodeFactory extends PatternTool {
}
Tree newPair( Tree left, Tree right ) {
- return gen.New( pos, defs.SCALA_TYPE, tuple2Sym(),
- new Type[] { left.type(), right.type() },
- new Tree[] { left, right });
+ return gen.New(gen.mkPrimaryConstr(pos, tuple2Sym(),
+ new Type[] { left.type(), right.type() },
+ new Tree[] { left, right }));
}
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java
index c79fa113e3..cb58f4b196 100644
--- a/sources/scalac/transformer/matching/LeftTracerInScala.java
+++ b/sources/scalac/transformer/matching/LeftTracerInScala.java
@@ -213,14 +213,14 @@ public class LeftTracerInScala extends TracerInScala {
.setType( _accumType( elementType ) ) ;
// `val acc = SeqNil[ elementType ]' init accumulator
- v.add( gen.ValDef( pos, emptyAccSym, emptyAcc) );
+ v.add( gen.ValDef( emptyAccSym, emptyAcc) );
Tree run = callFun( new Tree[] {
gen.Ident( pos, emptyAccSym ),
cf.newIterator( selector, selector.type() ),
cf.Int( 0 ) });
- run = gen.ValDef( Position.FIRSTPOS, resultSym, run );
+ run = gen.ValDef( resultSym, run );
v.add( run );
diff --git a/sources/scalac/transformer/matching/PatternMatcher.java b/sources/scalac/transformer/matching/PatternMatcher.java
index ca196c37e6..1ee3b2574f 100644
--- a/sources/scalac/transformer/matching/PatternMatcher.java
+++ b/sources/scalac/transformer/matching/PatternMatcher.java
@@ -902,7 +902,7 @@ public class PatternMatcher extends PatternTool {
cases = cases.next;
}
return cf.Switch(
- gen.Apply(gen.Select(selector.duplicate(), Names.tag), new Tree[0]),
+ gen.Apply(gen.Select__(selector.duplicate(), Names.tag), new Tree[0]),
tags,
bodies,
(defaultCase == null) ? gen.mkBooleanLit(selector.pos, false)