Implement parsing of desctructuring declarations in lambdas
#KT-5828 In Progress
This commit is contained in:
@@ -45,6 +45,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
||||
|
||||
private static final IElementType[] LOCAL_DECLARATION_FIRST =
|
||||
new IElementType[] {CLASS_KEYWORD, INTERFACE_KEYWORD, FUN_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, TYPE_ALIAS_KEYWORD};
|
||||
private static final TokenSet TOKEN_SET_TO_FOLLOW_AFTER_DESTRUCTURING_DECLARATION_IN_LAMBDA = TokenSet.create(ARROW, COMMA, COLON);
|
||||
|
||||
private static ImmutableMap<String, KtToken> tokenSetToMap(TokenSet tokens) {
|
||||
ImmutableMap.Builder<String, KtToken> builder = ImmutableMap.builder();
|
||||
@@ -1054,10 +1055,11 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
||||
advance(); // ARROW
|
||||
paramsFound = true;
|
||||
}
|
||||
else if (at(IDENTIFIER) || at(COLON)) {
|
||||
else if (at(IDENTIFIER) || at(COLON) || at(LPAR)) {
|
||||
// Try to parse a simple name list followed by an ARROW
|
||||
// {a -> ...}
|
||||
// {a, b -> ...}
|
||||
// {(a, b) -> ... }
|
||||
PsiBuilder.Marker rollbackMarker = mark();
|
||||
IElementType nextToken = lookahead(1);
|
||||
boolean preferParamsToExpressions = (nextToken == COMMA || nextToken == COLON);
|
||||
@@ -1144,7 +1146,11 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
||||
|
||||
|
||||
/*
|
||||
* (SimpleName (":" type)?){","}
|
||||
* lambdaParameter{","}
|
||||
*
|
||||
* lambdaParameter
|
||||
* : variableDeclarationEntry
|
||||
* : multipleVariableDeclarations (":" type)?
|
||||
*/
|
||||
private void parseFunctionLiteralParameterList() {
|
||||
PsiBuilder.Marker parameterList = mark();
|
||||
@@ -1155,6 +1161,11 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
||||
if (at(COLON)) {
|
||||
error("Expecting parameter name");
|
||||
}
|
||||
else if (at(LPAR)) {
|
||||
PsiBuilder.Marker destructuringDeclaration = mark();
|
||||
myKotlinParsing.parseMultiDeclarationName(TOKEN_SET_TO_FOLLOW_AFTER_DESTRUCTURING_DECLARATION_IN_LAMBDA);
|
||||
destructuringDeclaration.done(DESTRUCTURING_DECLARATION);
|
||||
}
|
||||
else {
|
||||
expect(IDENTIFIER, "Expecting parameter name", TokenSet.create(ARROW));
|
||||
}
|
||||
|
||||
@@ -1325,7 +1325,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
}
|
||||
|
||||
/*
|
||||
* (SimpleName (":" type)){","}
|
||||
* (SimpleName (":" type){","})
|
||||
*/
|
||||
public void parseMultiDeclarationName(TokenSet follow) {
|
||||
// Parsing multi-name, e.g.
|
||||
|
||||
Reference in New Issue
Block a user