From ffbb23661dc65594885d4cce4d94bbce86df9342 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 15 Jun 2022 15:01:16 +0300 Subject: [PATCH] [FIR] Report UNSUPPORTED for default value in function type --- .../checkers/CommonDeclarationCheckers.kt | 5 ++++ ...portedDefaultValueInFunctionTypeChecker.kt | 23 +++++++++++++++++++ .../FirSpecificTypeResolverTransformer.kt | 14 +++++++++++ .../resolve/diagnostics/ConeDiagnostics.kt | 3 +++ ...aultValueForParameterInFunctionType.fir.kt | 20 ---------------- .../DefaultValueForParameterInFunctionType.kt | 1 + 6 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirUnsupportedDefaultValueInFunctionTypeChecker.kt delete mode 100644 compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index 2e0f6a1317b..561e5f3e98f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -163,4 +163,9 @@ object CommonDeclarationCheckers : DeclarationCheckers() { get() = setOf( FirEnumCompanionInEnumConstructorCallChecker, ) + + override val valueParameterCheckers: Set + get() = setOf( + FirUnsupportedDefaultValueInFunctionTypeChecker + ) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirUnsupportedDefaultValueInFunctionTypeChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirUnsupportedDefaultValueInFunctionTypeChecker.kt new file mode 100644 index 00000000000..4507ee65b6a --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirUnsupportedDefaultValueInFunctionTypeChecker.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirValueParameter +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnsupportedDefaultValueInFunctionType +import org.jetbrains.kotlin.fir.types.FirErrorTypeRef + +object FirUnsupportedDefaultValueInFunctionTypeChecker : FirValueParameterChecker() { + override fun check(declaration: FirValueParameter, context: CheckerContext, reporter: DiagnosticReporter) { + val diagnostic = ((declaration.defaultValue?.typeRef as? FirErrorTypeRef)?.diagnostic as? ConeUnsupportedDefaultValueInFunctionType) + if (diagnostic != null) { + reporter.reportOn(diagnostic.source, FirErrors.UNSUPPORTED, diagnostic.reason, context) + } + } +} \ No newline at end of file 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 aad08eef486..cb8229d87cd 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 @@ -11,10 +11,14 @@ import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeUnexpectedTypeArgumentsError +import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.resolve.SupertypeSupplier +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnsupportedDefaultValueInFunctionType +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType import org.jetbrains.kotlin.fir.resolve.typeResolver import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef @@ -180,4 +184,14 @@ class FirSpecificTypeResolverTransformer( override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: ScopeClassDeclaration): FirTypeRef { return implicitTypeRef } + + override fun transformValueParameter(valueParameter: FirValueParameter, data: ScopeClassDeclaration): FirStatement { + val result = transformElement(valueParameter, data) + result.defaultValue?.let { + it.resultType = buildErrorTypeRef { + diagnostic = ConeUnsupportedDefaultValueInFunctionType(it.source) + } + } + return result + } } diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/diagnostics/ConeDiagnostics.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/diagnostics/ConeDiagnostics.kt index bb2e28036f0..e0af7f08b50 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/diagnostics/ConeDiagnostics.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/diagnostics/ConeDiagnostics.kt @@ -204,6 +204,9 @@ class ConeImportFromSingleton(val name: Name) : ConeDiagnostic { open class ConeUnsupported(override val reason: String, val source: KtSourceElement? = null) : ConeDiagnostic +open class ConeUnsupportedDefaultValueInFunctionType(source: KtSourceElement? = null) : + ConeUnsupported("Default value of parameter in function type", source) + class ConeUnresolvedParentInImport(val parentClassId: ClassId) : ConeDiagnostic { override val reason: String get() = "unresolved import" diff --git a/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.fir.kt b/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.fir.kt deleted file mode 100644 index 41c7b8eedbd..00000000000 --- a/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.fir.kt +++ /dev/null @@ -1,20 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE - -fun f(x: Int = 0) {} - -val inVal: (x: Int = 0)->Unit = {} - -fun inParam(fn: (x: Int = 0)->Unit) {} - -fun inParamNested(fn1: (fn2: (n: Int = 0)->Unit)->Unit) {} - -fun inReturn(): (x: Int = 0)->Unit = {} - -class A : (Int)->Unit { - override fun invoke(p1: Int) { - var lambda: (x: Int = 0)->Unit = {} - } - - val prop: (x: Int = 0)->Unit - get(): (x: Int = 0)->Unit = {} -} diff --git a/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt b/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt index a90120e3c81..e32d9b89078 100644 --- a/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt +++ b/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE fun f(x: Int = 0) {}