0-ary tuples
This commit is contained in:
@@ -56,9 +56,8 @@ elvisOperation
|
|||||||
: infixFunctionCall ("?:" infixFunctionCall)*
|
: infixFunctionCall ("?:" infixFunctionCall)*
|
||||||
;
|
;
|
||||||
|
|
||||||
// ATTENTION
|
|
||||||
infixFunctionCall
|
infixFunctionCall
|
||||||
: rangeExpression (SimpleName (typeArguments | rangeExpression))*
|
: rangeExpression (SimpleName rangeExpression)*
|
||||||
;
|
;
|
||||||
|
|
||||||
rangeExpression
|
rangeExpression
|
||||||
@@ -198,7 +197,7 @@ jump
|
|||||||
|
|
||||||
tupleLiteral // Ambiguity when after a SimpleName (infix call). In this case (e) is treated as an expression in parentheses
|
tupleLiteral // Ambiguity when after a SimpleName (infix call). In this case (e) is treated as an expression in parentheses
|
||||||
// to put a tuple, write write ((e))
|
// to put a tuple, write write ((e))
|
||||||
: "(" expression{","} ")"
|
: "(" ((SimpleName "=")? expression){","} ")"
|
||||||
;
|
;
|
||||||
|
|
||||||
functionLiteral // one can use "it" as a parameter name
|
functionLiteral // one can use "it" as a parameter name
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
RANGE(JetTokens.RANGE),
|
RANGE(JetTokens.RANGE),
|
||||||
SIMPLE_NAME(IDENTIFIER),
|
SIMPLE_NAME(IDENTIFIER),
|
||||||
ELVIS(JetTokens.ELVIS),
|
ELVIS(JetTokens.ELVIS),
|
||||||
// TODO: RHS (type parameters)
|
|
||||||
NAMED_INFIX_OR_TYPE(IN_KEYWORD, NOT_IN, IS_KEYWORD, NOT_IS, AS_KEYWORD, COLON),
|
NAMED_INFIX_OR_TYPE(IN_KEYWORD, NOT_IN, IS_KEYWORD, NOT_IS, AS_KEYWORD, COLON),
|
||||||
COMPARISON(LT, GT, LTEQ, GTEQ),
|
COMPARISON(LT, GT, LTEQ, GTEQ),
|
||||||
EQUALITY(EQEQ, EXCLEQ, EQEQEQ, EXCLEQEQEQ),
|
EQUALITY(EQEQ, EXCLEQ, EQEQEQ, EXCLEQEQEQ),
|
||||||
@@ -1019,7 +1018,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
/*
|
/*
|
||||||
* "(" expression ")" // see tupleLiteral
|
* "(" expression ")" // see tupleLiteral
|
||||||
* "(" expression{","} ")"
|
* "(" expression{","} ")"
|
||||||
* TODO: Labels in tuple literals?
|
* TODO: duplication with valueArguments (but for the error messages)
|
||||||
*/
|
*/
|
||||||
private void parseParenthesizedExpressionOrTuple() {
|
private void parseParenthesizedExpressionOrTuple() {
|
||||||
assert at(LPAR);
|
assert at(LPAR);
|
||||||
@@ -1029,12 +1028,17 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
myBuilder.disableEols();
|
myBuilder.disableEols();
|
||||||
advance(); // LPAR
|
advance(); // LPAR
|
||||||
|
|
||||||
|
if (!at(RPAR)) {
|
||||||
while (true) {
|
while (true) {
|
||||||
if (at(COMMA)) errorAndAdvance("Expecting a tuple entry (expression)");
|
while (at(COMMA)) errorAndAdvance("Expecting a tuple entry (expression)");
|
||||||
parseExpression();
|
parseExpression();
|
||||||
if (!at(COMMA)) break;
|
if (!at(COMMA)) break;
|
||||||
advance(); // COMMA
|
advance(); // COMMA
|
||||||
|
if (at(RPAR)) {
|
||||||
|
error("Expecting a tuple entry (expression)");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(RPAR, "Expecting ')'");
|
expect(RPAR, "Expecting ')'");
|
||||||
@@ -1078,13 +1082,18 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
PsiBuilder.Marker list = mark();
|
PsiBuilder.Marker list = mark();
|
||||||
|
|
||||||
myBuilder.disableEols();
|
myBuilder.disableEols();
|
||||||
expect(LPAR, "Expecting a parameter list", TokenSet.create(RPAR));
|
expect(LPAR, "Expecting an argument list", TokenSet.create(RPAR));
|
||||||
|
|
||||||
if (!at(RPAR)) {
|
if (!at(RPAR)) {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
while (at(COMMA)) errorAndAdvance("Expecting an argument");
|
||||||
parseValueArgument();
|
parseValueArgument();
|
||||||
if (!at(COMMA)) break;
|
if (!at(COMMA)) break;
|
||||||
advance(); // COMMA
|
advance(); // COMMA
|
||||||
|
if (at(RPAR)) {
|
||||||
|
error("Expecting an argument");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1368,7 +1368,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
* : "(" functionParameter{","}? ")" // default values
|
* : "(" functionParameter{","}? ")" // default values
|
||||||
* ;
|
* ;
|
||||||
*
|
*
|
||||||
* functionParameter
|
* functionParameter Машка Юдина Неееет! Зимой сельдерей не растет на улице!!! Как же так?
|
||||||
* : modifiers functionParameterRest
|
* : modifiers functionParameterRest
|
||||||
* ;
|
* ;
|
||||||
*
|
*
|
||||||
@@ -1377,8 +1377,6 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
* ;
|
* ;
|
||||||
*/
|
*/
|
||||||
public void parseValueParameterList(boolean isFunctionTypeContents, TokenSet recoverySet) {
|
public void parseValueParameterList(boolean isFunctionTypeContents, TokenSet recoverySet) {
|
||||||
// TODO: val a, b, c : Int
|
|
||||||
|
|
||||||
PsiBuilder.Marker parameters = mark();
|
PsiBuilder.Marker parameters = mark();
|
||||||
|
|
||||||
myBuilder.disableEols();
|
myBuilder.disableEols();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
fun a(
|
fun a(
|
||||||
|
a : foo = (),
|
||||||
a : foo = 10,
|
a : foo = 10,
|
||||||
a : foo = 0x10,
|
a : foo = 0x10,
|
||||||
a : foo = '1',
|
a : foo = '1',
|
||||||
|
|||||||
@@ -9,6 +9,22 @@ JetFile: SimpleExpressions.jet
|
|||||||
VALUE_PARAMETER_LIST
|
VALUE_PARAMETER_LIST
|
||||||
PsiElement(LPAR)('(')
|
PsiElement(LPAR)('(')
|
||||||
PsiWhiteSpace('\n ')
|
PsiWhiteSpace('\n ')
|
||||||
|
VALUE_PARAMETER
|
||||||
|
PsiElement(IDENTIFIER)('a')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(COLON)(':')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('foo')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(EQ)('=')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
TUPLE
|
||||||
|
PsiElement(LPAR)('(')
|
||||||
|
PsiElement(RPAR)(')')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace('\n ')
|
||||||
VALUE_PARAMETER
|
VALUE_PARAMETER
|
||||||
PsiElement(IDENTIFIER)('a')
|
PsiElement(IDENTIFIER)('a')
|
||||||
PsiWhiteSpace(' ')
|
PsiWhiteSpace(' ')
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ import junit.framework.TestSuite;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileFilter;
|
import java.io.FileFilter;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class JetParsingTest extends ParsingTestCase {
|
public class JetParsingTest extends ParsingTestCase {
|
||||||
static {
|
static {
|
||||||
@@ -70,11 +74,15 @@ public class JetParsingTest extends ParsingTestCase {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (recursive) {
|
if (recursive) {
|
||||||
for (File subDir : dir.listFiles(dirFilter)) {
|
List<File> subdirs = Arrays.asList(dir.listFiles(dirFilter));
|
||||||
suite.addTest(suiteForDirectory(dataPath + "/" + subDir.getName(), recursive));
|
Collections.sort(subdirs);
|
||||||
|
for (File subdir : subdirs) {
|
||||||
|
suite.addTest(suiteForDirectory(dataPath + "/" + subdir.getName(), recursive));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (File file : dir.listFiles(extensionFilter)) {
|
List<File> files = Arrays.asList(dir.listFiles(extensionFilter));
|
||||||
|
Collections.sort(files);
|
||||||
|
for (File file : files) {
|
||||||
String fileName = file.getName();
|
String fileName = file.getName();
|
||||||
suite.addTest(new JetParsingTest(dataPath, fileName.substring(0, fileName.length() - extension.length())));
|
suite.addTest(new JetParsingTest(dataPath, fileName.substring(0, fileName.length() - extension.length())));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user