()
| 837 | } |
| 838 | |
| 839 | func (p *codeParser) parseStmtBlock() *nodeBlock { |
| 840 | // we are sitting on the opening '{' token here |
| 841 | if p.peek().tok != token.LBRACE { |
| 842 | p.errorf("expected '{', got '%s'", p.peek().String()) |
| 843 | } |
| 844 | p.advance() |
| 845 | var block *nodeBlock |
| 846 | switch p.peek().tok { |
| 847 | // check for a transition, i.e., stay in code parser |
| 848 | case token.XOR: |
| 849 | p.advance() |
| 850 | code := p.parseCode() |
| 851 | if p.peek().tok == token.SEMICOLON { |
| 852 | p.advance() |
| 853 | } |
| 854 | block = &nodeBlock{nodes: []node{code}} |
| 855 | case token.EOF: |
| 856 | p.errorf("premature end of block in IF statement") |
| 857 | default: |
| 858 | block = p.transition() |
| 859 | } |
| 860 | // we should be at the closing '}' token here |
| 861 | if p.peek().tok != token.RBRACE { |
| 862 | if p.peek().tok == token.LSS { |
| 863 | p.errorf("there must be a single HTML element inside a Go code block, try wrapping them in a <text></text> pseudo-element") |
| 864 | } else { |
| 865 | p.errorf("expected closing '}', got %v", p.peek()) |
| 866 | } |
| 867 | } |
| 868 | p.advance() |
| 869 | return block |
| 870 | } |
| 871 | |
| 872 | // TODO(paulsmith): extract a common function with parseCodeKeyword |
| 873 | func (p *codeParser) parseHandlerKeyword() *nodeGoCode { |
no test coverage detected