diff options
Diffstat (limited to 'sources/scalac/transformer')
-rw-r--r-- | sources/scalac/transformer/AddConstructors.java | 22 | ||||
-rw-r--r-- | sources/scalac/transformer/AddInterfaces.java | 2 | ||||
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 3 |
3 files changed, 21 insertions, 6 deletions
diff --git a/sources/scalac/transformer/AddConstructors.java b/sources/scalac/transformer/AddConstructors.java index d592f83be7..b8e71d0c3f 100644 --- a/sources/scalac/transformer/AddConstructors.java +++ b/sources/scalac/transformer/AddConstructors.java @@ -221,20 +221,21 @@ public class AddConstructors extends GenTransformer { return gen.New(transform(init, true)); case TypeApply(Tree fun, Tree[] args): - if (!inNew && fun.symbol().isConstructor()) return transform(fun); - return gen.TypeApply(transform(fun, inNew), transform(args)); + if (!fun.symbol().isConstructor()) return super.transform(tree); + if (!inNew) return transform(fun); + assert fun instanceof Tree.Ident: tree; + return transform(tree, fun.symbol(), transform(args)); case Apply(Tree fun, Tree[] args): return gen.Apply(transform(fun, inNew), transform(args)); case Ident(_): Symbol symbol = tree.symbol(); + if (inNew) return transform(tree, symbol, Tree.EMPTY_ARRAY); if (symbol.isConstructor()) { symbol = getInitializer(symbol); - if (!inNew) { - Symbol clasz = symbol.owner(); - return gen.Select(gen.This(tree.pos, clasz), symbol); - } + Symbol clasz = symbol.owner(); + return gen.Select(gen.This(tree.pos, clasz), symbol); } else if (symbol.owner().isConstructor()) { symbol = subst.lookupSymbol(symbol); } @@ -249,4 +250,13 @@ public class AddConstructors extends GenTransformer { } // transform() + /** Transforms the new instance creation. */ + private Tree transform(Tree tree, Symbol constructor, Tree[] targs) { + assert constructor.isConstructor(): tree; + Symbol initializer = getInitializer(constructor); + Symbol clasz = initializer.owner(); + Tree instance = gen.Create(tree.pos, Tree.Empty, clasz, targs); + return gen.Select(tree.pos, instance, initializer); + } + } // class AddConstructors diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java index cb94006d98..53187d5018 100644 --- a/sources/scalac/transformer/AddInterfaces.java +++ b/sources/scalac/transformer/AddInterfaces.java @@ -79,6 +79,8 @@ public class AddInterfaces extends GenTransformer { /** Transforms the given symbol. */ public Symbol getSymbolFor(Tree tree) { switch (tree) { + case Create(_, _): + return phase.getClassSymbol(tree.symbol()); case Return(_): return member; case This(_): diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index 430c157b0e..81a1356ab4 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -157,6 +157,9 @@ public class Erasure extends GenTransformer implements Modifiers { } return gen.New(tree.pos, transform(init)); + case Create(_, _): + return gen.Create(tree.pos, Tree.Empty, tree.symbol()); + case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs): fun = transform(fun); vargs = transform(vargs); |