Skip to content

Commit db299a8

Browse files
demiurg906Space Cloud
authored andcommitted
[Compiler] Pass information about plugin-generated files from compiler to IC
^KT-55982 ^KT-75864
1 parent 738f691 commit db299a8

File tree

15 files changed

+101
-12
lines changed

15 files changed

+101
-12
lines changed

build-common/src/org/jetbrains/kotlin/incremental/ICFileMappingTrackerImpl.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,12 @@ class ICFileMappingTrackerImpl(private val outputItemsCollector: OutputItemsColl
1313
override fun recordSourceFilesToOutputFileMapping(sourceFiles: Collection<File>, outputFile: File) {
1414
outputItemsCollector.add(sourceFiles, outputFile)
1515
}
16+
17+
override fun recordSourceReferencedByCompilerPlugin(sourceFile: File) {
18+
// nothing yet
19+
}
20+
21+
override fun recordOutputFileGeneratedForPlugin(outputFile: File) {
22+
// nothing yet
23+
}
1624
}

compiler/backend-common/src/org/jetbrains/kotlin/backend/common/output/output.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ interface OutputFileCollection {
2626
interface OutputFile {
2727
val relativePath: String
2828
val sourceFiles: List<File>
29+
val generatedForCompilerPlugin: Boolean
30+
get() = false
31+
2932
fun asByteArray(): ByteArray
3033
fun asText(): String
3134
}

compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.serializeToByteArray
2020
import org.jetbrains.kotlin.name.FqName
2121
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
2222
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
23+
import org.jetbrains.kotlin.utils.addToStdlib.runIf
2324
import org.jetbrains.org.objectweb.asm.Type
2425
import java.io.File
2526
import java.nio.charset.StandardCharsets
@@ -31,6 +32,7 @@ class ClassFileFactory(
3132
private val finalizers: List<ClassFileFactoryFinalizerExtension>
3233
) : OutputFileCollection {
3334
private val generators: MutableMap<String, OutAndSourceFileList> = Collections.synchronizedMap(LinkedHashMap())
35+
private val generatedForCompilerPluginOutputs: MutableSet<String> = LinkedHashSet()
3436

3537
private var isDone = false
3638

@@ -39,10 +41,14 @@ class ClassFileFactory(
3941

4042
fun newVisitor(origin: JvmDeclarationOrigin, asmType: Type, sourceFiles: List<File>): ClassBuilder {
4143
val answer = builderFactory.newClassBuilder(origin)
44+
val classFileName = asmType.internalName + ".class"
4245
generators.put(
43-
asmType.internalName + ".class",
46+
classFileName,
4447
ClassBuilderAndSourceFileList(answer, sourceFiles)
4548
)
49+
if (origin.generatedForCompilerPlugin) {
50+
generatedForCompilerPluginOutputs.add(classFileName)
51+
}
4652
return answer
4753
}
4854

@@ -117,10 +123,12 @@ class ClassFileFactory(
117123
}
118124

119125
val currentOutput: List<OutputFile>
120-
get() = generators.keys.map { OutputClassFile(it) }
126+
get() = generators.keys.map { OutputClassFile(relativePath = it, generatedForCompilerPlugin = it in generatedForCompilerPluginOutputs) }
121127

122128
override fun get(relativePath: String): OutputFile? {
123-
return if (generators.containsKey(relativePath)) OutputClassFile(relativePath) else null
129+
return runIf(generators.containsKey(relativePath)) {
130+
OutputClassFile(relativePath, generatedForCompilerPlugin = relativePath in generatedForCompilerPluginOutputs)
131+
}
124132
}
125133

126134
@TestOnly
@@ -183,7 +191,10 @@ class ClassFileFactory(
183191
}
184192
}
185193

186-
private inner class OutputClassFile(override val relativePath: String) : OutputFile {
194+
private inner class OutputClassFile(
195+
override val relativePath: String,
196+
override val generatedForCompilerPlugin: Boolean,
197+
) : OutputFile {
187198
override val sourceFiles: List<File>
188199
get() {
189200
val pair: OutAndSourceFileList = generators[this.relativePath]!!

compiler/backend/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ open class JvmDeclarationOrigin(
2121
open val originalSourceElement: Any?
2222
get() = element
2323

24+
/**
25+
* This property indicates that the declaration was generated for top-level declarations generated by the frontend compiler plugin.
26+
*/
27+
open val generatedForCompilerPlugin: Boolean
28+
get() = false
29+
2430
override fun toString(): String =
2531
if (this == NO_ORIGIN) "NO_ORIGIN" else "origin=$originKind element=${element?.javaClass?.simpleName} descriptor=$descriptor"
2632

compiler/cli/src/org/jetbrains/kotlin/cli/common/output/outputUtils.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,17 @@ fun OutputFileCollection.writeAll(
5757
try {
5858
if (!reportOutputFiles && fileMappingTracker == null) writeAllTo(outputDir)
5959
else writeAll(outputDir) { outputInfo, output ->
60-
fileMappingTracker?.recordSourceFilesToOutputFileMapping(outputInfo.sourceFiles, output)
60+
fileMappingTracker?.let { tracker ->
61+
when (outputInfo.generatedForCompilerPlugin) {
62+
false -> tracker.recordSourceFilesToOutputFileMapping(outputInfo.sourceFiles, output)
63+
true -> {
64+
check(outputInfo.sourceFiles.none { it.exists() }) {
65+
"Plugin generated file shouldn't have sources, but got ${outputInfo.sourceFiles.joinToString { it.path }}"
66+
}
67+
tracker.recordSourceFilesToOutputFileMapping(outputInfo.sourceFiles, output)
68+
}
69+
}
70+
}
6171
if (reportOutputFiles) {
6272
messageCollector.report(CompilerMessageSeverity.OUTPUT, OutputMessageUtil.formatOutputMessage(outputInfo.sourceFiles, output))
6373
}

compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/IncrementalPassThroughLookupTrackerComponent.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@ package org.jetbrains.kotlin.fir
88
import org.jetbrains.kotlin.KtPsiSourceElement
99
import org.jetbrains.kotlin.KtSourceElement
1010
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile
11+
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
12+
import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile
13+
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
14+
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
15+
import org.jetbrains.kotlin.incremental.components.ICFileMappingTracker
1116
import org.jetbrains.kotlin.incremental.components.LookupTracker
1217
import org.jetbrains.kotlin.incremental.components.Position
1318
import org.jetbrains.kotlin.incremental.components.ScopeKind
1419
import org.jetbrains.kotlin.utils.SmartList
20+
import java.io.File
1521
import java.util.concurrent.ConcurrentHashMap
1622

1723
class IncrementalPassThroughLookupTrackerComponent(
24+
private val session: FirSession,
1825
private val lookupTracker: LookupTracker,
26+
private val fileMappingTracker: ICFileMappingTracker?,
1927
private val sourceToFilePath: (KtSourceElement) -> String?
2028
) : FirLookupTrackerComponent() {
2129

@@ -44,4 +52,12 @@ class IncrementalPassThroughLookupTrackerComponent(
4452
override fun recordLookup(name: String, inScope: String, source: KtSourceElement?, fileSource: KtSourceElement?) {
4553
recordLookup(name, SmartList(inScope), source, fileSource)
4654
}
55+
56+
@OptIn(SymbolInternals::class)
57+
override fun recordDirtyDeclaration(symbol: FirBasedSymbol<*>) {
58+
if (fileMappingTracker == null) return
59+
val containingFile = session.firProvider.getContainingFile(symbol) ?: return
60+
val sourceFile = containingFile.sourceFile?.path?.let { File(it) } ?: return
61+
fileMappingTracker.recordSourceReferencedByCompilerPlugin(sourceFile)
62+
}
4763
}

compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import org.jetbrains.kotlin.fir.serialization.FirProvidedDeclarationsForMetadata
6464
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
6565
import org.jetbrains.kotlin.fir.types.*
6666
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
67+
import org.jetbrains.kotlin.incremental.components.ICFileMappingTracker
6768
import org.jetbrains.kotlin.incremental.components.ImportTracker
6869
import org.jetbrains.kotlin.incremental.components.LookupTracker
6970
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
@@ -211,6 +212,7 @@ fun FirSession.registerResolveComponents(
211212
lookupTracker: LookupTracker? = null,
212213
enumWhenTracker: EnumWhenTracker? = null,
213214
importTracker: ImportTracker? = null,
215+
fileMappingTracker: ICFileMappingTracker? = null,
214216
) {
215217
register(FirQualifierResolver::class, FirQualifierResolverImpl(this))
216218
register(FirTypeResolver::class, FirTypeResolverImpl(this))
@@ -222,7 +224,7 @@ fun FirSession.registerResolveComponents(
222224
}
223225
register(
224226
FirLookupTrackerComponent::class,
225-
IncrementalPassThroughLookupTrackerComponent(lookupTracker, firFileToPath)
227+
IncrementalPassThroughLookupTrackerComponent(this, lookupTracker, fileMappingTracker, firFileToPath)
226228
)
227229
}
228230
if (enumWhenTracker != null) {

compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ abstract class FirAbstractSessionFactory<LIBRARY_CONTEXT, SOURCE_CONTEXT> {
243243
registerResolveComponents(
244244
configuration.lookupTracker,
245245
configuration.enumWhenTracker,
246-
configuration.importTracker
246+
configuration.importTracker,
247+
configuration.fileMappingTracker,
247248
)
248249
registerCliCompilerOnlyResolveComponents()
249250
registerSourceSessionComponents(context)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind
1010
import org.jetbrains.kotlin.KtPsiSourceFileLinesMapping
1111
import org.jetbrains.kotlin.KtSourceFileLinesMappingFromLineStartOffsets
1212
import org.jetbrains.kotlin.backend.common.CommonBackendErrors
13+
import org.jetbrains.kotlin.backend.common.fileForTopLevelPluginDeclarations
1314
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
1415
import org.jetbrains.kotlin.config.LanguageFeature
1516
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
@@ -152,6 +153,9 @@ class Fir2IrConverter(
152153
moduleDescriptor.getPackage(file.packageFqName).fragments.first(),
153154
moduleFragment
154155
)
156+
if (file.origin is FirDeclarationOrigin.Synthetic.PluginFile) {
157+
irFile.fileForTopLevelPluginDeclarations = true
158+
}
155159
declarationStorage.registerFile(file, irFile)
156160
for (declaration in file.declarations) {
157161
when (declaration) {

compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirPredicateBasedProviderImpl.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.extensions.predicate.AbstractPredicate
1717
import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate
1818
import org.jetbrains.kotlin.fir.extensions.predicate.LookupPredicate
1919
import org.jetbrains.kotlin.fir.extensions.predicate.PredicateVisitor
20+
import org.jetbrains.kotlin.fir.lookupTracker
2021
import org.jetbrains.kotlin.fir.resolve.fqName
2122
import org.jetbrains.kotlin.fir.resolve.toSymbol
2223
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -36,7 +37,10 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic
3637
val declarations = annotations.flatMapTo(mutableSetOf()) {
3738
cache.declarationByAnnotation[it] + cache.declarationsUnderAnnotated[it]
3839
}
39-
return declarations.filter { matches(predicate, it) }.map { it.symbol }
40+
return declarations
41+
.filter { matches(predicate, it) }
42+
.map { it.symbol }
43+
.onEach { session.lookupTracker?.recordDirtyDeclaration(it) }
4044
}
4145

4246
override fun fileHasPluginAnnotations(file: FirFile): Boolean {

0 commit comments

Comments
 (0)