diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt index fe0e9b2055c..8a367ab13f1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt @@ -5,15 +5,26 @@ package org.jetbrains.kotlin.caches.resolve +import com.intellij.openapi.roots.libraries.PersistentLibraryKind +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.analyzer.common.CommonAnalyzerFacade import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings +import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind +import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment class CommonPlatformKindResolution : IdePlatformKindResolution { + override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean { + return virtualFile.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION + } + + override val libraryKind: PersistentLibraryKind<*>? + get() = CommonLibraryKind + override val kind get() = CommonIdePlatformKind override val resolverForModuleFactory: ResolverForModuleFactory diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt index b78a8b7d842..27a59c96e65 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt @@ -16,10 +16,12 @@ package org.jetbrains.kotlin.caches.resolve -import org.jetbrains.kotlin.extensions.ApplicationExtensionDescriptor +import com.intellij.openapi.roots.libraries.PersistentLibraryKind +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.context.ProjectContext +import org.jetbrains.kotlin.extensions.ApplicationExtensionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings import org.jetbrains.kotlin.platform.IdePlatformKind @@ -30,6 +32,10 @@ interface IdePlatformKindResolution { fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns + fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean + + val libraryKind: PersistentLibraryKind<*>? + companion object : ApplicationExtensionDescriptor( "org.jetbrains.kotlin.idePlatformKindResolution", IdePlatformKindResolution::class.java ) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt index 6fa4d0340a9..21449a63858 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt @@ -5,15 +5,25 @@ package org.jetbrains.kotlin.caches.resolve +import com.intellij.openapi.roots.libraries.PersistentLibraryKind +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.idea.caches.resolve.JsAnalyzerFacade import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings +import org.jetbrains.kotlin.idea.framework.JSLibraryKind import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind class JsPlatformKindResolution : IdePlatformKindResolution { + override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean { + return virtualFile.extension == "js" || virtualFile.extension == "kjsm" + } + + override val libraryKind: PersistentLibraryKind<*>? + get() = JSLibraryKind + override val kind get() = JsIdePlatformKind override val resolverForModuleFactory: ResolverForModuleFactory diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JvmPlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JvmPlatformKindResolution.kt index bec8d6b51a5..f1868fe7318 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JvmPlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JvmPlatformKindResolution.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.caches.resolve +import com.intellij.openapi.roots.libraries.PersistentLibraryKind +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -15,6 +17,13 @@ import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade class JvmPlatformKindResolution : IdePlatformKindResolution { + override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean { + return false // TODO: No library kind for JVM + } + + override val libraryKind: PersistentLibraryKind<*>? + get() = null + override val kind get() = JvmIdePlatformKind override val resolverForModuleFactory: ResolverForModuleFactory diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt index 4fc47a97b92..1662d1955d4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt @@ -24,30 +24,37 @@ import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.util.io.JarUtil import com.intellij.openapi.vfs.* +import org.jetbrains.kotlin.caches.resolve.IdePlatformKindResolution import org.jetbrains.kotlin.idea.vfilefinder.KnownLibraryKindForIndex import org.jetbrains.kotlin.idea.vfilefinder.getLibraryKindForJar import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform -import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment import org.jetbrains.kotlin.utils.PathUtil import java.util.jar.Attributes import java.util.regex.Pattern -interface KotlinLibraryKind +interface KotlinLibraryKind { + val compilerPlatform: TargetPlatform +} object JSLibraryKind : PersistentLibraryKind("kotlin.js"), KotlinLibraryKind { + override val compilerPlatform: TargetPlatform + get() = JsPlatform + override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!! } object CommonLibraryKind : PersistentLibraryKind("kotlin.common"), KotlinLibraryKind { + override val compilerPlatform: TargetPlatform + get() = TargetPlatform.Common + override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!! } val PersistentLibraryKind<*>?.platform: TargetPlatform get() = when (this) { - JSLibraryKind -> JsPlatform - CommonLibraryKind -> TargetPlatform.Common + is KotlinLibraryKind -> this.compilerPlatform else -> JvmPlatform } @@ -68,11 +75,10 @@ fun detectLibraryKind(roots: Array): PersistentLibraryKind<*>? { } } - return when (jarFile.extension) { - "js", "kjsm" -> JSLibraryKind - MetadataPackageFragment.METADATA_FILE_EXTENSION -> CommonLibraryKind - else -> null - } + return IdePlatformKindResolution + .getInstances() + .firstOrNull { it.isLibraryFileForPlatform(jarFile) } + ?.libraryKind } fun getLibraryJar(roots: Array, jarPattern: Pattern): VirtualFile? {