]> Cypherpunks repositories - gostls13.git/commitdiff
exp/template: remove the visibility of the token channel from the parser.
authorRob Pike <r@golang.org>
Wed, 6 Jul 2011 00:13:53 +0000 (10:13 +1000)
committerRob Pike <r@golang.org>
Wed, 6 Jul 2011 00:13:53 +0000 (10:13 +1000)
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/4675053

src/pkg/exp/template/lex.go
src/pkg/exp/template/lex_test.go
src/pkg/exp/template/parse.go
src/pkg/exp/template/set.go

index d22d825a1df04a41c8f0747198ef9eee8c2e7d24..52d0617058c3ed0e2e46142816ba4d0c4c60af20 100644 (file)
@@ -190,15 +190,20 @@ func (l *lexer) run() {
        close(l.items)
 }
 
+// nextItem returns the next item from the input.
+func (l *lexer) nextItem() item {
+       return <-l.items
+}
+
 // lex launches a new scanner and returns the channel of items.
-func lex(name, input string) (*lexer, chan item) {
+func lex(name, input string) *lexer {
        l := &lexer{
                name:  name,
                input: input,
                items: make(chan item),
        }
        go l.run()
-       return l, l.items
+       return l
 }
 
 // state functions
index e13a7247a9b53eadf506935a358e75290f9c2a60..4b4d619bf02403567e9fe2b257122e9a25f88c00 100644 (file)
@@ -127,8 +127,8 @@ var lexTests = []lexTest{
 
 // collect gathers the emitted items into a slice.
 func collect(t *lexTest) (items []item) {
-       _, tokens := lex(t.name, t.input)
-       for i := range tokens {
+       l := lex(t.name, t.input)
+       for i := range l.items {
                items = append(items, i)
        }
        return
index 8514399b8234c4f291a5b51db0530fae5b884cec..23f3665d628e0816b9aab36eaf26c9fd88c06177 100644 (file)
@@ -23,7 +23,6 @@ type Template struct {
        // Parsing only; cleared after parse.
        set      *Set
        lex      *lexer
-       tokens   <-chan item
        token    item // token lookahead for parser
        havePeek bool
 }
@@ -33,7 +32,7 @@ func (t *Template) next() item {
        if t.havePeek {
                t.havePeek = false
        } else {
-               t.token = <-t.tokens
+               t.token = t.lex.nextItem()
        }
        return t.token
 }
@@ -48,7 +47,7 @@ func (t *Template) peek() item {
        if t.havePeek {
                return t.token
        }
-       t.token = <-t.tokens
+       t.token = t.lex.nextItem()
        t.havePeek = true
        return t.token
 }
@@ -508,15 +507,15 @@ func (t *Template) recover(errp *os.Error) {
 }
 
 // startParse starts the template parsing from the lexer.
-func (t *Template) startParse(set *Set, lex *lexer, tokens <-chan item) {
+func (t *Template) startParse(set *Set, lex *lexer) {
        t.root = nil
        t.set = set
-       t.lex, t.tokens = lex, tokens
+       t.lex = lex
 }
 
 // stopParse terminates parsing.
 func (t *Template) stopParse() {
-       t.set, t.lex, t.tokens = nil, nil, nil
+       t.set, t.lex = nil, nil
 }
 
 // atEOF returns true if, possibly after spaces, we're at EOF.
@@ -543,8 +542,7 @@ func (t *Template) atEOF() bool {
 // Parse parses the template definition string to construct an internal representation
 // of the template for execution.
 func (t *Template) Parse(s string) (err os.Error) {
-       lexer, tokens := lex(t.name, s)
-       t.startParse(nil, lexer, tokens)
+       t.startParse(nil, lex(t.name, s))
        defer t.recover(&err)
        t.parse(true)
        t.stopParse()
@@ -554,8 +552,7 @@ func (t *Template) Parse(s string) (err os.Error) {
 // ParseInSet parses the template definition string to construct an internal representation
 // of the template for execution. Function bindings are checked against those in the set.
 func (t *Template) ParseInSet(s string, set *Set) (err os.Error) {
-       lexer, tokens := lex(t.name, s)
-       t.startParse(set, lexer, tokens)
+       t.startParse(set, lex(t.name, s))
        defer t.recover(&err)
        t.parse(true)
        t.stopParse()
index 7100e7e3ec8b4cd76849f4b2cacea817ac2215ba..8b381358618e7d8d772887bfdfe8b50352ff0d78 100644 (file)
@@ -66,11 +66,11 @@ func (s *Set) recover(errp *os.Error) {
 // Parse parses the file into a set of named templates.
 func (s *Set) Parse(text string) (err os.Error) {
        defer s.recover(&err)
-       lex, tokens := lex("set", text)
+       lex := lex("set", text)
        const context = "define clause"
        for {
                t := New("set") // name will be updated once we know it.
-               t.startParse(s, lex, tokens)
+               t.startParse(s, lex)
                // Expect EOF or "{{ define name }}".
                if t.atEOF() {
                        return