FirConstChecks: support "Some string".length case properly
#KT-48165 Fixed
This commit is contained in:
@@ -23,6 +23,16 @@ FILE: const.kt
|
|||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
public final const val l: R|kotlin/Int| = R|/k|
|
public final const val l: R|kotlin/Int| = R|/k|
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
|
public final const val m: R|kotlin/String| = String(123).R|kotlin/Any.toString|()
|
||||||
|
public get(): R|kotlin/String|
|
||||||
|
public final const val n: R|kotlin/Int| = String(456).R|kotlin/String.length|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
public final val o: R|kotlin/String| = String(789)
|
||||||
|
public get(): R|kotlin/String|
|
||||||
|
public final const val p: R|kotlin/String| = R|/o|.R|kotlin/Any.toString|()
|
||||||
|
public get(): R|kotlin/String|
|
||||||
|
public final const val q: R|kotlin/Int| = R|/o|.R|kotlin/String.length|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
public final class ForConst : R|kotlin/Any| {
|
public final class ForConst : R|kotlin/Any| {
|
||||||
public constructor(): R|ForConst| {
|
public constructor(): R|ForConst| {
|
||||||
super<R|kotlin/Any|>()
|
super<R|kotlin/Any|>()
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ const val i = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>ForConst.one() + "one"<!>
|
|||||||
const val j = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>4 * ForConst.two()<!>
|
const val j = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>4 * ForConst.two()<!>
|
||||||
val k = 3 - ForConst.two()
|
val k = 3 - ForConst.two()
|
||||||
const val l = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>k<!>
|
const val l = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>k<!>
|
||||||
|
const val m = "123".toString()
|
||||||
|
const val n = "456".length
|
||||||
|
val o = "789"
|
||||||
|
const val p = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>o.toString()<!>
|
||||||
|
const val q = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>o.length<!>
|
||||||
|
|
||||||
class ForConst{
|
class ForConst{
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+14
-4
@@ -160,8 +160,20 @@ internal fun checkConstantArguments(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expression is FirQualifiedAccessExpression -> {
|
expression is FirQualifiedAccessExpression -> {
|
||||||
|
val propertySymbol = expressionSymbol as? FirPropertySymbol ?: return ConstantArgumentKind.NOT_CONST
|
||||||
|
|
||||||
|
@OptIn(SymbolInternals::class)
|
||||||
|
val property = propertySymbol.fir
|
||||||
when {
|
when {
|
||||||
(expressionSymbol as FirPropertySymbol).isLocal || expressionSymbol.callableId.className?.isRoot == false ->
|
property.name.asString() == "length" -> {
|
||||||
|
val coneType =
|
||||||
|
expression.dispatchReceiver.typeRef.coneTypeSafe<ConeKotlinType>() ?: return ConstantArgumentKind.NOT_CONST
|
||||||
|
val receiverClassId = coneType.lowerBoundIfFlexible().classId
|
||||||
|
if (receiverClassId == StandardClassIds.String) {
|
||||||
|
return checkConstantArguments(expression.dispatchReceiver, session)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
propertySymbol.isLocal || propertySymbol.callableId.className?.isRoot == false ->
|
||||||
return ConstantArgumentKind.NOT_CONST
|
return ConstantArgumentKind.NOT_CONST
|
||||||
expression.typeRef.coneType.classId == StandardClassIds.KClass ->
|
expression.typeRef.coneType.classId == StandardClassIds.KClass ->
|
||||||
return ConstantArgumentKind.NOT_KCLASS_LITERAL
|
return ConstantArgumentKind.NOT_KCLASS_LITERAL
|
||||||
@@ -170,9 +182,7 @@ internal fun checkConstantArguments(
|
|||||||
expression.dispatchReceiver is FirThisReceiverExpression ->
|
expression.dispatchReceiver is FirThisReceiverExpression ->
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@OptIn(SymbolInternals::class)
|
return when (property.initializer) {
|
||||||
val property = expressionSymbol.fir as? FirProperty
|
|
||||||
return when (property?.initializer) {
|
|
||||||
is FirConstExpression<*> -> {
|
is FirConstExpression<*> -> {
|
||||||
if (property.isVal)
|
if (property.isVal)
|
||||||
ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION
|
ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION
|
||||||
|
|||||||
Reference in New Issue
Block a user