From d4a11fc295094d4e104064eb35318fcd212f9aee Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Mon, 16 Aug 2021 20:06:47 +0300 Subject: [PATCH] [FIR] Disallow bare types for nested type arguments Detect missing WRONG_NUMBER_OF_TYPE_ARGUMENTS --- .../transformers/FirSpecificTypeResolverTransformer.kt | 8 +++++--- .../body/resolve/FirExpressionsResolveTransformer.kt | 4 ++-- .../diagnostics/tests/cast/bare/AsNestedBare.fir.kt | 10 ---------- .../diagnostics/tests/cast/bare/AsNestedBare.kt | 1 + .../tests/generics/RawTypeInIsExpression.fir.kt | 2 +- .../tests/generics/RawTypeInIsPattern.fir.kt | 2 +- 6 files changed, 10 insertions(+), 17 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.fir.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt index a825b32fede..7d27eaeeaed 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt @@ -29,9 +29,9 @@ class FirSpecificTypeResolverTransformer( var areBareTypesAllowed: Boolean = false @OptIn(PrivateForInline::class) - inline fun withAllowedBareTypes(block: () -> R): R { + inline fun withBareTypes(allowed: Boolean = true, block: () -> R): R { val oldValue = areBareTypesAllowed - areBareTypesAllowed = true + areBareTypesAllowed = allowed return try { block() } finally { @@ -72,7 +72,9 @@ class FirSpecificTypeResolverTransformer( override fun transformTypeRef(typeRef: FirTypeRef, data: ScopeClassDeclaration): FirResolvedTypeRef { val scopeOwnerLookupNames = data.scopes.flatMap { it.scopeOwnerLookupNames } session.lookupTracker?.recordTypeLookup(typeRef, scopeOwnerLookupNames, currentFile?.source) - typeRef.transformChildren(this, data) + withBareTypes(allowed = false) { + typeRef.transformChildren(this, data) + } return transformType( typeRef, typeResolver.resolveType( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 272f1e0aeff..af5e8746ca2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -219,7 +219,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform superReferenceContainer.resultType = superTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.SuperCallExplicitType) } superTypeRef !is FirImplicitTypeRef -> { - components.typeResolverTransformer.withAllowedBareTypes { + components.typeResolverTransformer.withBareTypes { superReference.transformChildren(transformer, ResolutionMode.ContextIndependent) } @@ -621,7 +621,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform typeOperatorCall: FirTypeOperatorCall, data: ResolutionMode, ): FirStatement { - val resolved = components.typeResolverTransformer.withAllowedBareTypes { + val resolved = components.typeResolverTransformer.withBareTypes { if (typeOperatorCall.operation == FirOperation.IS || typeOperatorCall.operation == FirOperation.NOT_IS) { components.typeResolverTransformer.withIsOperandOfIsOperator { typeOperatorCall.transformConversionTypeRef(transformer, ResolutionMode.ContextIndependent) diff --git a/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.fir.kt b/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.fir.kt deleted file mode 100644 index 92b6a51fcb0..00000000000 --- a/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -interface Tr -interface G - -fun test(tr: Tr): Any { - return tr as G -} - -fun test1(tr: Tr): Any { - return tr as G.(G) -> G -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.kt b/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.kt index 9f04ed15dbb..d3a6e147543 100644 --- a/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.kt +++ b/compiler/testData/diagnostics/tests/cast/bare/AsNestedBare.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface Tr interface G diff --git a/compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.fir.kt b/compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.fir.kt index 1cccbac6f89..237487208d5 100644 --- a/compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.fir.kt @@ -6,7 +6,7 @@ public fun foo(a: Any) { a is Map a is Map<*, *> a is Map<> - a is List + a is List<Map> a is List a is Int diff --git a/compiler/testData/diagnostics/tests/generics/RawTypeInIsPattern.fir.kt b/compiler/testData/diagnostics/tests/generics/RawTypeInIsPattern.fir.kt index 48305c2d3a4..14b1ffd151f 100644 --- a/compiler/testData/diagnostics/tests/generics/RawTypeInIsPattern.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/RawTypeInIsPattern.fir.kt @@ -5,7 +5,7 @@ public fun foo(a: Any, b: Map) { is Map -> {} is Map<*, *> -> {} is Map<> -> {} - is List -> {} + is List<Map> -> {} is List -> {} is Int -> {} else -> {}