Field references ($fieldName) and quoted literal (anyWord)

This commit is contained in:
Andrey Breslav
2011-01-04 01:09:42 +03:00
parent 1f09ee1965
commit 5fb3f37cab
9 changed files with 515 additions and 423 deletions
@@ -110,6 +110,7 @@ public interface JetNodeTypes {
JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN");
JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL");
JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE");
JetNodeType FIELD_REFERENCE = new JetNodeType("FIELD_REFERENCE");
IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME");
}
@@ -31,6 +31,12 @@ public class JetHighlighter extends SyntaxHighlighterBase {
SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()
);
public static final TextAttributesKey JET_FIELD_IDENTIFIER = TextAttributesKey.createTextAttributesKey(
"JET.FIELD.IDENTIFIER",
// TODO: proper attributes
SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()
);
private static final TextAttributesKey JET_NUMBER = TextAttributesKey.createTextAttributesKey(
"JET.NUMBER",
SyntaxHighlighterColors.NUMBER.getDefaultAttributes()
@@ -68,6 +74,7 @@ public class JetHighlighter extends SyntaxHighlighterBase {
fillMap(keys1, JetTokens.KEYWORDS, JET_KEYWORD);
keys1.put(JetTokens.FIELD_IDENTIFIER, JET_FIELD_IDENTIFIER);
keys1.put(JetTokens.INTEGER_LITERAL, JET_NUMBER);
keys1.put(JetTokens.LONG_LITERAL, JET_NUMBER);
keys1.put(JetTokens.FLOAT_LITERAL, JET_NUMBER);
@@ -324,6 +324,9 @@ public class JetExpressionParsing extends AbstractJetParsing {
VAR_KEYWORD, TYPE_KEYWORD, DECOMPOSER_KEYWORD)) {
parseLocalDeclaration();
}
else if (at(FIELD_IDENTIFIER)) {
parseOneTokenExpression(FIELD_REFERENCE);
}
else if (at(IDENTIFIER)) {
if (JetParsing.MODIFIER_KEYWORD_MAP.containsKey(myBuilder.getTokenText())) {
if (!parseLocalDeclaration()) {
@@ -337,7 +340,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
parseFunctionLiteral();
}
else if (!parseLiteralConstant()) {
// TODO: betters recovery if FIRST(expression) did not match
// TODO: better recovery if FIRST(expression) did not match
errorAndAdvance("Expecting an expression");
}
}
+7 -1
View File
@@ -21,7 +21,12 @@ DIGIT=[0-9]
HEX_DIGIT=[0-9A-Fa-f]
WHITE_SPACE_CHAR=[\ \n\t\f]
IDENTIFIER=[:jletter:] [:jletterdigit:]*
// TODO: prohibit '$' in identifiers?
PLAIN_IDENTIFIER=[:jletter:] [:jletterdigit:]*
// TODO: this one MUST allow everything accepted by the runtime
ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}`
IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER}
FIELD_IDENTIFIER = \${IDENTIFIER}
BLOCK_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*"
DOC_COMMENT="/*""*"+("/"|([^"/""*"]{COMMENT_TAIL}))?
@@ -111,6 +116,7 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
<YYINITIAL> "do" { return JetTokens.DO_KEYWORD ;}
<YYINITIAL> "as" { return JetTokens.AS_KEYWORD ;}
<YYINITIAL> {FIELD_IDENTIFIER} { return JetTokens.FIELD_IDENTIFIER; }
<YYINITIAL> {IDENTIFIER} { return JetTokens.IDENTIFIER; }
<YYINITIAL> "===" { return JetTokens.EQEQEQ ; }
@@ -58,6 +58,7 @@ public interface JetTokens {
JetToken IDENTIFIER = new JetToken("IDENTIFIER");
JetToken FIELD_IDENTIFIER = new JetToken("FIELD_IDENTIFIER");
JetToken LBRACKET = new JetToken("LBRACKET");
JetToken RBRACKET = new JetToken("RBRACKET");
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
[`return`] fun `namespace`() {
`class`()
}
+30
View File
@@ -0,0 +1,30 @@
JetFile: QuotedIdentifiers.jet
NAMESPACE
FUN
MODIFIER_LIST
ATTRIBUTE_ANNOTATION
PsiElement(LBRACKET)('[')
ATTRIBUTE
USER_TYPE
PsiElement(IDENTIFIER)('`return`')
PsiElement(RBRACKET)(']')
PsiWhiteSpace(' ')
PsiElement(fun)('fun')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('`namespace`')
TYPE_PARAMETER_LIST
<empty list>
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
PsiElement(IDENTIFIER)('`class`')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
@@ -927,7 +927,8 @@ JetFile: BinaryHeap.jet
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
BINARY_EXPRESSION
PsiElement(IDENTIFIER)('$value')
FIELD_REFERENCE
PsiElement(FIELD_IDENTIFIER)('$value')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')