summaryrefslogtreecommitdiff
path: root/sources/scalac/ast/TreeInfo.java
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-02-13 14:41:36 +0000
committerMartin Odersky <odersky@gmail.com>2003-02-13 14:41:36 +0000
commit4177daab2f54bdb20c71f623296a8bb32616fd12 (patch)
tree23f08b43f3758e825d5965b336030603a65bbcf7 /sources/scalac/ast/TreeInfo.java
parent33d6e170c97ca7b2f991896a0729941a7240b6d6 (diff)
downloadscala-4177daab2f54bdb20c71f623296a8bb32616fd12.tar.gz
scala-4177daab2f54bdb20c71f623296a8bb32616fd12.tar.bz2
scala-4177daab2f54bdb20c71f623296a8bb32616fd12.zip
Initial version.
Diffstat (limited to 'sources/scalac/ast/TreeInfo.java')
-rw-r--r--sources/scalac/ast/TreeInfo.java136
1 files changed, 136 insertions, 0 deletions
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
new file mode 100644
index 0000000000..81d9481f31
--- /dev/null
+++ b/sources/scalac/ast/TreeInfo.java
@@ -0,0 +1,136 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
+** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
+** /_____/\____/\___/\____/____/ **
+** **
+** $Id$
+\* */
+
+package scalac.ast;
+
+import scalac.ApplicationError;
+import scalac.util.Name;
+import scalac.symtab.Type;
+import scalac.symtab.Symbol;
+import scalac.symtab.Modifiers;
+
+public class TreeInfo {
+
+ public static boolean isTerm(Tree tree) {
+ return tree.isTerm();
+ }
+
+ public static boolean isType(Tree tree) {
+ return tree.isType();
+ }
+
+ public static boolean isOwnerDefinition(Tree tree) {
+ switch (tree) {
+ case PackageDef(_, _):
+ case ClassDef(_, _, _, _, _, _):
+ case ModuleDef(_, _, _, _):
+ case DefDef(_, _, _, _, _, _):
+ case Import(_, _):
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static boolean isDefinition(Tree tree) {
+ switch (tree) {
+ case PackageDef(_, _):
+ case ClassDef(_, _, _, _, _, _):
+ case ModuleDef(_, _, _, _):
+ case DefDef(_, _, _, _, _, _):
+ case ValDef(_, _, _, _):
+ case TypeDef(_, _, _, _):
+ case Import(_, _):
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static boolean isDeclaration(Tree tree) {
+ switch (tree) {
+ case DefDef(_, _, _, _, _, Tree rhs):
+ return rhs == Tree.Empty;
+ case ValDef(_, _, _, Tree rhs):
+ return rhs == Tree.Empty;
+ case TypeDef(_, _, _, _):
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /** Is tree a pure definition?
+ */
+ public static boolean isPureDef(Tree tree) {
+ switch (tree) {
+ case ClassDef(_, _, _, _, _, _):
+ case ModuleDef(_, _, _, _):
+ case DefDef(_, _, _, _, _, _):
+ case TypeDef(_, _, _, _):
+ case Import(_, _):
+ return true;
+ case ValDef(int mods, _, _, Tree rhs):
+ return (mods & Modifiers.MUTABLE) == 0 && isPureExpr(rhs);
+ default:
+ return false;
+ }
+ }
+
+ /** Is tree a stable & pure expression?
+ */
+ public static boolean isPureExpr(Tree tree) {
+ switch (tree) {
+ case Empty:
+ case This(_):
+ case Super(_):
+ return true;
+ case Ident(_):
+ return tree.type.isStable();
+ case Select(Tree qual, _):
+ return tree.type.isStable() && isPureExpr(qual);
+ case Typed(Tree expr, _):
+ return isPureExpr(expr);
+ case Literal(_):
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /** Is tree a pure constructor?
+ * //todo: update
+ */
+ public static boolean isPureConstr(Tree tree) {
+ switch (tree) {
+ case Ident(_):
+ return tree.symbol() != null && tree.symbol().isPrimaryConstructor();
+ case Select(Tree qual, _):
+ return isPureExpr(qual) &&
+ tree.symbol() != null && tree.symbol().isPrimaryConstructor();
+ case TypeApply(Tree constr, _):
+ return isPureConstr(constr);
+ default:
+ return false;
+ }
+ }
+
+ /** The method symbol of an application node, or Symbol.NONE, if none exists.
+ */
+ public static Symbol methSymbol(Tree tree) {
+ switch (tree) {
+ case Apply(Tree fn, _):
+ return methSymbol(fn);
+ case TypeApply(Tree fn, _):
+ return methSymbol(fn);
+ default:
+ if (tree.hasSymbol()) return tree.symbol();
+ else return Symbol.NONE;
+ }
+ }
+}