fixup! [FIR] do not use FirValueParameter for function type parameter
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index b74b7d1..af54411 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt
@@ -15,12 +15,11 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe -import org.jetbrains.kotlin.fir.FirLabel -import org.jetbrains.kotlin.fir.FirPackageDirective +import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isSuspend import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirSuperReference @@ -99,8 +98,12 @@ val firDeclaration = if (isAnonymousFunction(declaration)) declaration.toFirAnonymousFunction() else - declaration.getOrBuildFirOfType<FirCallableDeclaration>(firResolveSession) - return firDeclaration.returnTypeRef.coneType.asKtType() + declaration.getOrBuildFir(firResolveSession) + return when (firDeclaration) { + is FirCallableDeclaration -> firDeclaration.returnTypeRef.coneType.asKtType() + is FirFunctionTypeParameter -> firDeclaration.returnTypeRef.coneType.asKtType() + else -> unexpectedElementError<FirElement>(firDeclaration) + } } override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType {
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt index 768c16f..03de7b0 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt
@@ -121,7 +121,7 @@ append(classId.asSingleFqName().toString()) val parameters = buildList { receiverTypeRef?.let(::add) - valueParameters.mapTo(this) { it.returnTypeRef } + parameters.mapTo(this) { it.returnTypeRef } returnTypeRef.let(::add) } if (parameters.isNotEmpty()) {
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/types/functionalTypeArgument.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/types/functionalTypeArgument.txt index 0130de8..17750fb 100644 --- a/analysis/low-level-api-fir/testdata/getOrBuildFir/types/functionalTypeArgument.txt +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/types/functionalTypeArgument.txt
@@ -1,6 +1,6 @@ KT element: KtParameter -FIR element: FirValueParameterImpl +FIR element: FirFunctionTypeParameterImpl FIR source kind: KtRealSourceElementKind FIR element rendered: -R|kotlin/Int| +R|kotlin/Int| \ No newline at end of file
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmNamesChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmNamesChecker.kt index 16d4588..dfac804 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmNamesChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmNamesChecker.kt
@@ -21,22 +21,22 @@ private val DANGEROUS_CHARS = setOf('?', '*', '"', '|', '%') - fun checkNameAndReport(name: Name, source: KtSourceElement?, context: CheckerContext, reporter: DiagnosticReporter) { - if (source != null && - source.kind !is KtFakeSourceElementKind && + fun checkNameAndReport(name: Name, declarationSource: KtSourceElement?, context: CheckerContext, reporter: DiagnosticReporter) { + if (declarationSource != null && + declarationSource.kind !is KtFakeSourceElementKind && !name.isSpecial ) { val nameString = name.asString() if (nameString.any { it in INVALID_CHARS }) { reporter.reportOn( - source, + declarationSource, FirErrors.INVALID_CHARACTERS, "contains illegal characters: ${INVALID_CHARS.intersect(nameString.toSet()).joinToString("")}", context ) } else if (nameString.any { it in DANGEROUS_CHARS }) { reporter.reportOn( - source, + declarationSource, FirErrors.DANGEROUS_CHARACTERS, DANGEROUS_CHARS.intersect(nameString.toSet()).joinToString(""), context
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirFunctionalTypeParameterNameChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirFunctionalTypeParameterNameChecker.kt index 8ab5211..02a2be7 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirFunctionalTypeParameterNameChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirFunctionalTypeParameterNameChecker.kt
@@ -6,14 +6,12 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.type import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.diagnostics.nameIdentifier import org.jetbrains.kotlin.fir.FirFunctionTypeParameter import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.type.FirTypeRefChecker import org.jetbrains.kotlin.fir.analysis.jvm.FirJvmNamesChecker import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.toKtLightSourceElement object FirFunctionalTypeParameterNameChecker : FirTypeRefChecker() { override fun check(typeRef: FirTypeRef, context: CheckerContext, reporter: DiagnosticReporter) { @@ -26,11 +24,6 @@ private fun check(typeRef: FirFunctionTypeParameter, context: CheckerContext, reporter: DiagnosticReporter) { val name = typeRef.name ?: return val typeRefSource = typeRef.source ?: return - FirJvmNamesChecker.checkNameAndReport( - name, - typeRefSource.treeStructure.nameIdentifier(typeRefSource.lighterASTNode)?.toKtLightSourceElement(typeRefSource.treeStructure), - context, - reporter - ) + FirJvmNamesChecker.checkNameAndReport(name, typeRefSource, context, reporter) } } \ No newline at end of file
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 57121a4..57a5afc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt
@@ -18,8 +18,8 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.getChild -import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.containingClassForLocalAttr +import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.* @@ -540,10 +540,10 @@ } } is FirFunctionTypeRef -> { - val paramters = delegatedTypeRef.parameters + val parameters = delegatedTypeRef.parameters delegatedTypeRef.receiverTypeRef?.let { result.add(FirTypeRefSource(it, it.source)) } - for (valueParameter in paramters) { + for (valueParameter in parameters) { val valueParamTypeRef = valueParameter.returnTypeRef result.add(FirTypeRefSource(valueParamTypeRef, valueParamTypeRef.source)) }
diff --git a/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt b/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt index e71d64c..77169ad 100644 --- a/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt +++ b/compiler/testData/diagnostics/tests/DefaultValueForParameterInFunctionType.kt
@@ -1,11 +1,21 @@ // FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE +fun f(x: Int = 0) {} + +val inVal: (x: Int = <!UNSUPPORTED!>0<!>)->Unit = {} + +fun inParam(fn: (x: Int = <!UNSUPPORTED!>0<!>)->Unit) {} + +fun inParamNested(fn1: (fn2: (n: Int = <!UNSUPPORTED!>0<!>)->Unit)->Unit) {} + +fun inReturn(): (x: Int = <!UNSUPPORTED!>0<!>)->Unit = {} + class A : (Int)->Unit { override fun invoke(p1: Int) { var lambda: (x: Int = <!UNSUPPORTED!>0<!>)->Unit = {} } val prop: (x: Int = <!UNSUPPORTED!>0<!>)->Unit - get(): (x: Int = <!UNSUPPORTED!>0<!>)->Unit = {} + get(): (x: Int = <!UNSUPPORTED!>0<!>)->Unit = {} }