From fb06da2d75316b9890e72fb9e103cdb3a54fb66b Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 7 Apr 2021 14:04:55 +0300 Subject: [PATCH] [FIR] Implement WRONG_LONG_SUFFIX diagnostics, fix tests --- .../resolve/arguments/integerLiteralTypes.kt | 2 +- .../generator/diagnostics/DiagnosticData.kt | 1 + .../diagnostics/FirDiagnosticsList.kt | 1 + .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../LightTreePositioningStrategies.kt | 3 +++ .../SourceElementPositioningStrategies.kt | 5 +++++ .../coneDiagnosticToFirDiagnostic.kt | 1 + .../kotlin/fir/builder/BaseFirBuilder.kt | 21 +++++++++++++++++-- .../fir/diagnostics/ConeSimpleDiagnostic.kt | 2 ++ .../tests/evaluate/wrongLongSuffix.fir.kt | 10 --------- .../tests/evaluate/wrongLongSuffix.kt | 1 + .../wrongLongSuffixForULong.fir.kt | 4 ---- .../unsignedTypes/wrongLongSuffixForULong.kt | 1 + .../p-1/neg/1.3.fir.kt | 11 ---------- .../p-1/neg/1.3.kt | 1 + .../p-1/neg/2.1.fir.kt | 12 +++++------ .../diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 19 files changed, 60 insertions(+), 34 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.fir.kt delete mode 100644 compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt b/compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt index ab2b98af4f4..842196b1d4f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt @@ -5,7 +5,7 @@ fun takeAny(x: Any) {} fun takeString(x: String) {} fun test_0() { - 1l + 1L 1 10000000000 } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt index 0d68a52a1c0..d2073d03f10 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt @@ -56,6 +56,7 @@ enum class PositioningStrategy(private val strategy: String? = null) { VALUE_ARGUMENTS, SUPERTYPES_LIST, RETURN_WITH_LABEL, + LONG_LITERAL_SUFFIX, ; diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 0fed63446ff..28c587e4ffa 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -61,6 +61,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val EMPTY_CHARACTER_LITERAL by error() val TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL by error() val ILLEGAL_ESCAPE by error() + val WRONG_LONG_SUFFIX by error(PositioningStrategy.LONG_LITERAL_SUFFIX) } val UNRESOLVED by object : DiagnosticGroup("Unresolved") { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index c33c7fc84db..e42adaebd23 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -86,6 +86,7 @@ object FirErrors { val EMPTY_CHARACTER_LITERAL by error0() val TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL by error0() val ILLEGAL_ESCAPE by error0() + val WRONG_LONG_SUFFIX by error0(SourceElementPositioningStrategies.LONG_LITERAL_SUFFIX) // Unresolved val HIDDEN by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index 872b4658990..8bcd4198bdc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -522,6 +522,9 @@ object LightTreePositioningStrategies { return markElement(tree.returnKeyword(node) ?: node, startOffset, endOffset, tree) } } + + val LONG_LITERAL_SUFFIX = object : LightTreePositioningStrategy() { + } } fun FirSourceElement.hasValOrVar(): Boolean = diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index 4cafdf92ea0..958e0d29fbd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -177,4 +177,9 @@ object SourceElementPositioningStrategies { LightTreePositioningStrategies.RETURN_WITH_LABEL, PositioningStrategies.RETURN_WITH_LABEL ) + + val LONG_LITERAL_SUFFIX = SourceElementPositioningStrategy( + LightTreePositioningStrategies.LONG_LITERAL_SUFFIX, + PositioningStrategies.LONG_LITERAL_SUFFIX + ) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 004f305faff..3634addb3a2 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -179,6 +179,7 @@ private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0 FirErrors.UNKNOWN_CALLABLE_KIND DiagnosticKind.IllegalProjectionUsage -> FirErrors.ILLEGAL_PROJECTION_USAGE DiagnosticKind.MissingStdlibClass -> FirErrors.MISSING_STDLIB_CLASS + DiagnosticKind.WrongLongSuffix -> FirErrors.WRONG_LONG_SUFFIX DiagnosticKind.Other -> FirErrors.OTHER_ERROR DiagnosticKind.IncorrectCharacterLiteral -> FirErrors.INCORRECT_CHARACTER_LITERAL DiagnosticKind.EmptyCharacterLiteral -> FirErrors.EMPTY_CHARACTER_LITERAL diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index fcd3721ae05..fb2a0419e4a 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -291,20 +291,37 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } return when (type) { INTEGER_CONSTANT -> { + var diagnostic: DiagnosticKind = DiagnosticKind.IllegalConstExpression + val number: Long? + val kind = when { convertedText !is Long -> return reportIncorrectConstant(DiagnosticKind.IllegalConstExpression) hasUnsignedLongSuffix(text) -> { + if (text.endsWith("l")) { + diagnostic = DiagnosticKind.WrongLongSuffix + number = null + } else { + number = convertedText + } ConstantValueKind.UnsignedLong } hasLongSuffix(text) -> { + if (text.endsWith("l")) { + diagnostic = DiagnosticKind.WrongLongSuffix + number = null + } else { + number = convertedText + } ConstantValueKind.Long } hasUnsignedSuffix(text) -> { + number = convertedText ConstantValueKind.UnsignedIntegerLiteral } else -> { + number = convertedText ConstantValueKind.IntegerLiteral } } @@ -312,8 +329,8 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte buildConstOrErrorExpression( sourceElement, kind, - convertedText, - ConeSimpleDiagnostic("Incorrect integer literal: $text", DiagnosticKind.IllegalConstExpression) + number, + ConeSimpleDiagnostic("Incorrect integer literal: $text", diagnostic) ) } FLOAT_CONSTANT -> diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt index bfb6668758e..20d9583d606 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt @@ -36,5 +36,7 @@ enum class DiagnosticKind { TooManyCharactersInCharacterLiteral, IllegalEscape, + WrongLongSuffix, + Other } diff --git a/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.fir.kt b/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.fir.kt deleted file mode 100644 index 1284617c8df..00000000000 --- a/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -val a1: Int = 1l -val a2: Int = 0x1l -val a3: Int = 0X1l -val a4: Int = 0b1l -val a5: Int = 0B1l -val a6: Long = 1l -val a7: Long = 0x1l -val a8: Long = 0X1l -val a9: Long = 0b1l -val a10: Long = 0B1l \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.kt b/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.kt index 148347d8153..f5d2bc72fcb 100644 --- a/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.kt +++ b/compiler/testData/diagnostics/tests/evaluate/wrongLongSuffix.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL val a1: Int = 1l val a2: Int = 0x1l val a3: Int = 0X1l diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.fir.kt b/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.fir.kt deleted file mode 100644 index 144f0b45fa0..00000000000 --- a/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.fir.kt +++ /dev/null @@ -1,4 +0,0 @@ -val a1 = 1ul -val a2 = 0x1ul -val a3 = 0B1ul -val a4 = 1Ul diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.kt b/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.kt index 5c26acd9d13..a671b698092 100644 --- a/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.kt +++ b/compiler/testData/diagnostics/tests/unsignedTypes/wrongLongSuffixForULong.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL val a1 = 1ul val a2 = 0x1ul val a3 = 0B1ul diff --git a/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.fir.kt deleted file mode 100644 index 3daa75fa8eb..00000000000 --- a/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -// TESTCASE NUMBER: 1 -val value_1 = 0l - -// TESTCASE NUMBER: 2 -val value_2 = 1000000000000000l - -// TESTCASE NUMBER: 3 -val value_3 = 0X0l - -// TESTCASE NUMBER: 4 -val value_4 = 0b101l diff --git a/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.kt b/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.kt index f194986e646..a3beb50b014 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/1.3.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL /* * KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE) * diff --git a/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/2.1.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/2.1.fir.kt index 696be1a001a..9acef5d0174 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/2.1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/expressions/constant-literals/the-types-for-integer-literals/p-1/neg/2.1.fir.kt @@ -2,10 +2,10 @@ // TESTCASE NUMBER: 1 fun case_1() { - 0l checkType { check() } - 10000000000000l checkType { check() } - 0X000Af10cDl checkType { check() } - 0x0_0l checkType { check() } - 0b100_000_111_111l checkType { check() } - 0b0l checkType { check() } + 0l checkType { check() } + 10000000000000l checkType { check() } + 0X000Af10cDl checkType { check() } + 0x0_0l checkType { check() } + 0b100_000_111_111l checkType { check() } + 0b0l checkType { check() } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index acf64580914..edd743d0e58 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -149,6 +149,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.WRONG_LONG_SUFFIX) { firDiagnostic -> + WrongLongSuffixImpl( + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.HIDDEN) { firDiagnostic -> HiddenImpl( firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index ca2c02f4d7f..4d7b93124cf 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -124,6 +124,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = IllegalEscape::class } + abstract class WrongLongSuffix : KtFirDiagnostic() { + override val diagnosticClass get() = WrongLongSuffix::class + } + abstract class Hidden : KtFirDiagnostic() { override val diagnosticClass get() = Hidden::class abstract val hidden: KtSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 781349ceffb..f7723ff44ca 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -173,6 +173,13 @@ internal class IllegalEscapeImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class WrongLongSuffixImpl( + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.WrongLongSuffix(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class HiddenImpl( override val hidden: KtSymbol, firDiagnostic: FirPsiDiagnostic<*>,