From 1ce8ed907c57603e970e7c84a6b4cc5e78f5600e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 10 Nov 2016 11:47:48 +0300 Subject: [PATCH] Use TargetPlatformDetector.getPlatform instead of ProjectStructureUtil.isJsKotlinModule The reason for this is to make the choice of the platform more explicit now that there are more platforms than just JVM and JS (default platform, and also possibly native in the future) --- .../idea/caches/resolve/JsProjectDetector.kt | 14 ++++++++------ .../idea/project/ProjectStructureUtil.java | 7 ------- .../idea/completion/AllClassesCompletion.kt | 5 +++-- .../idea/completion/BasicCompletionSession.kt | 5 +++-- .../idea/completion/CompletionSession.kt | 5 +++-- .../intentions/AddJvmOverloadsIntention.kt | 8 ++++---- .../kotlin/idea/quickfix/ImportFix.kt | 15 +++++++-------- .../changeSignature/KotlinChangeInfo.kt | 5 +++-- .../run/KotlinJUnitRunConfigurationProducer.kt | 7 ++++--- .../idea/run/KotlinRunConfigurationProducer.kt | 5 +++-- .../run/KotlinTestNgConfigurationProducer.java | 7 ++++--- ...ortedAbiVersionNotificationPanelProvider.kt | 18 +++++++++--------- 12 files changed, 51 insertions(+), 50 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsProjectDetector.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsProjectDetector.kt index 0573b2879df..cfe9795dedc 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsProjectDetector.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsProjectDetector.kt @@ -16,18 +16,20 @@ package org.jetbrains.kotlin.idea.caches.resolve -import com.intellij.openapi.project.Project import com.intellij.openapi.module.ModuleManager -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil -import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.CachedValueProvider +import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectRootModificationTracker +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector +import org.jetbrains.kotlin.js.resolve.JsPlatform //TODO: this should go away to support cross-platform projects object JsProjectDetector { - @JvmStatic fun isJsProject(project: Project): Boolean { + @JvmStatic + fun isJsProject(project: Project): Boolean { return CachedValuesManager.getManager(project).getCachedValue(project) { - val result = ModuleManager.getInstance(project).modules.any { ProjectStructureUtil.isJsKotlinModule(it) } + val result = ModuleManager.getInstance(project).modules.any { TargetPlatformDetector.getPlatform(it) == JsPlatform } CachedValueProvider.Result(result, ProjectRootModificationTracker.getInstance(project)) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java index 55acedd407a..0c3dde77a9c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.project; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootModificationTracker; import com.intellij.openapi.roots.libraries.Library; @@ -32,7 +31,6 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.framework.JsLibraryStdDetectionUtil; -import org.jetbrains.kotlin.psi.KtFile; public class ProjectStructureUtil { private static final Key> IS_KOTLIN_JS_MODULE = Key.create("IS_KOTLIN_JS_MODULE"); @@ -40,11 +38,6 @@ public class ProjectStructureUtil { private ProjectStructureUtil() { } - public static boolean isJsKotlinModule(@NotNull KtFile file) { - Module module = ModuleUtilCore.findModuleForPsiElement(file); - return module != null && isJsKotlinModule(module); - } - public static boolean isJsKotlinModule(@NotNull final Module module) { CachedValue result = module.getUserData(IS_KOTLIN_JS_MODULE); if (result == null) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt index 980bb20a75f..b8ce790d5c9 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt @@ -27,12 +27,13 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.core.isJavaClassNotToBeUsedInKotlin -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered @@ -67,7 +68,7 @@ class AllClassesCompletion(private val parameters: CompletionParameters, .forEach { classifierDescriptorCollector(it) } } - if (!ProjectStructureUtil.isJsKotlinModule(parameters.originalFile as KtFile)) { + if (TargetPlatformDetector.getPlatform(parameters.originalFile as KtFile) == JvmPlatform) { addAdaptedJavaCompletion(javaClassCollector) } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index 0a804a33572..92082adf905 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -34,7 +34,7 @@ import org.jetbrains.kotlin.idea.completion.smart.SMART_COMPLETION_ITEM_PRIORITY import org.jetbrains.kotlin.idea.completion.smart.SmartCompletion import org.jetbrains.kotlin.idea.completion.smart.SmartCompletionItemPriority import org.jetbrains.kotlin.idea.core.ExpectedInfo -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.lexer.KtTokens @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter @@ -233,7 +234,7 @@ class BasicCompletionSession( val packageNames = PackageIndexUtil.getSubPackageFqNames(FqName.ROOT, searchScope, project, prefixMatcher.asNameFilter()) .toMutableSet() - if (!ProjectStructureUtil.isJsKotlinModule(parameters.originalFile as KtFile)) { + if (TargetPlatformDetector.getPlatform(parameters.originalFile as KtFile) == JvmPlatform) { JavaPsiFacade.getInstance(project).findPackage("")?.getSubPackages(searchScope)?.forEach { psiPackage -> val name = psiPackage.name if (Name.isValidIdentifier(name!!)) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 82b4c7e9b69..6bf3bc51dcd 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -35,12 +35,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolveScope import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper import org.jetbrains.kotlin.idea.core.* import org.jetbrains.kotlin.idea.imports.importableFqName -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.descriptorUtil.module +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver @@ -79,7 +80,7 @@ abstract class CompletionSession( protected val resolutionFacade = file.getResolutionFacade() protected val moduleDescriptor = resolutionFacade.moduleDescriptor protected val project = position.project - protected val isJvmModule = !ProjectStructureUtil.isJsKotlinModule(parameters.originalFile as KtFile) + protected val isJvmModule = TargetPlatformDetector.getPlatform(parameters.originalFile as KtFile) == JvmPlatform protected val isDebuggerContext = file is KtCodeFragment protected val nameExpression: KtSimpleNameExpression? diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/AddJvmOverloadsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/AddJvmOverloadsIntention.kt index 644877fccce..08100b4a67a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/AddJvmOverloadsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/AddJvmOverloadsIntention.kt @@ -18,13 +18,14 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.openapi.editor.Editor -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.util.addAnnotation import org.jetbrains.kotlin.idea.util.findAnnotation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform private val annotationFqName = FqName("kotlin.jvm.JvmOverloads") @@ -68,7 +69,7 @@ class AddJvmOverloadsIntention : SelfTargetingIntention( text = "Add '@JvmOverloads' annotation to $targetName" - return !ProjectStructureUtil.isJsKotlinModule(element.getContainingKtFile()) + return TargetPlatformDetector.getPlatform(element.getContainingKtFile()) == JvmPlatform && parameters.any { it.hasDefaultValue() } && element.findAnnotation(annotationFqName) == null } @@ -84,5 +85,4 @@ class AddJvmOverloadsIntention : SelfTargetingIntention( element.addAnnotation(annotationFqName) } } - -} \ No newline at end of file +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index b17c600cc51..9f226e5268d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -51,11 +51,12 @@ import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* @@ -69,6 +70,7 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.callUtil.getParentCall import org.jetbrains.kotlin.resolve.calls.context.ContextDependency import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.ExplicitImportsScope import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope @@ -77,7 +79,6 @@ import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.CachedValueProperty import org.jetbrains.kotlin.utils.addToStdlib.singletonList import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList -import java.lang.IllegalStateException import java.util.* /** @@ -242,11 +243,9 @@ internal abstract class OrdinaryImportFixBase(expression: T, f if (!expression.isImportDirectiveExpression() && !isSelectorInQualified(expression)) { val filterByCallType = { descriptor: DeclarationDescriptor -> callTypeAndReceiver.callType.descriptorKindFilter.accepts(descriptor) } - if (ProjectStructureUtil.isJsKotlinModule(expression.getContainingKtFile())) { - indicesHelper.getKotlinClasses({ it == name }, { true }).filterTo(result, filterByCallType) - } - else { - indicesHelper.getJvmClassesByName(name).filterTo(result, filterByCallType) + when (TargetPlatformDetector.getPlatform(expression.getContainingKtFile())) { + JsPlatform -> indicesHelper.getKotlinClasses({ it == name }, { true }).filterTo(result, filterByCallType) + JvmPlatform -> indicesHelper.getJvmClassesByName(name).filterTo(result, filterByCallType) } indicesHelper.getTopLevelTypeAliases { it == name }.filterTo(result, filterByCallType) @@ -419,7 +418,7 @@ internal class ImportMemberFix(expression: KtSimpleNameExpression) : ImportFixBa processor = processor ) - if (!ProjectStructureUtil.isJsKotlinModule(element.getContainingKtFile())) { + if (TargetPlatformDetector.getPlatform(element.getContainingKtFile()) == JvmPlatform) { indicesHelper.processJvmCallablesByName( name, filter = { it.hasModifierProperty(PsiModifier.STATIC) }, diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt index 3a84b8d778d..95aad01d51d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt @@ -36,7 +36,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.caches.resolve.getJavaOrKotlinMemberDescriptor -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor.Kind import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmOverloadsAnnotation +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList import org.jetbrains.kotlin.utils.keysToMap @@ -479,7 +480,7 @@ open class KotlinChangeInfo( return createJavaChangeInfo(originalPsiMethod, currentPsiMethod, newName, PsiType.VOID, newJavaParameters.toTypedArray()) } - if (ProjectStructureUtil.isJsKotlinModule(method.containingFile as KtFile)) return null + if (TargetPlatformDetector.getPlatform(method.containingFile as KtFile) != JvmPlatform) return null if (javaChangeInfos == null) { val method = method diff --git a/idea/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt b/idea/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt index aae8d6c75f9..290bac0929b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt @@ -29,13 +29,14 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer(JUnitConfigurationType.getInstance()) { override fun shouldReplace(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean { @@ -89,9 +90,9 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer(JetRunConfigurationType.getInstance()) { @@ -57,7 +58,7 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer> { - val badRoots = - if (!isJsKotlinModule(module)) - getLibraryRootsWithAbiIncompatibleKotlinClasses(module) - else - getLibraryRootsWithAbiIncompatibleForKotlinJs(module) + val badRoots = when (TargetPlatformDetector.getPlatform(module)) { + JvmPlatform -> getLibraryRootsWithAbiIncompatibleKotlinClasses(module) + JsPlatform -> getLibraryRootsWithAbiIncompatibleForKotlinJs(module) + else -> return emptyList() + } - if (badRoots.isEmpty()) return emptyList() - - return badRoots.toHashSet() + return if (badRoots.isEmpty()) emptyList() else badRoots.toHashSet() } } }