diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 27379ee4ae33..25d4412ef135 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -1030,39 +1030,40 @@ public class HighlightUtil extends HighlightUtilBase { final PsiElement parent = expression.getParent(); if (type == JavaTokenType.INTEGER_LITERAL) { + String cleanText = StringUtil.replace(text, "_", ""); //literal 2147483648 may appear only as the operand of the unary negation operator -. - if (!(text.equals(PsiLiteralExpressionImpl._2_IN_31) && + if (!(cleanText.equals(PsiLiteralExpressionImpl._2_IN_31) && parent instanceof PsiPrefixExpression && ((PsiPrefixExpression)parent).getOperationTokenType() == JavaTokenType.MINUS)) { - if (text.equals(PsiLiteralExpressionImpl.HEX_PREFIX)) { + if (cleanText.equals(PsiLiteralExpressionImpl.HEX_PREFIX)) { String message = JavaErrorMessages.message("hexadecimal.numbers.must.contain.at.least.one.hexadecimal.digit"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } - if (text.equals(PsiLiteralExpressionImpl.BIN_PREFIX)) { + if (cleanText.equals(PsiLiteralExpressionImpl.BIN_PREFIX)) { String message = JavaErrorMessages.message("binary.numbers.must.contain.at.least.one.hexadecimal.digit"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } - if (value == null || text.equals(PsiLiteralExpressionImpl._2_IN_31)) { + if (value == null || cleanText.equals(PsiLiteralExpressionImpl._2_IN_31)) { String message = JavaErrorMessages.message("integer.number.too.large"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } } } else if (type == JavaTokenType.LONG_LITERAL) { - String mText = text.endsWith("l") ? text.substring(0, text.length() - 1) : text; + String cleanText = StringUtil.replace(StringUtil.trimEnd(text, 'l'), "_", ""); //literal 9223372036854775808L may appear only as the operand of the unary negation operator -. - if (!(mText.equals(PsiLiteralExpressionImpl._2_IN_63) && + if (!(cleanText.equals(PsiLiteralExpressionImpl._2_IN_63) && parent instanceof PsiPrefixExpression && ((PsiPrefixExpression)parent).getOperationTokenType() == JavaTokenType.MINUS)) { - if (mText.equals(PsiLiteralExpressionImpl.HEX_PREFIX)) { + if (cleanText.equals(PsiLiteralExpressionImpl.HEX_PREFIX)) { String message = JavaErrorMessages.message("hexadecimal.numbers.must.contain.at.least.one.hexadecimal.digit"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } - if (mText.equals(PsiLiteralExpressionImpl.BIN_PREFIX)) { + if (cleanText.equals(PsiLiteralExpressionImpl.BIN_PREFIX)) { String message = JavaErrorMessages.message("binary.numbers.must.contain.at.least.one.hexadecimal.digit"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } - if (value == null || mText.equals(PsiLiteralExpressionImpl._2_IN_63)) { + if (value == null || cleanText.equals(PsiLiteralExpressionImpl._2_IN_63)) { String message = JavaErrorMessages.message("long.number.too.large"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NumericLiterals.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NumericLiterals.java index c597b6ecd2de..e954933774aa 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NumericLiterals.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NumericLiterals.java @@ -20,6 +20,8 @@ public class NumericLiterals { long l5 = 0b0001_0010_0100_1000l; long l6 = 0Bl; long l7 = 0B1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L; + long l8 = 9_223_372_036_854_775_808L; + long l9 = -9_223_372_036_854_775_808L; float f1 = 1_0f; float f2 = 1e1_2f;