Fixing function types
This commit is contained in:
@@ -87,6 +87,7 @@ public interface JetNodeTypes {
|
||||
JetNodeType LOOP_PARAMETER = new JetNodeType("LOOP_PARAMETER");
|
||||
JetNodeType LOOP_RANGE = new JetNodeType("LOOP_RANGE");
|
||||
JetNodeType BODY = new JetNodeType("BODY");
|
||||
JetNodeType RECEIVER_TYPE = new JetNodeType("RECEIVER_TYPE");
|
||||
|
||||
IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME");
|
||||
}
|
||||
|
||||
@@ -170,6 +170,13 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
int openBrackets = 0;
|
||||
IElementType previousToken = null;
|
||||
while (!eof()) {
|
||||
if (atSet(lookFor)
|
||||
&& openAngleBrackets == 0
|
||||
&& openBrackets == 0
|
||||
&& openBraces == 0
|
||||
&& openParentheses == 0) {
|
||||
lastOccurrence = myBuilder.getCurrentOffset();
|
||||
}
|
||||
if (atSet(stopAt)) {
|
||||
if (openAngleBrackets == 0
|
||||
&& openBrackets == 0
|
||||
@@ -202,13 +209,6 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
else if (at(RBRACKET)) {
|
||||
openBrackets--;
|
||||
}
|
||||
else if (atSet(lookFor)
|
||||
&& openAngleBrackets == 0
|
||||
&& openBrackets == 0
|
||||
&& openBraces == 0
|
||||
&& openParentheses == 0) {
|
||||
lastOccurrence = myBuilder.getCurrentOffset();
|
||||
}
|
||||
previousToken = tt();
|
||||
advance(); // skip token
|
||||
}
|
||||
|
||||
@@ -24,9 +24,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* : literalConstant
|
||||
* : functionLiteral
|
||||
* : tupleLiteral
|
||||
* : listLiteral
|
||||
* : mapLiteral
|
||||
* : range
|
||||
* : "null"
|
||||
* : "this" ("<" type ">")?
|
||||
* : expressionWithPrecedences
|
||||
@@ -46,9 +43,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
if (at(LPAR)) {
|
||||
parseParenthesizedExpressionOrTuple();
|
||||
}
|
||||
else if (at(LBRACKET)) {
|
||||
parseMapListOrRange();
|
||||
}
|
||||
else if (at(THIS_KEYWORD)) {
|
||||
parseThisExpression();
|
||||
}
|
||||
@@ -88,22 +82,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
else if (at(DO_KEYWORD)) {
|
||||
parseDoWhile();
|
||||
}
|
||||
else if (atSet(TokenSet.create(
|
||||
CLASS_KEYWORD,
|
||||
EXTENSION_KEYWORD,
|
||||
FUN_KEYWORD,
|
||||
VAL_KEYWORD,
|
||||
VAR_KEYWORD,
|
||||
TYPE_KEYWORD))) {
|
||||
// TODO
|
||||
}
|
||||
else if (at(IDENTIFIER)) {
|
||||
advance(); // TODO
|
||||
}
|
||||
else if (at(LBRACE)) {
|
||||
// TODO
|
||||
myJetParsing.parseBlock();
|
||||
}
|
||||
else if (at(INTEGER_LITERAL)) {
|
||||
parseOneTokenExpression(INTEGER_CONSTANT);
|
||||
}
|
||||
@@ -128,6 +106,24 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
else if (at(NULL_KEYWORD)) {
|
||||
parseOneTokenExpression(NULL);
|
||||
}
|
||||
else if (atSet(TokenSet.create(
|
||||
CLASS_KEYWORD,
|
||||
EXTENSION_KEYWORD,
|
||||
FUN_KEYWORD,
|
||||
VAL_KEYWORD,
|
||||
VAR_KEYWORD,
|
||||
TYPE_KEYWORD))) {
|
||||
// modifiers
|
||||
// attributes
|
||||
// TODO
|
||||
}
|
||||
else if (at(IDENTIFIER)) {
|
||||
advance(); // TODO
|
||||
}
|
||||
else if (at(LBRACE)) {
|
||||
// TODO
|
||||
myJetParsing.parseBlock();
|
||||
}
|
||||
else {
|
||||
errorAndAdvance("Expecting an expression");
|
||||
}
|
||||
@@ -390,90 +386,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
typeof.done(TYPEOF);
|
||||
}
|
||||
|
||||
/*
|
||||
* listLiteral
|
||||
* : "[" expression{","}? "]"
|
||||
* ;
|
||||
*
|
||||
* mapLiteral
|
||||
* : "[" mapEntryLiteral{","} "]"
|
||||
* : "[" ":" "]"
|
||||
* ;
|
||||
*
|
||||
* mapEntryLiteral
|
||||
* : expression ":" expression
|
||||
* ;
|
||||
*
|
||||
* range
|
||||
* : "[" expression ".." expression "]"
|
||||
* ;
|
||||
*/
|
||||
private void parseMapListOrRange() {
|
||||
assert at(LBRACKET);
|
||||
|
||||
PsiBuilder.Marker literal = mark();
|
||||
|
||||
advance(); // LBRACKET
|
||||
|
||||
// If this is an empty map "[:]"
|
||||
if (at(COLON)) {
|
||||
advance(); // COLON
|
||||
expect(RBRACKET, "Expecting ']' to close an empty map literal '[:]'");
|
||||
literal.done(MAP_LITERAL);
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an empty list "[]"
|
||||
if (at(RBRACKET)) {
|
||||
advance(); // RBRACKET
|
||||
literal.done(LIST_LITERAL);
|
||||
return;
|
||||
}
|
||||
|
||||
PsiBuilder.Marker item = mark();
|
||||
parseExpression();
|
||||
|
||||
// If it is a map "[e:e, e:e]"
|
||||
if (at(COLON)) {
|
||||
advance(); // COLON
|
||||
|
||||
parseExpression();
|
||||
item.done(MAP_LITERAL_ENTRY);
|
||||
|
||||
while (at(COMMA)) {
|
||||
advance(); // COMMA
|
||||
if (at(COMMA)) error("Expecting a map entry");
|
||||
parseMapLiteralEntry();
|
||||
}
|
||||
expect(RBRACKET, "Expecting ']' to close a map literal");
|
||||
literal.done(MAP_LITERAL);
|
||||
return;
|
||||
}
|
||||
|
||||
// If it is a range "[a..b]"
|
||||
if (at(RANGE)) {
|
||||
item.drop();
|
||||
advance(); // RANGE
|
||||
|
||||
parseExpression();
|
||||
|
||||
expect(RBRACKET, "Expecting ']' to close the range");
|
||||
literal.done(RANGE_LITERAL);
|
||||
return;
|
||||
}
|
||||
|
||||
// Else: it must be a list literal "[a, b, c]"
|
||||
item.drop();
|
||||
while (at(COMMA)) {
|
||||
advance(); // COMMA
|
||||
if (at(COMMA)) error("Expecting a list entry");
|
||||
parseExpression();
|
||||
}
|
||||
|
||||
expect(RBRACKET, "Expecting a ']' to close a list");
|
||||
literal.done(LIST_LITERAL);
|
||||
}
|
||||
|
||||
/*
|
||||
* mapLiteralEntry
|
||||
* : expression ":" expression
|
||||
|
||||
@@ -8,9 +8,7 @@ import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import org.jetbrains.jet.JetNodeType;
|
||||
import org.jetbrains.jet.lexer.JetKeywordToken;
|
||||
import org.jetbrains.jet.lexer.JetToken;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -1128,7 +1126,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
|
||||
/*
|
||||
* type
|
||||
* : attributes (userType | functionType | tupleType)
|
||||
* : attributes (functionType | userType | tupleType)
|
||||
* ;
|
||||
*/
|
||||
public void parseTypeRef() {
|
||||
@@ -1136,25 +1134,19 @@ public class JetParsing extends AbstractJetParsing {
|
||||
|
||||
parseAttributeList();
|
||||
|
||||
TokenSet simpleTypeFirst = TokenSet.create(IDENTIFIER, LBRACE, LPAR);
|
||||
while (true) {
|
||||
if (at(IDENTIFIER)) {
|
||||
parseSimpleUserType();
|
||||
}
|
||||
else if (at(LBRACE)) {
|
||||
parseSimpleFunctionType();
|
||||
} else if (at(LPAR)) {
|
||||
parseTupleType();
|
||||
} else {
|
||||
errorWithRecovery("Type expected",
|
||||
TokenSet.orSet(TOPLEVEL_OBJECT_FIRST,
|
||||
TokenSet.create(EQ, COMMA, GT, RBRACKET, DOT, RPAR, RBRACE, LBRACE, SEMICOLON)));
|
||||
break;
|
||||
}
|
||||
|
||||
if (!at(DOT)) break;
|
||||
if (!simpleTypeFirst.contains(lookahead(1))) break;
|
||||
advance(); // DOT
|
||||
if (at(IDENTIFIER)) {
|
||||
parseUserType();
|
||||
}
|
||||
else if (at(LBRACE)) {
|
||||
parseFunctionType();
|
||||
}
|
||||
else if (at(LPAR)) {
|
||||
parseTupleType();
|
||||
}
|
||||
else {
|
||||
errorWithRecovery("Type expected",
|
||||
TokenSet.orSet(TOPLEVEL_OBJECT_FIRST,
|
||||
TokenSet.create(EQ, COMMA, GT, RBRACKET, DOT, RPAR, RBRACE, LBRACE, SEMICOLON)));
|
||||
}
|
||||
type.done(TYPE_REFERENCE);
|
||||
}
|
||||
@@ -1165,15 +1157,11 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseUserType() {
|
||||
PsiBuilder.Marker userType = mark();
|
||||
|
||||
while (true) {
|
||||
parseSimpleUserType();
|
||||
if (!at(DOT)) break;
|
||||
advance(); // DOT
|
||||
}
|
||||
|
||||
userType.done(TYPE_REFERENCE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1256,16 +1244,25 @@ public class JetParsing extends AbstractJetParsing {
|
||||
}
|
||||
|
||||
/*
|
||||
* simpleFunctionType
|
||||
* : "{" functionTypeContents "}"
|
||||
* functionType
|
||||
* : "{" (type ".")? functionTypeContents "}"
|
||||
* ;
|
||||
*/
|
||||
private void parseSimpleFunctionType() {
|
||||
private void parseFunctionType() {
|
||||
assert at(LBRACE);
|
||||
|
||||
PsiBuilder.Marker functionType = mark();
|
||||
|
||||
advance(); // LBRACE
|
||||
|
||||
int lastLPar = findLastBefore(TokenSet.create(LPAR), TokenSet.create(RBRACE, COLON), false);
|
||||
if (lastLPar >= 0 && lastLPar > myBuilder.getCurrentOffset()) {
|
||||
PsiBuilder.Marker receiverType = mark();
|
||||
createTruncatedBuilder(lastLPar - 1).parseTypeRef();
|
||||
receiverType.done(RECEIVER_TYPE);
|
||||
advance(); // DOT
|
||||
}
|
||||
|
||||
parseFunctionTypeContents();
|
||||
|
||||
expect(RBRACE, "Expecting '}");
|
||||
|
||||
@@ -85,7 +85,6 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
|
||||
<YYINITIAL> "return" { return JetTokens.RETURN_KEYWORD ;}
|
||||
<YYINITIAL> "typeof" { return JetTokens.TYPEOF_KEYWORD ;}
|
||||
<YYINITIAL> "object" { return JetTokens.OBJECT_KEYWORD ;}
|
||||
<YYINITIAL> "isnot" { return JetTokens.ISNOT_KEYWORD ;}
|
||||
<YYINITIAL> "while" { return JetTokens.WHILE_KEYWORD ;}
|
||||
<YYINITIAL> "break" { return JetTokens.BREAK_KEYWORD ;}
|
||||
<YYINITIAL> "class" { return JetTokens.CLASS_KEYWORD ;}
|
||||
@@ -113,26 +112,14 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
|
||||
|
||||
<YYINITIAL> {IDENTIFIER} { return JetTokens.IDENTIFIER; }
|
||||
|
||||
<YYINITIAL> "[" { return JetTokens.LBRACKET ; }
|
||||
<YYINITIAL> "]" { return JetTokens.RBRACKET ; }
|
||||
<YYINITIAL> "{" { return JetTokens.LBRACE ; }
|
||||
<YYINITIAL> "}" { return JetTokens.RBRACE ; }
|
||||
<YYINITIAL> "(" { return JetTokens.LPAR ; }
|
||||
<YYINITIAL> ")" { return JetTokens.RPAR ; }
|
||||
<YYINITIAL> "." { return JetTokens.DOT ; }
|
||||
<YYINITIAL> "===" { return JetTokens.EQEQEQ ; }
|
||||
<YYINITIAL> "!==" { return JetTokens.EXCLEQEQEQ; }
|
||||
<YYINITIAL> "!in" { return JetTokens.NOT_IN; }
|
||||
<YYINITIAL> "!is" { return JetTokens.NOT_IS; }
|
||||
<YYINITIAL> "++" { return JetTokens.PLUSPLUS ; }
|
||||
<YYINITIAL> "--" { return JetTokens.MINUSMINUS; }
|
||||
<YYINITIAL> "*" { return JetTokens.MUL ; }
|
||||
<YYINITIAL> "+" { return JetTokens.PLUS ; }
|
||||
<YYINITIAL> "-" { return JetTokens.MINUS ; }
|
||||
<YYINITIAL> "!" { return JetTokens.EXCL ; }
|
||||
<YYINITIAL> "/" { return JetTokens.DIV ; }
|
||||
<YYINITIAL> "%" { return JetTokens.PERC ; }
|
||||
<YYINITIAL> "<" { return JetTokens.LT ; }
|
||||
<YYINITIAL> ">" { return JetTokens.GT ; }
|
||||
<YYINITIAL> "<=" { return JetTokens.LTEQ ; }
|
||||
<YYINITIAL> ">=" { return JetTokens.GTEQ ; }
|
||||
<YYINITIAL> "===" { return JetTokens.EQEQEQ ; }
|
||||
<YYINITIAL> "==" { return JetTokens.EQEQ ; }
|
||||
<YYINITIAL> "!=" { return JetTokens.EXCLEQ ; }
|
||||
<YYINITIAL> "&&" { return JetTokens.ANDAND ; }
|
||||
@@ -141,16 +128,32 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
|
||||
<YYINITIAL> "?:" { return JetTokens.ELVIS ; }
|
||||
<YYINITIAL> ".*" { return JetTokens.MAP ; }
|
||||
<YYINITIAL> ".?" { return JetTokens.FILTER ; }
|
||||
<YYINITIAL> "?" { return JetTokens.QUEST ; }
|
||||
<YYINITIAL> ":" { return JetTokens.COLON ; }
|
||||
<YYINITIAL> ";" { return JetTokens.SEMICOLON ; }
|
||||
<YYINITIAL> ".." { return JetTokens.RANGE ; }
|
||||
<YYINITIAL> "=" { return JetTokens.EQ ; }
|
||||
<YYINITIAL> "*=" { return JetTokens.MULTEQ ; }
|
||||
<YYINITIAL> "/=" { return JetTokens.DIVEQ ; }
|
||||
<YYINITIAL> "%=" { return JetTokens.PERCEQ ; }
|
||||
<YYINITIAL> "+=" { return JetTokens.PLUSEQ ; }
|
||||
<YYINITIAL> "-=" { return JetTokens.MINUSEQ ; }
|
||||
<YYINITIAL> "->" { return JetTokens.ARROW ; }
|
||||
<YYINITIAL> "[" { return JetTokens.LBRACKET ; }
|
||||
<YYINITIAL> "]" { return JetTokens.RBRACKET ; }
|
||||
<YYINITIAL> "{" { return JetTokens.LBRACE ; }
|
||||
<YYINITIAL> "}" { return JetTokens.RBRACE ; }
|
||||
<YYINITIAL> "(" { return JetTokens.LPAR ; }
|
||||
<YYINITIAL> ")" { return JetTokens.RPAR ; }
|
||||
<YYINITIAL> "." { return JetTokens.DOT ; }
|
||||
<YYINITIAL> "*" { return JetTokens.MUL ; }
|
||||
<YYINITIAL> "+" { return JetTokens.PLUS ; }
|
||||
<YYINITIAL> "-" { return JetTokens.MINUS ; }
|
||||
<YYINITIAL> "!" { return JetTokens.EXCL ; }
|
||||
<YYINITIAL> "/" { return JetTokens.DIV ; }
|
||||
<YYINITIAL> "%" { return JetTokens.PERC ; }
|
||||
<YYINITIAL> "<" { return JetTokens.LT ; }
|
||||
<YYINITIAL> ">" { return JetTokens.GT ; }
|
||||
<YYINITIAL> "?" { return JetTokens.QUEST ; }
|
||||
<YYINITIAL> ":" { return JetTokens.COLON ; }
|
||||
<YYINITIAL> ";" { return JetTokens.SEMICOLON ; }
|
||||
<YYINITIAL> ".." { return JetTokens.RANGE ; }
|
||||
<YYINITIAL> "=" { return JetTokens.EQ ; }
|
||||
<YYINITIAL> "," { return JetTokens.COMMA ; }
|
||||
|
||||
<YYINITIAL> . { return TokenType.BAD_CHARACTER; }
|
||||
|
||||
@@ -40,7 +40,6 @@ public interface JetTokens {
|
||||
JetKeywordToken TRUE_KEYWORD = JetKeywordToken.keyword("true");
|
||||
JetKeywordToken FALSE_KEYWORD = JetKeywordToken.keyword("false");
|
||||
JetKeywordToken IS_KEYWORD = JetKeywordToken.keyword("is");
|
||||
JetKeywordToken ISNOT_KEYWORD = JetKeywordToken.keyword("isnot");
|
||||
JetKeywordToken IN_KEYWORD = JetKeywordToken.keyword("in");
|
||||
JetKeywordToken THROW_KEYWORD = JetKeywordToken.keyword("throw");
|
||||
JetKeywordToken RETURN_KEYWORD = JetKeywordToken.keyword("return");
|
||||
@@ -77,6 +76,8 @@ public interface JetTokens {
|
||||
JetToken LTEQ = new JetToken("LTEQ");
|
||||
JetToken GTEQ = new JetToken("GTEQ");
|
||||
JetToken EQEQEQ = new JetToken("EQEQEQ");
|
||||
JetToken ARROW = new JetToken("ARROW");
|
||||
JetToken EXCLEQEQEQ = new JetToken("EXCLEQEQEQ");
|
||||
JetToken EQEQ = new JetToken("EQEQ");
|
||||
JetToken EXCLEQ = new JetToken("EXCLEQ");
|
||||
JetToken ANDAND = new JetToken("ANDAND");
|
||||
@@ -95,10 +96,12 @@ public interface JetTokens {
|
||||
JetToken PERCEQ = new JetToken("PERCEQ");
|
||||
JetToken PLUSEQ = new JetToken("PLUSEQ");
|
||||
JetToken MINUSEQ = new JetToken("MINUSEQ");
|
||||
JetToken NOT_IN = new JetToken("NOT_IN");
|
||||
JetToken NOT_IS = new JetToken("NOT_IS");
|
||||
|
||||
JetToken COMMA = new JetToken("COMMA");
|
||||
|
||||
JetToken EOL_OR_SEMICOLON = new JetToken("EOL_OR_SEMICOLON");
|
||||
|
||||
JetKeywordToken WRAPS_KEYWORD = JetKeywordToken.softKeyword("wraps");
|
||||
JetKeywordToken IMPORT_KEYWORD = JetKeywordToken.softKeyword("import");
|
||||
JetKeywordToken WHERE_KEYWORD = JetKeywordToken.softKeyword("where");
|
||||
@@ -119,11 +122,12 @@ public interface JetTokens {
|
||||
JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out");
|
||||
JetKeywordToken REF_KEYWORD = JetKeywordToken.softKeyword("ref");
|
||||
JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch");
|
||||
|
||||
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
|
||||
|
||||
TokenSet KEYWORDS = TokenSet.create(NAMESPACE_KEYWORD, AS_KEYWORD, TYPE_KEYWORD, CLASS_KEYWORD,
|
||||
THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, DECOMPOSER_KEYWORD, EXTENSION_KEYWORD, FOR_KEYWORD,
|
||||
NULL_KEYWORD, TYPEOF_KEYWORD, NEW_KEYWORD, TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, ISNOT_KEYWORD,
|
||||
NULL_KEYWORD, TYPEOF_KEYWORD, NEW_KEYWORD, TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
|
||||
IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD,
|
||||
ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, MATCH_KEYWORD, REF_KEYWORD, OUT_KEYWORD, TRY_KEYWORD
|
||||
);
|
||||
@@ -140,7 +144,6 @@ public interface JetTokens {
|
||||
);
|
||||
|
||||
TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT);
|
||||
|
||||
TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
|
||||
TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT);
|
||||
TokenSet STRINGS = TokenSet.create(CHARACTER_LITERAL, STRING_LITERAL, RAW_STRING_LITERAL);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user