diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 878661fb795..09caf3c1e0f 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -731,6 +731,49 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val RETURN_NOT_ALLOWED by error(PositioningStrategy.RETURN_WITH_LABEL) val RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY by error(PositioningStrategy.RETURN_WITH_LABEL) } + + val INLINE by object : DiagnosticGroup("Inline") { + val USAGE_IS_NOT_INLINABLE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("parameter") + } + + val NON_LOCAL_RETURN_NOT_ALLOWED by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("parameter") + } + + val RECURSION_IN_INLINE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("symbol") + } + + val NON_PUBLIC_CALL_FROM_PUBLIC_INLINE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("inlineDeclaration") + parameter("referencedDeclaration") + } + + val PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("inlineDeclaration") + parameter("referencedDeclaration") + } + + val PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("inlineDeclaration") + parameter("referencedDeclaration") + } + + val PROTECTED_CALL_FROM_PUBLIC_INLINE by warning(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("inlineDeclaration") + parameter("referencedDeclaration") + } + + val PRIVATE_CLASS_MEMBER_FROM_INLINE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("inlineDeclaration") + parameter("referencedDeclaration") + } + + val SUPER_CALL_FROM_PUBLIC_INLINE by warning(PositioningStrategy.REFERENCE_BY_QUALIFIED) { + parameter("symbol") + } + } } private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index afb29389227..ef74fe6e4f4 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -440,4 +440,15 @@ object FirErrors { val RETURN_NOT_ALLOWED by error0(SourceElementPositioningStrategies.RETURN_WITH_LABEL) val RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY by error0(SourceElementPositioningStrategies.RETURN_WITH_LABEL) + // Inline + val USAGE_IS_NOT_INLINABLE by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val NON_LOCAL_RETURN_NOT_ALLOWED by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val RECURSION_IN_INLINE by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val NON_PUBLIC_CALL_FROM_PUBLIC_INLINE by error2, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE by error2, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR by error2, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val PROTECTED_CALL_FROM_PUBLIC_INLINE by warning2, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val PRIVATE_CLASS_MEMBER_FROM_INLINE by error2, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val SUPER_CALL_FROM_PUBLIC_INLINE by warning1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt index 7f0d40a77b0..746e2464d0e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt @@ -186,7 +186,8 @@ internal val FirDeclaration.isEnumEntryInitializer: Boolean return (containingClassAttr as? ConeClassLookupTagWithFixedSymbol)?.symbol?.fir?.classKind == ClassKind.ENUM_ENTRY } -internal val FirMemberDeclaration.isLocalMember: Boolean +// contract: returns(true) implies (this is FirMemberDeclaration) +internal val FirDeclaration.isLocalMember: Boolean get() = when (this) { is FirProperty -> this.isLocal is FirRegularClass -> this.isLocal diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt new file mode 100644 index 00000000000..6b923bce006 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -0,0 +1,310 @@ +/* + * Copyright 2010-2021 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.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.EffectiveVisibility +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.util.checkChildrenWithCustomVisitor +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.references.FirSuperReference +import org.jetbrains.kotlin.fir.resolve.inference.isBuiltinFunctionalType +import org.jetbrains.kotlin.fir.resolve.inference.isFunctionalType +import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol +import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.isMarkedNullable +import org.jetbrains.kotlin.fir.types.toSymbol +import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor +import org.jetbrains.kotlin.util.OperatorNameConventions + +object FirInlineDeclarationChecker : FirMemberDeclarationChecker() { + override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (!declaration.isInline) return + // local inline functions are prohibited + if (declaration.isLocalMember) return + if (declaration !is FirPropertyAccessor && declaration !is FirSimpleFunction) return + + val effectiveVisibility = declaration.effectiveVisibility + val function = declaration as FirFunction<*> + checkInlineFunctionBody(function, effectiveVisibility, context, reporter) + } + + private fun checkInlineFunctionBody( + function: FirFunction<*>, + effectiveVisibility: EffectiveVisibility, + context: CheckerContext, + reporter: DiagnosticReporter + ) { + val body = function.body ?: return + val inlinableParameters = function.valueParameters.filter { + if (it.isNoinline) return@filter false + val type = it.returnTypeRef.coneType + !type.isMarkedNullable && type.isFunctionalType(context.session) { kind -> !kind.isReflectType } + } + + val visitor = Visitor( + function, + effectiveVisibility, + inlinableParameters, + context.session, + reporter + ) + body.checkChildrenWithCustomVisitor(context, visitor) + } + + private class Visitor( + val inlineFunction: FirFunction<*>, + val inlineFunEffectiveVisibility: EffectiveVisibility, + val inlinableParameters: List, + val session: FirSession, + val reporter: DiagnosticReporter + ) : FirDefaultVisitor() { + private val isEffectivelyPrivateApiFunction: Boolean = inlineFunEffectiveVisibility.privateApi + + private val prohibitProtectedCallFromInline: Boolean = + session.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitProtectedCallFromInline) + + override fun visitElement(element: FirElement, data: CheckerContext) {} + + override fun visitFunctionCall(functionCall: FirFunctionCall, data: CheckerContext) { + val targetSymbol = functionCall.toResolvedCallableSymbol() + checkReceiversOfQualifiedAccessExpression(functionCall, targetSymbol, data) + checkArgumentsOfCall(functionCall, targetSymbol, data) + checkQualifiedAccess(functionCall, targetSymbol, data) + } + + override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: CheckerContext) { + val targetSymbol = qualifiedAccessExpression.toResolvedCallableSymbol() + checkQualifiedAccess(qualifiedAccessExpression, targetSymbol, data) + checkReceiversOfQualifiedAccessExpression(qualifiedAccessExpression, targetSymbol, data) + } + + override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: CheckerContext) { + val propertySymbol = variableAssignment.calleeReference.toResolvedCallableSymbol() as? FirPropertySymbol ?: return + val setterSymbol = propertySymbol.fir.setter?.symbol ?: return + checkQualifiedAccess(variableAssignment, setterSymbol, data) + } + + private fun checkReceiversOfQualifiedAccessExpression( + qualifiedAccessExpression: FirQualifiedAccessExpression, + targetSymbol: AbstractFirBasedSymbol<*>?, + context: CheckerContext + ) { + checkReceiver(qualifiedAccessExpression, qualifiedAccessExpression.dispatchReceiver, targetSymbol, context) + checkReceiver(qualifiedAccessExpression, qualifiedAccessExpression.extensionReceiver, targetSymbol, context) + } + + private fun checkArgumentsOfCall( + functionCall: FirFunctionCall, + targetSymbol: AbstractFirBasedSymbol<*>?, + context: CheckerContext + ) { + val calledFunction = (targetSymbol as? FirNamedFunctionSymbol)?.fir ?: return + val argumentMapping = functionCall.resolvedArgumentMapping ?: return + for ((wrappedArgument, valueParameter) in argumentMapping) { + val argument = wrappedArgument.unwrapArgument() + val resolvedArgumentSymbol = argument.toResolvedCallableSymbol() as? FirVariableSymbol<*> ?: continue + + val valueParameterOfOriginalInlineFunction = inlinableParameters.firstOrNull { it == resolvedArgumentSymbol.fir } + if (valueParameterOfOriginalInlineFunction != null) { + val factory = when { + calledFunction.isInline -> when { + valueParameter.isNoinline -> FirErrors.USAGE_IS_NOT_INLINABLE + valueParameter.isCrossinline && !valueParameterOfOriginalInlineFunction.isCrossinline + -> FirErrors.NON_LOCAL_RETURN_NOT_ALLOWED + else -> continue + } + else -> FirErrors.USAGE_IS_NOT_INLINABLE + } + reporter.reportOn(argument.source, factory, valueParameterOfOriginalInlineFunction.symbol, context) + } + } + } + + private fun checkReceiver( + qualifiedAccessExpression: FirQualifiedAccessExpression, + receiverExpression: FirExpression, + targetSymbol: AbstractFirBasedSymbol<*>?, + context: CheckerContext + ) { + val receiverSymbol = receiverExpression.toResolvedCallableSymbol() ?: return + if (receiverSymbol.fir in inlinableParameters) { + val valueParameter = receiverSymbol.fir as FirValueParameter + if (!isInvokeOrInlineExtension(targetSymbol)) { + reporter.reportOn( + qualifiedAccessExpression.source, + FirErrors.USAGE_IS_NOT_INLINABLE, + valueParameter.symbol, + context + ) + } + } + } + + private fun isInvokeOrInlineExtension(targetSymbol: AbstractFirBasedSymbol<*>?): Boolean { + if (targetSymbol !is FirNamedFunctionSymbol) return false + val function = targetSymbol.fir + if (function.isInline) return true + return function.name == OperatorNameConventions.INVOKE && + function.dispatchReceiverType?.isBuiltinFunctionalType(session) == true + } + + private fun checkQualifiedAccess( + qualifiedAccess: FirQualifiedAccess, + targetSymbol: AbstractFirBasedSymbol<*>?, + context: CheckerContext + ) { + val source = qualifiedAccess.source ?: return + if (targetSymbol == null) return + val targetFir = targetSymbol.fir as? FirCallableMemberDeclaration<*> + + if (targetSymbol.fir in inlinableParameters) { + if (!qualifiedAccess.partOfCall(context)) { + val valueParameter = targetSymbol.fir as FirValueParameter + reporter.reportOn(source, FirErrors.USAGE_IS_NOT_INLINABLE, valueParameter.symbol, context) + } + } + checkVisibilityAndAccess(qualifiedAccess, targetFir, source, context) + checkRecursion(targetSymbol, source, context) + } + + private fun FirQualifiedAccess.partOfCall(context: CheckerContext): Boolean { + if (this !is FirExpression) return false + val containingQualifiedAccess = context.qualifiedAccesses.getOrNull(context.qualifiedAccesses.size - 2) ?: return false + if (this == containingQualifiedAccess.explicitReceiver) return true + val call = containingQualifiedAccess as? FirCall ?: return false + return call.arguments.any { it.unwrapArgument() == this } + } + + private fun checkVisibilityAndAccess( + accessExpression: FirQualifiedAccess, + calledDeclaration: FirCallableMemberDeclaration<*>?, + source: FirSourceElement, + context: CheckerContext + ) { + if (calledDeclaration == null) return + val calledFunEffectiveVisibility = calledDeclaration.effectiveVisibility.let { + if (it == EffectiveVisibility.Local) { + EffectiveVisibility.Public + } else { + it + } + } + val isCalledFunPublicOrPublishedApi = calledFunEffectiveVisibility.publicApi + val isInlineFunPublicOrPublishedApi = inlineFunEffectiveVisibility.publicApi + if (isInlineFunPublicOrPublishedApi && + !isCalledFunPublicOrPublishedApi && + calledDeclaration.visibility !== Visibilities.Local + ) { + reporter.reportOn( + source, + FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, + calledDeclaration.symbol, + inlineFunction.symbol, + context + ) + } else { + checkPrivateClassMemberAccess(calledDeclaration, source, context) + if (isInlineFunPublicOrPublishedApi) { + checkSuperCalls(calledDeclaration, accessExpression, context) + } + } + + val isConstructorCall = calledDeclaration is FirConstructor + if ( + isInlineFunPublicOrPublishedApi && + inlineFunEffectiveVisibility.toVisibility() !== Visibilities.Protected && + calledFunEffectiveVisibility.toVisibility() === Visibilities.Protected + ) { + val factory = when { + isConstructorCall -> FirErrors.PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE + prohibitProtectedCallFromInline -> FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR + else -> FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE + } + reporter.reportOn(source, factory, calledDeclaration.symbol, inlineFunction.symbol, context) + } + } + + private fun checkPrivateClassMemberAccess( + calledDeclaration: FirCallableMemberDeclaration<*>, + source: FirSourceElement, + context: CheckerContext + ) { + if (!isEffectivelyPrivateApiFunction) { + if (calledDeclaration.isInsidePrivateClass()) { + reporter.reportOn( + source, + FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE, + calledDeclaration.symbol, + inlineFunction.symbol, + context + ) + } + } + } + + private fun checkSuperCalls( + calledDeclaration: FirCallableMemberDeclaration<*>, + callExpression: FirQualifiedAccess, + context: CheckerContext + ) { + val receiver = callExpression.dispatchReceiver as? FirQualifiedAccessExpression ?: return + if (receiver.calleeReference is FirSuperReference) { + val dispatchReceiverType = receiver.dispatchReceiver.typeRef.coneType + val classSymbol = dispatchReceiverType.toSymbol(session) ?: return + if (!classSymbol.isDefinedInInlineFunction()) { + reporter.reportOn( + callExpression.dispatchReceiver.source, + FirErrors.SUPER_CALL_FROM_PUBLIC_INLINE, + calledDeclaration.symbol, + context + ) + } + } + } + + private fun AbstractFirBasedSymbol<*>.isDefinedInInlineFunction(): Boolean { + return when (val fir = this.fir) { + is FirAnonymousFunction -> true + is FirMemberDeclaration -> fir.isLocalMember + is FirAnonymousObject -> true + is FirRegularClass -> fir.classId.isLocal + else -> error("Unknown callable declaration type: ${fir.render()}") + } + } + + private fun checkRecursion( + targetSymbol: AbstractFirBasedSymbol<*>, + source: FirSourceElement, + context: CheckerContext + ) { + if (targetSymbol == inlineFunction.symbol) { + reporter.reportOn(source, FirErrors.RECURSION_IN_INLINE, targetSymbol, context) + } + } + + private fun FirCallableMemberDeclaration<*>.isInsidePrivateClass(): Boolean { + val containingClass = this.containingClass()?.toSymbol(session)?.fir ?: return false + + val containingClassVisibility = when (containingClass) { + is FirAnonymousObject -> return false + is FirRegularClass -> containingClass.visibility + is FirTypeAlias -> containingClass.visibility + } + return containingClassVisibility == Visibilities.Private || containingClassVisibility == Visibilities.PrivateToThis + } + } +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/util/firCheckersUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/util/firCheckersUtils.kt new file mode 100644 index 00000000000..5c66234ec84 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/util/firCheckersUtils.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2021 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.util + +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.context.PersistentCheckerContext +import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollectorVisitor +import org.jetbrains.kotlin.fir.visitors.FirVisitor + +fun FirElement.checkChildrenWithCustomVisitor( + parentContext: CheckerContext, + visitorVoid: FirVisitor +) { + val collectingVisitor = object : AbstractDiagnosticCollectorVisitor(parentContext as PersistentCheckerContext) { + override fun checkElement(element: FirElement) { + element.accept(visitorVoid, context) + } + } + this.accept(collectingVisitor, null) +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index da7cb0ce4f5..004e8754a45 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -170,9 +170,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NONE_APPLICABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_FINAL_MEMBER_IN_FINAL_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_FINAL_MEMBER_IN_OBJECT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_LOCAL_RETURN_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_MEMBER_FUNCTION_NO_BODY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_ENUM import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_VARARG_SPREAD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOTHING_TO_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_AN_ANNOTATION_CLASS @@ -193,6 +195,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERLOAD_RESOLUTI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDING_FINAL_MEMBER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_FUNCTION_WITH_NO_BODY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_PROPERTY_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY @@ -203,8 +206,12 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_INITIALI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_IMPLICIT_TYPES +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_SUPERTYPES import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_CALL_OF_CONVERSION_METHOD @@ -235,6 +242,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_INITIAL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_NOT_A_CLASS_OR_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_NOT_INITIALIZED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPER_CALL_FROM_PUBLIC_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPER_IS_NOT_AN_EXPRESSION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPER_NOT_AVAILABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SYNTAX @@ -269,6 +277,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_FEATU import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNUSED_VARIABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UPPER_BOUND_IS_EXTENSION_FUNCTION_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UPPER_BOUND_VIOLATED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USAGE_IS_NOT_INLINABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_ELVIS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_ELVIS_RIGHT_IS_NULL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_VARARG_ON_PARAMETER @@ -905,6 +914,45 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { "Returns are not allowed for functions with expression body. Use block body in '{...}'" ) + // Inline + map.put( + USAGE_IS_NOT_INLINABLE, + "Illegal usage of inline-parameter ''{0}''. Add ''noinline'' modifier to the parameter declaration", + SYMBOL + ) + map.put( + NON_LOCAL_RETURN_NOT_ALLOWED, + "Can''t inline ''{0}'' here: it may contain non-local returns. Add ''crossinline'' modifier to parameter declaration ''{0}''", + SYMBOL + ) + map.put(RECURSION_IN_INLINE, "Inline function ''{0}'' cannot be recursive", SYMBOL) + map.put(NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, "Public-API inline function cannot access non-public-API ''{1}''", SYMBOL, SYMBOL) + map.put( + PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE, + "Protected constructor call from public-API inline function is deprecated", + SYMBOL, + SYMBOL + ) + map.put( + PROTECTED_CALL_FROM_PUBLIC_INLINE, + "Protected function call from public-API inline function is deprecated", + SYMBOL, + SYMBOL + ) + map.put( + PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR, + "Protected function call from public-API inline function is prohibited", + SYMBOL, + SYMBOL + ) + map.put( + PRIVATE_CLASS_MEMBER_FROM_INLINE, + "Non-private inline function cannot access members of private classes: ''{1}''", + SYMBOL, + SYMBOL + ) + map.put(SUPER_CALL_FROM_PUBLIC_INLINE, "Accessing super members from public-API inline function is deprecated", SYMBOL) + // Extended checkers group map.put(REDUNDANT_VISIBILITY_MODIFIER, "Redundant visibility modifier") map.put(REDUNDANT_MODALITY_MODIFIER, "Redundant modality modifier") diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt index 88671c14831..6637437d03c 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt @@ -31,6 +31,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirSealedSupertypeChecker, FirTypeAliasChecker, FirCyclicTypeBoundsChecker, + FirInlineDeclarationChecker, ) override val functionCheckers: Set diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index 0c0b9dcc1c8..d580d33dfa3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl import org.jetbrains.kotlin.fir.expressions.impl.FirPartiallyResolvedArgumentList import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock +import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType @@ -65,6 +66,10 @@ fun FirExpression.toResolvedCallableSymbol(): FirCallableSymbol<*>? { return toResolvedCallableReference()?.resolvedSymbol as FirCallableSymbol<*>? } +fun FirReference.toResolvedCallableSymbol(): FirCallableSymbol<*>? { + return (this as? FirResolvedNamedReference)?.resolvedSymbol as? FirCallableSymbol<*> +} + fun buildErrorLoop(source: FirSourceElement?, diagnostic: ConeDiagnostic): FirErrorLoop { return buildErrorLoop { this.source = source @@ -109,4 +114,4 @@ fun FirBlock.replaceFirstStatement(statement: FirStatement): FirStatement { return existed } -fun FirExpression.unwrapArgument(): FirExpression = (this as? FirWrappedArgumentExpression)?.expression ?: this \ No newline at end of file +fun FirExpression.unwrapArgument(): FirExpression = (this as? FirWrappedArgumentExpression)?.expression ?: this diff --git a/compiler/testData/codegen/box/publishedApi/noMangling.kt b/compiler/testData/codegen/box/publishedApi/noMangling.kt index 1aa6627b831..d330db2bc84 100644 --- a/compiler/testData/codegen/box/publishedApi/noMangling.kt +++ b/compiler/testData/codegen/box/publishedApi/noMangling.kt @@ -1,3 +1,4 @@ +// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM //WITH_REFLECT class A { diff --git a/compiler/testData/codegen/box/publishedApi/simple.kt b/compiler/testData/codegen/box/publishedApi/simple.kt index 4ad78979fd4..b6868dd3c59 100644 --- a/compiler/testData/codegen/box/publishedApi/simple.kt +++ b/compiler/testData/codegen/box/publishedApi/simple.kt @@ -1,3 +1,4 @@ +// IGNORE_BACKEND_FIR: JVM_IR // MODULE: lib // FILE: lib.kt class A { @@ -13,4 +14,4 @@ class A { // FILE: main.kt fun box(): String { return A().test() -} \ No newline at end of file +} diff --git a/compiler/testData/codegen/box/publishedApi/topLevel.kt b/compiler/testData/codegen/box/publishedApi/topLevel.kt index e2a33400e7d..45614c81b72 100644 --- a/compiler/testData/codegen/box/publishedApi/topLevel.kt +++ b/compiler/testData/codegen/box/publishedApi/topLevel.kt @@ -1,3 +1,4 @@ +// IGNORE_BACKEND_FIR: JVM_IR // MODULE: lib // FILE: lib.kt @PublishedApi @@ -7,4 +8,4 @@ inline fun test() = published() // MODULE: main(lib) // FILE: main.kt -fun box() = test() \ No newline at end of file +fun box() = test() diff --git a/compiler/testData/diagnostics/tests/inline/assignment.fir.kt b/compiler/testData/diagnostics/tests/inline/assignment.fir.kt deleted file mode 100644 index 3e04fcb9ef6..00000000000 --- a/compiler/testData/diagnostics/tests/inline/assignment.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - var d = s - d = s - - var e = ext - e = ext -} - - -inline fun Function1.inlineExt() { - var d = this - d = this -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/assignment.kt b/compiler/testData/diagnostics/tests/inline/assignment.kt index 8605ac02f1a..0abdee0c5b5 100644 --- a/compiler/testData/diagnostics/tests/inline/assignment.kt +++ b/compiler/testData/diagnostics/tests/inline/assignment.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { var d = s @@ -11,4 +12,4 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { inline fun Function1.inlineExt() { var d = this d = this -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.fir.kt deleted file mode 100644 index 8d7a1cd5fb8..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -TYPE_MISMATCH - -inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - s && ext - s || s -} - -inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - s && ext - s || s -} - -inline fun Function1.inlineExt() { - invoke(11) - this && this - this || this -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt index 465795e0fb0..d55b86e1e17 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -TYPE_MISMATCH inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { @@ -14,4 +15,4 @@ inline fun Function1.inlineExt() { invoke(11) this && this this || this -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt index 697bc552738..d82ac861104 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt @@ -17,6 +17,6 @@ operator fun @ExtensionFunctionType Function3.get(index } inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { - s[1] - ext[1] + s[1] + ext[1] } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt index 7ec7960bb2a..0324a66e8aa 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt @@ -8,8 +8,8 @@ inline operator fun Function1.modAssign(p: Function1) = { } inline operator fun Function1.plusAssign(p: Function1) { - this -= p - p -= this + this -= p + p -= this } operator fun @ExtensionFunctionType Function2.minusAssign(ext : @ExtensionFunctionType Function2) {} @@ -20,11 +20,11 @@ inline operator fun @ExtensionFunctionType Function2.modAssig } inline operator fun @ExtensionFunctionType Function2.plusAssign(ext : @ExtensionFunctionType Function2) { - this -= ext - ext -= this + this -= ext + ext -= this } inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { s += s ext += ext -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt index af0da08e58c..130195d5232 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt @@ -14,13 +14,13 @@ operator fun Function2.compareTo(index : Function2) operator fun @ExtensionFunctionType Function3.compareTo(index : @ExtensionFunctionType Function3) = 1 inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { - s < s - s <= s - s > s - s >= s + s < s + s <= s + s > s + s >= s - ext < ext - ext > ext - ext <= ext - ext >= ext + ext < ext + ext > ext + ext <= ext + ext >= ext } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt index d57da8784d2..13fd7b57299 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt @@ -3,7 +3,7 @@ inline operator fun Function1.component1() = 1 inline operator fun Function1.component2() = 2 inline fun inlineFunWithInvoke(s: (p: T) -> U) { - val (d1, e1) = s + val (d1, e1) = s } operator fun Function2.component1() = 1 @@ -13,6 +13,6 @@ operator fun @ExtensionFunctionType Function3.component operator fun @ExtensionFunctionType Function3.component2() = 2 inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { - val (d1, e1) = s - val (d2, e2) = ext + val (d1, e1) = s + val (d2, e2) = ext } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt index d74c5d90803..f5d238ec527 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt @@ -16,9 +16,9 @@ operator fun Function2.contains(p: Function2): Boole operator fun @ExtensionFunctionType Function3.contains(ext: @ExtensionFunctionType Function3): Boolean = false inline fun inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) { - s in s - s !in s + s in s + s !in s - ext in ext - ext !in ext + ext in ext + ext !in ext } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.fir.kt deleted file mode 100644 index d641299f7b2..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.fir.kt +++ /dev/null @@ -1,34 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -CONFLICTING_JVM_DECLARATIONS -CONFLICTING_OVERLOADS -operator fun Function1.minus(p: Function1) { - -} - -operator fun @ExtensionFunctionType Function2.minus(p: T.(p: U) -> V) { - -} - -inline operator fun Function1.plus(p: Function1) { - this - p -} - -inline operator fun @ExtensionFunctionType Function2.plus(p: T.(p: U) -> V) { - this - p -} - -inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { - s + s - ext + ext -} - -inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { - s + s - ext + ext -} - -inline fun Function1.submit() { - this + this -} - -inline fun @ExtensionFunctionType Function2.submit() { - this + this -} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt index f8798923c3d..42a440c50e6 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -CONFLICTING_JVM_DECLARATIONS -CONFLICTING_OVERLOADS operator fun Function1.minus(p: Function1) { diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt index fca75c38907..2ac05af30c4 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt @@ -21,9 +21,9 @@ operator fun @ExtensionFunctionType Function3.rangeTo(e } inline fun inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) { - s..s - s..s + s..s + s..s - ext..ext - ext..ext + ext..ext + ext..ext } diff --git a/compiler/testData/diagnostics/tests/inline/capture.fir.kt b/compiler/testData/diagnostics/tests/inline/capture.fir.kt index 18680133bd5..d495c98e005 100644 --- a/compiler/testData/diagnostics/tests/inline/capture.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/capture.fir.kt @@ -46,6 +46,6 @@ inline fun testExtension(s: (p: Int) -> Unit) { inline fun inlineFunWrongExtension(s: (p: Int) -> Unit) { { - s.noInlineExt(11) + s.noInlineExt(11) } () -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt index 6ab76240945..d38f4feffb3 100644 --- a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt @@ -20,9 +20,9 @@ inline fun testExtension(s: (p: Int) -> Unit) { } inline fun inlineFunWrongExtension(s: (p: Int) -> Unit) { - s.noInlineExt(11) + s.noInlineExt(11) } inline fun inlineFunNoInline(noinline s: (p: Int) -> Unit) { s.noInlineExt(11) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt b/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt index 065f4c26ceb..25f8cb087aa 100644 --- a/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt @@ -1,7 +1,7 @@ inline fun onlyLocal(p: () -> R) { - inlineAll(p) + inlineAll(p) } inline fun inlineAll(noinline p: () -> R) { p() -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/functions.fir.kt b/compiler/testData/diagnostics/tests/inline/functions.fir.kt deleted file mode 100644 index 41bb698bd4f..00000000000 --- a/compiler/testData/diagnostics/tests/inline/functions.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -UNNECESSARY_NOT_NULL_ASSERTION -UNNECESSARY_SAFE_CALL - -fun getFun(s: (p: Int) -> Unit): Function1 = {11} - -inline fun getInlineFun(s: (p: Int) -> Unit): Function1 = {11} - -inline fun testExtension(s: (p: Int) -> Unit) { - getFun(s).invoke(10) - getInlineFun(s).invoke(10) - getInlineFun(s)!!.invoke(10) - getInlineFun(s)?.invoke(10) -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/functions.kt b/compiler/testData/diagnostics/tests/inline/functions.kt index 9956b63ba57..4e43b56c209 100644 --- a/compiler/testData/diagnostics/tests/inline/functions.kt +++ b/compiler/testData/diagnostics/tests/inline/functions.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -UNNECESSARY_NOT_NULL_ASSERTION -UNNECESSARY_SAFE_CALL fun getFun(s: (p: Int) -> Unit): Function1 = {11} @@ -9,4 +10,4 @@ inline fun testExtension(s: (p: Int) -> Unit) { getInlineFun(s).invoke(10) getInlineFun(s)!!.invoke(10) getInlineFun(s)?.invoke(10) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/isCheck.fir.kt b/compiler/testData/diagnostics/tests/inline/isCheck.fir.kt index e5c021a89dc..4ea8d43784e 100644 --- a/compiler/testData/diagnostics/tests/inline/isCheck.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/isCheck.fir.kt @@ -5,6 +5,6 @@ inline public fun reg(converter: (Any) -> Any, flag: Boolean) { } public inline fun register(converter: (Any) -> Any) { - converter is (Any) -> Any - reg(converter, converter is (Any) -> Any) -} \ No newline at end of file + converter is (Any) -> Any + reg(converter, converter is (Any) -> Any) +} diff --git a/compiler/testData/diagnostics/tests/inline/kt15410.fir.kt b/compiler/testData/diagnostics/tests/inline/kt15410.fir.kt index 3f918cef175..b4899954c86 100644 --- a/compiler/testData/diagnostics/tests/inline/kt15410.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/kt15410.fir.kt @@ -6,5 +6,5 @@ open class Foo protected constructor() inline fun foo(f: () -> Unit) = object: Foo() {} class A : Foo() { - inline fun foo(f: () -> Unit) = Foo() + inline fun foo(f: () -> Unit) = Foo() } diff --git a/compiler/testData/diagnostics/tests/inline/kt19679.fir.kt b/compiler/testData/diagnostics/tests/inline/kt19679.fir.kt index 4138c154f28..8c58ee90d84 100644 --- a/compiler/testData/diagnostics/tests/inline/kt19679.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/kt19679.fir.kt @@ -1,4 +1,4 @@ inline fun test(s: () -> Unit, p: (() -> Unit)?) { s() p?.invoke() -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/kt21177.fir.kt b/compiler/testData/diagnostics/tests/inline/kt21177.fir.kt deleted file mode 100644 index 45412c060c0..00000000000 --- a/compiler/testData/diagnostics/tests/inline/kt21177.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER - -class SomeContainer { - protected class Limit - - protected fun makeLimit(): Limit = TODO() - - public inline fun foo(f: () -> Unit) { - Limit() - makeLimit() - } -} - -open class A protected constructor() { - inline fun foo(f: () -> Unit) { - A() - } -} diff --git a/compiler/testData/diagnostics/tests/inline/kt21177.kt b/compiler/testData/diagnostics/tests/inline/kt21177.kt index 9d8dcdd28a1..99a2ae566ee 100644 --- a/compiler/testData/diagnostics/tests/inline/kt21177.kt +++ b/compiler/testData/diagnostics/tests/inline/kt21177.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER class SomeContainer { diff --git a/compiler/testData/diagnostics/tests/inline/kt4869.fir.kt b/compiler/testData/diagnostics/tests/inline/kt4869.fir.kt index 5fc9d07399f..9c353f4e130 100644 --- a/compiler/testData/diagnostics/tests/inline/kt4869.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/kt4869.fir.kt @@ -2,5 +2,5 @@ inline fun foo(f: () -> Unit) { val ff = { f: () -> Unit -> f.invoke() } - ff(f) + ff(f) } diff --git a/compiler/testData/diagnostics/tests/inline/labeled.fir.kt b/compiler/testData/diagnostics/tests/inline/labeled.fir.kt index 15dee73802a..15f37ccad45 100644 --- a/compiler/testData/diagnostics/tests/inline/labeled.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/labeled.fir.kt @@ -24,7 +24,7 @@ inline fun foo(bar1: (String.() -> Int) -> Int, bar2: (()->Int) -> Int) { } inline fun foo2(bar1: (String.() -> Int) -> Int) { - l1@ bar1 + l1@ bar1 l2@ bar1 { 11 @@ -37,4 +37,4 @@ inline fun foo2(bar1: (String.() -> Int) -> Int) { (l5@ (l4@ bar1)) { 11 } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/lambdaCast.fir.kt b/compiler/testData/diagnostics/tests/inline/lambdaCast.fir.kt deleted file mode 100644 index af524ecd3c5..00000000000 --- a/compiler/testData/diagnostics/tests/inline/lambdaCast.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -// !DIAGNOSTICS: -UNCHECKED_CAST -USELESS_CAST -inline public fun reg(convertFunc: (Any) -> Any) { - convertFunc("") -} - -public inline fun register(converter: (T) -> R) { - converter as (Any) -> Any - reg(converter as (Any) -> Any) -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/lambdaCast.kt b/compiler/testData/diagnostics/tests/inline/lambdaCast.kt index 128d406d7a1..6fbc523a268 100644 --- a/compiler/testData/diagnostics/tests/inline/lambdaCast.kt +++ b/compiler/testData/diagnostics/tests/inline/lambdaCast.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNCHECKED_CAST -USELESS_CAST inline public fun reg(convertFunc: (Any) -> Any) { convertFunc("") @@ -6,4 +7,4 @@ inline public fun reg(convertFunc: (Any) -> Any) { public inline fun register(converter: (T) -> R) { converter as (Any) -> Any reg(converter as (Any) -> Any) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.fir.kt deleted file mode 100644 index 8970e751c2b..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.fir.kt +++ /dev/null @@ -1,8 +0,0 @@ - -inline fun toOnlyLocal(crossinline p: () -> R) { - p() -} - -inline fun inlineAll(p: () -> R) { - toOnlyLocal(p) -} diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.kt index 683f14f669c..0d1c48a680a 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/toOnlyLocal.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL inline fun toOnlyLocal(crossinline p: () -> R) { p() diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.fir.kt deleted file mode 100644 index 850af038fae..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.fir.kt +++ /dev/null @@ -1,47 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -PRIVATE_CLASS_MEMBER_FROM_INLINE -private class Z public constructor(){ - public val publicProperty:Int = 12 - public fun publicFun() {} -} - -public inline fun test() { - Z().publicProperty - Z().publicFun() -} - -internal inline fun testInternal() { - Z().publicProperty - Z().publicFun() -} - -internal class Z2 { - private val privateProperty = 11; - - public val publicProperty:Int = 12 - - private fun privateFun() {} - - public fun publicFun() {} - - public inline fun test() { - privateProperty - privateFun() - publicProperty - publicFun() - Z2().publicProperty - Z2().publicFun() - Z2().privateProperty - Z2().privateFun() - } - - internal inline fun testInternal() { - privateProperty - privateFun() - publicProperty - publicFun() - Z2().publicProperty - Z2().publicFun() - Z2().privateProperty - Z2().privateFun() - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.kt index b81c8551e37..6813ed255e5 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inNonPublicClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -PRIVATE_CLASS_MEMBER_FROM_INLINE private class Z public constructor(){ public val publicProperty:Int = 12 diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.fir.kt deleted file mode 100644 index 4278490afdb..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.fir.kt +++ /dev/null @@ -1,27 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE - -private val privateProperty = 11; -private fun privateFun() {} - -internal val internalProperty = 11; -internal fun internalFun() {} - -public inline fun test() { - privateFun() - privateProperty -} - -public inline fun test2() { - internalFun() - internalProperty -} - -internal inline fun testInternal() { - privateFun() - privateProperty -} - -internal inline fun test2Internal() { - internalFun() - internalProperty -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.kt index 8d327a43e81..319b8e2ec0d 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPackage.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE private val privateProperty = 11; diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.fir.kt deleted file mode 100644 index b58a7e8d0ec..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.fir.kt +++ /dev/null @@ -1,37 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -public class Z { - internal val privateProperty = 11; - - internal fun privateFun() { - - } -} - -public inline fun test() { - Z().privateProperty - Z().privateFun() -} - -internal inline fun testInternal() { - Z().privateProperty - Z().privateFun() -} - - -public class Z2 { - private val privateProperty = 11; - - private fun privateFun() { - - } - - public inline fun test() { - privateProperty - privateFun() - } - - internal inline fun testInternal() { - privateProperty - privateFun() - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.kt index dc6add88bc0..dcd908bd205 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/inPublicClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE public class Z { internal val privateProperty = 11; diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/publishedApi.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/publishedApi.fir.kt index 9c03541d22a..0916a9f9499 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/publishedApi.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/publishedApi.fir.kt @@ -2,11 +2,11 @@ inline fun call(a: A) { - a.test() + a.test() - privateFun() + privateFun() - internalFun() + internalFun() } @PublishedApi diff --git a/compiler/testData/diagnostics/tests/inline/nullabilityOperations.fir.kt b/compiler/testData/diagnostics/tests/inline/nullabilityOperations.fir.kt deleted file mode 100644 index 176f08f96ae..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nullabilityOperations.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNNECESSARY_SAFE_CALL -UNNECESSARY_NOT_NULL_ASSERTION -CONFLICTING_JVM_DECLARATIONS -inline fun String.submit(action: Function1) { - -} - -inline fun Function1.submit() { - this?.invoke(11) - this!!.invoke(11) - - submit(this!!) -} - -inline fun submit(action: Function1) { - action?.invoke(10) - action!!.invoke(10) -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt b/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt index 8ecd4838605..8bccc8aafcb 100644 --- a/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNNECESSARY_SAFE_CALL -UNNECESSARY_NOT_NULL_ASSERTION -CONFLICTING_JVM_DECLARATIONS inline fun String.submit(action: Function1) { @@ -13,4 +14,4 @@ inline fun Function1.submit() { inline fun submit(action: Function1) { action?.invoke(10) action!!.invoke(10) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt b/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt index 5d81a507901..fbbdef51cde 100644 --- a/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt @@ -18,4 +18,4 @@ public inline fun Function1?.submit() { public inline fun submit(action: Function1?) { -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt b/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt index fd3aaf8e3ed..4d1b9fb6558 100644 --- a/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt @@ -4,7 +4,7 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit) { (s)(11) (s).invoke(11) (s) invoke 11 - (s) + (s) } inline fun Function1.inlineExt() { @@ -18,10 +18,10 @@ inline fun inlineFunWithInvoke2(s: (p: Int) -> Unit) { (((s)))(11) (((s))).invoke(11) (((s))) invoke 11 - (((s))) + (((s))) } inline fun propagation(s: (p: Int) -> Unit) { inlineFunWithInvoke((label@ s)) inlineFunWithInvoke((label2@ label@ s)) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/privateClass.fir.kt b/compiler/testData/diagnostics/tests/inline/privateClass.fir.kt deleted file mode 100644 index eacf2e30adb..00000000000 --- a/compiler/testData/diagnostics/tests/inline/privateClass.fir.kt +++ /dev/null @@ -1,25 +0,0 @@ -// !DIAGNOSTICS: -EXPOSED_PARAMETER_TYPE - -private class S public constructor() { - fun a() { - - } -} - -internal inline fun x(s: S, z: () -> Unit) { - z() - S() - s.a() - test() -} - -private inline fun x2(s: S, z: () -> Unit) { - z() - S() - s.a() - test() -} - -private fun test(): S { - return S() -} diff --git a/compiler/testData/diagnostics/tests/inline/privateClass.kt b/compiler/testData/diagnostics/tests/inline/privateClass.kt index c68bd5d2a77..b2d7715291b 100644 --- a/compiler/testData/diagnostics/tests/inline/privateClass.kt +++ b/compiler/testData/diagnostics/tests/inline/privateClass.kt @@ -1,3 +1,5 @@ +// FIR_IDENTICAL +// FIR_IDENTICAL // !DIAGNOSTICS: -EXPOSED_PARAMETER_TYPE private class S public constructor() { diff --git a/compiler/testData/diagnostics/tests/inline/propagation.fir.kt b/compiler/testData/diagnostics/tests/inline/propagation.fir.kt deleted file mode 100644 index 812ad41f724..00000000000 --- a/compiler/testData/diagnostics/tests/inline/propagation.fir.kt +++ /dev/null @@ -1,37 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -NON_LOCAL_RETURN_NOT_ALLOWED - -inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - subInline(s, ext) - subNoInline(s, ext) -} - -inline fun inlineFunWithInvokeClosure(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - subInline({p: Int -> s(p)}, { p -> this.ext(p)}) - subNoInline({p: Int -> s(p)}, { p -> this.ext(p)}) -} - -//No inline -inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, noinline ext: Int.(p: Int) -> Unit) { - subInline(s, ext) - subNoInline(s, ext) -} - -inline fun inlineFunWithInvokeClosureNoinline(noinline s: (p: Int) -> Unit, noinline ext: Int.(p: Int) -> Unit) { - subInline({p: Int -> s(p)}, { p -> this.ext(p)}) - subNoInline({p: Int -> s(p)}, { p -> this.ext(p)}) -} - -//ext function -inline fun Function1.inlineExt(ext: Int.(p: Int) -> Unit) { - subInline(this, ext) - subNoInline(this, ext) -} - -inline fun Function1.inlineExtWithClosure(ext: Int.(p: Int) -> Unit) { - subInline({p: Int -> this(p)}, { p -> this.ext(p)}) - subNoInline({p: Int -> this(p)}, { p -> this.ext(p)}) -} - -inline fun subInline(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {} - -fun subNoInline(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {} diff --git a/compiler/testData/diagnostics/tests/inline/propagation.kt b/compiler/testData/diagnostics/tests/inline/propagation.kt index e5aec969fbe..1be141091fd 100644 --- a/compiler/testData/diagnostics/tests/inline/propagation.kt +++ b/compiler/testData/diagnostics/tests/inline/propagation.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -NON_LOCAL_RETURN_NOT_ALLOWED inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { diff --git a/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt b/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt index c6137f3ccdc..6e31ad879f4 100644 --- a/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt @@ -18,10 +18,10 @@ open class A { protected set(value) {} inline fun call() { - test() - z + test() + z zVar - zVar = "123" + zVar = "123" } internal inline fun callFromInternal() { @@ -48,13 +48,13 @@ open class A { class B : A() { inline fun testB() { - test() + test() } } class C : JavaClass() { inline fun call() { - bind() + bind() } internal inline fun callFromInternal() { @@ -99,4 +99,4 @@ private class X { } } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt b/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt index a3dec4dfa8e..866ccd6c970 100644 --- a/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt @@ -18,10 +18,10 @@ open class A { protected set(value) {} inline fun call() { - test() - z + test() + z zVar - zVar = "123" + zVar = "123" } internal inline fun callFromInternal() { @@ -48,13 +48,13 @@ open class A { class B : A() { inline fun testB() { - test() + test() } } class C : JavaClass() { inline fun call() { - bind() + bind() } internal inline fun callFromInternal() { @@ -99,4 +99,4 @@ private class X { } } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/publishedApi.fir.kt b/compiler/testData/diagnostics/tests/inline/publishedApi.fir.kt index ba28cd7abd9..333587f6213 100644 --- a/compiler/testData/diagnostics/tests/inline/publishedApi.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/publishedApi.fir.kt @@ -1,13 +1,13 @@ // !DIAGNOSTICS: -EXPOSED_PARAMETER_TYPE -NOTHING_TO_INLINE inline fun call(a: A) { - a.test() - publishedTopLevel() + a.test() + publishedTopLevel() - a.publishedVar - a.publishedVar = 1 + a.publishedVar + a.publishedVar = 1 - publishedVarTopLevel - publishedVarTopLevel = 1 + publishedVarTopLevel + publishedVarTopLevel = 1 } inline var inlineVar: Int diff --git a/compiler/testData/diagnostics/tests/inline/recursion.fir.kt b/compiler/testData/diagnostics/tests/inline/recursion.fir.kt deleted file mode 100644 index 905e848bcae..00000000000 --- a/compiler/testData/diagnostics/tests/inline/recursion.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// !CHECK_TYPE -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -VARIABLE_EXPECTED - -inline fun inlineFun(s: (p: Int) -> Unit) { - inlineFun(s) -} - -inline fun inlineFun(s: T) { - inlineFun(11) -} - - -inline fun Function0.inlineExt() { - (checkSubtype>({11})).inlineExt(); - {11}.inlineExt() -} - -inline operator fun Function1.not() : Boolean { - return !this -} - -inline operator fun Function1.inc() : Function1 { - return this++ -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/recursion.kt b/compiler/testData/diagnostics/tests/inline/recursion.kt index 021b84011a0..a391e30aa86 100644 --- a/compiler/testData/diagnostics/tests/inline/recursion.kt +++ b/compiler/testData/diagnostics/tests/inline/recursion.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !CHECK_TYPE // !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -VARIABLE_EXPECTED diff --git a/compiler/testData/diagnostics/tests/inline/regressions/kt4341.fir.kt b/compiler/testData/diagnostics/tests/inline/regressions/kt4341.fir.kt deleted file mode 100644 index ed80d11bd1d..00000000000 --- a/compiler/testData/diagnostics/tests/inline/regressions/kt4341.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -//KT-4341 No resolved call for right-hand side of equals expression -package g - -inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s == s //resolved call for right-hand side 's' not traced -} diff --git a/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt b/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt index 98486f0ec47..7e5dd09af75 100644 --- a/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt +++ b/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL //KT-4341 No resolved call for right-hand side of equals expression package g diff --git a/compiler/testData/diagnostics/tests/inline/returns.fir.kt b/compiler/testData/diagnostics/tests/inline/returns.fir.kt index bdf8c0bd8a6..8a694cc500e 100644 --- a/compiler/testData/diagnostics/tests/inline/returns.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/returns.fir.kt @@ -1,15 +1,15 @@ inline fun inlineFun(s: (p: Int) -> Unit) : (p: Int) -> Unit { - return s + return s } -inline fun inlineFun2(s: (p: Int) -> Unit) : (p: Int) -> Unit = s +inline fun inlineFun2(s: (p: Int) -> Unit) : (p: Int) -> Unit = s inline fun inlineFunWithExt(ext: Int.(p: Int) -> Unit) : Int.(p: Int) -> Unit { - return ext + return ext } -inline fun inlineFunWithExt2(ext: Int.(p: Int) -> Unit) : Int.(p: Int) -> Unit = ext +inline fun inlineFunWithExt2(ext: Int.(p: Int) -> Unit) : Int.(p: Int) -> Unit = ext @@ -17,4 +17,4 @@ inline fun Function1.inlineExt(): Function1 { return this } -inline fun Function1.inlineExt2(): Function1 = this \ No newline at end of file +inline fun Function1.inlineExt2(): Function1 = this diff --git a/compiler/testData/diagnostics/tests/inline/sam.fir.kt b/compiler/testData/diagnostics/tests/inline/sam.fir.kt index 2aa22055690..93919977c99 100644 --- a/compiler/testData/diagnostics/tests/inline/sam.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/sam.fir.kt @@ -22,8 +22,8 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { 11.ext(11) 11 ext 11 - s - ext + s + ext 11 } } @@ -38,7 +38,7 @@ inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.( 11 ext 11 s - ext + ext 11 } @@ -55,4 +55,4 @@ inline fun Function1.inlineExt() { 11 } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/stringTemplate.fir.kt b/compiler/testData/diagnostics/tests/inline/stringTemplate.fir.kt deleted file mode 100644 index ae1c745c672..00000000000 --- a/compiler/testData/diagnostics/tests/inline/stringTemplate.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -inline public fun reg(converter: (Any) -> Any, str: String) { - str - converter("") -} - -public inline fun register(converter: (Any) -> Any) { - "123$converter" - reg(converter, "123$converter") -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/stringTemplate.kt b/compiler/testData/diagnostics/tests/inline/stringTemplate.kt index c7a89195617..29573e3ebe0 100644 --- a/compiler/testData/diagnostics/tests/inline/stringTemplate.kt +++ b/compiler/testData/diagnostics/tests/inline/stringTemplate.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION inline public fun reg(converter: (Any) -> Any, str: String) { str @@ -7,4 +8,4 @@ inline public fun reg(converter: (Any) -> Any, str: String) { public inline fun register(converter: (Any) -> Any) { "123$converter" reg(converter, "123$converter") -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/superCallDepecation.fir.kt b/compiler/testData/diagnostics/tests/inline/superCallDepecation.fir.kt index be77fd7b8c0..139ce9f8138 100644 --- a/compiler/testData/diagnostics/tests/inline/superCallDepecation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/superCallDepecation.fir.kt @@ -7,7 +7,7 @@ open class AndroidTargetConfigurator : AndroidModuleConfigurator { public inline fun inlineFun(): String { - return super.classFun() + super.getConfiguratorSettings() + super.getConfiguratorSettings() + return super.classFun() + super.getConfiguratorSettings() + super.getConfiguratorSettings() } @PublishedApi @@ -17,11 +17,11 @@ open class AndroidTargetConfigurator : public inline fun inlineFunAnonymousObjects(): String { { - super.classFun() + super.getConfiguratorSettings() + super.getConfiguratorSettings() + super.classFun() + super.getConfiguratorSettings() + super.getConfiguratorSettings() }() return object { - fun run() = super@AndroidTargetConfigurator.classFun() + super@AndroidTargetConfigurator.getConfiguratorSettings() + super@AndroidTargetConfigurator.getConfiguratorSettings() + fun run() = super@AndroidTargetConfigurator.classFun() + super@AndroidTargetConfigurator.getConfiguratorSettings() + super@AndroidTargetConfigurator.getConfiguratorSettings() }.run() } @@ -94,7 +94,7 @@ sealed class FooSealed : Base() { class B: FooSealed() inline fun test() { - super.classFun() + super.classFun() } } @@ -114,8 +114,8 @@ class FooOuter : Base() { inner class FooInner: Base() { inline fun test() { - super@FooOuter.classFun() - super.classFun() + super@FooOuter.classFun() + super.classFun() } } diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt index 36ef67bba28..e2d8ae2025b 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt @@ -12,17 +12,17 @@ operator fun @ExtensionFunctionType Function2.dec() = this inline fun inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { +s - -s - s++ - ++s - s-- - --s + -s + s++ + ++s + s-- + --s +ext - -ext - ext++ - ++ext - ext-- - --ext + -ext + ext++ + ++ext + ext-- + --ext } inline fun Function1.inlineFunWithInvoke() { diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt index 864423fa3de..3b844d5a19d 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt @@ -16,6 +16,6 @@ operator fun @ExtensionFunctionType Function3.not() : B } inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: T, l : U) -> V) { - !s - !ext + !s + !ext } diff --git a/compiler/testData/diagnostics/tests/inline/vararg.fir.kt b/compiler/testData/diagnostics/tests/inline/vararg.fir.kt deleted file mode 100644 index 305d27c98cc..00000000000 --- a/compiler/testData/diagnostics/tests/inline/vararg.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE - -inline fun inlineFun(s: (p: Int) -> Unit, noinline b: (p: Int) -> Unit) { - subInline(s, b) - subNoInline(s, b) -} - -inline fun Function1.inlineExt(s: (p: Int) -> Unit, noinline b: (p: Int) -> Unit) { - subInline(this, s, b) - subNoInline(this, s, b) -} - - -inline fun subInline(vararg s: (p: Int) -> Unit) {} - -fun subNoInline(vararg s: (p: Int) -> Unit) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/vararg.kt b/compiler/testData/diagnostics/tests/inline/vararg.kt index 14c1e7d51a0..2a0265822e7 100644 --- a/compiler/testData/diagnostics/tests/inline/vararg.kt +++ b/compiler/testData/diagnostics/tests/inline/vararg.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE inline fun inlineFun(s: (p: Int) -> Unit, noinline b: (p: Int) -> Unit) { @@ -13,4 +14,4 @@ inline fun Function1.inlineExt(s: (p: Int) -> Unit, noinline b: (p: I inline fun subInline(vararg s: (p: Int) -> Unit) {} -fun subNoInline(vararg s: (p: Int) -> Unit) {} \ No newline at end of file +fun subNoInline(vararg s: (p: Int) -> Unit) {} diff --git a/compiler/testData/diagnostics/tests/inline/when.fir.kt b/compiler/testData/diagnostics/tests/inline/when.fir.kt index 9fb50407b45..47766cfdc04 100644 --- a/compiler/testData/diagnostics/tests/inline/when.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/when.fir.kt @@ -4,8 +4,8 @@ inline public fun reg(converter: (Any) -> Any) { } public inline fun register(converter: (Any) -> Any) { - reg(when(converter) { - is (Any) -> Any -> converter - else -> converter + reg(when(converter) { + is (Any) -> Any -> converter + else -> converter }) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/wrongUsage.fir.kt b/compiler/testData/diagnostics/tests/inline/wrongUsage.fir.kt deleted file mode 100644 index a74451dc5ce..00000000000 --- a/compiler/testData/diagnostics/tests/inline/wrongUsage.fir.kt +++ /dev/null @@ -1,51 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -NOTHING_TO_INLINE -USELESS_ELVIS - -inline fun inlineFunWrongUsage(s: (p: Int) -> Unit) { - s - - if (true) s else 0 - - s ?: s -} - -inline fun inlineFunWrongUsageExt(ext: Int.(p: Int) -> Unit) { - ext - - if (true) ext else 0 - - ext ?: ext -} - -inline fun inlineFunWrongUsageInClosure(s: (p: Int) -> Unit) { - { - s - - if (true) s else 0 - - s ?: s - }() -} - -inline fun inlineFunWrongUsageInClosureExt(ext: Int.(p: Int) -> Unit) { - { - ext - - if (true) ext else 0 - - ext ?: ext - }() -} - -inline fun inlineFunNoInline(noinline s: (p: Int) -> Unit) { - s - if (true) s else 0 - - s ?: s -} - -inline fun inlineFunNoInline(noinline ext: Int.(p: Int) -> Unit) { - ext - if (true) ext else 0 - - ext ?: ext -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/wrongUsage.kt b/compiler/testData/diagnostics/tests/inline/wrongUsage.kt index 7248ae4a670..ef99cc93a63 100644 --- a/compiler/testData/diagnostics/tests/inline/wrongUsage.kt +++ b/compiler/testData/diagnostics/tests/inline/wrongUsage.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -NOTHING_TO_INLINE -USELESS_ELVIS inline fun inlineFunWrongUsage(s: (p: Int) -> Unit) { @@ -48,4 +49,4 @@ inline fun inlineFunNoInline(noinline ext: Int.(p: Int) -> Unit) { if (true) ext else 0 ext ?: ext -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/kt7971.fir.kt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/kt7971.fir.kt index 27db9f77583..acced7b9e14 100644 --- a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/kt7971.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/kt7971.fir.kt @@ -18,7 +18,7 @@ fun javaClass(): Class = null!! public class AppServiceModule : AbstractModule() { inline fun AbstractModule.bind() { - val x = bind(javaClass()) + val x = bind(javaClass()) x checkType { _() } // check that Class receiver is used instead of extension one } diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.fir.kt index 97f26b0b553..0c4b3c1ce0f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.fir.kt @@ -15,16 +15,16 @@ fun foo(y: Boolean) { inline fun case1(block: () -> Unit) { val contracts = listOf( contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) }, contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } ) block() } inline fun case_2(block: () -> Unit) = contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } fun case_3(block: () -> Unit) { @@ -73,4 +73,4 @@ fun case_7(cond: Boolean): Boolean { } } return true -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt index 947e56276e4..18ce2f553ec 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt @@ -21,7 +21,7 @@ inline fun test(crossinline c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } suspend fun calculate() = "OK" diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt index 1274ba3fb3d..c2e352d3d27 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt @@ -25,7 +25,7 @@ inline fun test(crossinline c: suspend () -> Unit) { } } val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } suspend fun calculate() = "OK" diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt index 4085e871dd5..8c7416bd4c5 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt @@ -21,7 +21,7 @@ inline fun test(c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt index da657917e87..d9c093f898d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt @@ -25,7 +25,7 @@ inline fun test(c: suspend () -> Unit) { } } val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt index 7dadb75ca42..db3279d5780 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt @@ -20,7 +20,7 @@ suspend inline fun test(crossinline c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt index ba40df50841..6b523193efe 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt @@ -24,7 +24,7 @@ suspend inline fun test(crossinline c: suspend () -> Unit) { } } val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt index c036c55114a..0e5dcd52f96 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt @@ -20,7 +20,7 @@ suspend inline fun test(c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } suspend fun calculate() = "OK" diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt index 6501622345b..e0357c42b23 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt @@ -24,7 +24,7 @@ suspend inline fun test(c: suspend () -> Unit) { } } val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) { diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-1/neg/2.2.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-1/neg/2.2.fir.kt index ef013bdae6c..9b1dd1b8538 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-1/neg/2.2.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-1/neg/2.2.fir.kt @@ -20,8 +20,8 @@ inline operator fun B?.plusAssign( c: ()->Any) { } //(1) @JvmName("aa") inline operator fun B?.plusAssign( c: ()->C) { //(2) - this += {1} - this += {1} + this += {1} + this += {1} } class C diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/1.fir.kt index 2435c14fd7c..8a4cd53037d 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/1.fir.kt @@ -14,7 +14,7 @@ inline fun case_1(block: () -> Unit) { inline fun case_2(block: () -> Unit) { 10 - 1 contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } @@ -23,7 +23,7 @@ inline fun case_2(block: () -> Unit) { inline fun case_3(block: () -> Unit) { throw Exception() contract { - callsInPlace(block, InvocationKind.UNKNOWN) + callsInPlace(block, InvocationKind.UNKNOWN) } return block() } @@ -35,7 +35,7 @@ inline fun case_3(block: () -> Unit) { inline fun case_4(block: () -> Unit) { .0009 return contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/11.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/11.fir.kt index c9a8b5124b5..1f08242387d 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/11.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/11.fir.kt @@ -8,7 +8,7 @@ import kotlin.contracts.* // TESTCASE NUMBER: 1, 2 inline fun contractBuilder(block: () -> Unit): ContractBuilder.() -> Unit = { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } // FILE: main.kt diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/12.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/12.fir.kt index a578d91a6ff..b7cd9874554 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/12.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/12.fir.kt @@ -8,7 +8,7 @@ import kotlin.contracts.* // TESTCASE NUMBER: 1, 2, 3 inline fun ContractBuilder.callsInPlaceEffectBuilder(block: () -> Unit) = - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) fun ContractBuilder.returnsEffectBuilder(value_1: Int?) = returns(true) implies (value_1 != null) diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/14.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/14.fir.kt index e006d6bfe47..17cefcecdfc 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/14.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/14.fir.kt @@ -6,7 +6,7 @@ import kotlin.contracts.* // TESTCASE NUMBER: 1 inline fun case_1(block: () -> Unit) { return contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } } @@ -16,7 +16,7 @@ fun case_2() = contract { } // TESTCASE NUMBER: 3 inline fun case_3(block: () -> Unit) { val value_1 = contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() } @@ -40,13 +40,13 @@ inline fun case_5(block: () -> Unit) { // TESTCASE NUMBER: 6 inline fun case_6(block: () -> Unit) { throw Exception(contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) }.toString()) } // TESTCASE NUMBER: 7 inline fun case_7(block: () -> Unit) { funWithAnyArg(contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) }) } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/6.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/6.fir.kt index 5a6cb3c5bb1..a85062bd058 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/6.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/6.fir.kt @@ -58,6 +58,6 @@ class case_2(value_5: Boolean, val value_1: Boolean) { inline fun K.case_2_5(): Boolean? { contract { returnsNotNull() implies (value_4) } - return if (value_4) true else null + return if (value_4) true else null } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/9.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/9.fir.kt index 2f20cde512c..978894c3183 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/9.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/9.fir.kt @@ -6,6 +6,6 @@ import kotlin.contracts.* // TESTCASE NUMBER: 1 inline fun case_1(block: () -> Unit) = { contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) + callsInPlace(block, InvocationKind.EXACTLY_ONCE) } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/1.fir.kt index 7fefbf338fa..c9cfe740c2c 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/1.fir.kt @@ -6,5 +6,5 @@ import kotlin.contracts.* inline fun case_1(block: () -> Unit) { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() - case_1(block) + case_1(block) } diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index 728d610a603..52a94c4d428 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.DiagnosticList import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.DiagnosticParameter import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.ConeKotlinType @@ -133,6 +134,14 @@ private object FirToKtConversionCreator { "org.jetbrains.kotlin.fir.psi" ) ), + FirQualifiedAccess::class to HLFunctionCallConversion( + "{0}.source!!.psi as KtExpression", + KtExpression::class.createType(), + importsToAdd = listOf( + "org.jetbrains.kotlin.psi.KtExpression", + "org.jetbrains.kotlin.fir.psi" + ) + ), FirValueParameter::class to HLFunctionCallConversion( "firSymbolBuilder.buildSymbol({0})", KtSymbol::class.createType(), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index decdc10df6f..af3950f269a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -2092,4 +2092,72 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.USAGE_IS_NOT_INLINABLE) { firDiagnostic -> + UsageIsNotInlinableImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.NON_LOCAL_RETURN_NOT_ALLOWED) { firDiagnostic -> + NonLocalReturnNotAllowedImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.RECURSION_IN_INLINE) { firDiagnostic -> + RecursionInInlineImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> + NonPublicCallFromPublicInlineImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firSymbolBuilder.buildSymbol(firDiagnostic.b.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> + ProtectedConstructorCallFromPublicInlineImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firSymbolBuilder.buildSymbol(firDiagnostic.b.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR) { firDiagnostic -> + ProtectedCallFromPublicInlineErrorImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firSymbolBuilder.buildSymbol(firDiagnostic.b.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> + ProtectedCallFromPublicInlineImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firSymbolBuilder.buildSymbol(firDiagnostic.b.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE) { firDiagnostic -> + PrivateClassMemberFromInlineImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firSymbolBuilder.buildSymbol(firDiagnostic.b.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.SUPER_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> + SuperCallFromPublicInlineImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir as FirDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index b17e278cce6..66d19844129 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1459,4 +1459,54 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = ReturnInFunctionWithExpressionBody::class } + abstract class UsageIsNotInlinable : KtFirDiagnostic() { + override val diagnosticClass get() = UsageIsNotInlinable::class + abstract val parameter: KtSymbol + } + + abstract class NonLocalReturnNotAllowed : KtFirDiagnostic() { + override val diagnosticClass get() = NonLocalReturnNotAllowed::class + abstract val parameter: KtSymbol + } + + abstract class RecursionInInline : KtFirDiagnostic() { + override val diagnosticClass get() = RecursionInInline::class + abstract val symbol: KtSymbol + } + + abstract class NonPublicCallFromPublicInline : KtFirDiagnostic() { + override val diagnosticClass get() = NonPublicCallFromPublicInline::class + abstract val inlineDeclaration: KtSymbol + abstract val referencedDeclaration: KtSymbol + } + + abstract class ProtectedConstructorCallFromPublicInline : KtFirDiagnostic() { + override val diagnosticClass get() = ProtectedConstructorCallFromPublicInline::class + abstract val inlineDeclaration: KtSymbol + abstract val referencedDeclaration: KtSymbol + } + + abstract class ProtectedCallFromPublicInlineError : KtFirDiagnostic() { + override val diagnosticClass get() = ProtectedCallFromPublicInlineError::class + abstract val inlineDeclaration: KtSymbol + abstract val referencedDeclaration: KtSymbol + } + + abstract class ProtectedCallFromPublicInline : KtFirDiagnostic() { + override val diagnosticClass get() = ProtectedCallFromPublicInline::class + abstract val inlineDeclaration: KtSymbol + abstract val referencedDeclaration: KtSymbol + } + + abstract class PrivateClassMemberFromInline : KtFirDiagnostic() { + override val diagnosticClass get() = PrivateClassMemberFromInline::class + abstract val inlineDeclaration: KtSymbol + abstract val referencedDeclaration: KtSymbol + } + + abstract class SuperCallFromPublicInline : KtFirDiagnostic() { + override val diagnosticClass get() = SuperCallFromPublicInline::class + abstract val symbol: KtSymbol + } + } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 788026669a6..936a348a9ba 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2378,3 +2378,80 @@ internal class ReturnInFunctionWithExpressionBodyImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class UsageIsNotInlinableImpl( + override val parameter: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.UsageIsNotInlinable(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class NonLocalReturnNotAllowedImpl( + override val parameter: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.NonLocalReturnNotAllowed(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class RecursionInInlineImpl( + override val symbol: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.RecursionInInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class NonPublicCallFromPublicInlineImpl( + override val inlineDeclaration: KtSymbol, + override val referencedDeclaration: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.NonPublicCallFromPublicInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class ProtectedConstructorCallFromPublicInlineImpl( + override val inlineDeclaration: KtSymbol, + override val referencedDeclaration: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.ProtectedConstructorCallFromPublicInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class ProtectedCallFromPublicInlineErrorImpl( + override val inlineDeclaration: KtSymbol, + override val referencedDeclaration: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.ProtectedCallFromPublicInlineError(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class ProtectedCallFromPublicInlineImpl( + override val inlineDeclaration: KtSymbol, + override val referencedDeclaration: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.ProtectedCallFromPublicInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class PrivateClassMemberFromInlineImpl( + override val inlineDeclaration: KtSymbol, + override val referencedDeclaration: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.PrivateClassMemberFromInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class SuperCallFromPublicInlineImpl( + override val symbol: KtSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.SuperCallFromPublicInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} +