Add extension point to recognize library kind

This commit is contained in:
Simon Ogorodnik
2018-09-06 22:29:20 +03:00
committed by Mikhail Glukhikh
parent 08a66b61c2
commit 6b5dcf6ae7
5 changed files with 52 additions and 10 deletions
@@ -5,15 +5,26 @@
package org.jetbrains.kotlin.caches.resolve 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.ResolverForModuleFactory
import org.jetbrains.kotlin.analyzer.common.CommonAnalyzerFacade import org.jetbrains.kotlin.analyzer.common.CommonAnalyzerFacade
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings 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.platform.impl.CommonIdePlatformKind
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment
class CommonPlatformKindResolution : IdePlatformKindResolution { 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 kind get() = CommonIdePlatformKind
override val resolverForModuleFactory: ResolverForModuleFactory override val resolverForModuleFactory: ResolverForModuleFactory
@@ -16,10 +16,12 @@
package org.jetbrains.kotlin.caches.resolve 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.analyzer.ResolverForModuleFactory
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.extensions.ApplicationExtensionDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
import org.jetbrains.kotlin.platform.IdePlatformKind import org.jetbrains.kotlin.platform.IdePlatformKind
@@ -30,6 +32,10 @@ interface IdePlatformKindResolution {
fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns
fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean
val libraryKind: PersistentLibraryKind<*>?
companion object : ApplicationExtensionDescriptor<IdePlatformKindResolution>( companion object : ApplicationExtensionDescriptor<IdePlatformKindResolution>(
"org.jetbrains.kotlin.idePlatformKindResolution", IdePlatformKindResolution::class.java "org.jetbrains.kotlin.idePlatformKindResolution", IdePlatformKindResolution::class.java
) { ) {
@@ -5,15 +5,25 @@
package org.jetbrains.kotlin.caches.resolve 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.ResolverForModuleFactory
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.idea.caches.resolve.JsAnalyzerFacade import org.jetbrains.kotlin.idea.caches.resolve.JsAnalyzerFacade
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings 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.js.resolve.JsPlatform
import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind
class JsPlatformKindResolution : IdePlatformKindResolution { 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 kind get() = JsIdePlatformKind
override val resolverForModuleFactory: ResolverForModuleFactory override val resolverForModuleFactory: ResolverForModuleFactory
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.caches.resolve 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.ResolverForModuleFactory
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
@@ -15,6 +17,13 @@ import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade
class JvmPlatformKindResolution : IdePlatformKindResolution { 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 kind get() = JvmIdePlatformKind
override val resolverForModuleFactory: ResolverForModuleFactory override val resolverForModuleFactory: ResolverForModuleFactory
@@ -24,30 +24,37 @@ import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.util.io.JarUtil import com.intellij.openapi.util.io.JarUtil
import com.intellij.openapi.vfs.* 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.KnownLibraryKindForIndex
import org.jetbrains.kotlin.idea.vfilefinder.getLibraryKindForJar import org.jetbrains.kotlin.idea.vfilefinder.getLibraryKindForJar
import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.js.resolve.JsPlatform
import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment
import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.kotlin.utils.PathUtil
import java.util.jar.Attributes import java.util.jar.Attributes
import java.util.regex.Pattern import java.util.regex.Pattern
interface KotlinLibraryKind interface KotlinLibraryKind {
val compilerPlatform: TargetPlatform
}
object JSLibraryKind : PersistentLibraryKind<DummyLibraryProperties>("kotlin.js"), KotlinLibraryKind { object JSLibraryKind : PersistentLibraryKind<DummyLibraryProperties>("kotlin.js"), KotlinLibraryKind {
override val compilerPlatform: TargetPlatform
get() = JsPlatform
override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!! override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!!
} }
object CommonLibraryKind : PersistentLibraryKind<DummyLibraryProperties>("kotlin.common"), KotlinLibraryKind { object CommonLibraryKind : PersistentLibraryKind<DummyLibraryProperties>("kotlin.common"), KotlinLibraryKind {
override val compilerPlatform: TargetPlatform
get() = TargetPlatform.Common
override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!! override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!!
} }
val PersistentLibraryKind<*>?.platform: TargetPlatform val PersistentLibraryKind<*>?.platform: TargetPlatform
get() = when (this) { get() = when (this) {
JSLibraryKind -> JsPlatform is KotlinLibraryKind -> this.compilerPlatform
CommonLibraryKind -> TargetPlatform.Common
else -> JvmPlatform else -> JvmPlatform
} }
@@ -68,11 +75,10 @@ fun detectLibraryKind(roots: Array<VirtualFile>): PersistentLibraryKind<*>? {
} }
} }
return when (jarFile.extension) { return IdePlatformKindResolution
"js", "kjsm" -> JSLibraryKind .getInstances()
MetadataPackageFragment.METADATA_FILE_EXTENSION -> CommonLibraryKind .firstOrNull { it.isLibraryFileForPlatform(jarFile) }
else -> null ?.libraryKind
}
} }
fun getLibraryJar(roots: Array<VirtualFile>, jarPattern: Pattern): VirtualFile? { fun getLibraryJar(roots: Array<VirtualFile>, jarPattern: Pattern): VirtualFile? {