[FIR] Implement FLOAT_LITERAL_OUT_OF_RANGE diagnostics, fix tests

This commit is contained in:
Ivan Kochurkin
2021-04-07 16:36:18 +03:00
committed by TeamCityServer
parent 4cf30cd1fa
commit 964bba3530
20 changed files with 52 additions and 242 deletions
@@ -57,6 +57,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
SUPERTYPES_LIST,
RETURN_WITH_LABEL,
INT_LITERAL_OUT_OF_RANGE,
FLOAT_LITERAL_OUT_OF_RANGE,
LONG_LITERAL_SUFFIX,
;
@@ -62,6 +62,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
val TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL by error<FirSourceElement, PsiElement>()
val ILLEGAL_ESCAPE by error<FirSourceElement, PsiElement>()
val INT_LITERAL_OUT_OF_RANGE by error<FirSourceElement, PsiElement>()
val FLOAT_LITERAL_OUT_OF_RANGE by error<FirSourceElement, PsiElement>()
val WRONG_LONG_SUFFIX by error<FirSourceElement, KtElement>(PositioningStrategy.LONG_LITERAL_SUFFIX)
}
@@ -87,6 +87,7 @@ object FirErrors {
val TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL by error0<FirSourceElement, PsiElement>()
val ILLEGAL_ESCAPE by error0<FirSourceElement, PsiElement>()
val INT_LITERAL_OUT_OF_RANGE by error0<FirSourceElement, PsiElement>()
val FLOAT_LITERAL_OUT_OF_RANGE by error0<FirSourceElement, PsiElement>()
val WRONG_LONG_SUFFIX by error0<FirSourceElement, KtElement>(SourceElementPositioningStrategies.LONG_LITERAL_SUFFIX)
// Unresolved
@@ -180,6 +180,7 @@ private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0<FirSourceEl
DiagnosticKind.IllegalProjectionUsage -> FirErrors.ILLEGAL_PROJECTION_USAGE
DiagnosticKind.MissingStdlibClass -> FirErrors.MISSING_STDLIB_CLASS
DiagnosticKind.IntLiteralOutOfRange -> FirErrors.INT_LITERAL_OUT_OF_RANGE
DiagnosticKind.FloatLiteralOutOfRange -> FirErrors.FLOAT_LITERAL_OUT_OF_RANGE
DiagnosticKind.WrongLongSuffix -> FirErrors.WRONG_LONG_SUFFIX
DiagnosticKind.Other -> FirErrors.OTHER_ERROR
DiagnosticKind.IncorrectCharacterLiteral -> FirErrors.INCORRECT_CHARACTER_LITERAL
@@ -345,14 +345,14 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
sourceElement,
ConstantValueKind.Float,
convertedText,
ConeSimpleDiagnostic("Incorrect float: $text", DiagnosticKind.IllegalConstExpression)
ConeSimpleDiagnostic("Incorrect float: $text", DiagnosticKind.FloatLiteralOutOfRange)
)
} else {
buildConstOrErrorExpression(
sourceElement,
ConstantValueKind.Double,
convertedText as? Double,
ConeSimpleDiagnostic("Incorrect double: $text", DiagnosticKind.IllegalConstExpression)
ConeSimpleDiagnostic("Incorrect double: $text", DiagnosticKind.FloatLiteralOutOfRange)
)
}
CHARACTER_CONSTANT -> {
@@ -37,6 +37,7 @@ enum class DiagnosticKind {
IllegalEscape,
IntLiteralOutOfRange,
FloatLiteralOutOfRange,
WrongLongSuffix,
Other
@@ -1,50 +0,0 @@
// TESTCASE NUMBER: 1
val value_1 = <!ILLEGAL_CONST_EXPRESSION!>0.0E<!>
// TESTCASE NUMBER: 2
val value_2 = <!ILLEGAL_CONST_EXPRESSION!>00.0e<!>
// TESTCASE NUMBER: 3
val value_3 = <!ILLEGAL_CONST_EXPRESSION!>000.00e-<!>
// TESTCASE NUMBER: 4
val value_4 = <!ILLEGAL_CONST_EXPRESSION!>0000.000E+<!>
// TESTCASE NUMBER: 5
val value_5 = <!ILLEGAL_CONST_EXPRESSION!>1.0e<!>
// TESTCASE NUMBER: 6
val value_6 = <!ILLEGAL_CONST_EXPRESSION!>22.00E+<!>
// TESTCASE NUMBER: 7
val value_7 = <!ILLEGAL_CONST_EXPRESSION!>333.000e<!>
// TESTCASE NUMBER: 8
val value_8 = <!ILLEGAL_CONST_EXPRESSION!>4444.0000E<!>
// TESTCASE NUMBER: 9
val value_9 = <!ILLEGAL_CONST_EXPRESSION!>55555.0e+<!>
// TESTCASE NUMBER: 10
val value_10 = <!ILLEGAL_CONST_EXPRESSION!>666666.00E-<!>
// TESTCASE NUMBER: 11
val value_11 = <!ILLEGAL_CONST_EXPRESSION!>7777777.000e<!>
// TESTCASE NUMBER: 12
val value_12 = <!ILLEGAL_CONST_EXPRESSION!>88888888.0000e<!>
// TESTCASE NUMBER: 13
val value_13 = <!ILLEGAL_CONST_EXPRESSION!>999999999.0E-<!>
// TESTCASE NUMBER: 14
val value_14 = <!ILLEGAL_CONST_EXPRESSION!>7.888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888e+<!>
// TESTCASE NUMBER: 15
val value_15 = <!ILLEGAL_CONST_EXPRESSION!>0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e<!>
// TESTCASE NUMBER: 16
val value_16 = <!ILLEGAL_CONST_EXPRESSION!>0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-<!>
// TESTCASE NUMBER: 17
val value_17 = <!ILLEGAL_CONST_EXPRESSION!>0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
@@ -1,50 +0,0 @@
// TESTCASE NUMBER: 1
val value_1 = <!ILLEGAL_CONST_EXPRESSION!>0.0EF<!>
// TESTCASE NUMBER: 2
val value_2 = <!ILLEGAL_CONST_EXPRESSION!>00.0ef<!>
// TESTCASE NUMBER: 3
val value_3 = <!ILLEGAL_CONST_EXPRESSION!>000.00e-f<!>
// TESTCASE NUMBER: 4
val value_4 = <!ILLEGAL_CONST_EXPRESSION!>0000.000E+F<!>
// TESTCASE NUMBER: 5
val value_5 = <!ILLEGAL_CONST_EXPRESSION!>1.0eF<!>
// TESTCASE NUMBER: 6
val value_6 = <!ILLEGAL_CONST_EXPRESSION!>22.00E+f<!>
// TESTCASE NUMBER: 7
val value_7 = <!ILLEGAL_CONST_EXPRESSION!>333.000ef<!>
// TESTCASE NUMBER: 8
val value_8 = <!ILLEGAL_CONST_EXPRESSION!>4444.0000Ef<!>
// TESTCASE NUMBER: 9
val value_9 = <!ILLEGAL_CONST_EXPRESSION!>55555.0e+F<!>
// TESTCASE NUMBER: 10
val value_10 = <!ILLEGAL_CONST_EXPRESSION!>666666.00E-F<!>
// TESTCASE NUMBER: 11
val value_11 = <!ILLEGAL_CONST_EXPRESSION!>7777777.000eF<!>
// TESTCASE NUMBER: 12
val value_12 = <!ILLEGAL_CONST_EXPRESSION!>88888888.0000ef<!>
// TESTCASE NUMBER: 13
val value_13 = <!ILLEGAL_CONST_EXPRESSION!>999999999.0E-F<!>
// TESTCASE NUMBER: 14
val value_14 = <!ILLEGAL_CONST_EXPRESSION!>7.888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888e+f<!>
// TESTCASE NUMBER: 15
val value_15 = <!ILLEGAL_CONST_EXPRESSION!>0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eF<!>
// TESTCASE NUMBER: 16
val value_16 = <!ILLEGAL_CONST_EXPRESSION!>0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-f<!>
// TESTCASE NUMBER: 17
val value_17 = <!ILLEGAL_CONST_EXPRESSION!>0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+F<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
@@ -1,50 +0,0 @@
// TESTCASE NUMBER: 1
val value_1 = <!ILLEGAL_CONST_EXPRESSION!>.0E<!>
// TESTCASE NUMBER: 2
val value_2 = <!ILLEGAL_CONST_EXPRESSION!>.0e<!>
// TESTCASE NUMBER: 3
val value_3 = <!ILLEGAL_CONST_EXPRESSION!>.00e-<!>
// TESTCASE NUMBER: 4
val value_4 = <!ILLEGAL_CONST_EXPRESSION!>.000E+<!>
// TESTCASE NUMBER: 5
val value_5 = <!ILLEGAL_CONST_EXPRESSION!>.0e<!>
// TESTCASE NUMBER: 6
val value_6 = <!ILLEGAL_CONST_EXPRESSION!>.00E+<!>
// TESTCASE NUMBER: 7
val value_7 = <!ILLEGAL_CONST_EXPRESSION!>.000e<!>
// TESTCASE NUMBER: 8
val value_8 = <!ILLEGAL_CONST_EXPRESSION!>.0000E<!>
// TESTCASE NUMBER: 9
val value_9 = <!ILLEGAL_CONST_EXPRESSION!>.0e+<!>
// TESTCASE NUMBER: 10
val value_10 = <!ILLEGAL_CONST_EXPRESSION!>.00E-<!>
// TESTCASE NUMBER: 11
val value_11 = <!ILLEGAL_CONST_EXPRESSION!>.000e<!>
// TESTCASE NUMBER: 12
val value_12 = <!ILLEGAL_CONST_EXPRESSION!>.0000e<!>
// TESTCASE NUMBER: 13
val value_13 = <!ILLEGAL_CONST_EXPRESSION!>.0E-<!>
// TESTCASE NUMBER: 14
val value_14 = <!ILLEGAL_CONST_EXPRESSION!>.888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888e+<!>
// TESTCASE NUMBER: 15
val value_15 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e<!>
// TESTCASE NUMBER: 16
val value_16 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-<!>
// TESTCASE NUMBER: 17
val value_17 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
@@ -1,50 +0,0 @@
// TESTCASE NUMBER: 1
val value_1 = <!ILLEGAL_CONST_EXPRESSION!>.0EF<!>
// TESTCASE NUMBER: 2
val value_2 = <!ILLEGAL_CONST_EXPRESSION!>.0ef<!>
// TESTCASE NUMBER: 3
val value_3 = <!ILLEGAL_CONST_EXPRESSION!>.00e-f<!>
// TESTCASE NUMBER: 4
val value_4 = <!ILLEGAL_CONST_EXPRESSION!>.000E+F<!>
// TESTCASE NUMBER: 5
val value_5 = <!ILLEGAL_CONST_EXPRESSION!>.0eF<!>
// TESTCASE NUMBER: 6
val value_6 = <!ILLEGAL_CONST_EXPRESSION!>.00E+f<!>
// TESTCASE NUMBER: 7
val value_7 = <!ILLEGAL_CONST_EXPRESSION!>.000ef<!>
// TESTCASE NUMBER: 8
val value_8 = <!ILLEGAL_CONST_EXPRESSION!>.0000Ef<!>
// TESTCASE NUMBER: 9
val value_9 = <!ILLEGAL_CONST_EXPRESSION!>.0e+F<!>
// TESTCASE NUMBER: 10
val value_10 = <!ILLEGAL_CONST_EXPRESSION!>.00E-F<!>
// TESTCASE NUMBER: 11
val value_11 = <!ILLEGAL_CONST_EXPRESSION!>.000eF<!>
// TESTCASE NUMBER: 12
val value_12 = <!ILLEGAL_CONST_EXPRESSION!>.0000ef<!>
// TESTCASE NUMBER: 13
val value_13 = <!ILLEGAL_CONST_EXPRESSION!>.0E-F<!>
// TESTCASE NUMBER: 14
val value_14 = <!ILLEGAL_CONST_EXPRESSION!>.888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888e+f<!>
// TESTCASE NUMBER: 15
val value_15 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eF<!>
// TESTCASE NUMBER: 16
val value_16 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-f<!>
// TESTCASE NUMBER: 17
val value_17 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+F<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
@@ -1,26 +0,0 @@
// TESTCASE NUMBER: 1
val value_1 = <!ILLEGAL_CONST_EXPRESSION!>0e<!>
// TESTCASE NUMBER: 2
val value_2 = <!ILLEGAL_CONST_EXPRESSION!>00e-<!>
// TESTCASE NUMBER: 3
val value_3 = <!ILLEGAL_CONST_EXPRESSION!>000E+<!>
// TESTCASE NUMBER: 4
val value_4 = <!ILLEGAL_CONST_EXPRESSION!>0000e+<!>
// TESTCASE NUMBER: 5
val value_5 = <!ILLEGAL_CONST_EXPRESSION!>00000000000000000000000000000000000000E<!>
// TESTCASE NUMBER: 6
val value_6 = <!ILLEGAL_CONST_EXPRESSION!>34567E+<!>
// TESTCASE NUMBER: 7
val value_7 = <!ILLEGAL_CONST_EXPRESSION!>456e-<!>
// TESTCASE NUMBER: 8
val value_8 = <!ILLEGAL_CONST_EXPRESSION!>55555e+f<!>
// TESTCASE NUMBER: 9
val value_9 = <!ILLEGAL_CONST_EXPRESSION!>666666E-F<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
@@ -1,44 +1,53 @@
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-100
* MAIN LINK: expressions, constant-literals, real-literals -> paragraph 4 -> sentence 1
* NUMBER: 1
* DESCRIPTION: Real literals without digits after an exponent mark and with undescores in the different pisitions.
*/
// TESTCASE NUMBER: 1
val value_1 = <!ILLEGAL_CONST_EXPRESSION!>.0_0e-<!>
val value_1 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.0_0e-<!>
// TESTCASE NUMBER: 2
val value_2 = <!ILLEGAL_CONST_EXPRESSION!>0_0___0E+<!>
val value_2 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0_0___0E+<!>
// TESTCASE NUMBER: 3
val value_3 = <!ILLEGAL_CONST_EXPRESSION!>.0_0e-F<!>
val value_3 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.0_0e-F<!>
// TESTCASE NUMBER: 4
val value_4 = <!ILLEGAL_CONST_EXPRESSION!>0__________________________0E+<!>
val value_4 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0__________________________0E+<!>
// TESTCASE NUMBER: 5
val value_5 = <!ILLEGAL_CONST_EXPRESSION!>0_00e<!>
val value_5 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0_00e<!>
// TESTCASE NUMBER: 6
val value_6 = <!ILLEGAL_CONST_EXPRESSION!>.0_0__0___0E<!>
val value_6 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.0_0__0___0E<!>
// TESTCASE NUMBER: 7
val value_7 = <!ILLEGAL_CONST_EXPRESSION!>0_1e+f<!>
val value_7 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0_1e+f<!>
// TESTCASE NUMBER: 8
val value_8 = <!ILLEGAL_CONST_EXPRESSION!>.0_0E-<!>
val value_8 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.0_0E-<!>
// TESTCASE NUMBER: 9
val value_9 = <!ILLEGAL_CONST_EXPRESSION!>0___0__0e<!>
val value_9 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0___0__0e<!>
// TESTCASE NUMBER: 10
val value_10 = <!ILLEGAL_CONST_EXPRESSION!>0_00_0ef<!>
val value_10 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0_00_0ef<!>
// TESTCASE NUMBER: 11
val value_11 = <!ILLEGAL_CONST_EXPRESSION!>.0_5E-F<!>
val value_11 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.0_5E-F<!>
// TESTCASE NUMBER: 12
val value_12 = <!ILLEGAL_CONST_EXPRESSION!>.8____8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888_____8888888888888888888e+f<!>
val value_12 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.8____8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888_____8888888888888888888e+f<!>
// TESTCASE NUMBER: 13
val value_13 = <!ILLEGAL_CONST_EXPRESSION!>0_0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_0eF<!>
val value_13 = <!FLOAT_LITERAL_OUT_OF_RANGE!>0_0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_0eF<!>
// TESTCASE NUMBER: 14
val value_14 = <!ILLEGAL_UNDERSCORE!>0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_e-f<!>
// TESTCASE NUMBER: 15
val value_15 = <!ILLEGAL_CONST_EXPRESSION!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+<!>
val value_15 = <!FLOAT_LITERAL_OUT_OF_RANGE!>.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+<!>
@@ -155,6 +155,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.FLOAT_LITERAL_OUT_OF_RANGE) { firDiagnostic ->
FloatLiteralOutOfRangeImpl(
firDiagnostic as FirPsiDiagnostic<*>,
token,
)
}
add(FirErrors.WRONG_LONG_SUFFIX) { firDiagnostic ->
WrongLongSuffixImpl(
firDiagnostic as FirPsiDiagnostic<*>,
@@ -128,6 +128,10 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = IntLiteralOutOfRange::class
}
abstract class FloatLiteralOutOfRange : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = FloatLiteralOutOfRange::class
}
abstract class WrongLongSuffix : KtFirDiagnostic<KtElement>() {
override val diagnosticClass get() = WrongLongSuffix::class
}
@@ -180,6 +180,13 @@ internal class IntLiteralOutOfRangeImpl(
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
}
internal class FloatLiteralOutOfRangeImpl(
firDiagnostic: FirPsiDiagnostic<*>,
override val token: ValidityToken,
) : KtFirDiagnostic.FloatLiteralOutOfRange(), KtAbstractFirDiagnostic<PsiElement> {
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
}
internal class WrongLongSuffixImpl(
firDiagnostic: FirPsiDiagnostic<*>,
override val token: ValidityToken,