use of com.google.auto.value.processor.escapevelocity.TokenNode.ElseTokenNode in project auto by google.
the class Reparser method parseIfOrElseIf.
private Node parseIfOrElseIf(IfOrElseIfTokenNode ifOrElseIf) {
Node truePart = parseTo(ELSE_ELSE_IF_END_SET, ifOrElseIf);
Node falsePart;
Node token = currentNode();
// Skip #else or #elseif (cond) or #end.
nextNode();
if (token instanceof EndTokenNode) {
falsePart = emptyNode(token.lineNumber);
} else if (token instanceof ElseTokenNode) {
falsePart = parseTo(END_SET, ifOrElseIf);
// Skip #end
nextNode();
} else if (token instanceof ElseIfTokenNode) {
// We've seen #if (condition1) ... #elseif (condition2). currentToken is the first token
// after (condition2). We pretend that we've just seen #if (condition2) and parse out
// the remainder (which might have further #elseif and final #else). Then we pretend that
// we actually saw #if (condition1) ... #else #if (condition2) ...remainder ... #end #end.
falsePart = parseIfOrElseIf((ElseIfTokenNode) token);
} else {
throw new AssertionError(currentNode());
}
return new IfNode(ifOrElseIf.lineNumber, ifOrElseIf.condition, truePart, falsePart);
}
use of com.google.auto.value.processor.escapevelocity.TokenNode.ElseTokenNode in project auto by google.
the class Parser method parseDirective.
/**
* Parses a single directive token from the reader. Directives can be spelled with or without
* braces, for example {@code #if} or {@code #{if}}. We omit the brace spelling in the productions
* here: <pre>{@code
* <directive> -> <if-token> |
* <else-token> |
* <elseif-token> |
* <end-token> |
* <foreach-token> |
* <set-token> |
* <macro-token> |
* <macro-call> |
* <comment>
* }</pre>
*/
private Node parseDirective() throws IOException {
String directive;
if (c == '{') {
next();
directive = parseId("Directive inside #{...}");
expect('}');
} else {
directive = parseId("Directive");
}
Node node;
if (directive.equals("end")) {
node = new EndTokenNode(lineNumber());
} else if (directive.equals("if") || directive.equals("elseif")) {
node = parseIfOrElseIf(directive);
} else if (directive.equals("else")) {
node = new ElseTokenNode(lineNumber());
} else if (directive.equals("foreach")) {
node = parseForEach();
} else if (directive.equals("set")) {
node = parseSet();
} else if (directive.equals("macro")) {
node = parseMacroDefinition();
} else {
node = parsePossibleMacroCall(directive);
}
// TODO(emcmanus): in fact it also skips space before the newline, which should be implemented.
if (c == '\n') {
next();
}
return node;
}
Aggregations