[JPS] Fix incremental build after changing Java enum used in Kotlin when

EnumWhenTracker implemented for tracking changed java enum class items, that used in kotlin when expression.

#KT-47824 Fixed
This commit is contained in:
Aleksei.Cherepanov
2021-11-04 17:13:56 +03:00
committed by Space
parent ee8de63497
commit 3d8f140d6b
38 changed files with 319 additions and 57 deletions
@@ -0,0 +1,21 @@
/*
* 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.incremental
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import java.util.concurrent.ConcurrentHashMap
@Suppress("unused")
class EnumWhenTrackerImpl: EnumWhenTracker {
private val whenExpressionFilePathToEnumClass = ConcurrentHashMap<String, MutableSet<String>>()
val whenExpressionFilePathToEnumClassMap: Map<String, Collection<String>>
get() = whenExpressionFilePathToEnumClass
override fun report(whenExpressionFilePath: String, enumClassFqName: String) {
whenExpressionFilePathToEnumClass.getOrPut(whenExpressionFilePath) { hashSetOf() }.add(enumClassFqName)
}
}
@@ -38,6 +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.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -209,6 +210,8 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
putIfNotNull(CommonConfigurationKeys.INLINE_CONST_TRACKER, services[InlineConstTracker::class.java]) putIfNotNull(CommonConfigurationKeys.INLINE_CONST_TRACKER, services[InlineConstTracker::class.java])
putIfNotNull(CommonConfigurationKeys.ENUM_WHEN_TRACKER, services[EnumWhenTracker::class.java])
putIfNotNull( putIfNotNull(
JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS, JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS,
services[IncrementalCompilationComponents::class.java] services[IncrementalCompilationComponents::class.java]
@@ -214,6 +214,7 @@ object FirKotlinToJvmBytecodeCompiler {
sourceScope, sourceScope,
librariesScope, librariesScope,
lookupTracker = moduleConfiguration.get(CommonConfigurationKeys.LOOKUP_TRACKER), lookupTracker = moduleConfiguration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
enumWhenTracker = moduleConfiguration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER),
providerAndScopeForIncrementalCompilation, providerAndScopeForIncrementalCompilation,
firExtensionRegistrars, firExtensionRegistrars,
needRegisterJavaElementFinder, needRegisterJavaElementFinder,
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava
import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis
import org.jetbrains.kotlin.frontend.java.di.initialize import org.jetbrains.kotlin.frontend.java.di.initialize
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
@@ -163,6 +164,7 @@ object TopDownAnalyzerFacadeForJVM {
val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING
val expectActualTracker = configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER) ?: ExpectActualTracker.DoNothing val expectActualTracker = configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER) ?: ExpectActualTracker.DoNothing
val inlineConstTracker = configuration.get(CommonConfigurationKeys.INLINE_CONST_TRACKER) ?: InlineConstTracker.DoNothing val inlineConstTracker = configuration.get(CommonConfigurationKeys.INLINE_CONST_TRACKER) ?: InlineConstTracker.DoNothing
val enumWhenTracker = configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER) ?: EnumWhenTracker.DoNothing
val targetIds = configuration.get(JVMConfigurationKeys.MODULES)?.map(::TargetId) val targetIds = configuration.get(JVMConfigurationKeys.MODULES)?.map(::TargetId)
val separateModules = !configuration.getBoolean(JVMConfigurationKeys.USE_SINGLE_MODULE) val separateModules = !configuration.getBoolean(JVMConfigurationKeys.USE_SINGLE_MODULE)
@@ -197,7 +199,7 @@ object TopDownAnalyzerFacadeForJVM {
val dependenciesContainer = createContainerForLazyResolveWithJava( val dependenciesContainer = createContainerForLazyResolveWithJava(
jvmPlatform, jvmPlatform,
dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, moduleClassResolver, dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, moduleClassResolver,
targetEnvironment, lookupTracker, expectActualTracker, inlineConstTracker, targetEnvironment, lookupTracker, expectActualTracker, inlineConstTracker, enumWhenTracker,
packagePartProvider(dependencyScope), languageVersionSettings, packagePartProvider(dependencyScope), languageVersionSettings,
useBuiltInsProvider = true, useBuiltInsProvider = true,
configureJavaClassFinder = configureJavaClassFinder, configureJavaClassFinder = configureJavaClassFinder,
@@ -232,7 +234,7 @@ object TopDownAnalyzerFacadeForJVM {
val container = createContainerForLazyResolveWithJava( val container = createContainerForLazyResolveWithJava(
jvmPlatform, jvmPlatform,
moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, moduleClassResolver, moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, moduleClassResolver,
targetEnvironment, lookupTracker, expectActualTracker, inlineConstTracker, targetEnvironment, lookupTracker, expectActualTracker, inlineConstTracker, enumWhenTracker,
partProvider, languageVersionSettings, partProvider, languageVersionSettings,
useBuiltInsProvider = true, useBuiltInsProvider = true,
configureJavaClassFinder = configureJavaClassFinder, configureJavaClassFinder = configureJavaClassFinder,
@@ -403,6 +403,7 @@ fun createSession(
projectEnvironment.getSearchScopeForProjectJavaSources(), projectEnvironment.getSearchScopeForProjectJavaSources(),
librariesScope, librariesScope,
lookupTracker = moduleConfiguration.get(CommonConfigurationKeys.LOOKUP_TRACKER), lookupTracker = moduleConfiguration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
enumWhenTracker = moduleConfiguration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER),
providerAndScopeForIncrementalCompilation, providerAndScopeForIncrementalCompilation,
extensionRegistrars = (projectEnvironment as? VfsBasedProjectEnvironment)?.let { FirExtensionRegistrar.getInstances(it.project) } extensionRegistrars = (projectEnvironment as? VfsBasedProjectEnvironment)?.let { FirExtensionRegistrar.getInstances(it.project) }
?: emptyList(), ?: emptyList(),
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.config package org.jetbrains.kotlin.config
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -43,6 +44,9 @@ object CommonConfigurationKeys {
@JvmField @JvmField
val INLINE_CONST_TRACKER = CompilerConfigurationKey.create<InlineConstTracker>("inline constant tracker") val INLINE_CONST_TRACKER = CompilerConfigurationKey.create<InlineConstTracker>("inline constant tracker")
@JvmField
val ENUM_WHEN_TRACKER = CompilerConfigurationKey.create<EnumWhenTracker>("enum when tracker")
@JvmField @JvmField
val METADATA_VERSION = CompilerConfigurationKey.create<BinaryVersion>("metadata version") val METADATA_VERSION = CompilerConfigurationKey.create<BinaryVersion>("metadata version")
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.daemon.client package org.jetbrains.kotlin.daemon.client
import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.daemon.common.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.*
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupInfo
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.incremental.js.JsInlineFunctionHash import org.jetbrains.kotlin.incremental.js.JsInlineFunctionHash
@@ -38,6 +35,7 @@ open class CompilerCallbackServicesFacadeServer(
val compilationCanceledStatus: CompilationCanceledStatus? = null, val compilationCanceledStatus: CompilationCanceledStatus? = null,
val expectActualTracker: ExpectActualTracker? = null, val expectActualTracker: ExpectActualTracker? = null,
val inlineConstTracker: InlineConstTracker? = null, val inlineConstTracker: InlineConstTracker? = null,
val enumWhenTracker: EnumWhenTracker? = 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 +55,8 @@ open class CompilerCallbackServicesFacadeServer(
override fun hasInlineConstTracker(): Boolean = inlineConstTracker != null override fun hasInlineConstTracker(): Boolean = inlineConstTracker != null
override fun hasEnumWhenTracker(): Boolean = enumWhenTracker != 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
@@ -124,6 +124,10 @@ open class CompilerCallbackServicesFacadeServer(
inlineConstTracker?.report(filePath, owner, name, constType) ?: throw NullPointerException("inlineConstTracker was not initialized") inlineConstTracker?.report(filePath, owner, name, constType) ?: throw NullPointerException("inlineConstTracker was not initialized")
} }
override fun enumWhenTracker_report(whenUsageClassPath: String, enumClassFqName: String) {
enumWhenTracker?.report(whenUsageClassPath, enumClassFqName) ?: throw NullPointerException("enumWhenTracker was not initialized")
}
override fun incrementalResultsConsumer_processHeader(headerMetadata: ByteArray) { override fun incrementalResultsConsumer_processHeader(headerMetadata: ByteArray) {
incrementalResultsConsumer!!.processHeader(headerMetadata) incrementalResultsConsumer!!.processHeader(headerMetadata)
} }
@@ -51,6 +51,9 @@ interface CompilerCallbackServicesFacade : Remote {
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun hasInlineConstTracker(): Boolean fun hasInlineConstTracker(): Boolean
@Throws(RemoteException::class)
fun hasEnumWhenTracker(): Boolean
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun hasIncrementalResultsConsumer(): Boolean fun hasIncrementalResultsConsumer(): Boolean
@@ -109,6 +112,11 @@ interface CompilerCallbackServicesFacade : Remote {
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun inlineConstTracker_report(filePath: String, owner: String, name: String, constType: String) fun inlineConstTracker_report(filePath: String, owner: String, name: String, constType: String)
// ---------------------------------------------------
// EnumWhenTracker
@Throws(RemoteException::class)
fun enumWhenTracker_report(whenUsageClassPath: String, enumClassFqName: String)
// --------------------------------------------------- // ---------------------------------------------------
// IncrementalResultsConsumer (js) // IncrementalResultsConsumer (js)
@Throws(RemoteException::class) @Throws(RemoteException::class)
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.daemon.report.DaemonMessageReporter
import org.jetbrains.kotlin.daemon.report.DaemonMessageReporterPrintStreamAdapter import org.jetbrains.kotlin.daemon.report.DaemonMessageReporterPrintStreamAdapter
import org.jetbrains.kotlin.daemon.report.getBuildReporter import org.jetbrains.kotlin.daemon.report.getBuildReporter
import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
@@ -891,6 +892,9 @@ class CompileServiceImpl(
if (facade.hasInlineConstTracker()) { if (facade.hasInlineConstTracker()) {
builder.register(InlineConstTracker::class.java, RemoteInlineConstTracker(facade, rpcProfiler)) builder.register(InlineConstTracker::class.java, RemoteInlineConstTracker(facade, rpcProfiler))
} }
if (facade.hasEnumWhenTracker()) {
builder.register(EnumWhenTracker::class.java, RemoteEnumWhenTracker(facade, rpcProfiler))
}
if (facade.hasIncrementalResultsConsumer()) { if (facade.hasIncrementalResultsConsumer()) {
builder.register(IncrementalResultsConsumer::class.java, RemoteIncrementalResultsConsumer(facade, eventManager, rpcProfiler)) builder.register(IncrementalResultsConsumer::class.java, RemoteIncrementalResultsConsumer(facade, eventManager, rpcProfiler))
} }
@@ -0,0 +1,22 @@
/*
* 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.daemon
import org.jetbrains.kotlin.daemon.common.DummyProfiler
import org.jetbrains.kotlin.daemon.common.Profiler
import org.jetbrains.kotlin.daemon.common.withMeasure
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
class RemoteEnumWhenTracker(
@Suppress("DEPRECATION") val facade: org.jetbrains.kotlin.daemon.common.CompilerCallbackServicesFacade,
val profiler: Profiler = DummyProfiler()
): EnumWhenTracker {
override fun report(whenExpressionFilePath: String, enumClassFqName: String) {
profiler.withMeasure(this) {
facade.enumWhenTracker_report(whenExpressionFilePath, enumClassFqName)
}
}
}
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirSubstitutionOverrideStorage
import org.jetbrains.kotlin.fir.symbols.FirPhaseManager import org.jetbrains.kotlin.fir.symbols.FirPhaseManager
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
import org.jetbrains.kotlin.fir.types.TypeComponents import org.jetbrains.kotlin.fir.types.TypeComponents
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
@@ -94,7 +95,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) { fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null, enumWhenTracker: EnumWhenTracker? = 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())
@@ -110,6 +111,12 @@ fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null) {
IncrementalPassThroughLookupTrackerComponent(lookupTracker, firFileToPath) IncrementalPassThroughLookupTrackerComponent(lookupTracker, firFileToPath)
) )
} }
if (enumWhenTracker != null) {
register(
FirEnumWhenTrackerComponent::class,
IncrementalPassThroughEnumWhenTrackerComponent(enumWhenTracker)
)
}
} }
/* /*
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider 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.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
@@ -88,6 +89,7 @@ object FirSessionFactory {
javaSourcesScope: AbstractProjectFileSearchScope, javaSourcesScope: AbstractProjectFileSearchScope,
librariesScope: AbstractProjectFileSearchScope, librariesScope: AbstractProjectFileSearchScope,
lookupTracker: LookupTracker?, lookupTracker: LookupTracker?,
enumWhenTracker: EnumWhenTracker?,
incrementalCompilationContext: IncrementalCompilationContext?, incrementalCompilationContext: IncrementalCompilationContext?,
extensionRegistrars: List<FirExtensionRegistrar>, extensionRegistrars: List<FirExtensionRegistrar>,
needRegisterJavaElementFinder: Boolean, needRegisterJavaElementFinder: Boolean,
@@ -123,6 +125,7 @@ object FirSessionFactory {
extensionRegistrars, extensionRegistrars,
languageVersionSettings = languageVersionSettings, languageVersionSettings = languageVersionSettings,
lookupTracker = lookupTracker, lookupTracker = lookupTracker,
enumWhenTracker = enumWhenTracker,
needRegisterJavaElementFinder, needRegisterJavaElementFinder,
init = sessionConfigurator init = sessionConfigurator
) )
@@ -137,6 +140,7 @@ object FirSessionFactory {
extensionRegistrars: List<FirExtensionRegistrar>, extensionRegistrars: List<FirExtensionRegistrar>,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null, lookupTracker: LookupTracker? = null,
enumWhenTracker: EnumWhenTracker? = null,
needRegisterJavaElementFinder: Boolean, needRegisterJavaElementFinder: Boolean,
init: FirSessionConfigurator.() -> Unit = {} init: FirSessionConfigurator.() -> Unit = {}
): FirSession { ): FirSession {
@@ -147,7 +151,7 @@ object FirSessionFactory {
registerCliCompilerOnlyComponents() registerCliCompilerOnlyComponents()
registerCommonComponents(languageVersionSettings) registerCommonComponents(languageVersionSettings)
registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver())
registerResolveComponents(lookupTracker) registerResolveComponents(lookupTracker, enumWhenTracker)
registerJavaSpecificResolveComponents() registerJavaSpecificResolveComponents()
val kotlinScopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped) val kotlinScopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped)
@@ -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.FirEnumWhenTrackerComponent
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
class IncrementalPassThroughEnumWhenTrackerComponent(private val enumWhenTracker: EnumWhenTracker) : FirEnumWhenTrackerComponent() {
override fun report(whenExpressionFilePath: String, enumClassFqName: String) {
enumWhenTracker.report(whenExpressionFilePath, enumClassFqName)
}
}
@@ -8,8 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.diagnostics.WhenMissingCase
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
@@ -96,6 +95,10 @@ class FirWhenExhaustivenessTransformer(private val bodyResolveComponents: BodyRe
override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Any?): FirStatement { override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Any?): FirStatement {
processExhaustivenessCheck(whenExpression) processExhaustivenessCheck(whenExpression)
bodyResolveComponents.session.enumWhenTracker?.reportEnumUsageInWhen(
bodyResolveComponents.file.sourceFile?.path,
getSubjectType(bodyResolveComponents.session, whenExpression)
)
return whenExpression return whenExpression
} }
@@ -0,0 +1,21 @@
/*
* 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
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.classId
abstract class FirEnumWhenTrackerComponent : FirSessionComponent {
abstract fun report(whenExpressionFilePath: String, enumClassFqName: String)
}
val FirSession.enumWhenTracker: FirEnumWhenTrackerComponent? by FirSession.nullableSessionComponentAccessor()
fun FirEnumWhenTrackerComponent.reportEnumUsageInWhen(path: String?, subjectType: ConeKotlinType?) {
if (path == null || subjectType == null) return
val fqName = subjectType.classId?.asString()?.replace(".", "$")?.replace("/", ".") ?: return
this.report(path, fqName)
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -63,6 +64,7 @@ fun createContainerForLazyResolveWithJava(
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
expectActualTracker: ExpectActualTracker, expectActualTracker: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker,
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
useBuiltInsProvider: Boolean, useBuiltInsProvider: Boolean,
@@ -76,7 +78,7 @@ fun createContainerForLazyResolveWithJava(
sealedInheritorsProvider sealedInheritorsProvider
) )
configureIncrementalCompilation(lookupTracker, expectActualTracker, inlineConstTracker) configureIncrementalCompilation(lookupTracker, expectActualTracker, inlineConstTracker, enumWhenTracker)
configureStandardResolveComponents() configureStandardResolveComponents()
useInstance(moduleContentScope) useInstance(moduleContentScope)
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -114,6 +115,7 @@ class JvmResolverForModuleFactory(
lookupTracker, lookupTracker,
ExpectActualTracker.DoNothing, ExpectActualTracker.DoNothing,
InlineConstTracker.DoNothing, InlineConstTracker.DoNothing,
EnumWhenTracker.DoNothing,
packagePartProvider, packagePartProvider,
languageVersionSettings, languageVersionSettings,
sealedInheritorsProvider = sealedInheritorsProvider, sealedInheritorsProvider = sealedInheritorsProvider,
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.diagnostics.WhenMissingCase
import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
@@ -49,6 +50,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall
import org.jetbrains.kotlin.resolve.calls.util.* import org.jetbrains.kotlin.resolve.calls.util.*
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
@@ -58,13 +60,15 @@ import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
import org.jetbrains.kotlin.types.isFlexible import org.jetbrains.kotlin.types.isFlexible
import org.jetbrains.kotlin.types.typeUtil.isBooleanOrNullableBoolean import org.jetbrains.kotlin.types.typeUtil.isBooleanOrNullableBoolean
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.util.record
class ControlFlowInformationProviderImpl private constructor( class ControlFlowInformationProviderImpl private constructor(
private val subroutine: KtElement, private val subroutine: KtElement,
private val trace: BindingTrace, private val trace: BindingTrace,
private val pseudocode: Pseudocode, private val pseudocode: Pseudocode,
private val languageVersionSettings: LanguageVersionSettings, private val languageVersionSettings: LanguageVersionSettings,
private val diagnosticSuppressor: PlatformDiagnosticSuppressor private val diagnosticSuppressor: PlatformDiagnosticSuppressor,
private val enumWhenTracker: EnumWhenTracker?
) : ControlFlowInformationProvider { ) : ControlFlowInformationProvider {
private val pseudocodeVariablesData by lazy { private val pseudocodeVariablesData by lazy {
PseudocodeVariablesData(pseudocode, trace.bindingContext) PseudocodeVariablesData(pseudocode, trace.bindingContext)
@@ -74,13 +78,15 @@ class ControlFlowInformationProviderImpl private constructor(
declaration: KtElement, declaration: KtElement,
trace: BindingTrace, trace: BindingTrace,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
diagnosticSuppressor: PlatformDiagnosticSuppressor diagnosticSuppressor: PlatformDiagnosticSuppressor,
enumWhenTracker: EnumWhenTracker? = null
) : this( ) : this(
declaration, declaration,
trace, trace,
ControlFlowProcessor(trace, languageVersionSettings).generatePseudocode(declaration), ControlFlowProcessor(trace, languageVersionSettings).generatePseudocode(declaration),
languageVersionSettings, languageVersionSettings,
diagnosticSuppressor diagnosticSuppressor,
enumWhenTracker
) )
override fun checkForLocalClassOrObjectMode() { override fun checkForLocalClassOrObjectMode() {
@@ -231,7 +237,7 @@ class ControlFlowInformationProviderImpl private constructor(
val expectedType = functionDescriptor?.returnType val expectedType = functionDescriptor?.returnType
val providerForLocalDeclaration = ControlFlowInformationProviderImpl( val providerForLocalDeclaration = ControlFlowInformationProviderImpl(
element, trace, localDeclarationInstruction.body, languageVersionSettings, diagnosticSuppressor element, trace, localDeclarationInstruction.body, languageVersionSettings, diagnosticSuppressor, enumWhenTracker
) )
providerForLocalDeclaration.checkFunction(expectedType) providerForLocalDeclaration.checkFunction(expectedType)
@@ -1057,6 +1063,9 @@ class ControlFlowInformationProviderImpl private constructor(
} }
continue continue
} }
enumWhenTracker?.record(subjectType, subjectExpression, elseEntry)
if (!usedAsExpression) { if (!usedAsExpression) {
if (languageVersionSettings.supportsFeature(LanguageFeature.WarnAboutNonExhaustiveWhenOnAlgebraicTypes)) { if (languageVersionSettings.supportsFeature(LanguageFeature.WarnAboutNonExhaustiveWhenOnAlgebraicTypes)) {
// report warnings on all non-exhaustive when's with algebraic subject // report warnings on all non-exhaustive when's with algebraic subject
@@ -1318,9 +1327,10 @@ class ControlFlowInformationProviderImpl private constructor(
declaration: KtElement, declaration: KtElement,
trace: BindingTrace, trace: BindingTrace,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
diagnosticSuppressor: PlatformDiagnosticSuppressor diagnosticSuppressor: PlatformDiagnosticSuppressor,
enumWhenTracker: EnumWhenTracker
): ControlFlowInformationProvider = ): ControlFlowInformationProvider =
ControlFlowInformationProviderImpl(declaration, trace, languageVersionSettings, diagnosticSuppressor) ControlFlowInformationProviderImpl(declaration, trace, languageVersionSettings, diagnosticSuppressor, enumWhenTracker)
} }
companion object { companion object {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.cfg package org.jetbrains.kotlin.cfg
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor
@@ -24,6 +25,7 @@ interface ControlFlowInformationProvider {
trace: BindingTrace, trace: BindingTrace,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
diagnosticSuppressor: PlatformDiagnosticSuppressor, diagnosticSuppressor: PlatformDiagnosticSuppressor,
enumWhenTracker: EnumWhenTracker
): ControlFlowInformationProvider ): ControlFlowInformationProvider
} }
} }
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
import org.jetbrains.kotlin.extensions.TypeAttributeTranslatorExtension import org.jetbrains.kotlin.extensions.TypeAttributeTranslatorExtension
import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -130,10 +131,16 @@ fun StorageComponentContainer.configureStandardResolveComponents() {
useImpl<AnnotationResolverImpl>() useImpl<AnnotationResolverImpl>()
} }
fun StorageComponentContainer.configureIncrementalCompilation(lookupTracker: LookupTracker, expectActualTracker: ExpectActualTracker, inlineConstTracker: InlineConstTracker) { fun StorageComponentContainer.configureIncrementalCompilation(
lookupTracker: LookupTracker,
expectActualTracker: ExpectActualTracker,
inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker
) {
useInstance(lookupTracker) useInstance(lookupTracker)
useInstance(expectActualTracker) useInstance(expectActualTracker)
useInstance(inlineConstTracker) useInstance(inlineConstTracker)
useInstance(enumWhenTracker)
} }
fun createContainerForBodyResolve( fun createContainerForBodyResolve(
@@ -209,6 +216,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
useInstance(lookupTracker) useInstance(lookupTracker)
useInstance(ExpectActualTracker.DoNothing) useInstance(ExpectActualTracker.DoNothing)
useInstance(InlineConstTracker.DoNothing) useInstance(InlineConstTracker.DoNothing)
useInstance(EnumWhenTracker.DoNothing)
useImpl<LazyTopDownAnalyzer>() useImpl<LazyTopDownAnalyzer>()
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor; import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor;
import org.jetbrains.kotlin.descriptors.PropertyDescriptor; import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor; import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor; import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
@@ -38,19 +39,22 @@ public class ControlFlowAnalyzer {
private final LanguageVersionSettings languageVersionSettings; private final LanguageVersionSettings languageVersionSettings;
private final PlatformDiagnosticSuppressor diagnosticSuppressor; private final PlatformDiagnosticSuppressor diagnosticSuppressor;
private final ControlFlowInformationProvider.Factory controlFlowInformationProviderFactory; private final ControlFlowInformationProvider.Factory controlFlowInformationProviderFactory;
private final EnumWhenTracker enumWhenTracker;
public ControlFlowAnalyzer( public ControlFlowAnalyzer(
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull KotlinBuiltIns builtIns, @NotNull KotlinBuiltIns builtIns,
@NotNull LanguageVersionSettings languageVersionSettings, @NotNull LanguageVersionSettings languageVersionSettings,
@NotNull PlatformDiagnosticSuppressor diagnosticSuppressor, @NotNull PlatformDiagnosticSuppressor diagnosticSuppressor,
@NotNull ControlFlowInformationProvider.Factory controlFlowInformationProviderFactory @NotNull ControlFlowInformationProvider.Factory controlFlowInformationProviderFactory,
@NotNull EnumWhenTracker enumWhenTracker
) { ) {
this.trace = trace; this.trace = trace;
this.builtIns = builtIns; this.builtIns = builtIns;
this.languageVersionSettings = languageVersionSettings; this.languageVersionSettings = languageVersionSettings;
this.diagnosticSuppressor = diagnosticSuppressor; this.diagnosticSuppressor = diagnosticSuppressor;
this.controlFlowInformationProviderFactory = controlFlowInformationProviderFactory; this.controlFlowInformationProviderFactory = controlFlowInformationProviderFactory;
this.enumWhenTracker = enumWhenTracker;
} }
public void process(@NotNull BodiesResolveContext c) { public void process(@NotNull BodiesResolveContext c) {
@@ -84,7 +88,7 @@ public class ControlFlowAnalyzer {
private void checkSecondaryConstructor(@NotNull KtSecondaryConstructor constructor) { private void checkSecondaryConstructor(@NotNull KtSecondaryConstructor constructor) {
ControlFlowInformationProvider controlFlowInformationProvider = ControlFlowInformationProvider controlFlowInformationProvider =
controlFlowInformationProviderFactory.createControlFlowInformationProvider( controlFlowInformationProviderFactory.createControlFlowInformationProvider(
constructor, trace, languageVersionSettings, diagnosticSuppressor constructor, trace, languageVersionSettings, diagnosticSuppressor, enumWhenTracker
); );
controlFlowInformationProvider.checkDeclaration(); controlFlowInformationProvider.checkDeclaration();
controlFlowInformationProvider.checkFunction(builtIns.getUnitType()); controlFlowInformationProvider.checkFunction(builtIns.getUnitType());
@@ -95,7 +99,7 @@ public class ControlFlowAnalyzer {
// or initialization of properties corresponds to a package declared in a file // or initialization of properties corresponds to a package declared in a file
ControlFlowInformationProvider controlFlowInformationProvider = ControlFlowInformationProvider controlFlowInformationProvider =
controlFlowInformationProviderFactory.createControlFlowInformationProvider( controlFlowInformationProviderFactory.createControlFlowInformationProvider(
(KtElement) declarationContainer, trace, languageVersionSettings, diagnosticSuppressor (KtElement) declarationContainer, trace, languageVersionSettings, diagnosticSuppressor, enumWhenTracker
); );
if (c.getTopDownAnalysisMode().isLocalDeclarations()) { if (c.getTopDownAnalysisMode().isLocalDeclarations()) {
controlFlowInformationProvider.checkForLocalClassOrObjectMode(); controlFlowInformationProvider.checkForLocalClassOrObjectMode();
@@ -120,7 +124,7 @@ public class ControlFlowAnalyzer {
) { ) {
ControlFlowInformationProvider controlFlowInformationProvider = ControlFlowInformationProvider controlFlowInformationProvider =
controlFlowInformationProviderFactory.createControlFlowInformationProvider( controlFlowInformationProviderFactory.createControlFlowInformationProvider(
function, trace, languageVersionSettings, diagnosticSuppressor function, trace, languageVersionSettings, diagnosticSuppressor, enumWhenTracker
); );
if (c.getTopDownAnalysisMode().isLocalDeclarations()) { if (c.getTopDownAnalysisMode().isLocalDeclarations()) {
controlFlowInformationProvider.checkForLocalClassOrObjectMode(); controlFlowInformationProvider.checkForLocalClassOrObjectMode();
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.types.error.ErrorUtils;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt; import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt;
import org.jetbrains.kotlin.util.KotlinFrontEndException; import org.jetbrains.kotlin.util.KotlinFrontEndException;
import org.jetbrains.kotlin.util.LookupTrackerUtilKt; import org.jetbrains.kotlin.util.IncrementalTrackerUtilKt;
import org.jetbrains.kotlin.util.PerformanceCounter; import org.jetbrains.kotlin.util.PerformanceCounter;
import org.jetbrains.kotlin.util.ReenteringLazyValueComputationException; import org.jetbrains.kotlin.util.ReenteringLazyValueComputationException;
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments; import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments;
@@ -236,7 +236,7 @@ public abstract class ExpressionTypingVisitorDispatcher extends KtVisitor<Kotlin
KotlinType resultType = typeInfo.getType(); KotlinType resultType = typeInfo.getType();
if (resultType != null) { if (resultType != null) {
LookupTrackerUtilKt.record(lookupTracker, expression, resultType); IncrementalTrackerUtilKt.record(lookupTracker, expression, resultType);
} }
} }
@@ -18,11 +18,16 @@ package org.jetbrains.kotlin.util
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.containingPackage
import org.jetbrains.kotlin.incremental.KotlinLookupLocation import org.jetbrains.kotlin.incremental.KotlinLookupLocation
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.record import org.jetbrains.kotlin.incremental.record
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
import org.jetbrains.kotlin.psi.KtWhenEntry
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.isError
import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.types.typeUtil.isUnit
@@ -50,3 +55,20 @@ fun LookupTracker.record(expression: KtExpression, type: KotlinType) {
} }
} }
} }
fun EnumWhenTracker.record(subjectType: KotlinType?, subjectExpression: KtExpression, elseEntry: KtWhenEntry?) {
if (elseEntry != null) return
if (subjectExpression !is KtNameReferenceExpression) return
val declarationDescriptor = subjectType?.constructor?.declarationDescriptor ?: return
val containingPackage = declarationDescriptor.containingPackage()?.toString() ?: return
val fqName = declarationDescriptor.fqNameSafe.asString()
val filePath = subjectExpression.containingFile.virtualFile?.path ?: return
val owner = if (fqName.startsWith("$containingPackage.")) {
containingPackage + "." + fqName.substring(containingPackage.length + 1).replace(".", "$")
} else {
fqName.replace(".", "$")
}
this.report(filePath, owner)
}
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDependenciesImpl
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava
import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -208,6 +209,7 @@ class ClassicFrontendFacade(
lookupTracker = LookupTracker.DO_NOTHING, lookupTracker = LookupTracker.DO_NOTHING,
expectActualTracker = ExpectActualTracker.DoNothing, expectActualTracker = ExpectActualTracker.DoNothing,
inlineConstTracker = InlineConstTracker.DoNothing, inlineConstTracker = InlineConstTracker.DoNothing,
enumWhenTracker = EnumWhenTracker.DoNothing,
packagePartProvider = packagePartProviderFactory(moduleContentScope), packagePartProvider = packagePartProviderFactory(moduleContentScope),
languageVersionSettings = module.languageVersionSettings, languageVersionSettings = module.languageVersionSettings,
useBuiltInsProvider = true useBuiltInsProvider = true
@@ -93,6 +93,7 @@ class FirFrontendFacade(
PsiBasedProjectFileSearchScope(sourcesScope), PsiBasedProjectFileSearchScope(sourcesScope),
PsiBasedProjectFileSearchScope(librariesScope), PsiBasedProjectFileSearchScope(librariesScope),
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = FirExtensionRegistrar.getInstances(project), extensionRegistrars = FirExtensionRegistrar.getInstances(project),
needRegisterJavaElementFinder = true, needRegisterJavaElementFinder = true,
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava import org.jetbrains.kotlin.frontend.java.di.createContainerForLazyResolveWithJava
import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -428,7 +429,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
moduleContentScope, moduleContentScope,
moduleClassResolver, moduleClassResolver,
CompilerEnvironment, CompilerEnvironment,
LookupTracker.DO_NOTHING, ExpectActualTracker.DoNothing, InlineConstTracker.DoNothing, LookupTracker.DO_NOTHING, ExpectActualTracker.DoNothing, InlineConstTracker.DoNothing, EnumWhenTracker.DoNothing,
environment.createPackagePartProvider(moduleContentScope), environment.createPackagePartProvider(moduleContentScope),
languageVersionSettings, languageVersionSettings,
useBuiltInsProvider = true useBuiltInsProvider = true
@@ -99,6 +99,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
javaSourcesScope = PsiBasedProjectFileSearchScope(scope), javaSourcesScope = PsiBasedProjectFileSearchScope(scope),
librariesScope = PsiBasedProjectFileSearchScope(allProjectScope), librariesScope = PsiBasedProjectFileSearchScope(allProjectScope),
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = emptyList(), extensionRegistrars = emptyList(),
needRegisterJavaElementFinder = true needRegisterJavaElementFinder = true
@@ -41,6 +41,7 @@ fun createSessionForTests(
sourceScope, sourceScope,
librariesScope, librariesScope,
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = emptyList(), extensionRegistrars = emptyList(),
needRegisterJavaElementFinder = true, needRegisterJavaElementFinder = true,
@@ -72,6 +73,7 @@ fun createSessionForTests(
PsiBasedProjectFileSearchScope(sourceScope), PsiBasedProjectFileSearchScope(sourceScope),
PsiBasedProjectFileSearchScope(librariesScope), PsiBasedProjectFileSearchScope(librariesScope),
lookupTracker = null, lookupTracker = null,
enumWhenTracker = null,
incrementalCompilationContext = null, incrementalCompilationContext = null,
extensionRegistrars = emptyList(), extensionRegistrars = emptyList(),
needRegisterJavaElementFinder = true, needRegisterJavaElementFinder = true,
@@ -0,0 +1,26 @@
/*
* 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.incremental.components
import org.jetbrains.kotlin.container.DefaultImplementation
/**
* EnumWhenTracker is used to track Java enum classes used in Kotlin when expressions for correct build scope expansion in IC during JPS build.
*/
@DefaultImplementation(EnumWhenTracker.DoNothing::class)
interface EnumWhenTracker {
/**
* Report Java enum class, which FqName is [enumClassFqName].
* This enum class is used in Kotlin file with [whenExpressionFilePath] path in when expression.
* Format of [enumClassFqName] class is "package.Outer$Inner"
*/
fun report(whenExpressionFilePath: String, enumClassFqName: String)
object DoNothing : EnumWhenTracker {
override fun report(whenExpressionFilePath: String, enumClassFqName: String) {}
}
}
@@ -20,6 +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.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -38,6 +39,7 @@ internal class JpsCompilerServicesFacadeImpl(
env.services[CompilationCanceledStatus::class.java], env.services[CompilationCanceledStatus::class.java],
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[IncrementalResultsConsumer::class.java], env.services[IncrementalResultsConsumer::class.java],
env.services[IncrementalDataProvider::class.java], env.services[IncrementalDataProvider::class.java],
port port
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.build.report.ICReporterBase import org.jetbrains.kotlin.build.report.ICReporterBase
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.jps.KotlinJpsBundle import org.jetbrains.kotlin.jps.KotlinJpsBundle
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache
@@ -236,6 +237,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
LookupTracker.DO_NOTHING, LookupTracker.DO_NOTHING,
ExpectActualTracker.DoNothing, ExpectActualTracker.DoNothing,
InlineConstTracker.DoNothing, InlineConstTracker.DoNothing,
EnumWhenTracker.DoNothing,
chunk, chunk,
messageCollector messageCollector
) ?: return ) ?: return
@@ -356,7 +358,10 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
if (!kotlinChunk.haveSameCompiler) { if (!kotlinChunk.haveSameCompiler) {
messageCollector.report( messageCollector.report(
ERROR, ERROR,
KotlinJpsBundle.message("error.text.cyclically.dependent.modules.0.should.have.same.compiler", kotlinChunk.presentableModulesToCompilersList) KotlinJpsBundle.message(
"error.text.cyclically.dependent.modules.0.should.have.same.compiler",
kotlinChunk.presentableModulesToCompilersList
)
) )
return ABORT return ABORT
} }
@@ -394,8 +399,9 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val targetsWithoutOutputDir = targets.filter { it.outputDir == null } val targetsWithoutOutputDir = targets.filter { it.outputDir == null }
if (targetsWithoutOutputDir.isNotEmpty()) { if (targetsWithoutOutputDir.isNotEmpty()) {
messageCollector.report(ERROR, messageCollector.report(
KotlinJpsBundle.message("error.text.output.directory.not.specified.for.0", targetsWithoutOutputDir.joinToString()) ERROR,
KotlinJpsBundle.message("error.text.output.directory.not.specified.for.0", targetsWithoutOutputDir.joinToString())
) )
return ABORT return ABORT
} }
@@ -405,6 +411,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val exceptActualTracer = ExpectActualTrackerImpl() val exceptActualTracer = ExpectActualTrackerImpl()
val incrementalCaches = kotlinChunk.loadCaches() val incrementalCaches = kotlinChunk.loadCaches()
val inlineConstTracker = InlineConstTrackerImpl() val inlineConstTracker = InlineConstTrackerImpl()
val enumWhenTracker = EnumWhenTrackerImpl()
val environment = createCompileEnvironment( val environment = createCompileEnvironment(
context, context,
representativeTarget, representativeTarget,
@@ -412,6 +419,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
lookupTracker, lookupTracker,
exceptActualTracer, exceptActualTracer,
inlineConstTracker, inlineConstTracker,
enumWhenTracker,
chunk, chunk,
messageCollector messageCollector
) ?: return ABORT ) ?: return ABORT
@@ -604,11 +612,19 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker,
chunk: ModuleChunk, chunk: ModuleChunk,
messageCollector: MessageCollectorAdapter messageCollector: MessageCollectorAdapter
): JpsCompilerEnvironment? { ): JpsCompilerEnvironment? {
val compilerServices = with(Services.Builder()) { val compilerServices = with(Services.Builder()) {
kotlinModuleBuilderTarget.makeServices(this, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker) kotlinModuleBuilderTarget.makeServices(
this,
incrementalCaches,
lookupTracker,
exceptActualTracer,
inlineConstTracker,
enumWhenTracker
)
build() build()
} }
@@ -20,6 +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.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -70,9 +71,10 @@ class KotlinJsModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleBu
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker
) { ) {
super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker) super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker, enumWhenTracker)
with(builder) { with(builder) {
register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl()) register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl())
@@ -28,6 +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.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -80,9 +81,10 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker
) { ) {
super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker) super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker, enumWhenTracker)
with(builder) { with(builder) {
register( register(
@@ -363,6 +365,7 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
val previousMappings = localContext.projectDescriptor.dataManager.mappings val previousMappings = localContext.projectDescriptor.dataManager.mappings
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 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,24 +396,8 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
// process inlineConstTracker // process inlineConstTracker
for (sourceFile: File in sourceFiles) { for (sourceFile: File in sourceFiles) {
val cRefs = inlineConstTracker.inlineConstMap[sourceFile.path]?.mapNotNull { cRef: ConstantRef -> processInlineConstTracker(inlineConstTracker, sourceFile, output, callback)
val descriptor = when (cRef.constType) { processEnumWhenTracker(enumWhenTracker, sourceFile, output, callback)
"Byte" -> "B"
"Short" -> "S"
"Int" -> "I"
"Long" -> "J"
"Float" -> "F"
"Double" -> "D"
"Boolean" -> "Z"
"Char" -> "C"
"String" -> "Ljava/lang/String;"
else -> null
} ?: return@mapNotNull null
Callbacks.createConstantReference(cRef.owner, cRef.name, descriptor)
} ?: continue
val className = output.outputClass.className.internalName
callback.registerConstantReferences(className, cRefs)
} }
callback.associate( callback.associate(
@@ -425,4 +412,30 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
JavaBuilderUtil.registerFilesToCompile(localContext, allCompiled) JavaBuilderUtil.registerFilesToCompile(localContext, allCompiled)
JavaBuilderUtil.registerSuccessfullyCompiled(localContext, allCompiled) JavaBuilderUtil.registerSuccessfullyCompiled(localContext, allCompiled)
} }
private fun processInlineConstTracker(inlineConstTracker: InlineConstTrackerImpl, sourceFile: File, output: GeneratedJvmClass, callback: Callbacks.Backend) {
val cRefs = inlineConstTracker.inlineConstMap[sourceFile.path]?.mapNotNull { cRef: ConstantRef ->
val descriptor = when (cRef.constType) {
"Byte" -> "B"
"Short" -> "S"
"Int" -> "I"
"Long" -> "J"
"Float" -> "F"
"Double" -> "D"
"Boolean" -> "Z"
"Char" -> "C"
"String" -> "Ljava/lang/String;"
else -> null
} ?: return@mapNotNull null
Callbacks.createConstantReference(cRef.owner, cRef.name, descriptor)
} ?: return
val className = output.outputClass.className.internalName
callback.registerConstantReferences(className, cRefs)
}
private fun processEnumWhenTracker(enumWhenTracker: EnumWhenTrackerImpl, sourceFile: File, output: GeneratedJvmClass, callback: Callbacks.Backend) {
val enumFqNameClasses = enumWhenTracker.whenExpressionFilePathToEnumClassMap[sourceFile.path]?.map { "$it.*" } ?: return
callback.registerImports(output.outputClass.className.internalName, listOf(), enumFqNameClasses)
}
} }
@@ -24,6 +24,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.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -272,7 +273,8 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker
) { ) {
with(builder) { with(builder) {
register(LookupTracker::class.java, lookupTracker) register(LookupTracker::class.java, lookupTracker)
@@ -283,6 +285,7 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
} }
}) })
register(InlineConstTracker::class.java, inlineConstTracker) register(InlineConstTracker::class.java, inlineConstTracker)
register(EnumWhenTracker::class.java, enumWhenTracker)
} }
} }
@@ -8,9 +8,6 @@ Exit code: NOTHING_DONE
Compiling files: Compiling files:
src/Enum.java src/Enum.java
End of files End of files
================ Step #2 =================
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module/META-INF/module.kotlin_module
out/production/module/UseKt$WhenMappings.class out/production/module/UseKt$WhenMappings.class
@@ -19,5 +16,21 @@ End of files
Compiling files: Compiling files:
src/use.kt src/use.kt
End of files End of files
Exit code: ABORT
------------------------------------------
COMPILATION FAILED
'when' expression must be exhaustive, add necessary 'C' branch or 'else' branch instead
================ Step #2 =================
Cleaning output files:
out/production/module/Enum.class
End of files
Compiling files:
src/use.kt
End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Compiling files:
src/Enum.java
End of files
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -47,6 +48,7 @@ fun createContainerForJS(
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
expectActualTracker: ExpectActualTracker, expectActualTracker: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker,
additionalPackages: List<PackageFragmentProvider>, additionalPackages: List<PackageFragmentProvider>,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
): StorageComponentContainer { ): StorageComponentContainer {
@@ -59,7 +61,7 @@ fun createContainerForJS(
languageVersionSettings languageVersionSettings
) )
configureIncrementalCompilation(lookupTracker, expectActualTracker, inlineConstTracker) configureIncrementalCompilation(lookupTracker, expectActualTracker, inlineConstTracker, enumWhenTracker)
configureStandardResolveComponents() configureStandardResolveComponents()
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
@@ -83,11 +85,12 @@ fun createTopDownAnalyzerForJs(
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
expectActualTracker: ExpectActualTracker, expectActualTracker: ExpectActualTracker,
inlineConstTracker: InlineConstTracker, inlineConstTracker: InlineConstTracker,
enumWhenTracker: EnumWhenTracker,
additionalPackages: List<PackageFragmentProvider>, additionalPackages: List<PackageFragmentProvider>,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
): LazyTopDownAnalyzer { ): LazyTopDownAnalyzer {
return createContainerForJS( return createContainerForJS(
moduleContext, bindingTrace, declarationProviderFactory, languageVersionSettings, moduleContext, bindingTrace, declarationProviderFactory, languageVersionSettings,
lookupTracker, expectActualTracker, inlineConstTracker, additionalPackages, targetEnvironment lookupTracker, expectActualTracker, inlineConstTracker, enumWhenTracker, additionalPackages, targetEnvironment
).get<LazyTopDownAnalyzer>() ).get<LazyTopDownAnalyzer>()
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.js.di.createContainerForJS import org.jetbrains.kotlin.frontend.js.di.createContainerForJS
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -107,6 +108,7 @@ abstract class AbstractTopDownAnalyzerFacadeForJS {
val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING
val expectActualTracker = configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER) ?: ExpectActualTracker.DoNothing val expectActualTracker = configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER) ?: ExpectActualTracker.DoNothing
val inlineConstTracker = configuration.get(CommonConfigurationKeys.INLINE_CONST_TRACKER) ?: InlineConstTracker.DoNothing val inlineConstTracker = configuration.get(CommonConfigurationKeys.INLINE_CONST_TRACKER) ?: InlineConstTracker.DoNothing
val enumWhenTracker = configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER) ?: EnumWhenTracker.DoNothing
val languageVersionSettings = configuration.languageVersionSettings val languageVersionSettings = configuration.languageVersionSettings
val packageFragment = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER]?.let { val packageFragment = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER]?.let {
loadIncrementalCacheMetadata(it, moduleContext, lookupTracker, languageVersionSettings) loadIncrementalCacheMetadata(it, moduleContext, lookupTracker, languageVersionSettings)
@@ -119,6 +121,7 @@ abstract class AbstractTopDownAnalyzerFacadeForJS {
lookupTracker, lookupTracker,
expectActualTracker, expectActualTracker,
inlineConstTracker, inlineConstTracker,
enumWhenTracker,
additionalPackages + listOfNotNull(packageFragment), additionalPackages + listOfNotNull(packageFragment),
targetEnvironment, targetEnvironment,
) )
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.Severity
import org.jetbrains.kotlin.frontend.js.di.createTopDownAnalyzerForJs import org.jetbrains.kotlin.frontend.js.di.createTopDownAnalyzerForJs
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -56,6 +57,7 @@ abstract class AbstractJsScriptlikeCodeAnalyser(
val lookupTracker = LookupTracker.DO_NOTHING val lookupTracker = LookupTracker.DO_NOTHING
val expectActualTracker = ExpectActualTracker.DoNothing val expectActualTracker = ExpectActualTracker.DoNothing
val inlineConstTracker = InlineConstTracker.DoNothing val inlineConstTracker = InlineConstTracker.DoNothing
val enumWhenTracker = EnumWhenTracker.DoNothing
val additionalPackages = emptyList<PackageFragmentProvider>() val additionalPackages = emptyList<PackageFragmentProvider>()
val moduleDescriptor = moduleContext.module val moduleDescriptor = moduleContext.module
@@ -68,6 +70,7 @@ abstract class AbstractJsScriptlikeCodeAnalyser(
lookupTracker, lookupTracker,
expectActualTracker, expectActualTracker,
inlineConstTracker, inlineConstTracker,
enumWhenTracker,
additionalPackages, additionalPackages,
CompilerEnvironment, CompilerEnvironment,
) )