From 46b8deedf70e7468cd85dda94da8dbd20926aae9 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 8 Dec 2017 12:00:14 +0100 Subject: [PATCH] Run classifier usage checkers on constructor calls In some cases, REFERENCE_TARGET for annotation entries is the annotation class descriptor, and in others -- the constructor of that class --- .../jvm/checkers/JvmModuleAccessibilityChecker.kt | 3 +++ .../kotlin/resolve/checkers/ClassifierUsageChecker.kt | 10 ++++------ .../org/jetbrains/kotlin/resolve/deprecationUtil.kt | 3 --- .../diagnostics/tests/deprecated/deprecatedHidden.kt | 4 ++-- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt index bdc318f4d5a..f63ecb685ee 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker.kt @@ -46,6 +46,9 @@ class JvmModuleAccessibilityChecker(project: Project) : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { val descriptor = resolvedCall.resultingDescriptor + // Do not check constructors, because the containing class will be checked in [ClassifierUsage] + if (descriptor is ClassConstructorDescriptor) return + // javac seems to check only the containing class of the member being called. Note that it's fine to call, for example, // members with parameter types or return type from an unexported package val targetDescriptor = DescriptorUtils.getParentOfType(descriptor, ClassOrPackageFragmentDescriptor::class.java) ?: return diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt index b8a56fbbdad..2edd00a32cf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt @@ -18,10 +18,7 @@ package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassifierDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource -import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtReferenceExpression @@ -77,8 +74,9 @@ fun checkClassifierUsages( } private fun getReferencedClassifier(expression: KtReferenceExpression): ClassifierDescriptor? { - val target = context.trace.get(BindingContext.REFERENCE_TARGET, expression) as? ClassifierDescriptor - if (target != null) return target + val target = context.trace.get(BindingContext.REFERENCE_TARGET, expression) + if (target is ClassifierDescriptor) return target + if (target is ClassConstructorDescriptor) return target.constructedClass // "Comparable" in "import java.lang.Comparable" references both a class and a SAM constructor and prevents // REFERENCE_TARGET from being recorded in favor of AMBIGUOUS_REFERENCE_TARGET. But we must still run checkers diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt index abd8d055222..3a3b9c077cd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt @@ -334,9 +334,6 @@ class DeprecationResolver( is DescriptorDerivedFromTypeAlias -> { result.addAll(typeAliasDescriptor.getOwnDeprecations()) } - is ConstructorDescriptor -> { - addDeprecationIfPresent(containingDeclaration) - } is PropertyAccessorDescriptor -> { addDeprecationIfPresent(correspondingProperty) diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedHidden.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedHidden.kt index a9bdc18b2d6..8035eac33c0 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedHidden.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedHidden.kt @@ -5,7 +5,7 @@ open class Foo fun test(f: Foo) { f.toString() - val g: Foo? = Foo() + val g: Foo? = Foo() } -class Bar : Foo() +class Bar : Foo()