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() } } }