Skip to content

Commit 48d0f6d

Browse files
demiurg906Space Team
authored andcommitted
[IR] Add an API for writing lookups from IrGenerationExtension
^KT-79504 Fixed
1 parent 2a24ac5 commit 48d0f6d

File tree

6 files changed

+39
-1
lines changed

6 files changed

+39
-1
lines changed

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrPluginContext.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package org.jetbrains.kotlin.fir.backend
77

8+
import org.jetbrains.kotlin.KtSourceElement
89
import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI
910
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
1011
import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase
@@ -25,10 +26,21 @@ import org.jetbrains.kotlin.ir.IrDiagnosticReporter
2526
import org.jetbrains.kotlin.ir.KtDiagnosticReporterWithImplicitIrBasedContext
2627
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
2728
import org.jetbrains.kotlin.backend.common.linkage.IrDeserializer
29+
import org.jetbrains.kotlin.fir.lookupTracker
30+
import org.jetbrains.kotlin.fir.recordFqNameLookup
31+
import org.jetbrains.kotlin.ir.declarations.IrClass
32+
import org.jetbrains.kotlin.ir.declarations.IrConstructor
33+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
34+
import org.jetbrains.kotlin.ir.declarations.IrFile
35+
import org.jetbrains.kotlin.ir.declarations.IrProperty
36+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
37+
import org.jetbrains.kotlin.ir.declarations.IrTypeAlias
2838
import org.jetbrains.kotlin.ir.symbols.*
2939
import org.jetbrains.kotlin.ir.util.IdSignature
3040
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
3141
import org.jetbrains.kotlin.ir.util.TypeTranslator
42+
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
43+
import org.jetbrains.kotlin.ir.util.sourceElement
3244
import org.jetbrains.kotlin.name.CallableId
3345
import org.jetbrains.kotlin.name.ClassId
3446
import org.jetbrains.kotlin.name.FqName
@@ -135,6 +147,14 @@ class Fir2IrPluginContext(
135147
return callables.mapNotNull { c.declarationStorage.irExtractor(it) }.filterIsInstance<R>()
136148
}
137149

150+
override fun recordLookup(declaration: IrDeclarationWithName, fromFile: IrFile) {
151+
val lookupTracker = c.session.lookupTracker ?: return
152+
val fqName = declaration.fqNameWhenAvailable ?: return
153+
val firFile = (fromFile.metadata as? FirMetadataSource.File)?.fir ?: return
154+
val fileSource = firFile.source ?: return
155+
lookupTracker.recordFqNameLookup(fqName, source = null, fileSource = fileSource)
156+
}
157+
138158
@Deprecated("Use messageCollector or diagnosticReporter properties instead", level = DeprecationLevel.ERROR)
139159
override fun createDiagnosticReporter(pluginId: String): MessageCollector {
140160
error(ERROR_MESSAGE)

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContext.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
1313
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
1414
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
1515
import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
16+
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
17+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
18+
import org.jetbrains.kotlin.ir.declarations.IrFile
1619
import org.jetbrains.kotlin.ir.symbols.*
1720
import org.jetbrains.kotlin.ir.util.IdSignature
1821
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
@@ -65,6 +68,15 @@ interface IrPluginContext : IrGeneratorContext {
6568
fun referenceFunctions(callableId: CallableId): Collection<IrSimpleFunctionSymbol>
6669
fun referenceProperties(callableId: CallableId): Collection<IrPropertySymbol>
6770

71+
// ------------------------------------ IC API ------------------------------------
72+
73+
/**
74+
* Records information that [declaration] was referenced during modification of file [fromFile].
75+
* This information later will be used by the Incremental compilation to correctly invalidate
76+
* compiled files on source changes.
77+
*/
78+
fun recordLookup(declaration: IrDeclarationWithName, fromFile: IrFile)
79+
6880
// ------------------------------------ Deprecated API ------------------------------------
6981

7082
@Deprecated("Use diagnosticReporter instead", level = DeprecationLevel.ERROR)

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContextImpl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration
2525
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
2626
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
2727
import org.jetbrains.kotlin.backend.common.linkage.IrDeserializer
28+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
29+
import org.jetbrains.kotlin.ir.declarations.IrFile
2830
import org.jetbrains.kotlin.ir.symbols.*
2931
import org.jetbrains.kotlin.ir.util.IdSignature
3032
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
@@ -195,6 +197,8 @@ open class IrPluginContextImpl(
195197
return referenceProperties(callableId.asSingleFqName())
196198
}
197199

200+
override fun recordLookup(declaration: IrDeclarationWithName, fromFile: IrFile) {}
201+
198202
@Deprecated("This API is deprecated. It will be removed after the 2.3 release", level = DeprecationLevel.WARNING)
199203
@FirIncompatiblePluginAPI
200204
override fun referenceTopLevel(

plugins/plugin-sandbox/plugin-sandbox-ic-test/testData/pureKotlin/referenceFunctionFromIrPlugin/build.log

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
Compiling files:
44
src/a.kt
5+
src/b.kt
56
End of files
67
Exit code: OK
78

plugins/plugin-sandbox/plugin-sandbox-ic-test/testData/pureKotlin/referenceFunctionFromIrPlugin/fail.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

plugins/plugin-sandbox/src/org/jetbrains/kotlin/plugin/sandbox/ir/IrTransformerForICTesting.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
1515
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
1616
import org.jetbrains.kotlin.ir.expressions.IrConst
1717
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
18+
import org.jetbrains.kotlin.ir.util.file
1819
import org.jetbrains.kotlin.ir.util.getAnnotation
1920
import org.jetbrains.kotlin.ir.visitors.IrVisitorVoid
2021
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -60,5 +61,6 @@ class IrTransformerForICTesting(private val context: IrPluginContext) : IrVisito
6061
superQualifierSymbol = null
6162
)
6263
body.statements.add(0, functionCall)
64+
context.recordLookup(functionToCall, fromFile = declaration.file)
6365
}
6466
}

0 commit comments

Comments
 (0)