From 5dc563a9afd5b0f79c270161e27677866d1701ad Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 12 Sep 2018 16:12:33 +0300 Subject: [PATCH] Split deprecationUtil.kt to several files, move to subpackage Also move interface Deprecation to subpackage "deprecation" --- .../kotlin/codegen/state/GenerationState.kt | 5 +- .../BadInheritedJavaSignaturesChecker.kt | 6 +- .../kotlin/synthetic/JavaSyntheticScopes.kt | 2 +- .../synthetic/SamAdapterFunctionsScope.kt | 12 +- .../kotlin/resolve/LazyTopDownAnalyzer.kt | 1 + .../kotlin/resolve/ModifiersChecker.java | 1 + .../kotlin/resolve/calls/CallCompleter.kt | 5 +- .../resolve/calls/checkers/CallChecker.kt | 2 +- .../calls/checkers/DeprecatedCallChecker.kt | 4 +- .../inference/CoroutineInferenceSession.kt | 6 +- .../tower/KotlinResolutionCallbacksImpl.kt | 6 +- .../KotlinResolutionStatelessCallbacksImpl.kt | 4 +- .../tower/KotlinToResolvedCallTransformer.kt | 1 + .../calls/tower/NewResolutionOldInference.kt | 3 +- .../resolve/calls/tower/PSICallResolver.kt | 1 + .../calls/tower/ResolvedAtomCompleter.kt | 2 +- .../kotlin/resolve/checkers/CheckerContext.kt | 2 +- .../checkers/ClassifierUsageChecker.kt | 2 +- .../resolve/checkers/DeclarationChecker.kt | 2 +- .../DeprecatedClassifierUsageChecker.kt | 2 +- .../checkers/ExperimentalUsageChecker.kt | 6 +- .../kotlin/resolve/deprecation/Deprecation.kt | 129 ++++++++++ .../DeprecationResolver.kt} | 223 ++---------------- .../resolve/deprecation/deprecationUtil.kt | 72 ++++++ .../kotlin/resolve/lazy/LazyImportScope.kt | 1 + .../ExpressionTypingComponents.java | 1 + .../typeEnhancement/signatureEnhancement.kt | 2 +- .../org/jetbrains/kotlin/load/java/utils.kt | 4 +- .../resolve/{ => deprecation}/deprecation.kt | 2 +- .../codeInsight/ReferenceVariantsHelper.kt | 2 +- .../kotlin/idea/core/KotlinIndicesHelper.kt | 2 +- .../idea/KotlinQuickDocumentationProvider.kt | 4 +- .../KotlinQuickDocumentationProvider.kt.173 | 4 +- .../ConflictingExtensionPropertyInspection.kt | 7 +- .../OverridingDeprecatedMemberInspection.kt | 4 +- .../js/resolve/JsPlatformConfigurator.kt | 6 +- 36 files changed, 294 insertions(+), 244 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/Deprecation.kt rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{deprecationUtil.kt => deprecation/DeprecationResolver.kt} (53%) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt rename core/descriptors/src/org/jetbrains/kotlin/resolve/{ => deprecation}/deprecation.kt (92%) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index 3f3d0627ce8..afef75291cb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin @@ -139,7 +141,8 @@ class GenerationState private constructor( val deserializationConfiguration: DeserializationConfiguration = CompilerDeserializationConfiguration(configuration.languageVersionSettings) - val deprecationProvider = DeprecationResolver(LockBasedStorageManager.NO_LOCKS, configuration.languageVersionSettings, CoroutineCompatibilitySupport.ENABLED) + val deprecationProvider = + DeprecationResolver(LockBasedStorageManager.NO_LOCKS, configuration.languageVersionSettings, CoroutineCompatibilitySupport.ENABLED) init { val icComponents = configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/BadInheritedJavaSignaturesChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/BadInheritedJavaSignaturesChecker.kt index 3845f716f82..14fb783c100 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/BadInheritedJavaSignaturesChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/BadInheritedJavaSignaturesChecker.kt @@ -11,11 +11,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.load.java.DeprecationCausedByFunctionN -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.renderer.DescriptorRenderer -import org.jetbrains.kotlin.resolve.DEPRECATED_FUNCTION_KEY import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext +import org.jetbrains.kotlin.resolve.deprecation.DEPRECATED_FUNCTION_KEY import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult object BadInheritedJavaSignaturesChecker : DeclarationChecker { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt index f3e23c85db8..e7ee26d1022 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.synthetic import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.load.java.components.SamConversionResolver -import org.jetbrains.kotlin.resolve.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.storage.StorageManager diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 8ef11ee52f2..a29f4a2ca0c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -37,8 +37,8 @@ import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.calls.inference.wrapWithCapturingSubstitution +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.ResolutionScope import org.jetbrains.kotlin.resolve.scopes.SyntheticScope @@ -54,11 +54,11 @@ interface SamAdapterExtensionFunctionDescriptor : FunctionDescriptor, SyntheticM val SAM_LOOKUP_NAME = Name.special("") class SamAdapterFunctionsScope( - storageManager: StorageManager, - private val languageVersionSettings: LanguageVersionSettings, - private val samResolver: SamConversionResolver, - private val deprecationResolver: DeprecationResolver, - private val lookupTracker: LookupTracker + storageManager: StorageManager, + private val languageVersionSettings: LanguageVersionSettings, + private val samResolver: SamConversionResolver, + private val deprecationResolver: DeprecationResolver, + private val lookupTracker: LookupTracker ) : SyntheticScope { private val samViaSyntheticScopeDisabled = languageVersionSettings.supportsFeature(LanguageFeature.NewInference) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt index 703dfa45379..8dfaa0ebf87 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.checkers.ClassifierUsageChecker import org.jetbrains.kotlin.resolve.checkers.ClassifierUsageCheckerContext import org.jetbrains.kotlin.resolve.checkers.checkClassifierUsages +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.lazy.* import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index 1949e1c79d0..c7100f73efd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.lexer.KtModifierKeywordToken; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.checkers.*; +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver; import java.util.Collection; import java.util.HashMap; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt index 6d409ce9e17..2c18fb999a8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.resolve.calls -import org.jetbrains.kotlin.builtins.* +import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType +import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType +import org.jetbrains.kotlin.builtins.isFunctionOrSuspendFunctionType import org.jetbrains.kotlin.contracts.EffectSystem import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -41,6 +43,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstructor +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.expressions.DataFlowAnalyzer import org.jetbrains.kotlin.utils.addToStdlib.safeAs diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt index 0d6866a746d..90cbbd98ed9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt @@ -20,12 +20,12 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.checkers.CheckerContext +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.types.DeferredType import org.jetbrains.kotlin.types.KotlinType diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/DeprecatedCallChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/DeprecatedCallChecker.kt index ee879f27b13..2e727be3aa8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/DeprecatedCallChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/DeprecatedCallChecker.kt @@ -29,10 +29,10 @@ import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.KtUnaryExpression import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject -import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.createDeprecationDiagnostic object DeprecatedCallChecker : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt index 108ffa4c869..7734b3cbbf5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt @@ -10,13 +10,14 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.TemporaryBindingTrace import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver import org.jetbrains.kotlin.resolve.calls.components.CompletedCallInfo import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext -import org.jetbrains.kotlin.resolve.calls.inference.components.* +import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter +import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor +import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutorByConstructorMap import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl @@ -25,6 +26,7 @@ import org.jetbrains.kotlin.resolve.calls.model.KotlinCallComponents import org.jetbrains.kotlin.resolve.calls.model.KotlinResolutionCandidate import org.jetbrains.kotlin.resolve.calls.model.ResolvedLambdaAtom import org.jetbrains.kotlin.resolve.calls.tower.* +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.types.StubType import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.UnwrappedType diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt index 88d0ab8eca5..0cdb9349ef7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt @@ -17,7 +17,10 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.psi.KtReturnExpression import org.jetbrains.kotlin.psi.psiUtil.lastBlockStatementOrThis -import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTrace +import org.jetbrains.kotlin.resolve.TemporaryBindingTrace +import org.jetbrains.kotlin.resolve.TypeResolver import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver import org.jetbrains.kotlin.resolve.calls.components.InferenceSession import org.jetbrains.kotlin.resolve.calls.components.KotlinResolutionCallbacks @@ -32,6 +35,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.util.CallMaker import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt index 7b2467b2891..b1bbb7093d1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt @@ -16,12 +16,10 @@ package org.jetbrains.kotlin.resolve.calls.tower -import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.psi.KtSuperExpression -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isConventionCall import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isInfixCall @@ -33,7 +31,7 @@ import org.jetbrains.kotlin.resolve.calls.model.CallableReferenceKotlinCallArgum import org.jetbrains.kotlin.resolve.calls.model.KotlinCall import org.jetbrains.kotlin.resolve.calls.model.KotlinCallArgument import org.jetbrains.kotlin.resolve.calls.model.SimpleKotlinCallArgument -import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.utils.addToStdlib.safeAs class KotlinResolutionStatelessCallbacksImpl( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt index 53b7f97b399..92022f222d2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.receivers.CastImplicitClassReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt index 1a1421379df..4521f5e7674 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.psi.Call import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.TemporaryBindingTrace import org.jetbrains.kotlin.resolve.calls.CallTransformer import org.jetbrains.kotlin.resolve.calls.CandidateResolver @@ -48,6 +47,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.tasks.* import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.hasDynamicExtensionAnnotation import org.jetbrains.kotlin.resolve.scopes.HierarchicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope @@ -62,7 +62,6 @@ import org.jetbrains.kotlin.types.isDynamic import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.sure -import java.lang.IllegalStateException import java.util.* class NewResolutionOldInference( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt index cd2a1863f51..4cecf7e7a83 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionCandidate import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy import org.jetbrains.kotlin.resolve.calls.util.CallMaker import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.MemberScope diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt index 1e5d74facbf..89919a0e774 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.TemporaryBindingTrace import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext @@ -31,6 +30,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategyImpl import org.jetbrains.kotlin.resolve.calls.util.CallMaker +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.types.IndexedParametersSubstitution import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.UnwrappedType diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CheckerContext.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CheckerContext.kt index 9912dd8a069..e40b8d77abc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CheckerContext.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CheckerContext.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver interface CheckerContext { val trace: BindingTrace 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 530f425afcb..6adf37637e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt @@ -26,8 +26,8 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForTypeAliasObject +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject interface ClassifierUsageChecker { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt index bceda854b3e..b0790dda1ee 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver interface DeclarationChecker { fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt index d6280b352a7..02a04c738bb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.psi.KtThisExpression -import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic +import org.jetbrains.kotlin.resolve.deprecation.createDeprecationDiagnostic class DeprecatedClassifierUsageChecker : ClassifierUsageChecker { override fun check(targetDescriptor: ClassifierDescriptor, element: PsiElement, context: ClassifierUsageCheckerContext) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt index 795020081f7..f01d9aab3a4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -36,6 +36,9 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.constants.ArrayValue import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.constants.KClassValue +import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport +import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe @@ -208,7 +211,8 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { // Ideally, we should run full resolution (with all classifier usage checkers) on classifiers used in "-Xexperimental" and // "-Xuse-experimental" arguments. However, it's not easy to do this. This should be solved in the future with the support of // module annotations. For now, we only check deprecations because this is needed to correctly retire unneeded compiler arguments. - val deprecationResolver = DeprecationResolver(LockBasedStorageManager(), languageVersionSettings, CoroutineCompatibilitySupport.ENABLED) + val deprecationResolver = + DeprecationResolver(LockBasedStorageManager(), languageVersionSettings, CoroutineCompatibilitySupport.ENABLED) fun checkAnnotation(fqName: String): Boolean { val descriptor = module.resolveClassByFqName(FqName(fqName), NoLookupLocation.FOR_NON_TRACKED_SCOPE) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/Deprecation.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/Deprecation.kt new file mode 100644 index 00000000000..a96570fc0da --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/Deprecation.kt @@ -0,0 +1,129 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.resolve.deprecation + +import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.annotations.argumentValue +import org.jetbrains.kotlin.resolve.calls.checkers.shouldWarnAboutDeprecatedModFromBuiltIns +import org.jetbrains.kotlin.resolve.constants.EnumValue +import org.jetbrains.kotlin.resolve.constants.StringValue +import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue.* +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +internal data class DeprecatedByAnnotation(val annotation: AnnotationDescriptor, override val target: DeclarationDescriptor) : Deprecation { + override val deprecationLevel: DeprecationLevelValue + get() = when (annotation.argumentValue("level")?.safeAs()?.enumEntryName?.asString()) { + "WARNING" -> WARNING + "ERROR" -> ERROR + "HIDDEN" -> HIDDEN + else -> WARNING + } + + override val message: String? + get() = annotation.argumentValue("message")?.safeAs()?.value +} + +internal data class DeprecatedByOverridden(private val deprecations: Collection) : Deprecation { + init { + assert(deprecations.isNotEmpty()) + assert(deprecations.none { it is DeprecatedByOverridden }) + } + + override val deprecationLevel: DeprecationLevelValue = deprecations.map(Deprecation::deprecationLevel).min()!! + + override val target: DeclarationDescriptor + get() = deprecations.first().target + + override val message: String + get() { + val message = deprecations.filter { it.deprecationLevel == this.deprecationLevel }.map { it.message }.toSet().joinToString(". ") + return "${additionalMessage()}. $message" + } + + internal fun additionalMessage() = + "Overrides deprecated member in '${DescriptorUtils.getContainingClass(target)!!.fqNameSafe.asString()}'" +} + +internal data class DeprecatedExperimentalCoroutine( + override val target: DeclarationDescriptor, + override val deprecationLevel: DeprecationLevelValue +) : Deprecation { + override val message: String? = + if (deprecationLevel == WARNING) + "Experimental coroutines support will be dropped in 1.4" + else + "Experimental coroutine cannot be used with API version 1.3" +} + +internal data class DeprecatedOperatorMod( + val languageVersionSettings: LanguageVersionSettings, + val currentDeprecation: Deprecation +) : Deprecation { + init { + assert(shouldWarnAboutDeprecatedModFromBuiltIns(languageVersionSettings)) { + "Deprecation created for mod that shouldn't have any deprecations; languageVersionSettings: $languageVersionSettings" + } + } + + override val deprecationLevel: DeprecationLevelValue + get() = when (languageVersionSettings.apiVersion) { + ApiVersion.KOTLIN_1_1, ApiVersion.KOTLIN_1_2 -> WARNING + ApiVersion.KOTLIN_1_3 -> ERROR + else -> ERROR + } + + override val message: String? + get() = currentDeprecation.message + + override val target: DeclarationDescriptor + get() = currentDeprecation.target +} + +internal data class DeprecatedByVersionRequirement( + val versionRequirement: VersionRequirement, + override val target: DeclarationDescriptor +) : Deprecation { + override val deprecationLevel: DeprecationLevelValue + get() = when (versionRequirement.level) { + DeprecationLevel.WARNING -> WARNING + DeprecationLevel.ERROR -> ERROR + DeprecationLevel.HIDDEN -> HIDDEN + } + + override val message: String? + get() { + val message = versionRequirement.message + val errorCode = versionRequirement.errorCode + if (message == null && errorCode == null) return null + + return buildString { + if (message != null) { + append(message) + if (errorCode != null) { + append(" (error code $errorCode)") + } + } else { + append("Error code $errorCode") + } + } + } +} + +internal data class DeprecatedTypealiasByAnnotation( + val typeAliasTarget: TypeAliasDescriptor, + val nested: DeprecatedByAnnotation +) : Deprecation { + override val target get() = typeAliasTarget + override val deprecationLevel get() = nested.deprecationLevel + override val message get() = nested.message +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/DeprecationResolver.kt similarity index 53% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/DeprecationResolver.kt index bf24b0c5d08..e670e2d9324 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/DeprecationResolver.kt @@ -1,224 +1,35 @@ /* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2018 JetBrains s.r.o. 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.resolve +package org.jetbrains.kotlin.resolve.deprecation -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.container.DefaultImplementation +import org.jetbrains.kotlin.config.KotlinCompilerVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.MavenComparableVersion import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.impl.DescriptorDerivedFromTypeAlias import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor -import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.metadata.ProtoBuf -import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.Call -import org.jetbrains.kotlin.resolve.DeprecationLevelValue.* -import org.jetbrains.kotlin.resolve.annotations.argumentValue +import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.checkers.isOperatorMod import org.jetbrains.kotlin.resolve.calls.checkers.shouldWarnAboutDeprecatedModFromBuiltIns import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker -import org.jetbrains.kotlin.resolve.constants.AnnotationValue -import org.jetbrains.kotlin.resolve.constants.EnumValue -import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor.CoroutinesCompatibilityMode.* +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor.CoroutinesCompatibilityMode.COMPATIBLE +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor.CoroutinesCompatibilityMode.NEEDS_WRAPPER import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.addToStdlib.safeAs -private val JAVA_DEPRECATED = FqName("java.lang.Deprecated") - -fun Deprecation.deprecatedByOverriddenMessage(): String? = (this as? DeprecatedByOverridden)?.additionalMessage() - -fun Deprecation.deprecatedByAnnotationReplaceWithExpression(): String? { - val annotation = (this as? DeprecatedByAnnotation)?.annotation ?: return null - val replaceWithAnnotation = - annotation.argumentValue(kotlin.Deprecated::replaceWith.name)?.safeAs()?.value ?: return null - return replaceWithAnnotation.argumentValue(kotlin.ReplaceWith::expression.name)?.safeAs()?.value -} - -private data class DeprecatedByAnnotation(val annotation: AnnotationDescriptor, override val target: DeclarationDescriptor) : Deprecation { - override val deprecationLevel: DeprecationLevelValue - get() = when (annotation.argumentValue("level")?.safeAs()?.enumEntryName?.asString()) { - "WARNING" -> WARNING - "ERROR" -> ERROR - "HIDDEN" -> HIDDEN - else -> WARNING - } - - override val message: String? - get() = annotation.argumentValue("message")?.safeAs()?.value -} - -private data class DeprecatedByOverridden(private val deprecations: Collection) : Deprecation { - init { - assert(deprecations.isNotEmpty()) - assert(deprecations.none { - it is DeprecatedByOverridden - }) - } - - override val deprecationLevel: DeprecationLevelValue = deprecations.map(Deprecation::deprecationLevel).min()!! - - override val target: DeclarationDescriptor - get() = deprecations.first().target - - override val message: String - get() { - val message = deprecations.filter { it.deprecationLevel == this.deprecationLevel }.map { it.message }.toSet().joinToString(". ") - return "${additionalMessage()}. $message" - } - - internal fun additionalMessage() = - "Overrides deprecated member in '${DescriptorUtils.getContainingClass(target)!!.fqNameSafe.asString()}'" -} - -private data class DeprecatedExperimentalCoroutine( - override val target: DeclarationDescriptor, - override val deprecationLevel: DeprecationLevelValue -) : Deprecation { - override val message: String? = - if (deprecationLevel == WARNING) - "Experimental coroutines support will be dropped in 1.4" - else - "Experimental coroutine cannot be used with API version 1.3" -} - -private data class DeprecatedOperatorMod( - val languageVersionSettings: LanguageVersionSettings, - val currentDeprecation: Deprecation -) : Deprecation { - init { - assert(shouldWarnAboutDeprecatedModFromBuiltIns(languageVersionSettings)) { - "Deprecation created for mod that shouldn't have any deprecations; languageVersionSettings: $languageVersionSettings" - } - } - - override val deprecationLevel: DeprecationLevelValue - get() = when (languageVersionSettings.apiVersion) { - ApiVersion.KOTLIN_1_1, ApiVersion.KOTLIN_1_2 -> WARNING - ApiVersion.KOTLIN_1_3 -> ERROR - else -> ERROR - } - - override val message: String? - get() = currentDeprecation.message - - override val target: DeclarationDescriptor - get() = currentDeprecation.target -} - -private data class DeprecatedByVersionRequirement( - val versionRequirement: VersionRequirement, - override val target: DeclarationDescriptor -) : Deprecation { - override val deprecationLevel: DeprecationLevelValue - get() = when (versionRequirement.level) { - DeprecationLevel.WARNING -> WARNING - DeprecationLevel.ERROR -> ERROR - DeprecationLevel.HIDDEN -> HIDDEN - } - - override val message: String? - get() { - val message = versionRequirement.message - val errorCode = versionRequirement.errorCode - if (message == null && errorCode == null) return null - - return buildString { - if (message != null) { - append(message) - if (errorCode != null) { - append(" (error code $errorCode)") - } - } else { - append("Error code $errorCode") - } - } - } -} - -private data class DeprecatedTypealiasByAnnotation( - val typeAliasTarget: TypeAliasDescriptor, - val nested: DeprecatedByAnnotation -) : Deprecation { - override val target get() = typeAliasTarget - override val deprecationLevel get() = nested.deprecationLevel - override val message get() = nested.message -} - -private fun Deprecation.wrapInTypeAliasExpansion(typeAliasDescriptor: TypeAliasDescriptor) = when { - this is DeprecatedByAnnotation -> DeprecatedTypealiasByAnnotation(typeAliasDescriptor, this) - else -> this -} - -internal fun createDeprecationDiagnostic( - element: PsiElement, deprecation: Deprecation, languageVersionSettings: LanguageVersionSettings -): Diagnostic { - val targetOriginal = deprecation.target.original - return when (deprecation) { - is DeprecatedByVersionRequirement -> { - val factory = when (deprecation.deprecationLevel) { - WARNING -> Errors.VERSION_REQUIREMENT_DEPRECATION - ERROR, HIDDEN -> Errors.VERSION_REQUIREMENT_DEPRECATION_ERROR - } - factory.on( - element, targetOriginal, deprecation.versionRequirement.version, - languageVersionSettings.languageVersion to deprecation.message - ) - } - - is DeprecatedTypealiasByAnnotation -> { - val factory = when (deprecation.deprecationLevel) { - WARNING -> Errors.TYPEALIAS_EXPANSION_DEPRECATION - ERROR, HIDDEN -> Errors.TYPEALIAS_EXPANSION_DEPRECATION_ERROR - } - factory.on(element, deprecation.typeAliasTarget.original, deprecation.nested.target.original, deprecation.nested.message ?: "") - } - - else -> { - val factory = when (deprecation.deprecationLevel) { - WARNING -> Errors.DEPRECATION - ERROR, HIDDEN -> Errors.DEPRECATION_ERROR - } - factory.on(element, targetOriginal, deprecation.message ?: "") - } - } -} - -@DefaultImplementation(CoroutineCompatibilitySupport::class) -class CoroutineCompatibilitySupport private constructor(val enabled: Boolean) { - constructor() : this(true) - - companion object { - val ENABLED = CoroutineCompatibilitySupport(true) - - val DISABLED = CoroutineCompatibilitySupport(false) - } -} - class DeprecationResolver( storageManager: StorageManager, private val languageVersionSettings: LanguageVersionSettings, @@ -241,7 +52,7 @@ class DeprecationResolver( deprecations(descriptor.original) fun isDeprecatedHidden(descriptor: DeclarationDescriptor): Boolean = - getDeprecations(descriptor).any { it.deprecationLevel == HIDDEN } + getDeprecations(descriptor).any { it.deprecationLevel == DeprecationLevelValue.HIDDEN } @JvmOverloads fun isHiddenInResolution( @@ -371,8 +182,9 @@ class DeprecationResolver( target.coroutinesExperimentalCompatibilityMode.let { mode -> return when { mode == COMPATIBLE -> null - mode == NEEDS_WRAPPER && coroutineCompatibilitySupport.enabled -> DeprecatedExperimentalCoroutine(target, WARNING) - else -> DeprecatedExperimentalCoroutine(target, ERROR) + mode == NEEDS_WRAPPER && coroutineCompatibilitySupport.enabled -> + DeprecatedExperimentalCoroutine(target, DeprecationLevelValue.WARNING) + else -> DeprecatedExperimentalCoroutine(target, DeprecationLevelValue.ERROR) } } } @@ -409,4 +221,13 @@ class DeprecationResolver( null } } + + companion object { + private val JAVA_DEPRECATED = FqName("java.lang.Deprecated") + + private fun Deprecation.wrapInTypeAliasExpansion(typeAliasDescriptor: TypeAliasDescriptor): Deprecation = when { + this is DeprecatedByAnnotation -> DeprecatedTypealiasByAnnotation(typeAliasDescriptor, this) + else -> this + } + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt new file mode 100644 index 00000000000..fdf8c619ad5 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.resolve.deprecation + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.container.DefaultImplementation +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.resolve.annotations.argumentValue +import org.jetbrains.kotlin.resolve.constants.AnnotationValue +import org.jetbrains.kotlin.resolve.constants.StringValue +import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue.* +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +fun Deprecation.deprecatedByOverriddenMessage(): String? = (this as? DeprecatedByOverridden)?.additionalMessage() + +fun Deprecation.deprecatedByAnnotationReplaceWithExpression(): String? { + val annotation = (this as? DeprecatedByAnnotation)?.annotation ?: return null + val replaceWithAnnotation = + annotation.argumentValue(kotlin.Deprecated::replaceWith.name)?.safeAs()?.value ?: return null + return replaceWithAnnotation.argumentValue(kotlin.ReplaceWith::expression.name)?.safeAs()?.value +} + +internal fun createDeprecationDiagnostic( + element: PsiElement, deprecation: Deprecation, languageVersionSettings: LanguageVersionSettings +): Diagnostic { + val targetOriginal = deprecation.target.original + return when (deprecation) { + is DeprecatedByVersionRequirement -> { + val factory = when (deprecation.deprecationLevel) { + WARNING -> Errors.VERSION_REQUIREMENT_DEPRECATION + ERROR, HIDDEN -> Errors.VERSION_REQUIREMENT_DEPRECATION_ERROR + } + factory.on( + element, targetOriginal, deprecation.versionRequirement.version, + languageVersionSettings.languageVersion to deprecation.message + ) + } + + is DeprecatedTypealiasByAnnotation -> { + val factory = when (deprecation.deprecationLevel) { + WARNING -> Errors.TYPEALIAS_EXPANSION_DEPRECATION + ERROR, HIDDEN -> Errors.TYPEALIAS_EXPANSION_DEPRECATION_ERROR + } + factory.on(element, deprecation.typeAliasTarget.original, deprecation.nested.target.original, deprecation.nested.message ?: "") + } + + else -> { + val factory = when (deprecation.deprecationLevel) { + WARNING -> Errors.DEPRECATION + ERROR, HIDDEN -> Errors.DEPRECATION_ERROR + } + factory.on(element, targetOriginal, deprecation.message ?: "") + } + } +} + +@DefaultImplementation(CoroutineCompatibilitySupport::class) +class CoroutineCompatibilitySupport private constructor(val enabled: Boolean) { + @Suppress("unused") + constructor() : this(true) + + companion object { + val ENABLED = CoroutineCompatibilitySupport(true) + + val DISABLED = CoroutineCompatibilitySupport(false) + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index 02a26889034..698cc567c8f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtImportInfo import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.storage.NotNullLazyValue diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java index 05259104d75..3f74ceeea91 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker; import org.jetbrains.kotlin.resolve.calls.checkers.RttiExpressionChecker; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory; import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator; +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver; import org.jetbrains.kotlin.types.WrappedTypeFactory; import javax.inject.Inject; diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 9ba2be075c5..d542f03ea58 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -30,8 +30,8 @@ import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents import org.jetbrains.kotlin.load.kotlin.computeJvmDescriptor import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.DEPRECATED_FUNCTION_KEY import org.jetbrains.kotlin.resolve.constants.EnumValue +import org.jetbrains.kotlin.resolve.deprecation.DEPRECATED_FUNCTION_KEY import org.jetbrains.kotlin.resolve.descriptorUtil.firstArgument import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.types.* diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt index c5b7eef401d..626a1cc62ee 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.Deprecation -import org.jetbrains.kotlin.resolve.DeprecationLevelValue +import org.jetbrains.kotlin.resolve.deprecation.Deprecation +import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.utils.extractRadix diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/deprecation.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/deprecation/deprecation.kt similarity index 92% rename from core/descriptors/src/org/jetbrains/kotlin/resolve/deprecation.kt rename to core/descriptors/src/org/jetbrains/kotlin/resolve/deprecation/deprecation.kt index 0e1c9fafcc4..35c7bbb1131 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/deprecation.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/deprecation/deprecation.kt @@ -3,7 +3,7 @@ * that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.deprecation import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index ea87a74d162..9bf3a67c3dd 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -33,10 +33,10 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtVariableDeclaration import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.scopes.* import org.jetbrains.kotlin.resolve.scopes.receivers.ClassQualifier diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt index bbcb61596d3..cd66095e971 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt @@ -47,7 +47,7 @@ import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.contains import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.resolve.scopes.collectSyntheticStaticFunctions diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index e3b9e769e17..fcfbdfcbc20 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -50,9 +50,9 @@ import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy import org.jetbrains.kotlin.renderer.ClassifierNamePolicy import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.deprecatedByAnnotationReplaceWithExpression +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.deprecatedByAnnotationReplaceWithExpression import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt.173 b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt.173 index 2d0f22d544c..c9a38682eb4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt.173 +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt.173 @@ -48,9 +48,9 @@ import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.ClassifierNamePolicy import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.deprecatedByAnnotationReplaceWithExpression +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.deprecatedByAnnotationReplaceWithExpression import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt index 8d10ba64495..b062be6cf50 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt @@ -24,7 +24,10 @@ import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.ui.GuiUtils import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.* +import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade +import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.core.targetDescriptors import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction @@ -38,8 +41,8 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.renderer.render -import org.jetbrains.kotlin.resolve.DeprecationResolver import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.resolve.scopes.collectSyntheticExtensionProperties diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt index 5bb3b63a135..6f048b91533 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt @@ -29,8 +29,8 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtVisitorVoid -import org.jetbrains.kotlin.resolve.DeprecationResolver -import org.jetbrains.kotlin.resolve.deprecatedByOverriddenMessage +import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver +import org.jetbrains.kotlin.resolve.deprecation.deprecatedByOverriddenMessage class OverridingDeprecatedMemberInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt index 273513178ab..bb44713110a 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt @@ -23,10 +23,14 @@ import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.js.analyze.JsNativeDiagnosticSuppressor import org.jetbrains.kotlin.js.naming.NameSuggestion import org.jetbrains.kotlin.js.resolve.diagnostics.* -import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.DeclarationReturnTypeSanitizer +import org.jetbrains.kotlin.resolve.OverloadFilter +import org.jetbrains.kotlin.resolve.OverridesBackwardCompatibilityHelper +import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.calls.checkers.ReifiedTypeParameterSubstitutionChecker import org.jetbrains.kotlin.resolve.calls.components.SamConversionTransformer import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker +import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport import org.jetbrains.kotlin.resolve.lazy.DelegationFilter import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.types.DynamicTypesAllowed