Skip to content

Commit 3aed3ec

Browse files
koperagenSpace Team
authored andcommitted
[KDF] Disable function call transformer in inline because local classes are not supported there
1 parent e4bfc24 commit 3aed3ec

File tree

5 files changed

+69
-1
lines changed

5 files changed

+69
-1
lines changed

plugins/kotlin-dataframe/kotlin-dataframe.k2/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/ExpressionAnalysisAdditionalChecker.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,16 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
2424
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
2525
import org.jetbrains.kotlin.diagnostics.KtDiagnosticsContainer
2626
import org.jetbrains.kotlin.diagnostics.reportOn
27+
import org.jetbrains.kotlin.fir.declarations.utils.isInline
2728
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
2829
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
30+
import org.jetbrains.kotlin.fir.expressions.toResolvedCallableReference
2931
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
3032
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
33+
import org.jetbrains.kotlin.fir.references.toResolvedNamedFunctionSymbol
3134
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
3235
import org.jetbrains.kotlin.fir.resolve.toSymbol
36+
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
3337
import org.jetbrains.kotlin.fir.types.*
3438
import org.jetbrains.kotlin.name.CallableId
3539
import org.jetbrains.kotlin.name.ClassId
@@ -38,6 +42,7 @@ import org.jetbrains.kotlin.name.Name
3842
import org.jetbrains.kotlin.psi.KtElement
3943
import org.jetbrains.kotlinx.dataframe.plugin.extensions.FirDataFrameErrors.CAST_ERROR
4044
import org.jetbrains.kotlinx.dataframe.plugin.extensions.FirDataFrameErrors.CAST_TARGET_WARNING
45+
import org.jetbrains.kotlinx.dataframe.plugin.extensions.FirDataFrameErrors.DATAFRAME_PLUGIN_NOT_YET_SUPPORTED_IN_INLINE
4146
import org.jetbrains.kotlinx.dataframe.plugin.extensions.FirDataFrameErrors.ERROR
4247
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
4348
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup
@@ -57,7 +62,9 @@ class ExpressionAnalysisAdditionalChecker(
5762
) : FirAdditionalCheckersExtension(session) {
5863
override val expressionCheckers: ExpressionCheckers = object : ExpressionCheckers() {
5964
override val functionCallCheckers: Set<FirFunctionCallChecker> = setOfNotNull(
60-
Checker(isTest), FunctionCallSchemaReporter.takeIf { dumpSchemas }
65+
Checker(isTest),
66+
FunctionCallSchemaReporter.takeIf { dumpSchemas },
67+
InlineDataFrameLocalClassesChecker,
6168
)
6269
override val propertyAccessExpressionCheckers: Set<FirPropertyAccessExpressionChecker> = setOfNotNull(
6370
PropertyAccessSchemaReporter.takeIf { dumpSchemas }
@@ -74,6 +81,7 @@ object FirDataFrameErrors : KtDiagnosticsContainer() {
7481
val ERROR by error1<KtElement, String>(SourceElementPositioningStrategies.DEFAULT)
7582
val CAST_ERROR by error1<KtElement, String>(SourceElementPositioningStrategies.CALL_ELEMENT_WITH_DOT)
7683
val CAST_TARGET_WARNING by warning1<KtElement, String>(SourceElementPositioningStrategies.CALL_ELEMENT_WITH_DOT)
84+
val DATAFRAME_PLUGIN_NOT_YET_SUPPORTED_IN_INLINE by warning1<KtElement, String>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
7785

7886
override fun getRendererFactory(): BaseDiagnosticRendererFactory = DataFrameDiagnosticMessages
7987
}
@@ -83,6 +91,7 @@ object DataFrameDiagnosticMessages : BaseDiagnosticRendererFactory() {
8391
map.put(ERROR, "{0}", TO_STRING)
8492
map.put(CAST_ERROR, "{0}", TO_STRING)
8593
map.put(CAST_TARGET_WARNING, "{0}", TO_STRING)
94+
map.put(DATAFRAME_PLUGIN_NOT_YET_SUPPORTED_IN_INLINE, "{0}", TO_STRING)
8695
}
8796
}
8897

@@ -178,6 +187,24 @@ private data object PropertySchemaReporter : FirPropertyChecker(mppKind = MppChe
178187
}
179188
}
180189

190+
private data object InlineDataFrameLocalClassesChecker : FirFunctionCallChecker(mppKind = MppCheckerKind.Common) {
191+
context(context: CheckerContext, reporter: DiagnosticReporter)
192+
override fun check(expression: FirFunctionCall) {
193+
expression.toResolvedCallableReference()?.toResolvedNamedFunctionSymbol()?.let { symbol ->
194+
if (
195+
FunctionCallTransformer.shouldRefine(expression.annotations, symbol, context.session) &&
196+
context.containingDeclarations.any { it is FirNamedFunctionSymbol && it.isInline }
197+
) {
198+
reporter.reportOn(
199+
expression.source,
200+
DATAFRAME_PLUGIN_NOT_YET_SUPPORTED_IN_INLINE,
201+
"DataFrame compiler plugin is not yet supported in inline functions"
202+
)
203+
}
204+
}
205+
}
206+
}
207+
181208
private data object FunctionCallSchemaReporter : FirFunctionCallChecker(mppKind = MppCheckerKind.Common) {
182209
context(context: CheckerContext, reporter: DiagnosticReporter)
183210
override fun check(expression: FirFunctionCall) {

plugins/kotlin-dataframe/kotlin-dataframe.k2/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/FunctionCallTransformer.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.utils.Names
2020
import org.jetbrains.kotlinx.dataframe.plugin.utils.projectOverDataColumnType
2121
import org.jetbrains.kotlin.fir.declarations.EmptyDeprecationsProvider
2222
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
23+
import org.jetbrains.kotlin.fir.declarations.FirFunction
2324
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
2425
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
2526
import org.jetbrains.kotlin.fir.declarations.InlineStatus
@@ -28,6 +29,8 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass
2829
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
2930
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
3031
import org.jetbrains.kotlin.fir.declarations.utils.classId
32+
import org.jetbrains.kotlin.fir.declarations.utils.isInline
33+
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
3134
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
3235
import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
3336
import org.jetbrains.kotlin.fir.expressions.buildResolvedArgumentList
@@ -90,6 +93,16 @@ class FunctionCallTransformer(
9093
) : FirFunctionCallRefinementExtension(session), KotlinTypeFacade {
9194
companion object {
9295
const val DEFAULT_NAME = "DataFrameType"
96+
97+
fun shouldRefine(callSiteAnnotations: List<FirAnnotation>, symbol: FirNamedFunctionSymbol, session: FirSession): Boolean {
98+
if (callSiteAnnotations.any { it.fqName(session)?.shortName()?.equals(Name.identifier("DisableInterpretation")) == true }) {
99+
return false
100+
}
101+
if (symbol.resolvedAnnotationClassIds.none { it.shortClassName == Name.identifier("Refine") }) {
102+
return false
103+
}
104+
return true
105+
}
93106
}
94107

95108
private interface CallTransformer {
@@ -112,6 +125,9 @@ class FunctionCallTransformer(
112125

113126
override fun intercept(callInfo: CallInfo, symbol: FirNamedFunctionSymbol): CallReturnType? {
114127
val callSiteAnnotations = (callInfo.callSite as? FirAnnotationContainer)?.annotations ?: emptyList()
128+
if (!shouldRefine(callSiteAnnotations, symbol, session)) return null
129+
// See org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirInlineBodyRegularClassChecker
130+
if (callInfo.containingDeclarations.any { it is FirFunction && it.isInline }) return null
115131
if (callSiteAnnotations.any { it.fqName(session)?.shortName()?.equals(Name.identifier("DisableInterpretation")) == true }) {
116132
return null
117133
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FILE: pluginInInline.kt
2+
private final inline fun <reified T> convert(l: R|kotlin/collections/List<T>|): R|org/jetbrains/kotlinx/dataframe/DataFrame<T>| {
3+
^convert R|<local>/l|.R|org/jetbrains/kotlinx/dataframe/api/toDataFrame|<R|T|>()
4+
}
5+
public final fun box(): R|kotlin/String| {
6+
R|/convert|<R|kotlin/Int|>(R|kotlin/collections/listOf|<R|kotlin/Int|>(vararg(Int(1), Int(2), Int(3))))
7+
^box String(OK)
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import org.jetbrains.kotlinx.dataframe.*
2+
import org.jetbrains.kotlinx.dataframe.annotations.*
3+
import org.jetbrains.kotlinx.dataframe.api.*
4+
import org.jetbrains.kotlinx.dataframe.io.*
5+
6+
private inline fun <reified T> convert(l: List<T>) = l.<!DATAFRAME_PLUGIN_NOT_YET_SUPPORTED_IN_INLINE!>toDataFrame<!>()
7+
8+
fun box(): String {
9+
convert(listOf(1, 2, 3))
10+
return "OK"
11+
}

plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameDiagnosticTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)