summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2006-10-14 13:31:12 +0000
committerBurak Emir <emir@epfl.ch>2006-10-14 13:31:12 +0000
commit470f990722777041a475de2e5cf02ca4504a2237 (patch)
tree4527d5a708f563c53ffcc1e37f908c76062cd201 /src/compiler
parentf1208fc000438bb03bbb18011659dd4ca25d1127 (diff)
downloadscala-470f990722777041a475de2e5cf02ca4504a2237.tar.gz
scala-470f990722777041a475de2e5cf02ca4504a2237.tar.bz2
scala-470f990722777041a475de2e5cf02ca4504a2237.zip
xml improvements for 2.2.1 (see changes)
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreePrinters.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala48
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala38
3 files changed, 74 insertions, 14 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
index 916736bda4..9f9ce71c7e 100644
--- a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
@@ -280,7 +280,7 @@ abstract class TreePrinters {
print("this")
case Select(qual @ New(tpe), name) =>
- assert(tree.symbol == null || tree.symbol.isConstructor)
+ assert(tree.symbol == null || tree.symbol.isConstructor || phase.prev.name == "parser")
print(qual)
case Select(qualifier, name) =>
diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
index f2e31ed6ce..0adf872a81 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
@@ -91,7 +91,14 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean
nextch
val tmp = xAttributeValue(delim)
nextch
- Literal(Constant(tmp))
+ try {
+ handle.parseAttribute(pos1, tmp)
+ } catch {
+ case e =>
+ reportSyntaxError("error parsing attribute value")
+ p.errorTermTree
+ }
+
case '{' =>
nextch
xEmbeddedExpr
@@ -181,6 +188,34 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean
Predef.error("this cannot happen")
}
+ def xUnparsed: Tree = {
+ val pos1 = pos
+ val sb: StringBuffer = new StringBuffer()
+ while (true) {
+ if (ch=='<' &&
+ { sb.append(ch); nextch; ch == '/' } &&
+ { sb.append(ch); nextch; ch == 'x' } &&
+ { sb.append(ch); nextch; ch == 'm' } &&
+ { sb.append(ch); nextch; ch == 'l' } &&
+ { sb.append(ch); nextch; ch == ':' } &&
+ { sb.append(ch); nextch; ch == 'u' } &&
+ { sb.append(ch); nextch; ch == 'n' } &&
+ { sb.append(ch); nextch; ch == 'p' } &&
+ { sb.append(ch); nextch; ch == 'a' } &&
+ { sb.append(ch); nextch; ch == 'r' } &&
+ { sb.append(ch); nextch; ch == 's' } &&
+ { sb.append(ch); nextch; ch == 'e' } &&
+ { sb.append(ch); nextch; ch == 'd' } &&
+ { sb.append(ch); nextch; ch == '>' }) {
+ sb.setLength(sb.length - "</xml:unparsed".length)
+ nextch
+ return handle.unparsed(pos1, sb.toString())
+ } else sb.append(ch)
+ nextch
+ }
+ Predef.error("this cannot happen")
+ }
+
/** CharRef ::= "&#" '0'..'9' {'0'..'9'} ";"
* | "&#x" '0'..'9'|'A'..'F'|'a'..'f' { hexdigit } ";"
*
@@ -339,14 +374,17 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean
}
else { // handle content
xToken('>')
+ if(qname == "xml:unparsed")
+ return xUnparsed
+
debugLastStartElement.push(Pair(pos1, qname))
val ts = content
xEndTag(qname)
debugLastStartElement.pop
- if(qname=="xml:group")
- handle.group(pos1, ts)
- else
- handle.element(pos1, qname, attrMap, ts)
+ qname match {
+ case "xml:group" => handle.group(pos1, ts)
+ case _ => handle.element(pos1, qname, attrMap, ts)
+ }
}
}
diff --git a/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
index 3a14035312..1d6b1319a7 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
@@ -9,7 +9,7 @@ package scala.tools.nsc.ast.parser
import scala.collection.immutable.{Map, ListMap}
import scala.collection.mutable
import scala.tools.nsc.util.Position
-import scala.xml.{Text, TextBuffer}
+import scala.xml.{EntityRef, Text, TextBuffer}
import symtab.Flags.MUTABLE
/** This class builds instance of Tree that represent XML.
@@ -37,6 +37,7 @@ abstract class SymbolicXMLBuilder(make: TreeBuilder, p: Parsers # Parser, preser
def _UnprefixedAttribute = global.newTypeName("UnprefixedAttribute")
def _Elem = global.newTypeName("Elem")
def _Group = global.newTypeName("Group")
+ def _Unparsed = global.newTypeName("Unparsed")
def _Seq = global.newTypeName("Seq")
def _immutable = global.newTermName("immutable")
def _mutable = global.newTermName("mutable")
@@ -79,6 +80,7 @@ abstract class SymbolicXMLBuilder(make: TreeBuilder, p: Parsers # Parser, preser
private def _scala_xml_Elem = _scala_xml(_Elem)
private def _scala_xml_Attribute = _scala_xml(_Attribute)
private def _scala_xml_Group = _scala_xml(_Group)
+ private def _scala_xml_Unparsed = _scala_xml(_Unparsed)
/*
private def bufferToArray(buf: mutable.Buffer[Tree]): Array[Tree] = {
@@ -99,11 +101,10 @@ abstract class SymbolicXMLBuilder(make: TreeBuilder, p: Parsers # Parser, preser
protected def mkXML(pos: int, isPattern: boolean, pre: Tree, label: Tree, attrs: /*Array[*/Tree/*]*/ , scope:Tree, children: mutable.Buffer[Tree]): Tree = {
if (isPattern) {
- //val ts = new mutable.ArrayBuffer[Tree]()
convertToTextPat(children)
- atPos (pos) {
+ atPos (pos) { //@todo maybe matching on attributes, scope?
Apply( _scala_xml_Elem, List(
- pre, label, Ident( nme.WILDCARD ) /* attributes? */ , Ident( nme.WILDCARD )) /* scope? */ ::: children.toList )
+ pre, label, Ident( nme.WILDCARD ) /* md */ , Ident( nme.WILDCARD )) /* scope */ ::: children.toList )
}
} else {
var ab = List(pre, label, attrs, scope);
@@ -167,6 +168,20 @@ abstract class SymbolicXMLBuilder(make: TreeBuilder, p: Parsers # Parser, preser
case _ => t
}
+ def parseAttribute(pos: Int, s: String): Tree = {
+ val ns = xml.Utility.parseAttributeValue(s)
+ val ts:collection.mutable.ListBuffer[Tree] = new collection.mutable.ListBuffer
+ val it = ns.elements
+ while(it.hasNext) it.next match {
+ case Text(s) => ts += text(pos, s) // makeText1(Literal(Constant(s)))
+ case EntityRef(s) => ts += entityRef(pos, s)
+ }
+ ts.length match {
+ case 0 => gen.mkNil
+ case 1 => val t = ts(0); ts.clear; t
+ case _ => makeXMLseq(pos, ts)
+ }
+ }
protected def convertToTextPat(buf: mutable.Buffer[Tree]): Unit = {
var i = 0; while (i < buf.length) {
val t1 = buf(i)
@@ -208,6 +223,12 @@ abstract class SymbolicXMLBuilder(make: TreeBuilder, p: Parsers # Parser, preser
atPos(pos) { New( _scala_xml_Group, LL( makeXMLseq(pos, args))) }
}
+ /** code that constructs an unparsed node
+ */
+ def unparsed(pos: int, str: String): Tree = {
+ atPos(pos) { New( _scala_xml_Unparsed, LL( Literal(Constant(str)))) }
+ }
+
/** makes an element */
def element(pos: int, qname: String, attrMap: mutable.Map[String,Tree], args: mutable.Buffer[Tree]): Tree = {
//Console.println("SymbolicXMLBuilder::element("+pos+","+qname+","+attrMap+","+args+")");
@@ -216,10 +237,11 @@ abstract class SymbolicXMLBuilder(make: TreeBuilder, p: Parsers # Parser, preser
var tlist: List[Tree] = List()
/* pre can be null */
- def handleNamespaceBinding(pre:String , uri:Tree): Unit = {
- val t = Assign(Ident(_tmpscope), New( _scala_xml_NamespaceBinding,
- LL(Literal(Constant(pre)), uri, Ident( _tmpscope))));
- tlist = t :: tlist
+ def handleNamespaceBinding(pre:String , uri1: Tree): Unit = uri1 match {
+ case Apply(_,List(uri @ Literal(Constant(_)))) => //text
+ val t = Assign(Ident(_tmpscope), New( _scala_xml_NamespaceBinding,
+ LL(Literal(Constant(pre)), uri, Ident( _tmpscope))));
+ tlist = t :: tlist
//Console.println("SymbolicXMLBuilder::handleNamespaceBinding:");
//Console.println(t.toString());
}