Added parsing of <#<template>#> blocks.

This commit is contained in:
Evgeny Gerashchenko
2012-01-31 20:18:49 +04:00
parent 3660b4668e
commit 29c465641b
4 changed files with 423 additions and 388 deletions
@@ -84,7 +84,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
IDENTIFIER, // SimpleName IDENTIFIER, // SimpleName
FIELD_IDENTIFIER, // Field reference FIELD_IDENTIFIER, // Field reference
PACKAGE_KEYWORD // for absolute qualified names PACKAGE_KEYWORD, // for absolute qualified names
IDE_TEMPLATE_START
); );
private static final TokenSet STATEMENT_FIRST = TokenSet.orSet( private static final TokenSet STATEMENT_FIRST = TokenSet.orSet(
@@ -102,7 +103,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
); );
/*package*/ static final TokenSet EXPRESSION_FOLLOW = TokenSet.create( /*package*/ static final TokenSet EXPRESSION_FOLLOW = TokenSet.create(
SEMICOLON, ARROW, COMMA, RBRACE, RPAR, RBRACKET SEMICOLON, ARROW, COMMA, RBRACE, RPAR, RBRACKET, IDE_TEMPLATE_END
); );
@SuppressWarnings({"UnusedDeclaration"}) @SuppressWarnings({"UnusedDeclaration"})
@@ -506,6 +507,9 @@ public class JetExpressionParsing extends AbstractJetParsing {
if (at(LPAR)) { if (at(LPAR)) {
parseParenthesizedExpression(); parseParenthesizedExpression();
} }
else if (at(IDE_TEMPLATE_START)) {
parseIdeTemplate();
}
else if (at(HASH)) { else if (at(HASH)) {
parseTupleExpression(); parseTupleExpression();
} }
@@ -1831,6 +1835,22 @@ public class JetExpressionParsing extends AbstractJetParsing {
parseExpression(); parseExpression();
argument.done(VALUE_ARGUMENT); argument.done(VALUE_ARGUMENT);
} }
/*
* "<#<" expression ">#>"
*/
private void parseIdeTemplate() {
PsiBuilder.Marker placeholder = mark();
advance();
if (at(IDE_TEMPLATE_END)) {
error("Expecting IDE template");
} else {
parseExpression();
}
expect(IDE_TEMPLATE_END, "");
placeholder.done(PARENTHESIZED);
}
public void parseObjectLiteral() { public void parseObjectLiteral() {
PsiBuilder.Marker literal = mark(); PsiBuilder.Marker literal = mark();
@@ -197,6 +197,8 @@ LONG_TEMPLATE_ENTRY_END=\}
\!in{IDENTIFIER_PART} { yypushback(3); return JetTokens.EXCL; } \!in{IDENTIFIER_PART} { yypushback(3); return JetTokens.EXCL; }
\!is{IDENTIFIER_PART} { yypushback(3); return JetTokens.EXCL; } \!is{IDENTIFIER_PART} { yypushback(3); return JetTokens.EXCL; }
"<#<" { return JetTokens.IDE_TEMPLATE_START ; }
">#>" { return JetTokens.IDE_TEMPLATE_END ; }
"===" { return JetTokens.EQEQEQ ; } "===" { return JetTokens.EQEQEQ ; }
"!==" { return JetTokens.EXCLEQEQEQ; } "!==" { return JetTokens.EXCLEQEQEQ; }
"!in" { return JetTokens.NOT_IN; } "!in" { return JetTokens.NOT_IN; }
@@ -114,6 +114,9 @@ public interface JetTokens {
JetToken HASH = new JetToken("HASH"); JetToken HASH = new JetToken("HASH");
JetToken AT = new JetToken("AT"); JetToken AT = new JetToken("AT");
JetToken ATAT = new JetToken("ATAT"); JetToken ATAT = new JetToken("ATAT");
JetToken IDE_TEMPLATE_START = new JetToken("IDE_TEMPLATE_START");
JetToken IDE_TEMPLATE_END = new JetToken("IDE_TEMPLATE_END");
TokenSet LABELS = TokenSet.create(AT, ATAT, LABEL_IDENTIFIER); TokenSet LABELS = TokenSet.create(AT, ATAT, LABEL_IDENTIFIER);
File diff suppressed because it is too large Load Diff