Add import tracker

This tracker reports import directives to IJ's JPS to track changes and detectwehen it is needed to adjust compilation scope.

#KT-44835 Fixed
This commit is contained in:
Aleksei.Cherepanov
2023-08-11 15:17:50 +02:00
committed by Space Team
parent b27aef2c61
commit 68af705664
25 changed files with 175 additions and 45 deletions
@@ -0,0 +1,21 @@
/*
* Copyright 2010-2023 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.incremental
import org.jetbrains.kotlin.incremental.components.ImportTracker
import java.util.concurrent.ConcurrentHashMap
@Suppress("unused")
class ImportTrackerImpl: ImportTracker {
private val filePathToImportedFqNames = ConcurrentHashMap<String, MutableSet<String>>()
val filePathToImportedFqNamesMap: Map<String, Collection<String>>
get() = filePathToImportedFqNames
override fun report(filePath: String, importedFqName: String) {
filePathToImportedFqNames.getOrPut(filePath) { hashSetOf() }.add(importedFqName)
}
}
@@ -100,6 +100,7 @@ fun <F> prepareJvmSessions(
configuration.languageVersionSettings, configuration.languageVersionSettings,
configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER), configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER), configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER),
configuration.get(CommonConfigurationKeys.IMPORT_TRACKER),
needRegisterJavaElementFinder = true, needRegisterJavaElementFinder = true,
registerExtraComponents = {}, registerExtraComponents = {},
sessionConfigurator, sessionConfigurator,
@@ -293,6 +294,7 @@ fun <F> prepareCommonSessions(
configuration.languageVersionSettings, configuration.languageVersionSettings,
lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER), lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
enumWhenTracker = configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER), enumWhenTracker = configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER),
importTracker = configuration.get(CommonConfigurationKeys.IMPORT_TRACKER),
registerExtraComponents = {}, registerExtraComponents = {},
init = sessionConfigurator init = sessionConfigurator
) )
@@ -38,10 +38,7 @@ import org.jetbrains.kotlin.cli.jvm.config.ClassicFrontendSpecificJvmConfigurati
import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots
import org.jetbrains.kotlin.codegen.CompilationException import org.jetbrains.kotlin.codegen.CompilationException
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.JavaClassesTracker import org.jetbrains.kotlin.load.java.JavaClassesTracker
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
@@ -225,6 +222,8 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
putIfNotNull(CommonConfigurationKeys.ENUM_WHEN_TRACKER, services[EnumWhenTracker::class.java]) putIfNotNull(CommonConfigurationKeys.ENUM_WHEN_TRACKER, services[EnumWhenTracker::class.java])
putIfNotNull(CommonConfigurationKeys.IMPORT_TRACKER, services[ImportTracker::class.java])
putIfNotNull( putIfNotNull(
JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS, JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS,
services[IncrementalCompilationComponents::class.java] services[IncrementalCompilationComponents::class.java]
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.config package org.jetbrains.kotlin.config
import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
object CommonConfigurationKeys { object CommonConfigurationKeys {
@@ -48,6 +45,9 @@ object CommonConfigurationKeys {
@JvmField @JvmField
val ENUM_WHEN_TRACKER = CompilerConfigurationKey.create<EnumWhenTracker>("enum when tracker") val ENUM_WHEN_TRACKER = CompilerConfigurationKey.create<EnumWhenTracker>("enum when tracker")
@JvmField
val IMPORT_TRACKER = CompilerConfigurationKey.create<ImportTracker>("import tracker")
@JvmField @JvmField
val METADATA_VERSION = CompilerConfigurationKey.create<BinaryVersion>("metadata version") val METADATA_VERSION = CompilerConfigurationKey.create<BinaryVersion>("metadata version")
@@ -36,6 +36,7 @@ open class CompilerCallbackServicesFacadeServer(
val expectActualTracker: ExpectActualTracker? = null, val expectActualTracker: ExpectActualTracker? = null,
val inlineConstTracker: InlineConstTracker? = null, val inlineConstTracker: InlineConstTracker? = null,
val enumWhenTracker: EnumWhenTracker? = null, val enumWhenTracker: EnumWhenTracker? = null,
val importTracker: ImportTracker? = null,
val incrementalResultsConsumer: IncrementalResultsConsumer? = null, val incrementalResultsConsumer: IncrementalResultsConsumer? = null,
val incrementalDataProvider: IncrementalDataProvider? = null, val incrementalDataProvider: IncrementalDataProvider? = null,
port: Int = SOCKET_ANY_FREE_PORT port: Int = SOCKET_ANY_FREE_PORT
@@ -57,6 +58,8 @@ open class CompilerCallbackServicesFacadeServer(
override fun hasEnumWhenTracker(): Boolean = enumWhenTracker != null override fun hasEnumWhenTracker(): Boolean = enumWhenTracker != null
override fun hasImportTracker(): Boolean = importTracker != null
override fun hasIncrementalResultsConsumer(): Boolean = incrementalResultsConsumer != null override fun hasIncrementalResultsConsumer(): Boolean = incrementalResultsConsumer != null
override fun hasIncrementalDataProvider(): Boolean = incrementalDataProvider != null override fun hasIncrementalDataProvider(): Boolean = incrementalDataProvider != null
@@ -128,6 +131,10 @@ open class CompilerCallbackServicesFacadeServer(
enumWhenTracker?.report(whenUsageClassPath, enumClassFqName) ?: throw NullPointerException("enumWhenTracker was not initialized") enumWhenTracker?.report(whenUsageClassPath, enumClassFqName) ?: throw NullPointerException("enumWhenTracker was not initialized")
} }
override fun importTracker_report(filePath: String, importedFqName: String) {
importTracker?.report(filePath, importedFqName) ?: throw NullPointerException("importTracker was not initialized")
}
override fun incrementalResultsConsumer_processHeader(headerMetadata: ByteArray) { override fun incrementalResultsConsumer_processHeader(headerMetadata: ByteArray) {
incrementalResultsConsumer!!.processHeader(headerMetadata) incrementalResultsConsumer!!.processHeader(headerMetadata)
} }
@@ -54,6 +54,9 @@ interface CompilerCallbackServicesFacade : Remote {
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun hasEnumWhenTracker(): Boolean fun hasEnumWhenTracker(): Boolean
@Throws(RemoteException::class)
fun hasImportTracker(): Boolean
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun hasIncrementalResultsConsumer(): Boolean fun hasIncrementalResultsConsumer(): Boolean
@@ -117,6 +120,11 @@ interface CompilerCallbackServicesFacade : Remote {
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun enumWhenTracker_report(whenUsageClassPath: String, enumClassFqName: String) fun enumWhenTracker_report(whenUsageClassPath: String, enumClassFqName: String)
// ---------------------------------------------------
// ImportTracker
@Throws(RemoteException::class)
fun importTracker_report(filePath: String, importedFqName: String)
// --------------------------------------------------- // ---------------------------------------------------
// IncrementalResultsConsumer (js) // IncrementalResultsConsumer (js)
@Throws(RemoteException::class) @Throws(RemoteException::class)
@@ -53,6 +53,7 @@ import org.jetbrains.kotlin.fir.serialization.FirProvidedDeclarationsForMetadata
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ImportTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparator import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparator
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
@@ -123,7 +124,7 @@ fun FirSession.registerCommonJavaComponents(javaModuleResolver: JavaModuleResolv
* Resolve components which are same on all platforms * Resolve components which are same on all platforms
*/ */
@OptIn(SessionConfiguration::class) @OptIn(SessionConfiguration::class)
fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null, enumWhenTracker: EnumWhenTracker? = null) { fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null, enumWhenTracker: EnumWhenTracker? = null, importTracker: ImportTracker? = null) {
register(FirQualifierResolver::class, FirQualifierResolverImpl(this)) register(FirQualifierResolver::class, FirQualifierResolverImpl(this))
register(FirTypeResolver::class, FirTypeResolverImpl(this)) register(FirTypeResolver::class, FirTypeResolverImpl(this))
register(CheckersComponent::class, CheckersComponent()) register(CheckersComponent::class, CheckersComponent())
@@ -145,6 +146,12 @@ fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null, e
IncrementalPassThroughEnumWhenTrackerComponent(enumWhenTracker) IncrementalPassThroughEnumWhenTrackerComponent(enumWhenTracker)
) )
} }
if (importTracker != null) {
register(
FirImportTrackerComponent::class,
IncrementalPassThroughImportTrackerComponent(importTracker)
)
}
register(FirExpectActualMatchingContextFactory::class, FirExpectActualMatchingContextImpl.Factory) register(FirExpectActualMatchingContextFactory::class, FirExpectActualMatchingContextImpl.Factory)
} }
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ImportTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -83,6 +84,7 @@ abstract class FirAbstractSessionFactory {
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
lookupTracker: LookupTracker?, lookupTracker: LookupTracker?,
enumWhenTracker: EnumWhenTracker?, enumWhenTracker: EnumWhenTracker?,
importTracker: ImportTracker?,
init: FirSessionConfigurator.() -> Unit, init: FirSessionConfigurator.() -> Unit,
registerExtraComponents: ((FirSession) -> Unit), registerExtraComponents: ((FirSession) -> Unit),
registerExtraCheckers: ((FirSessionConfigurator) -> Unit)?, registerExtraCheckers: ((FirSessionConfigurator) -> Unit)?,
@@ -99,7 +101,7 @@ abstract class FirAbstractSessionFactory {
registerModuleData(moduleData) registerModuleData(moduleData)
registerCliCompilerOnlyComponents() registerCliCompilerOnlyComponents()
registerCommonComponents(languageVersionSettings) registerCommonComponents(languageVersionSettings)
registerResolveComponents(lookupTracker, enumWhenTracker) registerResolveComponents(lookupTracker, enumWhenTracker, importTracker)
registerExtraComponents(this) registerExtraComponents(this)
val kotlinScopeProvider = createKotlinScopeProvider.invoke() val kotlinScopeProvider = createKotlinScopeProvider.invoke()
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ImportTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider
@@ -91,6 +92,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null, lookupTracker: LookupTracker? = null,
enumWhenTracker: EnumWhenTracker? = null, enumWhenTracker: EnumWhenTracker? = null,
importTracker: ImportTracker? = null,
registerExtraComponents: ((FirSession) -> Unit) = {}, registerExtraComponents: ((FirSession) -> Unit) = {},
init: FirSessionConfigurator.() -> Unit = {} init: FirSessionConfigurator.() -> Unit = {}
): FirSession { ): FirSession {
@@ -101,6 +103,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
languageVersionSettings, languageVersionSettings,
lookupTracker, lookupTracker,
enumWhenTracker, enumWhenTracker,
importTracker,
init, init,
registerExtraComponents = { registerExtraComponents = {
it.register(FirVisibilityChecker::class, FirVisibilityChecker.Default) it.register(FirVisibilityChecker::class, FirVisibilityChecker.Default)
@@ -52,6 +52,7 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
compilerConfiguration.languageVersionSettings, compilerConfiguration.languageVersionSettings,
lookupTracker, lookupTracker,
null, null,
null,
init, init,
registerExtraComponents = { session -> registerExtraComponents = { session ->
session.registerJsSpecificComponents(compilerConfiguration) session.registerJsSpecificComponents(compilerConfiguration)
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ImportTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -89,6 +90,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null, lookupTracker: LookupTracker? = null,
enumWhenTracker: EnumWhenTracker? = null, enumWhenTracker: EnumWhenTracker? = null,
importTracker: ImportTracker? = null,
needRegisterJavaElementFinder: Boolean, needRegisterJavaElementFinder: Boolean,
registerExtraComponents: ((FirSession) -> Unit) = {}, registerExtraComponents: ((FirSession) -> Unit) = {},
init: FirSessionConfigurator.() -> Unit = {} init: FirSessionConfigurator.() -> Unit = {}
@@ -100,6 +102,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
languageVersionSettings, languageVersionSettings,
lookupTracker, lookupTracker,
enumWhenTracker, enumWhenTracker,
importTracker,
init, init,
registerExtraComponents = { registerExtraComponents = {
it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver())
@@ -75,6 +75,7 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
languageVersionSettings, languageVersionSettings,
null, null,
null, null,
null,
init, init,
registerExtraComponents = { registerExtraComponents = {
it.register(FirVisibilityChecker::class, FirVisibilityChecker.Default) it.register(FirVisibilityChecker::class, FirVisibilityChecker.Default)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ImportTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
@@ -33,6 +34,7 @@ object FirSessionFactoryHelper {
librariesScope: AbstractProjectFileSearchScope, librariesScope: AbstractProjectFileSearchScope,
lookupTracker: LookupTracker?, lookupTracker: LookupTracker?,
enumWhenTracker: EnumWhenTracker?, enumWhenTracker: EnumWhenTracker?,
importTracker: ImportTracker?,
incrementalCompilationContext: IncrementalCompilationContext?, incrementalCompilationContext: IncrementalCompilationContext?,
extensionRegistrars: List<FirExtensionRegistrar>, extensionRegistrars: List<FirExtensionRegistrar>,
needRegisterJavaElementFinder: Boolean, needRegisterJavaElementFinder: Boolean,
@@ -73,6 +75,7 @@ object FirSessionFactoryHelper {
languageVersionSettings, languageVersionSettings,
lookupTracker, lookupTracker,
enumWhenTracker, enumWhenTracker,
importTracker,
needRegisterJavaElementFinder, needRegisterJavaElementFinder,
registerExtraComponents = {}, registerExtraComponents = {},
sessionConfigurator, sessionConfigurator,
@@ -44,6 +44,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
languageVersionSettings, languageVersionSettings,
lookupTracker, lookupTracker,
null, null,
null,
init, init,
registerExtraComponents = { session -> registerExtraComponents = { session ->
session.registerWasmSpecificComponents() session.registerWasmSpecificComponents()
@@ -0,0 +1,16 @@
/*
* 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.session
import org.jetbrains.kotlin.fir.FirImportTrackerComponent
import org.jetbrains.kotlin.incremental.components.ImportTracker
class IncrementalPassThroughImportTrackerComponent(private val importTracker: ImportTracker) : FirImportTrackerComponent() {
override fun report(filePath: String, importedFqName: String) {
importTracker.report(filePath, importedFqName)
}
}
@@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.importTracker
import org.jetbrains.kotlin.fir.packageFqName import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.reportImportDirectives
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.scopeSessionKey import org.jetbrains.kotlin.fir.resolve.scopeSessionKey
import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
@@ -18,13 +20,14 @@ import org.jetbrains.kotlin.name.FqName
private val ALL_IMPORTS = scopeSessionKey<FirFile, ListStorageFirScope>() private val ALL_IMPORTS = scopeSessionKey<FirFile, ListStorageFirScope>()
private val DEFAULT_STAR_IMPORT = scopeSessionKey<DefaultStarImportKey, FirSingleLevelDefaultStarImportingScope>() private val DEFAULT_STAR_IMPORT = scopeSessionKey<DefaultStarImportKey, FirSingleLevelDefaultStarImportingScope>()
private val DEFAULT_SIMPLE_IMPORT = scopeSessionKey<DefaultImportPriority, FirDefaultSimpleImportingScope>() private val DEFAULT_SIMPLE_IMPORT = scopeSessionKey<DefaultImportPriority, FirDefaultSimpleImportingScope>()
private data class DefaultStarImportKey(val priority: DefaultImportPriority, val excludedImportNames: Set<FqName>) private data class DefaultStarImportKey(val priority: DefaultImportPriority, val excludedImportNames: Set<FqName>)
fun createImportingScopes( fun createImportingScopes(
file: FirFile, file: FirFile,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
useCaching: Boolean = true useCaching: Boolean = true,
): List<FirScope> = if (useCaching) { ): List<FirScope> = if (useCaching) {
scopeSession.getOrBuild(file, ALL_IMPORTS) { scopeSession.getOrBuild(file, ALL_IMPORTS) {
ListStorageFirScope(computeImportingScopes(file, session, scopeSession)) ListStorageFirScope(computeImportingScopes(file, session, scopeSession))
@@ -49,6 +52,12 @@ internal fun computeImportingScopes(
if (it.parent() == file.packageFqName) it.shortName() else null if (it.parent() == file.packageFqName) it.shortName() else null
} }
session.importTracker?.let { tracker ->
file.imports.map { import ->
tracker.reportImportDirectives(file.sourceFile?.path, import.importedFqName?.asString())
}
}
return buildList { return buildList {
if (includeDefaultImports) { if (includeDefaultImports) {
this += FirDefaultStarImportingScope( this += FirDefaultStarImportingScope(
@@ -0,0 +1,17 @@
/*
* 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
abstract class FirImportTrackerComponent : FirSessionComponent {
abstract fun report(filePath: String, importedFqName: String)
}
val FirSession.importTracker: FirImportTrackerComponent? by FirSession.nullableSessionComponentAccessor()
fun FirImportTrackerComponent.reportImportDirectives(filePath: String?, importedFqName: String?) {
if (filePath == null || importedFqName == null) return
this.report(filePath, importedFqName)
}
@@ -99,6 +99,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
librariesScope = PsiBasedProjectFileSearchScope(allProjectScope), librariesScope = PsiBasedProjectFileSearchScope(allProjectScope),
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null, enumWhenTracker = null,
importTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = emptyList(), extensionRegistrars = emptyList(),
needRegisterJavaElementFinder = true needRegisterJavaElementFinder = true
@@ -43,6 +43,7 @@ object FirTestSessionFactoryHelper {
librariesScope, librariesScope,
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null, enumWhenTracker = null,
importTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = emptyList(), extensionRegistrars = emptyList(),
needRegisterJavaElementFinder = true, needRegisterJavaElementFinder = true,
@@ -75,6 +76,7 @@ object FirTestSessionFactoryHelper {
PsiBasedProjectFileSearchScope(librariesScope), PsiBasedProjectFileSearchScope(librariesScope),
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null, enumWhenTracker = null,
importTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = emptyList(), extensionRegistrars = emptyList(),
needRegisterJavaElementFinder = true, needRegisterJavaElementFinder = true,
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2023 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.incremental.components
import org.jetbrains.kotlin.container.DefaultImplementation
/**
* ImportTracker is used to track imports directives used in Kotlin for correct build scope expansion in IC during JPS build.
* e.g. Removing of Java file, that Kotlin relies on by importing
*/
@DefaultImplementation(ImportTracker.DoNothing::class)
interface ImportTracker {
/**
* Report import directives, where FqName is [importedFqName].
* Format of [importedFqName] class is "package.Outer.Inner"
*/
fun report(filePath: String, importedFqName: String)
object DoNothing : ImportTracker {
override fun report(filePath: String, importedFqName: String) {}
}
}
@@ -20,10 +20,7 @@ import org.jetbrains.kotlin.daemon.client.CompilerCallbackServicesFacadeServer
import org.jetbrains.kotlin.daemon.client.reportFromDaemon import org.jetbrains.kotlin.daemon.client.reportFromDaemon
import org.jetbrains.kotlin.daemon.common.JpsCompilerServicesFacade import org.jetbrains.kotlin.daemon.common.JpsCompilerServicesFacade
import org.jetbrains.kotlin.daemon.common.SOCKET_ANY_FREE_PORT import org.jetbrains.kotlin.daemon.common.SOCKET_ANY_FREE_PORT
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
@@ -40,6 +37,7 @@ internal class JpsCompilerServicesFacadeImpl(
env.services[ExpectActualTracker::class.java], env.services[ExpectActualTracker::class.java],
env.services[InlineConstTracker::class.java], env.services[InlineConstTracker::class.java],
env.services[EnumWhenTracker::class.java], env.services[EnumWhenTracker::class.java],
env.services[ImportTracker::class.java],
env.services[IncrementalResultsConsumer::class.java], env.services[IncrementalResultsConsumer::class.java],
env.services[IncrementalDataProvider::class.java], env.services[IncrementalDataProvider::class.java],
port port
@@ -35,10 +35,7 @@ import org.jetbrains.kotlin.config.KotlinModuleKind
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.daemon.common.isDaemonEnabled import org.jetbrains.kotlin.daemon.common.isDaemonEnabled
import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.jps.KotlinJpsBundle import org.jetbrains.kotlin.jps.KotlinJpsBundle
import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache
import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageManager import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageManager
@@ -245,6 +242,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
ExpectActualTracker.DoNothing, ExpectActualTracker.DoNothing,
InlineConstTracker.DoNothing, InlineConstTracker.DoNothing,
EnumWhenTracker.DoNothing, EnumWhenTracker.DoNothing,
ImportTracker.DoNothing,
chunk, chunk,
messageCollector messageCollector
) ?: return ) ?: return
@@ -420,18 +418,21 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val project = projectDescriptor.project val project = projectDescriptor.project
val lookupTracker = getLookupTracker(project, representativeTarget) val lookupTracker = getLookupTracker(project, representativeTarget)
val exceptActualTracer = ExpectActualTrackerImpl() val exceptActualTracker = ExpectActualTrackerImpl()
val incrementalCaches = kotlinChunk.loadCaches() val incrementalCaches = kotlinChunk.loadCaches()
val inlineConstTracker = InlineConstTrackerImpl() val inlineConstTracker = InlineConstTrackerImpl()
val enumWhenTracker = EnumWhenTrackerImpl() val enumWhenTracker = EnumWhenTrackerImpl()
val importTracker = ImportTrackerImpl()
val environment = createCompileEnvironment( val environment = createCompileEnvironment(
context, context,
representativeTarget, representativeTarget,
incrementalCaches, incrementalCaches,
lookupTracker, lookupTracker,
exceptActualTracer, exceptActualTracker,
inlineConstTracker, inlineConstTracker,
enumWhenTracker, enumWhenTracker,
importTracker,
chunk, chunk,
messageCollector messageCollector
) ?: return ABORT ) ?: return ABORT
@@ -625,6 +626,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker, enumWhenTracker: EnumWhenTracker,
importTracker: ImportTracker,
chunk: ModuleChunk, chunk: ModuleChunk,
messageCollector: MessageCollectorAdapter messageCollector: MessageCollectorAdapter
): JpsCompilerEnvironment? { ): JpsCompilerEnvironment? {
@@ -635,7 +637,8 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
lookupTracker, lookupTracker,
exceptActualTracer, exceptActualTracer,
inlineConstTracker, inlineConstTracker,
enumWhenTracker enumWhenTracker,
importTracker
) )
build() build()
} }
@@ -20,10 +20,7 @@ import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.ChangesCollector
import org.jetbrains.kotlin.incremental.IncrementalJsCache import org.jetbrains.kotlin.incremental.IncrementalJsCache
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
import org.jetbrains.kotlin.incremental.js.IncrementalDataProviderFromCache import org.jetbrains.kotlin.incremental.js.IncrementalDataProviderFromCache
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
@@ -72,9 +69,10 @@ class KotlinJsModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleBu
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker enumWhenTracker: EnumWhenTracker,
importTracker: ImportTracker
) { ) {
super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker, enumWhenTracker) super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker, enumWhenTracker, importTracker)
with(builder) { with(builder) {
register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl()) register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl())
@@ -11,6 +11,7 @@ import com.intellij.util.io.URLUtil
import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.ModuleChunk
import org.jetbrains.jps.builders.java.JavaBuilderUtil import org.jetbrains.jps.builders.java.JavaBuilderUtil
import org.jetbrains.jps.builders.java.dependencyView.Callbacks import org.jetbrains.jps.builders.java.dependencyView.Callbacks
import org.jetbrains.jps.builders.java.dependencyView.Callbacks.Backend
import org.jetbrains.jps.builders.storage.BuildDataPaths import org.jetbrains.jps.builders.storage.BuildDataPaths
import org.jetbrains.jps.incremental.* import org.jetbrains.jps.incremental.*
import org.jetbrains.jps.model.java.JpsJavaExtensionService import org.jetbrains.jps.model.java.JpsJavaExtensionService
@@ -27,10 +28,7 @@ import org.jetbrains.kotlin.compilerRunner.JpsKotlinCompilerRunner
import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.jps.build.KotlinBuilder import org.jetbrains.kotlin.jps.build.KotlinBuilder
import org.jetbrains.kotlin.jps.build.KotlinCompileContext import org.jetbrains.kotlin.jps.build.KotlinCompileContext
import org.jetbrains.kotlin.jps.build.KotlinDirtySourceFilesHolder import org.jetbrains.kotlin.jps.build.KotlinDirtySourceFilesHolder
@@ -81,9 +79,10 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker enumWhenTracker: EnumWhenTracker,
importTracker: ImportTracker
) { ) {
super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker, enumWhenTracker) super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker, enumWhenTracker, importTracker)
with(builder) { with(builder) {
register( register(
@@ -365,6 +364,7 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
val callback = JavaBuilderUtil.getDependenciesRegistrar(localContext) val callback = JavaBuilderUtil.getDependenciesRegistrar(localContext)
val inlineConstTracker = environment.services[InlineConstTracker::class.java] as InlineConstTrackerImpl val inlineConstTracker = environment.services[InlineConstTracker::class.java] as InlineConstTrackerImpl
val enumWhenTracker = environment.services[EnumWhenTracker::class.java] as EnumWhenTrackerImpl val enumWhenTracker = environment.services[EnumWhenTracker::class.java] as EnumWhenTrackerImpl
val importTracker = environment.services[ImportTracker::class.java] as ImportTrackerImpl
val targetDirtyFiles: Map<ModuleBuildTarget, Set<File>> = chunk.targets.keysToMap { val targetDirtyFiles: Map<ModuleBuildTarget, Set<File>> = chunk.targets.keysToMap {
val files = HashSet<File>() val files = HashSet<File>()
@@ -393,10 +393,10 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
sourceFiles.removeAll(targetDirtyFiles[target] ?: emptySet()) sourceFiles.removeAll(targetDirtyFiles[target] ?: emptySet())
sourceFiles.addAll(output.sourceFiles) sourceFiles.addAll(output.sourceFiles)
// process inlineConstTracker // process trackers
for (sourceFile: File in sourceFiles) { for (sourceFile: File in sourceFiles) {
processInlineConstTracker(inlineConstTracker, sourceFile, output, callback) processInlineConstTracker(inlineConstTracker, sourceFile, output, callback)
processEnumWhenTracker(enumWhenTracker, sourceFile, output, callback) processBothEnumWhenAndImportTrackers(enumWhenTracker, importTracker, sourceFile, output, callback)
} }
callback.associate( callback.associate(
@@ -412,7 +412,7 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
JavaBuilderUtil.registerSuccessfullyCompiled(localContext, allCompiled) JavaBuilderUtil.registerSuccessfullyCompiled(localContext, allCompiled)
} }
private fun processInlineConstTracker(inlineConstTracker: InlineConstTrackerImpl, sourceFile: File, output: GeneratedJvmClass, callback: Callbacks.Backend) { private fun processInlineConstTracker(inlineConstTracker: InlineConstTrackerImpl, sourceFile: File, output: GeneratedJvmClass, callback: Backend) {
val cRefs = inlineConstTracker.inlineConstMap[sourceFile.path]?.mapNotNull { cRef: ConstantRef -> val cRefs = inlineConstTracker.inlineConstMap[sourceFile.path]?.mapNotNull { cRef: ConstantRef ->
val descriptor = when (cRef.constType) { val descriptor = when (cRef.constType) {
"Byte" -> "B" "Byte" -> "B"
@@ -433,8 +433,11 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
callback.registerConstantReferences(className, cRefs) callback.registerConstantReferences(className, cRefs)
} }
private fun processEnumWhenTracker(enumWhenTracker: EnumWhenTrackerImpl, sourceFile: File, output: GeneratedJvmClass, callback: Callbacks.Backend) { private fun processBothEnumWhenAndImportTrackers(enumWhenTracker: EnumWhenTrackerImpl, importTracker: ImportTrackerImpl, sourceFile: File, output: GeneratedJvmClass, callback: Backend) {
val enumFqNameClasses = enumWhenTracker.whenExpressionFilePathToEnumClassMap[sourceFile.path]?.map { "$it.*" } ?: return val enumFqNameClasses = enumWhenTracker.whenExpressionFilePathToEnumClassMap[sourceFile.path]?.map { "$it.*" }
callback.registerImports(output.outputClass.className.internalName, listOf(), enumFqNameClasses) val importedFqNames = importTracker.filePathToImportedFqNamesMap[sourceFile.path]
if (enumFqNameClasses == null && importedFqNames == null) return
callback.registerImports(output.outputClass.className.internalName, importedFqNames ?: listOf(), enumFqNameClasses ?: listOf())
} }
} }
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.compilerRunner.JpsCompilerEnvironment
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.ChangesCollector
import org.jetbrains.kotlin.incremental.ExpectActualTrackerImpl import org.jetbrains.kotlin.incremental.ExpectActualTrackerImpl
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.jps.KotlinJpsBundle import org.jetbrains.kotlin.jps.KotlinJpsBundle
import org.jetbrains.kotlin.jps.build.* import org.jetbrains.kotlin.jps.build.*
import org.jetbrains.kotlin.jps.incremental.CacheAttributesDiff import org.jetbrains.kotlin.jps.incremental.CacheAttributesDiff
@@ -272,7 +269,8 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker enumWhenTracker: EnumWhenTracker,
importTracker: ImportTracker
) { ) {
with(builder) { with(builder) {
register(LookupTracker::class.java, lookupTracker) register(LookupTracker::class.java, lookupTracker)
@@ -284,6 +282,7 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
}) })
register(InlineConstTracker::class.java, inlineConstTracker) register(InlineConstTracker::class.java, inlineConstTracker)
register(EnumWhenTracker::class.java, enumWhenTracker) register(EnumWhenTracker::class.java, enumWhenTracker)
register(ImportTracker::class.java, importTracker)
} }
} }