K2: split EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS to property/objects
Related to KT-64982
This commit is contained in:
committed by
Space Team
parent
4fd73b06e2
commit
e999e289ee
+1
@@ -3575,6 +3575,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
}
|
||||
add(FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS) { firDiagnostic ->
|
||||
ExplicitTypeArgumentsInPropertyAccessImpl(
|
||||
firDiagnostic.a,
|
||||
firDiagnostic as KtPsiDiagnostic,
|
||||
token,
|
||||
)
|
||||
|
||||
+1
@@ -2514,6 +2514,7 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
|
||||
interface ExplicitTypeArgumentsInPropertyAccess : KtFirDiagnostic<KtExpression> {
|
||||
override val diagnosticClass get() = ExplicitTypeArgumentsInPropertyAccess::class
|
||||
val kind: String
|
||||
}
|
||||
|
||||
interface LateinitIntrinsicCallOnNonLiteral : KtFirDiagnostic<PsiElement> {
|
||||
|
||||
+1
@@ -3024,6 +3024,7 @@ internal class LocalVariableWithTypeParametersImpl(
|
||||
) : KtAbstractFirDiagnostic<KtProperty>(firDiagnostic, token), KtFirDiagnostic.LocalVariableWithTypeParameters
|
||||
|
||||
internal class ExplicitTypeArgumentsInPropertyAccessImpl(
|
||||
override val kind: String,
|
||||
firDiagnostic: KtPsiDiagnostic,
|
||||
token: KtLifetimeToken,
|
||||
) : KtAbstractFirDiagnostic<KtExpression>(firDiagnostic, token), KtFirDiagnostic.ExplicitTypeArgumentsInPropertyAccess
|
||||
|
||||
compiler/fir/analysis-tests/testData/resolve/expresssions/propertyAccessWithExplicitTypeArguments.kt
Vendored
+22
-22
@@ -6,19 +6,19 @@ fun f1(x: Int) {
|
||||
val y = 5
|
||||
val s = "hello"
|
||||
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>x<!><Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>x<!><String, String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>y<!><Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>y<!><String, Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>s<!><String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>s<!><Int, String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>x<!><Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>x<!><String, String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>y<!><Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>y<!><String, Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>s<!><String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>s<!><Int, String>
|
||||
}
|
||||
|
||||
// Case 2: Simple property
|
||||
val property: Int = 10
|
||||
|
||||
fun f2() {
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>property<!><String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>property<!><String>
|
||||
}
|
||||
|
||||
// Case 3: Simple property with getter
|
||||
@@ -26,7 +26,7 @@ val property2: Int
|
||||
get() = 10
|
||||
|
||||
fun f3() {
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>property2<!><String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>property2<!><String>
|
||||
}
|
||||
|
||||
// Case 4: Property with extension and/or context receiver
|
||||
@@ -51,26 +51,26 @@ fun f4() {
|
||||
val receiver = Receiver<Int>()
|
||||
|
||||
receiver.hello1
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello1<!><Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello1<!><Int>
|
||||
receiver.<!TYPE_ARGUMENTS_NOT_ALLOWED!>hello1<!><Int, String>()
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello1<!><String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello1<!><Int, String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello1<!><Int, String, String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello1<!><String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello1<!><Int, String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello1<!><Int, String, String>
|
||||
|
||||
with (ContextImpl<String>()) {
|
||||
hello2
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello2<!><String>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello2<!><String>
|
||||
<!TYPE_ARGUMENTS_NOT_ALLOWED!>hello2<!><String, Int>()
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello2<!><Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello2<!><String, Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello2<!><String, Int, Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello2<!><Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello2<!><String, Int>
|
||||
<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello2<!><String, Int, Int>
|
||||
|
||||
receiver.hello3
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello3<!><Int, String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello3<!><Int, String>
|
||||
receiver.<!TYPE_ARGUMENTS_NOT_ALLOWED!>hello3<!><Int, String>()
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello3<!><String, Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello3<!><Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>hello3<!><Int, String, String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello3<!><String, Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello3<!><Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>hello3<!><Int, String, String>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,6 @@ inline val <reified A> Receiver<A>.helloReified: String
|
||||
fun f5() {
|
||||
val receiver = Receiver<Int>()
|
||||
receiver.helloReified
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>helloReified<!><Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>helloReified<!><String>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>helloReified<!><Int>
|
||||
receiver.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Property")!>helloReified<!><String>
|
||||
}
|
||||
|
||||
+3
-1
@@ -1229,7 +1229,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error<KtModifierListOwner>(PositioningStrategy.ABSTRACT_MODIFIER)
|
||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
|
||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
|
||||
val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS by error<KtExpression>(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED)
|
||||
val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS by error<KtExpression>(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) {
|
||||
parameter<String>("kind")
|
||||
}
|
||||
|
||||
val LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL by error<PsiElement>()
|
||||
val LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT by error<PsiElement>()
|
||||
|
||||
+1
-1
@@ -645,7 +645,7 @@ object FirErrors {
|
||||
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS: KtDiagnosticFactory0 by error0<KtModifierListOwner>(SourceElementPositioningStrategies.ABSTRACT_MODIFIER)
|
||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING: KtDiagnosticFactory0 by warning0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
|
||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS: KtDiagnosticFactory0 by error0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
|
||||
val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS: KtDiagnosticFactory0 by error0<KtExpression>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
||||
val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS: KtDiagnosticFactory1<String> by error1<KtExpression, String>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
||||
val LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL: KtDiagnosticFactory0 by error0<PsiElement>()
|
||||
val LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT: KtDiagnosticFactory0 by error0<PsiElement>()
|
||||
val LATEINIT_INTRINSIC_CALL_IN_INLINE_FUNCTION: KtDiagnosticFactory0 by error0<PsiElement>()
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ object FirPropertyAccessTypeArgumentsChecker : FirPropertyAccessExpressionChecke
|
||||
if (expression.calleeReference !is FirErrorNamedReference) {
|
||||
val hasExplicitTypeArgument = expression.typeArguments.any { it.source != null }
|
||||
if (hasExplicitTypeArgument) {
|
||||
reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, context)
|
||||
reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "Property", context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ object FirStandaloneQualifierChecker : FirResolvedQualifierChecker() {
|
||||
// Note: if it's real Unit, it will be filtered by ClassKind.OBJECT check below in reportErrorOn
|
||||
if (!expression.resolvedType.isUnit) {
|
||||
if (expression.typeArguments.any { it.source != null }) {
|
||||
reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, context)
|
||||
reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "Object", context)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
+1
-1
@@ -1979,7 +1979,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "Property in primary constructor cannot be declared as abstract.")
|
||||
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING, "Type parameters for local variables are deprecated.")
|
||||
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables cannot have type parameters.")
|
||||
map.put(EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "Property access cannot have explicit type arguments.")
|
||||
map.put(EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "{0} access cannot have explicit type arguments.", STRING)
|
||||
|
||||
map.put(LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL, "This declaration can only be called on a property literal (e.g. 'Foo::bar').")
|
||||
map.put(LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT, "This declaration can only be called on a reference to a 'lateinit' property.")
|
||||
|
||||
+3
-3
@@ -15,11 +15,11 @@ class Outer<T> {
|
||||
object Obj
|
||||
}
|
||||
|
||||
val test = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>Outer<!><String>
|
||||
val test = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Object")!>Outer<!><String>
|
||||
|
||||
val test2 = Outer.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>Nested<!><String>
|
||||
val test2 = Outer.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Object")!>Nested<!><String>
|
||||
|
||||
val test3 = Outer<Int>.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>Inner<!><Double>
|
||||
val test3 = Outer<Int>.<!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS("Object"), NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>Inner<!><Double>
|
||||
|
||||
val test4 = Outer<Int>.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>Obj<!>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user