Extract illegal underscore check function to ParseUtils

This commit is contained in:
Ivan Kylchik
2020-07-02 16:21:12 +03:00
parent d0f6997e6d
commit 54945b7fbc
2 changed files with 19 additions and 30 deletions
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.types.expressions;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.StubBasedPsiElement;
import com.intellij.psi.tree.IElementType;
@@ -39,6 +38,7 @@ import org.jetbrains.kotlin.incremental.KotlinLookupLocation;
import org.jetbrains.kotlin.lexer.KtKeywordToken;
import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.parsing.ParseUtilsKt;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import org.jetbrains.kotlin.psi.psiUtil.ReservedCheckingKt;
@@ -75,12 +75,9 @@ import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt;
import org.jetbrains.kotlin.types.expressions.unqualifiedSuper.UnqualifiedSuperKt;
import org.jetbrains.kotlin.util.OperatorNameConventions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
import static org.jetbrains.kotlin.lexer.KtTokens.*;
@@ -237,8 +234,6 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
return components.dataFlowAnalyzer.createCompileTimeConstantTypeInfo(compileTimeConstant, expression, context);
}
private static final Pattern FP_LITERAL_PARTS = Pattern.compile("(?:([_\\d]*)\\.?([_\\d]*)e?[+-]?([_\\d]*))[f]?");
private void checkUnderscores(
@NotNull KtConstantExpression expression,
@NotNull IElementType elementType,
@@ -254,30 +249,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
return;
}
List<String> parts;
if (elementType == KtNodeTypes.INTEGER_CONSTANT) {
int start = 0;
int end = expression.getText().length();
if (text.startsWith("0x") || text.startsWith("0b")) start += 2;
if (StringUtil.endsWithChar(text, 'l')) --end;
parts = Collections.singletonList(text.substring(start, end));
}
else {
Matcher matcher = FP_LITERAL_PARTS.matcher(text);
parts = new ArrayList<>();
if (matcher.matches()) {
for (int i = 0; i < matcher.groupCount(); i++) {
parts.add(matcher.group(i + 1));
}
}
}
for (String part : parts) {
if (part != null && (part.startsWith("_") || part.endsWith("_"))) {
context.trace.report(Errors.ILLEGAL_UNDERSCORE.on(expression));
return;
}
if (ParseUtilsKt.hasIllegalUnderscore(expression.getText(), elementType)) {
context.trace.report(Errors.ILLEGAL_UNDERSCORE.on(expression));
}
}