Refactoring: extract methods

This commit is contained in:
Nikolay Krasko
2017-12-06 16:25:55 +03:00
parent 04ab3e1519
commit 273bd55f01
@@ -59,14 +59,11 @@ class LambdaExpressionElementType extends IErrorCounterReparseableElementType {
}
private static boolean wasArrowMovedOrDeleted(@Nullable ASTNode parent, CharSequence buffer) {
if (parent == null) return false;
KtLambdaExpression lambdaExpression = findLambdaExpression(parent);
if (lambdaExpression == null) {
return false;
}
PsiElement parentPsi = parent.getPsi();
KtLambdaExpression[] lambdaExpressions = PsiTreeUtil.getChildrenOfType(parentPsi, KtLambdaExpression.class);
if (lambdaExpressions == null || lambdaExpressions.length != 1) return false;
// Now works only when actual node can be spotted ambiguously. Need change in API.
KtLambdaExpression lambdaExpression = lambdaExpressions[0];
KtFunctionLiteral literal = lambdaExpression.getFunctionLiteral();
PsiElement arrow = literal.getArrow();
@@ -75,18 +72,33 @@ class LambdaExpressionElementType extends IErrorCounterReparseableElementType {
int arrowOffset = arrow.getStartOffsetInParent() + literal.getStartOffsetInParent();
return hasTokenMoved(lambdaExpression.getText(), buffer, arrowOffset, KtTokens.ARROW);
}
private static KtLambdaExpression findLambdaExpression(@Nullable ASTNode parent) {
if (parent == null) return null;
PsiElement parentPsi = parent.getPsi();
KtLambdaExpression[] lambdaExpressions = PsiTreeUtil.getChildrenOfType(parentPsi, KtLambdaExpression.class);
if (lambdaExpressions == null || lambdaExpressions.length != 1) return null;
// Now works only when actual node can be spotted ambiguously. Need change in API.
return lambdaExpressions[0];
}
private static boolean hasTokenMoved(String oldText, CharSequence buffer, int oldOffset, IElementType tokenType) {
Lexer oldLexer = new KotlinLexer();
oldLexer.start(lambdaExpression.getText());
oldLexer.start(oldText);
Lexer newLexer = new KotlinLexer();
newLexer.start(buffer);
while (true) {
IElementType oldType = oldLexer.getTokenType();
if (oldType == null) break; // Didn't find an arrow token. Consider it as no arrow was present.
if (oldType == null) break; // Didn't find an expected token. Consider it as no token was present.
IElementType newType = newLexer.getTokenType();
if (newType == null) return true; // New text was finished before reaching arrow in old text
if (newType == null) return true; // New text was finished before reaching expected token in old text
if (newType != oldType) {
if (newType == KtTokens.WHITE_SPACE) {
@@ -98,10 +110,10 @@ class LambdaExpressionElementType extends IErrorCounterReparseableElementType {
continue;
}
return true; // Arrow was moved or deleted
return true; // Expected token was moved or deleted
}
if (oldType == KtTokens.ARROW && oldLexer.getCurrentPosition().getOffset() == arrowOffset) {
if (oldType == tokenType && oldLexer.getCurrentPosition().getOffset() == oldOffset) {
break;
}