summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2005-05-30 15:26:21 +0000
committerburaq <buraq@epfl.ch>2005-05-30 15:26:21 +0000
commit29f5328623037f1130993b0c85edbd3ceac5951a (patch)
tree48df8b820b07dd8453d8ddf2730ce04f7c206abd
parent23f5623d548ab080a7e89938396ae48854580be6 (diff)
downloadscala-29f5328623037f1130993b0c85edbd3ceac5951a.tar.gz
scala-29f5328623037f1130993b0c85edbd3ceac5951a.tar.bz2
scala-29f5328623037f1130993b0c85edbd3ceac5951a.zip
added >= method to Phase,
added mkAsInstanceOf and mkIsInstanceOf to TreeGen
-rwxr-xr-xsources/scala/tools/nsc/Global.scala6
-rw-r--r--sources/scala/tools/nsc/Phase.scala4
-rwxr-xr-xsources/scala/tools/nsc/ast/TreeGen.scala42
-rw-r--r--sources/scala/tools/nsc/ast/parser/ParserPhase.scala4
-rw-r--r--sources/scala/tools/nsc/matching/PatternMatcher.scala56
-rw-r--r--sources/scala/tools/nsc/transform/TypesAsValues.scala26
6 files changed, 110 insertions, 28 deletions
diff --git a/sources/scala/tools/nsc/Global.scala b/sources/scala/tools/nsc/Global.scala
index 5358a5f3d9..86358d2ab9 100755
--- a/sources/scala/tools/nsc/Global.scala
+++ b/sources/scala/tools/nsc/Global.scala
@@ -133,6 +133,7 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
object parserPhase extends ParserPhase(NoPhase) {
val global: Global.this.type = Global.this
+
}
val firstPhase = parserPhase;
@@ -147,6 +148,10 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
// val global: Global.this.type = Global.this;
//}
+ //object typesAsValues extends TypesAsValues {
+ // val global: Global.this.type = Global.this;
+ //}
+
object sampleTransform extends SampleTransform {
val global: Global.this.type = Global.this;
}
@@ -156,6 +161,7 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
val picklePhase = new pickler.PicklePhase(typeCheckPhase);
//val transMatchPhase = new transmatcher.TransMatchPhase(picklePhase);
//val samplePhase = new sampleTransform.Phase(transMatchPhase);
+ val typesAsValuesPhase: Phase = null; //new typesAsValues.Phase(transMatchPhase);
val samplePhase = new sampleTransform.Phase(typeCheckPhase);
/*
object icode extends ICode {
diff --git a/sources/scala/tools/nsc/Phase.scala b/sources/scala/tools/nsc/Phase.scala
index 1bb14483ac..a20779ee8c 100644
--- a/sources/scala/tools/nsc/Phase.scala
+++ b/sources/scala/tools/nsc/Phase.scala
@@ -21,6 +21,10 @@ abstract class Phase(val prev: Phase) {
override def toString() = name;
+ def >= (other: Phase): Boolean = {
+ this == other || prev >= other
+ }
+
// def check(units: List[CompilationUnit]): unit =
// for (val unit <- units; val checker <- checkers) checker.traverse(unit); // def checkers: List[Checker] = List();
diff --git a/sources/scala/tools/nsc/ast/TreeGen.scala b/sources/scala/tools/nsc/ast/TreeGen.scala
index 4f4550fae1..39c504f626 100755
--- a/sources/scala/tools/nsc/ast/TreeGen.scala
+++ b/sources/scala/tools/nsc/ast/TreeGen.scala
@@ -74,4 +74,46 @@ abstract class TreeGen {
if (qual.tpe != null) result setType atPhase(phase.next)(qual.tpe.memberType(sym));
result
}
+
+
+ /** Builds an instance test with given value and type. */
+ def mkIsInstanceOf(value: Tree, tpe: Type, erased: Boolean): Tree = {
+ val sym =
+ if(erased)
+ definitions.Any_isInstanceOfErased
+ else
+ definitions.Any_isInstanceOf;
+
+ Apply(
+ TypeApply(
+ Select(value, sym),
+ List(TypeTree(tpe))),
+ List())
+ }
+
+ def mkIsInstanceOf(value: Tree, tpe: Type): Tree = {
+ val afterTAV = global.phase >= global.typesAsValuesPhase;
+ mkIsInstanceOf(value, tpe, afterTAV);
+ }
+
+ /** Builds a cast with given value and type. */
+ def mkAsInstanceOf(value: Tree, tpe: Type, erased: Boolean): Tree = {
+ val sym =
+ if(erased)
+ definitions.Any_asInstanceOfErased
+ else
+ definitions.Any_asInstanceOf;
+
+ Apply(
+ TypeApply(
+ Select(value, sym),
+ List(TypeTree(tpe))),
+ List())
+ }
+
+ def mkAsInstanceOf(value: Tree, tpe: Type): Tree = {
+ val afterTAV = global.phase >= global.typesAsValuesPhase;
+ mkAsInstanceOf(value, tpe, afterTAV);
+ }
+
}
diff --git a/sources/scala/tools/nsc/ast/parser/ParserPhase.scala b/sources/scala/tools/nsc/ast/parser/ParserPhase.scala
index 008ba70c00..07ca77e2cc 100644
--- a/sources/scala/tools/nsc/ast/parser/ParserPhase.scala
+++ b/sources/scala/tools/nsc/ast/parser/ParserPhase.scala
@@ -14,4 +14,8 @@ abstract class ParserPhase(prev: Phase)
global.informProgress("parsing " + unit);
unit.body = new Parser(unit).parse();
}
+
+ /** this is the first phase */
+ override def >= (other: Phase) = this == other;
+
}
diff --git a/sources/scala/tools/nsc/matching/PatternMatcher.scala b/sources/scala/tools/nsc/matching/PatternMatcher.scala
index 6215fde0ef..31ce541b56 100644
--- a/sources/scala/tools/nsc/matching/PatternMatcher.scala
+++ b/sources/scala/tools/nsc/matching/PatternMatcher.scala
@@ -327,11 +327,10 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
if (tree.symbol == defs.PatternWildcard)
mk.DefaultPat(tree.pos, header.getTpe());
else if (tree.symbol.isPrimaryConstructor) {
- error("error may not happen"); // Burak
- null
+ scala.Predef.error("error may not happen"); // Burak
+
} else if (treeInfo.isVariableName(name)) {// Burak
- error("this may not happen"); // Burak
- null
+ scala.Predef.error("this may not happen"); // Burak
} else
mk.VariablePat(tree.pos, tree);
@@ -352,7 +351,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
}
case Alternative(ts) =>
if(ts.length < 2)
- error("ill-formed Alternative");
+ scala.Predef.error("ill-formed Alternative");
val subroot = mk.ConstrPat(header.pos, header.getTpe());
subroot.and = mk.Header(header.pos, header.getTpe(), header.selector.duplicate);
val subenv = new CaseEnv;
@@ -364,8 +363,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
mk.AltPat(tree.pos, subroot.and.asInstanceOf[Header]);
case _ =>
- error("unit = " + unit + "; tree = "+tree);
- null
+ scala.Predef.error("unit = " + unit + "; tree = "+tree);
}
}
@@ -393,14 +391,14 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
} else {
//Console.println("NOT FIRSTPOS");
val ts = casted.tpe.symbol.asInstanceOf[ClassSymbol]
- .caseFieldAccessor(index);
+ .caseFieldAccessors(index);
//Console.println("ts="+ts);
val accType = casted.tpe.memberType(ts);
- val accTree = gen.Select( ident, ts);
+ val accTree = typed(Select(ident, ts)); // !!!
accType match {
// scala case accessor
case MethodType(_, _) =>
- mk.Header(pos, accType.resultType(), gen.mkApply__(accTree));
+ mk.Header(pos, accType.resultType, Apply(accTree, List()));
// jaco case accessor
case _ =>
mk.Header(pos, accType, accTree);
@@ -418,7 +416,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
var curHeader = target.and.asInstanceOf[Header]; // advance one step in intermediate representation
if (curHeader == null) { // check if we have to add a new header
//assert index >= 0 : casted;
- if (index < 0) { error("error entering:" + casted); return null }
+ if (index < 0) { scala.Predef.error("error entering:" + casted); return null }
target.and = {curHeader = newHeader(pat.pos, casted, index); curHeader};
curHeader.or = patternNode(pat, curHeader, env);
enter(patArgs, curHeader.or, casted, env);
@@ -496,7 +494,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
0
case MethodType(args, _) =>
args.length;
- case PolyType(tvars, Type.MethodType(args, _)) =>
+ case PolyType(tvars, MethodType(args, _)) =>
args.length;
case PolyType(tvars, _) =>
0;
@@ -511,9 +509,10 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
//////////// generator methods
- def toTree(): Tree = {
+ def toTree(): global.Tree = {
if (optimize && isSimpleIntSwitch())
intSwitchToTree();
+
else /* if (false && optimize && isSimpleSwitch())
switchToTree();
else */ {
@@ -690,7 +689,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
node match {
case DefaultPat() =>
if (defaultBody != null)
- error("not your day today");
+ scala.Predef.error("not your day today");
defaultBody = bodyToTree(node.and);
node = node.or;
@@ -702,7 +701,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
node = node.or;
case _ =>
- error("intSwitchToTree/Header " + node.toString());
+ scala.Predef.error("intSwitchToTree/Header " + node.toString());
}
}
patNode = patNode.nextH();
@@ -723,7 +722,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
return Switch(selector, tags, bodies, defaultBody, resultVar.tpe);
}
case _ =>
- error("intSwitchToTree / not a header")
+ scala.Predef.error("intSwitchToTree / not a header")
}
}
@@ -732,7 +731,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
case _b:Body =>
return _b.body(0);
case _ =>
- error("not a body");
+ scala.Predef.error("not a body");
}
}
@@ -750,7 +749,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
/*protected*/ def toTree(node1: PatternNode): Tree = {
var node = node1;
- var res = Literal(false);
+ var res: Tree = Literal(false);
while (node != null)
node match {
case _h:Header =>
@@ -776,8 +775,10 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
bound = Predef.Array[Array[ValDef]]( Predef.Array[ValDef]() );
var i = guard.length - 1; while(i >= 0) {
val ts = bound(i).asInstanceOf[Array[Tree]];
- var res0 = Block(Assign(Ident(resultVar), body(i)),
- Literal(true));
+ var res0: Tree =
+ Block(
+ List(Assign(Ident(resultVar), body(i))),
+ Literal(true));
if (guard(i) != EmptyTree)
res0 = cf.And(guard(i), res0);
res = cf.Or(Block(ts, res0), res);
@@ -785,7 +786,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
}
return res;
case _ =>
- error("I am tired");
+ scala.Predef.error("I am tired");
}
return res;
}
@@ -850,7 +851,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
while (node != null)
node match {
case ConstrPat(casted) =>
- cases = insertNode(node.getTpe().symbol.tag(), node, cases);
+ cases = insertNode(node.getTpe().symbol.tag, node, cases);
node = node.or;
case DefaultPat() =>
@@ -858,7 +859,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
node = node.or;
case _ =>
- error("errare humanum est");
+ scala.Predef.error("errare humanum est");
}
var n = cases.length();
val tags = new Array[int](n);
@@ -893,7 +894,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
case ConstrPat(casted) =>
return If(gen.mkIsInstanceOf(selector.duplicate, node.getTpe()),
Block(ValDef(casted,
- gen.mkAsInstanceOf(selector.pos, selector.duplicate, node.getTpe(), true)),
+ gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true)),
toTree(node.and)),
toTree(node.or, selector.duplicate));
case SequencePat(casted, len) =>
@@ -904,15 +905,14 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
cf.Equals(
Apply(
Select(
- gen.mkAsInstanceOf(selector.pos,
- selector.duplicate,
+ gen.mkAsInstanceOf(selector.duplicate,
node.getTpe(),
true),
defs.Seq_length)
List()),
Literal(len))),
Block(ValDef(casted,
- gen.mkAsInstanceOf(selector.pos, selector.duplicate, node.getTpe(), true)),
+ gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true)),
toTree(node.and))),
toTree(node.or, selector.duplicate));
case ConstantPat(value) =>
@@ -929,7 +929,7 @@ abstract class PatternMatcher extends PatternUtil with PatternNodes with Pattern
toTree(node.and),
toTree(node.or, selector.duplicate));
case _ =>
- error("can't plant this tree");
+ scala.Predef.error("can't plant this tree");
}
}
}
diff --git a/sources/scala/tools/nsc/transform/TypesAsValues.scala b/sources/scala/tools/nsc/transform/TypesAsValues.scala
new file mode 100644
index 0000000000..f9f85fd288
--- /dev/null
+++ b/sources/scala/tools/nsc/transform/TypesAsValues.scala
@@ -0,0 +1,26 @@
+/* NSC -- new scala compiler
+ * Copyright 2005 LAMP/EPFL
+ * @author
+ */
+// $Id$
+package scala.tools.nsc.transform;
+
+abstract class TypesAsValues extends Transform {
+
+ // inherits abstract value `global' and class `Phase' from Transform
+
+ import global._; // the global environment
+ import definitions._; // standard classes and methods
+ import typer.typed; // methods to type trees
+ import posAssigner.atPos; // for filling in tree positions
+
+ protected val phaseName: String = "typesAsValues-phase";
+ protected def newTransformer: Transformer = new TypesAsValuesTransformer;
+
+ class TypesAsValuesTransformer extends Transformer {
+
+ override def transform(tree: Tree): Tree = tree; //@todo
+
+ }
+
+}