Reparse lambda expression after removing parameter comma (KT-21497)

Without the parameter it can become block.

 #KT-21497 Fixed
This commit is contained in:
Nikolay Krasko
2017-12-06 18:52:35 +03:00
parent 273bd55f01
commit b7ba45c001
3 changed files with 44 additions and 4 deletions
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.parsing.KotlinParser;
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
import org.jetbrains.kotlin.psi.KtLambdaExpression;
import org.jetbrains.kotlin.psi.KtParameterList;
class LambdaExpressionElementType extends IErrorCounterReparseableElementType {
public LambdaExpressionElementType() {
@@ -55,7 +56,7 @@ class LambdaExpressionElementType extends IErrorCounterReparseableElementType {
@Override
public boolean isParsable(@Nullable ASTNode parent, CharSequence buffer, Language fileLanguage, Project project) {
return super.isParsable(parent, buffer, fileLanguage, project) &&
!wasArrowMovedOrDeleted(parent, buffer);
!wasArrowMovedOrDeleted(parent, buffer) && !wasParameterCommaMovedOrDeleted(parent, buffer);
}
private static boolean wasArrowMovedOrDeleted(@Nullable ASTNode parent, CharSequence buffer) {
@@ -75,6 +76,27 @@ class LambdaExpressionElementType extends IErrorCounterReparseableElementType {
return hasTokenMoved(lambdaExpression.getText(), buffer, arrowOffset, KtTokens.ARROW);
}
private static boolean wasParameterCommaMovedOrDeleted(@Nullable ASTNode parent, CharSequence buffer) {
KtLambdaExpression lambdaExpression = findLambdaExpression(parent);
if (lambdaExpression == null) {
return false;
}
KtFunctionLiteral literal = lambdaExpression.getFunctionLiteral();
KtParameterList valueParameterList = literal.getValueParameterList();
if (valueParameterList == null || valueParameterList.getParameters().size() <= 1) {
return false;
}
PsiElement comma = valueParameterList.getFirstComma();
if (comma == null) {
return false;
}
int commaOffset = comma.getTextOffset() - lambdaExpression.getTextOffset();
return hasTokenMoved(lambdaExpression.getText(), buffer, commaOffset, KtTokens.COMMA);
}
private static KtLambdaExpression findLambdaExpression(@Nullable ASTNode parent) {
if (parent == null) return null;
@@ -89,4 +89,9 @@ public class KtParameterList extends KtElementImplStub<KotlinPlaceHolderStub<KtP
public PsiElement getLeftParenthesis() {
return findChildByType(KtTokens.LPAR);
}
@Nullable
public PsiElement getFirstComma() {
return findChildByType(KtTokens.COMMA);
}
}