diff options
author | buraq <buraq@epfl.ch> | 2005-05-30 15:26:21 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2005-05-30 15:26:21 +0000 |
commit | 29f5328623037f1130993b0c85edbd3ceac5951a (patch) | |
tree | 48df8b820b07dd8453d8ddf2730ce04f7c206abd | |
parent | 23f5623d548ab080a7e89938396ae48854580be6 (diff) | |
download | scala-29f5328623037f1130993b0c85edbd3ceac5951a.tar.gz scala-29f5328623037f1130993b0c85edbd3ceac5951a.tar.bz2 scala-29f5328623037f1130993b0c85edbd3ceac5951a.zip |
added >= method to Phase,
added mkAsInstanceOf and mkIsInstanceOf to TreeGen
-rwxr-xr-x | sources/scala/tools/nsc/Global.scala | 6 | ||||
-rw-r--r-- | sources/scala/tools/nsc/Phase.scala | 4 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/ast/TreeGen.scala | 42 | ||||
-rw-r--r-- | sources/scala/tools/nsc/ast/parser/ParserPhase.scala | 4 | ||||
-rw-r--r-- | sources/scala/tools/nsc/matching/PatternMatcher.scala | 56 | ||||
-rw-r--r-- | sources/scala/tools/nsc/transform/TypesAsValues.scala | 26 |
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 + + } + +} |