From 38be1f69470058ce85b40ed7bcc8d74a3f93a444 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 7 Sep 2018 12:13:55 +0300 Subject: [PATCH] Minor. Parametrize MainFunctionDetector with LanguageVersionSettings --- .../jetbrains/kotlin/codegen/state/GenerationState.kt | 2 +- .../cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt | 2 +- .../kotlin/cfg/ControlFlowInformationProvider.kt | 2 +- .../org/jetbrains/kotlin/idea/MainFunctionDetector.kt | 8 ++++++-- .../org/jetbrains/kotlin/resolve/OverloadResolver.kt | 6 ++++-- .../kotlin/idea/run/KotlinRunConfiguration.java | 4 +++- .../kotlin/idea/run/KotlinRunConfigurationProducer.kt | 4 +++- .../highlighter/KotlinRunLineMarkerContributor.kt | 5 +++-- .../inspections/MainFunctionReturnUnitInspection.kt | 5 ++++- .../inspections/UnusedReceiverParameterInspection.kt | 5 ++++- .../jetbrains/kotlin/idea/run/RunConfigurationTest.kt | 3 ++- .../src/org/jetbrains/kotlin/js/config/JsConfig.java | 11 +++++++++-- .../kotlin/js/translate/general/Translation.java | 2 +- ultimate/build.gradle.kts | 1 + .../cli/KotlinNodeJsRunConfigurationProducer.kt | 5 +++-- 15 files changed, 46 insertions(+), 19 deletions(-) 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 8999f8fb0ca..3f3d0627ce8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -181,7 +181,7 @@ class GenerationState private constructor( filter = if (wantsDiagnostics) BindingTraceFilter.ACCEPT_ALL else BindingTraceFilter.NO_DIAGNOSTICS ) val bindingContext: BindingContext = bindingTrace.bindingContext - val mainFunctionDetector = MainFunctionDetector(bindingContext) + val mainFunctionDetector = MainFunctionDetector(bindingContext, languageVersionSettings) private val isIrBackend = configuration.get(JVMConfigurationKeys.IR) ?: false val typeMapper: KotlinTypeMapper = KotlinTypeMapper( this.bindingContext, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index aa1f0274fc9..768602e29dc 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -222,7 +222,7 @@ object KotlinToJVMBytecodeCompiler { } private fun findMainClass(generationState: GenerationState, files: List): FqName? { - val mainFunctionDetector = MainFunctionDetector(generationState.bindingContext) + val mainFunctionDetector = MainFunctionDetector(generationState.bindingContext, generationState.languageVersionSettings) return files.asSequence() .map { file -> if (mainFunctionDetector.hasMain(file.declarations)) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt index f0372fca8a9..d61d34a42e9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt @@ -668,7 +668,7 @@ class ControlFlowInformationProvider private constructor( if (anonymous && !languageVersionSettings.supportsFeature(LanguageFeature.SingleUnderscoreForParameterName)) { return } - val mainFunctionDetector = MainFunctionDetector(trace.bindingContext) + val mainFunctionDetector = MainFunctionDetector(trace.bindingContext, languageVersionSettings) val isMain = owner is KtNamedFunction && mainFunctionDetector.isMain(owner) val functionName = functionDescriptor.name if (isMain diff --git a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt index 4aa3ea0d0ac..f65a28e19c4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtDeclaration @@ -31,17 +32,20 @@ import org.jetbrains.kotlin.types.Variance class MainFunctionDetector { private val getFunctionDescriptor: (KtNamedFunction) -> FunctionDescriptor? + private val languageVersionSettings: LanguageVersionSettings /** Assumes that the function declaration is already resolved and the descriptor can be found in the `bindingContext`. */ - constructor(bindingContext: BindingContext) { + constructor(bindingContext: BindingContext, languageVersionSettings: LanguageVersionSettings) { this.getFunctionDescriptor = { function -> bindingContext.get(BindingContext.FUNCTION, function) ?: throw IllegalStateException("No descriptor resolved for " + function + " " + function.text) } + this.languageVersionSettings = languageVersionSettings } - constructor(functionResolver: (KtNamedFunction) -> FunctionDescriptor?) { + constructor(languageVersionSettings: LanguageVersionSettings, functionResolver: (KtNamedFunction) -> FunctionDescriptor?) { this.getFunctionDescriptor = functionResolver + this.languageVersionSettings = languageVersionSettings } fun hasMain(declarations: List): Boolean { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt index c1226f4edd7..672bdbe6430 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve import com.intellij.util.containers.MultiMap +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.reportOnDeclaration @@ -31,10 +32,11 @@ import java.util.* class OverloadResolver( private val trace: BindingTrace, private val overloadFilter: OverloadFilter, - private val overloadChecker: OverloadChecker + private val overloadChecker: OverloadChecker, + languageVersionSettings: LanguageVersionSettings ) { - private val mainFunctionDetector = MainFunctionDetector(trace.bindingContext) + private val mainFunctionDetector = MainFunctionDetector(trace.bindingContext, languageVersionSettings) fun checkOverloads(c: BodiesResolveContext) { val inClasses = findConstructorsInNestedClassesAndTypeAliases(c) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfiguration.java b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfiguration.java index 9357ec4af3b..8fb79db4012 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfiguration.java +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfiguration.java @@ -56,6 +56,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod; import org.jetbrains.kotlin.idea.MainFunctionDetector; import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; import org.jetbrains.kotlin.idea.core.FileIndexUtilsKt; +import org.jetbrains.kotlin.idea.project.PlatformKt; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.KtDeclaration; import org.jetbrains.kotlin.psi.KtDeclarationContainer; @@ -319,7 +320,8 @@ public class KotlinRunConfiguration extends JetRunConfiguration { private static KtNamedFunction findMainFun(@NotNull PsiClass psiClass) { for (KtNamedFunction function : getMainFunCandidates(psiClass)) { BindingContext bindingContext = ResolutionUtils.analyze(function, BodyResolveMode.FULL); - MainFunctionDetector mainFunctionDetector = new MainFunctionDetector(bindingContext); + MainFunctionDetector mainFunctionDetector = + new MainFunctionDetector(bindingContext, PlatformKt.getLanguageVersionSettings(function)); if (mainFunctionDetector.isMain(function)) return function; } return null; diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt index 6a047276ddc..7c004c37184 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.project.TargetPlatformDetector +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfType @@ -79,7 +80,8 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer + val detector = MainFunctionDetector(function.languageVersionSettings) { someFunction -> someFunction.resolveToDescriptorIfAny() } @@ -46,4 +47,4 @@ class KotlinRunLineMarkerContributor : RunLineMarkerContributor() { return null } -} \ No newline at end of file +} diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/MainFunctionReturnUnitInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/MainFunctionReturnUnitInspection.kt index 49e9d05c440..dbe74b28b32 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/MainFunctionReturnUnitInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/MainFunctionReturnUnitInspection.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.setType +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtAnnotationEntry @@ -36,7 +37,9 @@ class MainFunctionReturnUnitInspection : AbstractKotlinInspection() { val descriptor = function.descriptor as? FunctionDescriptor ?: return if (isMain) { - if (!MainFunctionDetector { it.resolveToDescriptorIfAny() }.isMain(descriptor, checkReturnType = false)) return + val mainFunctionDetector = + MainFunctionDetector(function.languageVersionSettings) { it.resolveToDescriptorIfAny() } + if (!mainFunctionDetector.isMain(descriptor, checkReturnType = false)) return } else { val junitTestFqNames = listOf(FqName("org.junit.Test"), FqName("org.junit.jupiter.api.Test")) if (testAnnotations.none { it.fqName() in junitTestFqNames }) return diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt index b062eae4374..69bd56389b5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.isOverridable +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify @@ -77,7 +78,9 @@ class UnusedReceiverParameterInspection : AbstractKotlinInspection() { val callable = callableDeclaration.descriptor ?: return - if (MainFunctionDetector { it.resolveToDescriptorIfAny() }.isMain(callable)) return + val mainFunctionDetector = + MainFunctionDetector(callableDeclaration.languageVersionSettings) { it.resolveToDescriptorIfAny() } + if (mainFunctionDetector.isMain(callable)) return val containingDeclaration = callable.containingDeclaration if (containingDeclaration != null && containingDeclaration == receiverTypeDeclaration) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/run/RunConfigurationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/run/RunConfigurationTest.kt index 6797149bc55..052ee5c28f5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/run/RunConfigurationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/run/RunConfigurationTest.kt @@ -30,6 +30,7 @@ import com.intellij.psi.PsiManager import com.intellij.refactoring.RefactoringFactory import com.intellij.testFramework.MapDataContext import com.intellij.testFramework.PsiTestUtil +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.search.allScope @@ -69,7 +70,7 @@ class RunConfigurationTest: KotlinCodeInsightTestCase() { val assertIsNotMain = "no" in options val isMainFunction = - MainFunctionDetector { it.resolveToDescriptorIfAny() }.isMain(function) + MainFunctionDetector(LanguageVersionSettingsImpl.DEFAULT) { it.resolveToDescriptorIfAny() }.isMain(function) if (assertIsMain) { Assert.assertTrue("The function ${function.fqName?.asString()} should be main", isMainFunction) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java index ce1571374d3..fb4ff039126 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java @@ -42,7 +42,6 @@ import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils; import java.io.File; import java.util.*; -import static org.jetbrains.kotlin.config.CommonConfigurationKeysKt.getLanguageVersionSettings; import static org.jetbrains.kotlin.utils.PathUtil.getKotlinPathsForDistDirectory; public class JsConfig { @@ -135,6 +134,11 @@ public class JsConfig { return getConfiguration().getList(JSConfigurationKeys.FRIEND_PATHS); } + @NotNull + public LanguageVersionSettings getLanguageVersionSettings() { + return CommonConfigurationKeysKt.getLanguageVersionSettings(configuration); + } + public boolean isAtLeast(@NotNull LanguageVersion expected) { LanguageVersion actual = CommonConfigurationKeysKt.getLanguageVersionSettings(configuration).getLanguageVersion(); return actual.getMajor() > expected.getMajor() || @@ -165,7 +169,10 @@ public class JsConfig { Set modules = new HashSet<>(); - boolean skipMetadataVersionCheck = getLanguageVersionSettings(configuration).getFlag(AnalysisFlag.getSkipMetadataVersionCheck()); + boolean skipMetadataVersionCheck = + getLanguageVersionSettings().getFlag( + AnalysisFlag.getSkipMetadataVersionCheck() + ); for (String path : libraries) { if (librariesToSkip != null && librariesToSkip.contains(path)) continue; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java index 702e8611ed5..1f2685423d4 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java @@ -463,7 +463,7 @@ public final class Translation { ) { StaticContext staticContext = new StaticContext(trace, config, moduleDescriptor, sourceFilePathResolver); TranslationContext context = TranslationContext.rootContext(staticContext); - MainFunctionDetector mainFunctionDetector = new MainFunctionDetector(context.bindingContext()); + MainFunctionDetector mainFunctionDetector = new MainFunctionDetector(context.bindingContext(), config.getLanguageVersionSettings()); FunctionDescriptor functionDescriptor = mainFunctionDetector.getMainFunction(moduleDescriptor); if (functionDescriptor == null) { return null; diff --git a/ultimate/build.gradle.kts b/ultimate/build.gradle.kts index e43f40bf328..2a810bb241a 100644 --- a/ultimate/build.gradle.kts +++ b/ultimate/build.gradle.kts @@ -30,6 +30,7 @@ dependencies { compile(project(":compiler:light-classes")) { isTransitive = false } compile(project(":compiler:frontend")) { isTransitive = false } compile(project(":compiler:frontend.java")) { isTransitive = false } + compile(project(":compiler:util")) { isTransitive = false } compile(project(":js:js.frontend")) { isTransitive = false } compile(projectClasses(":idea")) compile(project(":idea:idea-jvm")) { isTransitive = false } diff --git a/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt b/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt index 7308cd4a275..aed6d842e77 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.idea.js.asJsModule import org.jetbrains.kotlin.idea.js.jsProductionOutputFilePath import org.jetbrains.kotlin.idea.nodejs.TestElementPath import org.jetbrains.kotlin.idea.nodejs.getNodeJsEnvironmentVars +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.run.addBuildTask import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction @@ -52,7 +53,7 @@ private class KotlinNodeJsRunConfigurationProducer : val jsFilePath = module.jsProductionOutputFilePath ?: return null val declaration = element.getNonStrictParentOfType() if (declaration is KtNamedFunction) { - val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() } + val detector = MainFunctionDetector(declaration.languageVersionSettings) { it.resolveToDescriptorIfAny() } if (!detector.isMain(declaration, false)) return null } else if (!TestElementPath.isModuleAssociatedDir(element, module)) return null return NodeJsConfigData(element, module, jsFilePath) @@ -81,4 +82,4 @@ private class KotlinNodeJsRunConfigurationProducer : val configData = getConfigurationData(context) ?: return false return configuration.inputPath == configData.jsOutputFilePath } -} \ No newline at end of file +}