FE 1.0: spread OptIn markers to children except fake override case

#KT-49001 Fixed
This commit is contained in:
Mikhail Glukhikh
2021-09-21 16:18:10 +03:00
committed by TeamCityServer
parent 3045a5e920
commit 69e06a242a
5 changed files with 31 additions and 103 deletions
@@ -169,18 +169,29 @@ class ExperimentalUsageChecker(project: Project) : CallChecker {
moduleAnnotationsResolver: ModuleAnnotationsResolver,
languageVersionSettings: LanguageVersionSettings,
visited: MutableSet<DeclarationDescriptor> = mutableSetOf(),
useFutureError: Boolean = false
useFutureError: Boolean = false,
useMarkersFromContainer: Boolean = true,
): Set<Experimentality> {
if (!visited.add(this)) return emptySet()
val result = SmartSet.create<Experimentality>()
if (this is CallableMemberDescriptor && kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
for (overridden in overriddenDescriptors) {
result.addAll(overridden.loadExperimentalities(
moduleAnnotationsResolver,
languageVersionSettings,
visited,
useFutureError = !languageVersionSettings.supportsFeature(LanguageFeature.OptInContagiousSignatures)
))
result.addAll(
overridden.loadExperimentalities(
moduleAnnotationsResolver,
languageVersionSettings,
visited,
useFutureError = !languageVersionSettings.supportsFeature(LanguageFeature.OptInContagiousSignatures),
useMarkersFromContainer = false
)
)
if (useMarkersFromContainer) {
(containingDeclaration as? ClassDescriptor)?.let {
result.addAll(
it.loadExperimentalities(moduleAnnotationsResolver, languageVersionSettings, visited, useFutureError)
)
}
}
}
return result
}
@@ -220,6 +231,11 @@ class ExperimentalUsageChecker(project: Project) : CallChecker {
}
}
val container = containingDeclaration
if (useMarkersFromContainer && container is ClassDescriptor && this !is ConstructorDescriptor) {
result.addAll(container.loadExperimentalities(moduleAnnotationsResolver, languageVersionSettings, visited, useFutureError))
}
for (moduleAnnotationClassId in moduleAnnotationsResolver.getAnnotationsOnContainingModule(this)) {
val annotationClass = module.findClassAcrossModuleDependencies(moduleAnnotationClassId)
result.addIfNotNull(annotationClass?.loadExperimentalityForMarkerAnnotation())