Fix incremental build after changing Java const used as class property
Report Java static final constant with InlineConstantTracker, used as class property in Kotlin for further registration in JPS #KT-49177 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
931779f1c6
commit
276fb77155
+2
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
|
||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||
import org.jetbrains.kotlin.frontend.di.configureModule
|
||||
import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.load.kotlin.MetadataFinderFactory
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||
@@ -244,6 +245,7 @@ private fun createContainerToResolveCommonCode(
|
||||
if (shouldCheckExpectActual) {
|
||||
useImpl<ExpectedActualDeclarationChecker>()
|
||||
}
|
||||
useInstance(InlineConstTracker.DoNothing)
|
||||
}
|
||||
|
||||
fun StorageComponentContainer.configureCommonSpecificComponents() {
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
|
||||
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
|
||||
import org.jetbrains.kotlin.idea.MainFunctionDetector
|
||||
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.platform.TargetPlatform
|
||||
import org.jetbrains.kotlin.platform.TargetPlatformVersion
|
||||
@@ -126,9 +127,10 @@ fun StorageComponentContainer.configureStandardResolveComponents() {
|
||||
useImpl<AnnotationResolverImpl>()
|
||||
}
|
||||
|
||||
fun StorageComponentContainer.configureIncrementalCompilation(lookupTracker: LookupTracker, expectActualTracker: ExpectActualTracker) {
|
||||
fun StorageComponentContainer.configureIncrementalCompilation(lookupTracker: LookupTracker, expectActualTracker: ExpectActualTracker, inlineConstTracker: InlineConstTracker) {
|
||||
useInstance(lookupTracker)
|
||||
useInstance(expectActualTracker)
|
||||
useInstance(inlineConstTracker)
|
||||
}
|
||||
|
||||
fun createContainerForBodyResolve(
|
||||
@@ -152,6 +154,7 @@ fun createContainerForBodyResolve(
|
||||
useImpl<BodyResolver>()
|
||||
useInstance(moduleStructureOracle)
|
||||
useInstance(controlFlowInformationProviderFactory)
|
||||
useInstance(InlineConstTracker.DoNothing)
|
||||
}
|
||||
|
||||
fun createContainerForLazyBodyResolve(
|
||||
@@ -177,6 +180,7 @@ fun createContainerForLazyBodyResolve(
|
||||
useImpl<BasicAbsentDescriptorHandler>()
|
||||
useInstance(moduleStructureOracle)
|
||||
useInstance(controlFlowInformationProviderFactory)
|
||||
useInstance(InlineConstTracker.DoNothing)
|
||||
|
||||
// All containers except common inject ExpectedActualDeclarationChecker, so for common we do that
|
||||
// explicitly.
|
||||
@@ -201,6 +205,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
|
||||
useInstance(localClassDescriptorHolder)
|
||||
useInstance(lookupTracker)
|
||||
useInstance(ExpectActualTracker.DoNothing)
|
||||
useInstance(InlineConstTracker.DoNothing)
|
||||
|
||||
useImpl<LazyTopDownAnalyzer>()
|
||||
|
||||
@@ -233,6 +238,7 @@ fun createContainerForLazyResolve(
|
||||
configureStandardResolveComponents()
|
||||
|
||||
useInstance(declarationProviderFactory)
|
||||
useInstance(InlineConstTracker.DoNothing)
|
||||
|
||||
|
||||
targetEnvironment.configure(this)
|
||||
|
||||
+35
-1
@@ -21,7 +21,10 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.diagnostics.reportDiagnosticOnce
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.parsing.*
|
||||
@@ -55,7 +58,8 @@ import java.util.*
|
||||
class ConstantExpressionEvaluator(
|
||||
internal val module: ModuleDescriptor,
|
||||
internal val languageVersionSettings: LanguageVersionSettings,
|
||||
project: Project
|
||||
project: Project,
|
||||
internal val inlineConstTracker: InlineConstTracker = InlineConstTracker.DoNothing
|
||||
) {
|
||||
private val moduleAnnotationsResolver = ModuleAnnotationsResolver.getInstance(project)
|
||||
|
||||
@@ -382,6 +386,11 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
private val builtIns = constantExpressionEvaluator.module.builtIns
|
||||
private val defaultValueForDontCreateIntegerLiteralType =
|
||||
languageVersionSettings.supportsFeature(ApproximateIntegerLiteralTypesInReceiverPosition)
|
||||
private val inlineConstTracker =
|
||||
if (constantExpressionEvaluator.inlineConstTracker is InlineConstTracker.DoNothing)
|
||||
null
|
||||
else
|
||||
constantExpressionEvaluator.inlineConstTracker
|
||||
|
||||
fun evaluate(expression: KtExpression, expectedType: KotlinType?): CompileTimeConstant<*>? {
|
||||
val recordedCompileTimeConstant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, trace.bindingContext)
|
||||
@@ -798,6 +807,14 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
return EnumValue(enumClassId, enumDescriptor.name).wrap()
|
||||
}
|
||||
|
||||
val variableDescriptor = enumDescriptor as? VariableDescriptor
|
||||
if (variableDescriptor != null
|
||||
&& isPropertyCompileTimeConstant(variableDescriptor)
|
||||
&& !variableDescriptor.containingDeclaration.isCompanionObject()
|
||||
) {
|
||||
reportInlineConst(expression, variableDescriptor)
|
||||
}
|
||||
|
||||
val resolvedCall = expression.getResolvedCall(trace.bindingContext)
|
||||
if (resolvedCall != null) {
|
||||
val callableDescriptor = resolvedCall.resultingDescriptor
|
||||
@@ -827,6 +844,23 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
return null
|
||||
}
|
||||
|
||||
private fun reportInlineConst(expression: KtSimpleNameExpression, variableDescriptor: VariableDescriptor) {
|
||||
if (inlineConstTracker == null) return
|
||||
val filePath = expression.containingFile.virtualFile?.path ?: return
|
||||
val name = expression.getReferencedName()
|
||||
val constType = variableDescriptor.type.toString()
|
||||
|
||||
// Transformation of fqName to the form "package.Outer$Inner"
|
||||
val containingPackage = variableDescriptor.containingPackage()?.toString() ?: return
|
||||
val fqName = variableDescriptor.containingDeclaration.fqNameSafe.asString()
|
||||
val owner = if (fqName.startsWith("$containingPackage.")) {
|
||||
containingPackage + "." + fqName.substring(containingPackage.length + 1).replace(".", "$")
|
||||
} else {
|
||||
fqName.replace(".", "$")
|
||||
}
|
||||
inlineConstTracker.report(filePath, owner, name, constType)
|
||||
}
|
||||
|
||||
// TODO: Should be replaced with descriptor.isConst
|
||||
private fun isPropertyCompileTimeConstant(descriptor: VariableDescriptor): Boolean {
|
||||
if (descriptor.isVar) {
|
||||
|
||||
Reference in New Issue
Block a user