summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-06-14 15:15:11 +0000
committerburaq <buraq@epfl.ch>2004-06-14 15:15:11 +0000
commit4c1a09cbc9581a51715e5aac25e4d58b228c4ce7 (patch)
tree0cf2e28220fc143135a2884b7dd841f1448a2626
parent43f2d69e0ede79d4d6ac82d86e4730fd199309d0 (diff)
downloadscala-4c1a09cbc9581a51715e5aac25e4d58b228c4ce7.tar.gz
scala-4c1a09cbc9581a51715e5aac25e4d58b228c4ce7.tar.bz2
scala-4c1a09cbc9581a51715e5aac25e4d58b228c4ce7.zip
cleanup of xml code, TextBuffer
-rw-r--r--sources/scala/tools/scalac/ast/parser/MarkupParser.scala68
-rw-r--r--sources/scala/tools/scalac/ast/parser/Scanner.scala17
-rw-r--r--sources/scala/xml/Namespace.scala4
-rw-r--r--sources/scala/xml/NamespaceRegistry.scala3
-rw-r--r--sources/scala/xml/Node.scala4
-rw-r--r--sources/scala/xml/NodeBuffer.scala6
6 files changed, 44 insertions, 58 deletions
diff --git a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
index 511387ed32..3f843179c6 100644
--- a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
+++ b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
@@ -9,14 +9,16 @@
import scalac.ast._;
import scalac.atree.AConstant;
import scalac._;
-import scalac.util._;
+import scalac.symtab.Modifiers;
+import scalac.util.{ Name, Names, TypeNames };
import scala.tools.util.Position;
import java.lang.{Integer, Long, Float, Double};
import scala.Iterator;
import scala.tools.scalac.util.NewArray;
import scala.collection.immutable.ListMap ;
import scala.collection.mutable.Buffer;
-import scalac.symtab.Modifiers;
+import scala.xml.{Text,TextBuffer};
+
package scala.tools.scalac.ast.parser {
class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
@@ -53,6 +55,10 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
*/
val gen: TreeGen = unit.global.treeGen;
+ var mode:boolean = false;
+ final val PATTERN = true;
+ final val EXPR = false;
+
// convenience methods
private def _scala( pos: int, name: Name ) =
make.Select( pos, make.Ident( pos, Names.scala ), name );
@@ -183,6 +189,17 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
makeText( pos, isPattern, gen.mkStringLit( pos, txt ));
}
+ def appendTrimmed(pos: int, ts:myTreeList, txt:String) = {
+ var textNodes =
+ if( !preserveWS )
+ new TextBuffer().append( txt ).toText;
+ else
+ List( Text( txt ));
+
+ for( val t <- textNodes )
+ ts.append( makeText( s.pos, mode, t.text ));
+ }
+
// create scala.xml.Text here <: scala.xml.Node
def makeText( pos: int, isPattern:Boolean, txt:Tree ):Tree = {
if( isPattern )
@@ -349,35 +366,12 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
}
}
- def trimWS( str:String ) = {
- val sb = new StringBuffer();
- val z:Seq[Char] = str;
- var ws = false;
- for( val c <- z ) {
- if( s.xIsSpace( c ) ) {
- if( !ws ) {
- ws = true; sb.append( ' ' )
- }
- } else {
- ws = false;
- sb.append( c );
- }
- }
- if( ' ' == sb.charAt( 0 ) ) {
- sb.deleteCharAt( 0 )
- }
- val len = sb.length();
- if( len > 0 && s.xIsSpace( sb.charAt( len-1 ) )) {
- sb.setLength( len - 1 )
- }
- sb.toString();
- }
-
/** xLiteral = xExpr { xExpr }
* @return Scala representation of this xml literal
* precondition: s.xStartsXML == true
*/
def xLiteral:Tree = {
+ mode = EXPR;
val pos = s.pos;
var tree = xExpr; s.token = EMPTY; s.nextToken();
if( s.xStartsXML ) {
@@ -497,10 +491,8 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
ts.append( xScalaExpr );
} else {
val str = new StringBuffer("{");
- var text = s.xText;
- if( !preserveWS ) text = trimWS( text );
- str.append( text );
- ts.append( makeText( s.pos, false, str.toString() ));
+ str.append( s.xText );
+ appendTrimmed( pos, ts, str.toString() )
}
// postcond: s.xScalaBlock == false!
case '&' => // EntityRef or CharRef
@@ -510,7 +502,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
s.xNext;
val theChar = makeText( s.pos, false, s.xCharRef );
s.xToken(';');
- ts.append( theChar);
+ ts.append( theChar );
case _ => // EntityRef
val pos = s.pos;
val n = s.xName ;
@@ -518,10 +510,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
ts.append( makeEntityRef( s.pos, n ));
}
case _ => // text content
- var text = s.xText;
- if( !preserveWS ) text = trimWS( text );
- if( text.length() > 0 )
- ts.append( makeText( s.pos, false, text ));
+ appendTrimmed( s.pos, ts, s.xText );
// here s.xScalaBlock might be true
}
@@ -543,6 +532,8 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
* precondition: s.xStartsXML == true
*/
def xLiteralPattern:Tree = {
+ val oldMode = mode;
+ mode = PATTERN;
val pos = s.pos;
var tree = xPattern; s.token = EMPTY; s.nextToken();
if( s.xStartsXML ) {
@@ -550,6 +541,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
while( s.xStartsXML ) { ts.append( xPattern ); s.nextToken(); }
tree = makeXMLseqPat( pos, ts.toArray() );
}
+ mode = oldMode;
tree
}
@@ -604,11 +596,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) {
// postcond: s.xScalaBlock = false;
if( s.xScalaBlock ) throw new ApplicationError(); // assert
case _ => // text
- val pos1 = s.pos;
- var text = s.xText;
- if( !preserveWS ) text = trimWS( text );
- if( text.length() > 0 )
- ts.append( makeText( pos1, true, text ));
+ appendTrimmed( pos, ts, s.xText );
// here s.xScalaBlock might be true;
//if( s.xScalaBlock ) throw new ApplicationError("after:"+text); // assert
}
diff --git a/sources/scala/tools/scalac/ast/parser/Scanner.scala b/sources/scala/tools/scalac/ast/parser/Scanner.scala
index bf5a7c6100..0a178d3457 100644
--- a/sources/scala/tools/scalac/ast/parser/Scanner.scala
+++ b/sources/scala/tools/scalac/ast/parser/Scanner.scala
@@ -945,21 +945,14 @@ class Scanner(_unit: Unit) extends TokenData {
/* unit.global.xmlMarkup && */ ( token == IDENTIFIER )&&( name == LT );
}
- def xIsSpace( ch:char ) = ch match {
- case ' ' | '\t' | CR | LF => true
- case _ => false;
- }
-
- /** skip optional space S?
- */
+ /** skip optional space S? */
def xSpaceOpt = {
- while( xIsSpace( ch ) ) { xNext; }
+ while( xml.Parsing.isSpace( ch ) ) { xNext; }
}
- /** scan [3] S ::= (#x20 | #x9 | #xD | #xA)+
- */
+ /** scan [3] S ::= (#x20 | #x9 | #xD | #xA)+ */
def xSpace = {
- if( xIsSpace( ch ) ) {
+ if( xml.Parsing.isSpace( ch ) ) {
xNext; xSpaceOpt
} else {
xSyntaxError("whitespace expected");
@@ -1171,7 +1164,7 @@ class Scanner(_unit: Unit) extends TokenData {
def xProcInstr:scala.xml.ProcInstr = {
val sb:StringBuffer = new StringBuffer();
val n = xName;
- if( xIsSpace( ch ) ) {
+ if( xml.Parsing.isSpace( ch ) ) {
xSpace;
while( true ) {
if( ch=='?' && { sb.append( ch ); xNext; ch == '>' } ) {
diff --git a/sources/scala/xml/Namespace.scala b/sources/scala/xml/Namespace.scala
index 51b8337488..0643deb9b8 100644
--- a/sources/scala/xml/Namespace.scala
+++ b/sources/scala/xml/Namespace.scala
@@ -9,4 +9,6 @@
package scala.xml ;
/** an XML namespace URI */
-case class Namespace( uri:String ) ;
+case class Namespace( uri:String ) {
+ final val code = NamespaceRegistry.getCode( uri );
+}
diff --git a/sources/scala/xml/NamespaceRegistry.scala b/sources/scala/xml/NamespaceRegistry.scala
index 4eb9b0ba85..5b6ba348cd 100644
--- a/sources/scala/xml/NamespaceRegistry.scala
+++ b/sources/scala/xml/NamespaceRegistry.scala
@@ -27,9 +27,6 @@ object NamespaceRegistry {
d
}
- /* returns a code for the argument namespace. Registers it if needed */
- //def getCode(ns: Namespace):Int = getCode( ns.uri );
-
/* returns a code for the argument namespace uri. Registers it if needed */
def getCode(uri: String):Int = synchronized {
val c = nmap.get( uri );
diff --git a/sources/scala/xml/Node.scala b/sources/scala/xml/Node.scala
index 7ea4859a6f..5f74136b53 100644
--- a/sources/scala/xml/Node.scala
+++ b/sources/scala/xml/Node.scala
@@ -18,8 +18,8 @@ object Node {
val NoAttributes: immutable.TreeMap[String,String] =
immutable.TreeMap.Empty[String,String];
- /** the constant empty attribute map */
- val EmptyNamespace: Int = 0;
+ /** the empty namespace */
+ val EmptyNamespace: Namespace = new Namespace("");
}
/** Trait for representing XML using nodes of a labelled tree.
diff --git a/sources/scala/xml/NodeBuffer.scala b/sources/scala/xml/NodeBuffer.scala
index 732cc36b8c..db23496b93 100644
--- a/sources/scala/xml/NodeBuffer.scala
+++ b/sources/scala/xml/NodeBuffer.scala
@@ -15,7 +15,13 @@ package scala.xml ;
*/
class NodeBuffer extends scala.collection.mutable.ArrayBuffer[Node] {
+ /** append a single node to this buffer */
override def +(n:Node):NodeBuffer = { super.+( n ); this }
+
+ /** append a sequence of nodes to this buffer */
def +(ns:Seq[Node]):NodeBuffer = { super.++( ns ); this }
+ /** append given string as a scala.xml.Text node to this buffer */
+ def +(t:String):NodeBuffer = { super.+( Text( t ) ); this }
+
}