From f7b4d7d35b3a8f614f6caa303aaddd3b02b7364b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 24 Sep 2016 15:18:56 +0300 Subject: [PATCH] Move ClassifierUsageChecker and DeclarationChecker to checkers/ --- .../AdditionalBuiltInsMembersChecker.kt | 2 +- .../jvm/checkers/ExternalFunChecker.kt | 2 +- .../checkers/JvmFieldApplicabilityChecker.kt | 2 +- .../JvmSyntheticApplicabilityChecker.kt | 2 +- .../checkers/StrictfpApplicabilityChecker.kt | 2 +- .../jvm/checkers/declarationCheckers.kt | 2 +- .../kotlin/resolve/LazyTopDownAnalyzer.kt | 1 + .../kotlin/resolve/ModifiersChecker.java | 2 + .../kotlin/resolve/TargetPlatform.kt | 1 + .../{ => checkers}/ClassifierUsageChecker.kt | 5 +- .../{ => checkers}/ConstModifierChecker.kt | 5 +- .../CoroutineModifierChecker.kt} | 59 +------------ .../DataClassDeclarationChecker.kt | 6 +- .../{ => checkers}/DeclarationChecker.kt | 5 +- .../DeprecatedClassifierUsageChecker.kt | 5 +- .../{ => checkers}/InfixModifierChecker.kt | 5 +- .../{ => checkers}/InlineParameterChecker.kt | 5 +- .../checkers/SuspendModifierChecker.kt | 83 +++++++++++++++++++ .../{ => checkers}/UnderscoreChecker.kt | 5 +- .../BasicExpressionTypingVisitor.java | 1 + .../expressions/FunctionsTypingVisitor.kt | 1 + .../idea/quickfix/AddConstModifierFix.kt | 2 +- .../diagnostics/NativeInnerClassChecker.kt | 2 +- .../js/resolve/nativeAnnotationCheckers.kt | 2 +- 24 files changed, 126 insertions(+), 81 deletions(-) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/ClassifierUsageChecker.kt (94%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/ConstModifierChecker.kt (95%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{SuspendModifierChecker.kt => checkers/CoroutineModifierChecker.kt} (59%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/DataClassDeclarationChecker.kt (94%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/DeclarationChecker.kt (92%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/DeprecatedClassifierUsageChecker.kt (83%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/InfixModifierChecker.kt (92%) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/InlineParameterChecker.kt (94%) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/SuspendModifierChecker.kt rename compiler/frontend/src/org/jetbrains/kotlin/resolve/{ => checkers}/UnderscoreChecker.kt (94%) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/AdditionalBuiltInsMembersChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/AdditionalBuiltInsMembersChecker.kt index cfc338f7b06..291e3d9b362 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/AdditionalBuiltInsMembersChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/AdditionalBuiltInsMembersChecker.kt @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.isFromBuiltins import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.DeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeUniqueAsSequence object AdditionalBuiltInsMemberOverrideDeclarationChecker : DeclarationChecker { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt index 38d67aa8303..ae8af960748 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclarationWithBody import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.inline.InlineUtil import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt index 6026f8458b6..7fc30fd2fb1 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmFieldAnnotation diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt index a0c2a09196c..1091a839d05 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.annotations.findJvmSyntheticAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/StrictfpApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/StrictfpApplicabilityChecker.kt index b362af40582..4a4e746f234 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/StrictfpApplicabilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/StrictfpApplicabilityChecker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.annotations.findStrictfpAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt index 119c2abf8e9..9c285dca5ba 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt index 5774f041af0..907c07813e6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo +import org.jetbrains.kotlin.resolve.checkers.ClassifierUsageChecker 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 59f158b61dc..e658f20938e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -28,6 +28,8 @@ import org.jetbrains.kotlin.lexer.KtKeywordToken; import org.jetbrains.kotlin.lexer.KtModifierKeywordToken; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.*; +import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker; +import org.jetbrains.kotlin.resolve.checkers.UnderscoreChecker; import java.util.*; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt index 1ed1c5b7028..c6104350db3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.resolve.calls.checkers.* import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator +import org.jetbrains.kotlin.resolve.checkers.* import org.jetbrains.kotlin.resolve.scopes.SyntheticConstructorsProvider import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.storage.StorageManager diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ClassifierUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt similarity index 94% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/ClassifierUsageChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt index 12e6a589323..9ce1fc2ee39 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ClassifierUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ClassDescriptor @@ -23,6 +23,9 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.KtTreeVisitorVoid +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTrace +import org.jetbrains.kotlin.resolve.DescriptorUtils interface ClassifierUsageChecker { fun check(targetDescriptor: ClassifierDescriptor, trace: BindingTrace, element: PsiElement) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ConstModifierChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ConstModifierChecker.kt similarity index 95% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/ConstModifierChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ConstModifierChecker.kt index 5bf0823c4b4..4951aa01130 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ConstModifierChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ConstModifierChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.* @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.resolve.BindingContext object ConstModifierChecker : SimpleDeclarationChecker { override fun check( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CoroutineModifierChecker.kt similarity index 59% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CoroutineModifierChecker.kt index 0b0bf8819c8..0a765f8e858 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/CoroutineModifierChecker.kt @@ -14,78 +14,23 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType import org.jetbrains.kotlin.builtins.isExtensionFunctionType import org.jetbrains.kotlin.coroutines.isValidContinuation -import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.incremental.KotlinLookupLocation import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclarationWithBody +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.util.OperatorNameConventions -import org.jetbrains.kotlin.utils.sure - -object SuspendModifierChecker : SimpleDeclarationChecker { - private val ALLOW_SUSPEND_EXTENSIONS_ANNOTATION_FQ_NAME = FqName("kotlin.coroutines.AllowSuspendExtensions") - - override fun check( - declaration: KtDeclaration, - descriptor: DeclarationDescriptor, - diagnosticHolder: DiagnosticSink, - bindingContext: BindingContext - ) { - val functionDescriptor = descriptor as? FunctionDescriptor ?: return - if (!functionDescriptor.isSuspend) return - - val suspendModifierElement = declaration.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD).sure { declaration.text } - fun report(message: String) { - diagnosticHolder.report(Errors.INAPPLICABLE_MODIFIER.on(suspendModifierElement, KtTokens.SUSPEND_KEYWORD, message)) - } - - if (functionDescriptor.dispatchReceiverParameter == null) { - if (functionDescriptor.extensionReceiverParameter == null) { - report("function must be either a class member or an extension") - return - } - - val classDescriptor = - functionDescriptor.extensionReceiverParameter!!.type.constructor.declarationDescriptor as? ClassDescriptor - if (classDescriptor == null) { - report("function must be an extension to class") - return - } - - if (!classDescriptor.annotations.hasAnnotation(ALLOW_SUSPEND_EXTENSIONS_ANNOTATION_FQ_NAME)) { - report("controller class must be annotated with AllowSuspendExtensions annotation") - return - } - } - - val continuationParameterType = functionDescriptor.valueParameters.lastOrNull()?.type - val isValidContinuation = continuationParameterType?.isValidContinuation() ?: false - if (!isValidContinuation) { - report("last parameter of suspend function should have a type of Continuation") - return - } - - if (continuationParameterType?.arguments?.firstOrNull()?.isStarProjection == true) { - report("Continuation<*> is prohibited as a last parameter of suspend function") - } - - if (functionDescriptor.returnType?.isUnit() != true) { - report("return type of suspension function must be a kotlin.Unit, but ${functionDescriptor.returnType} was found") - } - } -} object CoroutineModifierChecker : SimpleDeclarationChecker { override fun check( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DataClassDeclarationChecker.kt similarity index 94% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassDeclarationChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DataClassDeclarationChecker.kt index 599d892ec78..c355d1747f3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DataClassDeclarationChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration - +import org.jetbrains.kotlin.resolve.BindingContext class DataClassDeclarationChecker : SimpleDeclarationChecker { override fun check( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt similarity index 92% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt index dbc31347c27..8677d6f7395 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeclarationChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -14,12 +14,13 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.resolve.BindingContext interface DeclarationChecker { // TODO: Think about encapsulating these parameters into specific class like CheckerParameters when you're about to add another one diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeprecatedClassifierUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt similarity index 83% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/DeprecatedClassifierUsageChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt index a7249f815a8..48e606cc6e6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeprecatedClassifierUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker.kt @@ -14,10 +14,13 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.resolve.BindingTrace +import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic +import org.jetbrains.kotlin.resolve.getDeprecation class DeprecatedClassifierUsageChecker : ClassifierUsageChecker { override fun check(targetDescriptor: ClassifierDescriptor, trace: BindingTrace, element: PsiElement) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/InfixModifierChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InfixModifierChecker.kt similarity index 92% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/InfixModifierChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InfixModifierChecker.kt index d0ef195331b..e9f838cc55e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/InfixModifierChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InfixModifierChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.util.CheckResult import org.jetbrains.kotlin.util.InfixChecks diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineParameterChecker.kt similarity index 94% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineParameterChecker.kt index 9564f4145ab..a21f603b4c6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineParameterChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.resolve.BindingContext object InlineParameterChecker : SimpleDeclarationChecker { override fun check( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/SuspendModifierChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/SuspendModifierChecker.kt new file mode 100644 index 00000000000..c914109c53e --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/SuspendModifierChecker.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2016 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. + */ + +package org.jetbrains.kotlin.resolve.checkers + +import org.jetbrains.kotlin.coroutines.isValidContinuation +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.diagnostics.DiagnosticSink +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.types.typeUtil.isUnit +import org.jetbrains.kotlin.utils.sure + +object SuspendModifierChecker : SimpleDeclarationChecker { + private val ALLOW_SUSPEND_EXTENSIONS_ANNOTATION_FQ_NAME = FqName("kotlin.coroutines.AllowSuspendExtensions") + + override fun check( + declaration: KtDeclaration, + descriptor: DeclarationDescriptor, + diagnosticHolder: DiagnosticSink, + bindingContext: BindingContext + ) { + val functionDescriptor = descriptor as? FunctionDescriptor ?: return + if (!functionDescriptor.isSuspend) return + + val suspendModifierElement = declaration.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD).sure { declaration.text } + fun report(message: String) { + diagnosticHolder.report(Errors.INAPPLICABLE_MODIFIER.on(suspendModifierElement, KtTokens.SUSPEND_KEYWORD, message)) + } + + if (functionDescriptor.dispatchReceiverParameter == null) { + if (functionDescriptor.extensionReceiverParameter == null) { + report("function must be either a class member or an extension") + return + } + + val classDescriptor = + functionDescriptor.extensionReceiverParameter!!.type.constructor.declarationDescriptor as? ClassDescriptor + if (classDescriptor == null) { + report("function must be an extension to class") + return + } + + if (!classDescriptor.annotations.hasAnnotation(ALLOW_SUSPEND_EXTENSIONS_ANNOTATION_FQ_NAME)) { + report("controller class must be annotated with AllowSuspendExtensions annotation") + return + } + } + + val continuationParameterType = functionDescriptor.valueParameters.lastOrNull()?.type + val isValidContinuation = continuationParameterType?.isValidContinuation() ?: false + if (!isValidContinuation) { + report("last parameter of suspend function should have a type of Continuation") + return + } + + if (continuationParameterType?.arguments?.firstOrNull()?.isStarProjection == true) { + report("Continuation<*> is prohibited as a last parameter of suspend function") + } + + if (functionDescriptor.returnType?.isUnit() != true) { + report("return type of suspension function must be a kotlin.Unit, but ${functionDescriptor.returnType} was found") + } + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/UnderscoreChecker.kt similarity index 94% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/UnderscoreChecker.kt index a0af7945797..cae74eedaf2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/UnderscoreChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve +package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.BindingContext object UnderscoreChecker : SimpleDeclarationChecker { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 2b7c4d4baec..aa769f32a2e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -56,6 +56,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind; 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.checkers.UnderscoreChecker; import org.jetbrains.kotlin.resolve.constants.*; import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind; import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt index 030993d70f7..b63cb515ecb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.BindingContext.EXPECTED_RETURN_TYPE import org.jetbrains.kotlin.resolve.calls.callResolverUtil.getCorrespondingParameterForFunctionArgument import org.jetbrains.kotlin.resolve.calls.util.createFunctionType +import org.jetbrains.kotlin.resolve.checkers.UnderscoreChecker import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope import org.jetbrains.kotlin.resolve.source.toSourceElement diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt index 562c1b993e4..34fd836fba6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt @@ -40,7 +40,7 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.ConstModifierChecker +import org.jetbrains.kotlin.resolve.checkers.ConstModifierChecker import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.source.PsiSourceElement diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/NativeInnerClassChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/NativeInnerClassChecker.kt index dfddab5eb81..b413c5df8e7 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/NativeInnerClassChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/NativeInnerClassChecker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.DescriptorUtils class NativeInnerClassChecker : SimpleDeclarationChecker { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/nativeAnnotationCheckers.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/nativeAnnotationCheckers.kt index 6f5848863c1..e0a14b99ca8 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/nativeAnnotationCheckers.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/nativeAnnotationCheckers.kt @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf