diff options
author | paltherr <paltherr@epfl.ch> | 2003-12-11 14:07:46 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-12-11 14:07:46 +0000 |
commit | 58d053ebedf92597ea38ab40cae0acd706a47660 (patch) | |
tree | 327b0f2549c82a164bd719f01bf20e0df56e307d /sources/scalac | |
parent | 063e9a81fa4840230617a12bc6fada0648d71782 (diff) | |
download | scala-58d053ebedf92597ea38ab40cae0acd706a47660.tar.gz scala-58d053ebedf92597ea38ab40cae0acd706a47660.tar.bz2 scala-58d053ebedf92597ea38ab40cae0acd706a47660.zip |
- Added translation of statements
- Added stubs for translation of expressions
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/atree/ATreeFromSTree.java | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/sources/scalac/atree/ATreeFromSTree.java b/sources/scalac/atree/ATreeFromSTree.java index 18afd2a767..218291188a 100644 --- a/sources/scalac/atree/ATreeFromSTree.java +++ b/sources/scalac/atree/ATreeFromSTree.java @@ -8,10 +8,14 @@ package scalac.atree; +import java.util.List; +import java.util.ArrayList; + import scalac.Unit; import scalac.ast.Tree; import scalac.ast.Tree.Template; import scalac.symtab.Definitions; +import scalac.symtab.Symbol; import scalac.util.Debug; /** This class translates syntax trees into attributed trees. */ @@ -104,6 +108,7 @@ public class ATreeFromSTree { case DefDef(_, _, _, _, _, Tree rhs): AMethod method = new AMethod(tree.symbol(), false); clasz.addMethod(method); + if (!method.isAbstract()) method.setCode(expression(rhs)); return; default: @@ -112,6 +117,52 @@ public class ATreeFromSTree { } //######################################################################## + // Private Methods - Translating statements + + /** Translates the statements. */ + private ACode[] statement(List locals, Tree[] trees, int start, int count){ + List codes = new ArrayList(); + for (int i = start; i < count; i++) { + ACode code = statement(locals, trees[i]); + if (code != ACode.Void) codes.add(code); + } + return (ACode[])codes.toArray(new ACode[codes.size()]); + } + + /** Translates the statement. */ + private ACode statement(List locals, Tree tree) { + switch (tree) { + + case Empty: + return make.Void; + + case ValDef(_, _, _, Tree rhs): + Symbol symbol = tree.symbol(); + locals.add(symbol); + ALocation location = ALocation.Local(symbol, false); + return make.Store(tree, location, expression(rhs)); + + default: + return ACode.Drop(expression(tree), tree.type()); + } + } + + //######################################################################## + // Private Methods - Translating expressions + + /** Translates the expressions. */ + private ACode[] expression(Tree[] trees) { + ACode[] codes = new ACode[trees.length]; + for (int i = 0; i < codes.length; i++) codes[i] = expression(trees[i]); + return codes; + } + + /** Translates the expression. */ + private ACode expression(Tree tree) { + return ACode.Void; + } + + //######################################################################## // Private Methods - Translating constants /** Translates the constant. */ |