Refactor KotlinCoreEnvironment, fix warnings

This commit is contained in:
Alexander Udalov
2018-06-15 19:26:22 +02:00
parent d2f278b601
commit 51c01c15b8
@@ -115,41 +115,46 @@ import java.io.File
import java.util.zip.ZipFile import java.util.zip.ZipFile
class KotlinCoreEnvironment private constructor( class KotlinCoreEnvironment private constructor(
parentDisposable: Disposable, parentDisposable: Disposable,
applicationEnvironment: JavaCoreApplicationEnvironment, applicationEnvironment: JavaCoreApplicationEnvironment,
initialConfiguration: CompilerConfiguration, initialConfiguration: CompilerConfiguration,
configFiles: EnvironmentConfigFiles configFiles: EnvironmentConfigFiles
) { ) {
private val projectEnvironment: JavaCoreProjectEnvironment = object : KotlinCoreProjectEnvironment(parentDisposable, applicationEnvironment) { private val projectEnvironment: JavaCoreProjectEnvironment =
override fun preregisterServices() { object : KotlinCoreProjectEnvironment(parentDisposable, applicationEnvironment) {
registerProjectExtensionPoints(Extensions.getArea(project)) override fun preregisterServices() {
} registerProjectExtensionPoints(Extensions.getArea(project))
override fun registerJavaPsiFacade() {
with (project) {
registerService(CoreJavaFileManager::class.java, ServiceManager.getService(this, JavaFileManager::class.java) as CoreJavaFileManager)
val traceHolder = CliTraceHolder()
val cliLightClassGenerationSupport = CliLightClassGenerationSupport(traceHolder)
val kotlinAsJavaSupport = CliKotlinAsJavaSupport(this, traceHolder)
registerService(LightClassGenerationSupport::class.java, cliLightClassGenerationSupport)
registerService(CliLightClassGenerationSupport::class.java, cliLightClassGenerationSupport)
registerService(KotlinAsJavaSupport::class.java, kotlinAsJavaSupport)
registerService(CodeAnalyzerInitializer::class.java, traceHolder)
registerService(ExternalAnnotationsManager::class.java, MockExternalAnnotationsManager())
registerService(InferredAnnotationsManager::class.java, MockInferredAnnotationsManager())
val area = Extensions.getArea(this)
area.getExtensionPoint(PsiElementFinder.EP_NAME).registerExtension(JavaElementFinder(this, kotlinAsJavaSupport))
area.getExtensionPoint(PsiElementFinder.EP_NAME).registerExtension(
PsiElementFinderImpl(this, ServiceManager.getService(this, JavaFileManager::class.java)))
} }
super.registerJavaPsiFacade() override fun registerJavaPsiFacade() {
with(project) {
registerService(
CoreJavaFileManager::class.java,
ServiceManager.getService(this, JavaFileManager::class.java) as CoreJavaFileManager
)
val traceHolder = CliTraceHolder()
val cliLightClassGenerationSupport = CliLightClassGenerationSupport(traceHolder)
val kotlinAsJavaSupport = CliKotlinAsJavaSupport(this, traceHolder)
registerService(LightClassGenerationSupport::class.java, cliLightClassGenerationSupport)
registerService(CliLightClassGenerationSupport::class.java, cliLightClassGenerationSupport)
registerService(KotlinAsJavaSupport::class.java, kotlinAsJavaSupport)
registerService(CodeAnalyzerInitializer::class.java, traceHolder)
registerService(ExternalAnnotationsManager::class.java, MockExternalAnnotationsManager())
registerService(InferredAnnotationsManager::class.java, MockInferredAnnotationsManager())
val area = Extensions.getArea(this)
area.getExtensionPoint(PsiElementFinder.EP_NAME).registerExtension(JavaElementFinder(this, kotlinAsJavaSupport))
area.getExtensionPoint(PsiElementFinder.EP_NAME).registerExtension(
PsiElementFinderImpl(this, ServiceManager.getService(this, JavaFileManager::class.java))
)
}
super.registerJavaPsiFacade()
}
} }
}
private val sourceFiles = mutableListOf<KtFile>() private val sourceFiles = mutableListOf<KtFile>()
private val rootsIndex: JvmDependenciesDynamicCompoundIndex private val rootsIndex: JvmDependenciesDynamicCompoundIndex
@@ -162,8 +167,8 @@ class KotlinCoreEnvironment private constructor(
init { init {
PersistentFSConstants::class.java.getDeclaredField("ourMaxIntellisenseFileSize") PersistentFSConstants::class.java.getDeclaredField("ourMaxIntellisenseFileSize")
.apply { isAccessible = true } .apply { isAccessible = true }
.setInt(null, FileUtilRt.LARGE_FOR_CONTENT_LOADING) .setInt(null, FileUtilRt.LARGE_FOR_CONTENT_LOADING)
val project = projectEnvironment.project val project = projectEnvironment.project
@@ -182,41 +187,41 @@ class KotlinCoreEnvironment private constructor(
try { try {
registrar.registerProjectComponents(project, configuration) registrar.registerProjectComponents(project, configuration)
} catch (e: AbstractMethodError) { } catch (e: AbstractMethodError) {
throw IllegalStateException("The provided plugin ${registrar.javaClass.name} is not compatible with this version of compiler", e) throw IllegalStateException(
"The provided plugin ${registrar.javaClass.name} is not compatible with this version of compiler", e
)
} }
} }
project.registerService(DeclarationProviderFactoryService::class.java, CliDeclarationProviderFactoryService(sourceFiles)) project.registerService(DeclarationProviderFactoryService::class.java, CliDeclarationProviderFactoryService(sourceFiles))
project.registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(configFiles == EnvironmentConfigFiles.JVM_CONFIG_FILES))
val isJvm = configFiles == EnvironmentConfigFiles.JVM_CONFIG_FILES
project.registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(isJvm))
registerProjectServicesForCLI(projectEnvironment) registerProjectServicesForCLI(projectEnvironment)
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
registerProjectServices(projectEnvironment, messageCollector) registerProjectServices(projectEnvironment, messageCollector)
CompilerConfigurationExtension.getInstances(project).forEach { for (extension in CompilerConfigurationExtension.getInstances(project)) {
it.updateConfiguration(configuration) extension.updateConfiguration(configuration)
} }
sourceFiles += CompileEnvironmentUtil.getKtFiles(project, getSourceRootsCheckingForDuplicates(), this.configuration, { sourceFiles += CompileEnvironmentUtil.getKtFiles(project, getSourceRootsCheckingForDuplicates(), this.configuration) { message ->
message ->
report(ERROR, message) report(ERROR, message)
}) }
sourceFiles.sortBy { it.virtualFile.path } sourceFiles.sortBy { it.virtualFile.path }
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) as? CliScriptDefinitionProvider val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) as? CliScriptDefinitionProvider
if (scriptDefinitionProvider != null) { if (scriptDefinitionProvider != null) {
scriptDefinitionProvider.setScriptDefinitionsSources( scriptDefinitionProvider.setScriptDefinitionsSources(configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES))
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES) scriptDefinitionProvider.setScriptDefinitions(configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS))
)
scriptDefinitionProvider.setScriptDefinitions(
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS))
ScriptDependenciesProvider.getInstance(project).let { importsProvider -> ScriptDependenciesProvider.getInstance(project).let { importsProvider ->
configuration.addJvmClasspathRoots( configuration.addJvmClasspathRoots(
sourceFiles.mapNotNull(importsProvider::getScriptDependencies) sourceFiles.mapNotNull(importsProvider::getScriptDependencies)
.flatMap { it.classpath } .flatMap { it.classpath }
.distinctBy { it.absolutePath }) .distinctBy { it.absolutePath })
} }
} }
@@ -227,17 +232,17 @@ class KotlinCoreEnvironment private constructor(
}) })
val outputDirectory = val outputDirectory =
configuration.get(JVMConfigurationKeys.MODULES)?.singleOrNull()?.getOutputDirectory() configuration.get(JVMConfigurationKeys.MODULES)?.singleOrNull()?.getOutputDirectory()
?: configuration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY)?.absolutePath ?: configuration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY)?.absolutePath
classpathRootsResolver = ClasspathRootsResolver( classpathRootsResolver = ClasspathRootsResolver(
PsiManager.getInstance(project), PsiManager.getInstance(project),
messageCollector, messageCollector,
configuration.getList(JVMConfigurationKeys.ADDITIONAL_JAVA_MODULES), configuration.getList(JVMConfigurationKeys.ADDITIONAL_JAVA_MODULES),
this::contentRootToVirtualFile, this::contentRootToVirtualFile,
javaModuleFinder, javaModuleFinder,
!configuration.getBoolean(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE), !configuration.getBoolean(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE),
outputDirectory?.let(this::findLocalFile) outputDirectory?.let(this::findLocalFile)
) )
val (initialRoots, javaModules) = val (initialRoots, javaModules) =
@@ -246,9 +251,9 @@ class KotlinCoreEnvironment private constructor(
if (!configuration.getBoolean(JVMConfigurationKeys.SKIP_RUNTIME_VERSION_CHECK) && messageCollector != null) { if (!configuration.getBoolean(JVMConfigurationKeys.SKIP_RUNTIME_VERSION_CHECK) && messageCollector != null) {
JvmRuntimeVersionsConsistencyChecker.checkCompilerClasspathConsistency( JvmRuntimeVersionsConsistencyChecker.checkCompilerClasspathConsistency(
messageCollector, messageCollector,
configuration, configuration,
initialRoots.mapNotNull { (file, type) -> if (type == JavaRoot.RootType.BINARY) file else null } initialRoots.mapNotNull { (file, type) -> if (type == JavaRoot.RootType.BINARY) file else null }
) )
} }
@@ -262,15 +267,15 @@ class KotlinCoreEnvironment private constructor(
} }
(ServiceManager.getService(project, CoreJavaFileManager::class.java) as KotlinCliJavaFileManagerImpl).initialize( (ServiceManager.getService(project, CoreJavaFileManager::class.java) as KotlinCliJavaFileManagerImpl).initialize(
rootsIndex, rootsIndex,
packagePartProviders, packagePartProviders,
SingleJavaFileRootsIndex(singleJavaFileRoots), SingleJavaFileRootsIndex(singleJavaFileRoots),
configuration.getBoolean(JVMConfigurationKeys.USE_FAST_CLASS_FILES_READING) configuration.getBoolean(JVMConfigurationKeys.USE_FAST_CLASS_FILES_READING)
) )
project.registerService( project.registerService(
JavaModuleResolver::class.java, JavaModuleResolver::class.java,
CliJavaModuleResolver(classpathRootsResolver.javaModuleGraph, javaModules, javaModuleFinder.systemModules.toList()) CliJavaModuleResolver(classpathRootsResolver.javaModuleGraph, javaModules, javaModuleFinder.systemModules.toList())
) )
val finderFactory = CliVirtualFileFinderFactory(rootsIndex) val finderFactory = CliVirtualFileFinderFactory(rootsIndex)
@@ -302,18 +307,21 @@ class KotlinCoreEnvironment private constructor(
private val allJavaFiles: List<File> private val allJavaFiles: List<File>
get() = configuration.javaSourceRoots get() = configuration.javaSourceRoots
.mapNotNull(this::findLocalFile) .mapNotNull(this::findLocalFile)
.flatMap { it.javaFiles } .flatMap { it.javaFiles }
.map { File(it.canonicalPath) } .map { File(it.canonicalPath) }
fun registerJavac( fun registerJavac(
javaFiles: List<File> = allJavaFiles, javaFiles: List<File> = allJavaFiles,
kotlinFiles: List<KtFile> = sourceFiles, kotlinFiles: List<KtFile> = sourceFiles,
arguments: Array<String>? = null, arguments: Array<String>? = null,
bootClasspath: List<File>? = null, bootClasspath: List<File>? = null,
sourcePath: List<File>? = null sourcePath: List<File>? = null
): Boolean { ): Boolean {
return JavacWrapperRegistrar.registerJavac(projectEnvironment.project, configuration, javaFiles, kotlinFiles, arguments, bootClasspath, sourcePath, LightClassGenerationSupport.getInstance(project)) return JavacWrapperRegistrar.registerJavac(
projectEnvironment.project, configuration, javaFiles, kotlinFiles, arguments, bootClasspath, sourcePath,
LightClassGenerationSupport.getInstance(project)
)
} }
private val applicationEnvironment: CoreApplicationEnvironment private val applicationEnvironment: CoreApplicationEnvironment
@@ -322,11 +330,11 @@ class KotlinCoreEnvironment private constructor(
val project: Project val project: Project
get() = projectEnvironment.project get() = projectEnvironment.project
internal fun countLinesOfCode(sourceFiles: List<KtFile>): Int = internal fun countLinesOfCode(sourceFiles: List<KtFile>): Int =
sourceFiles.sumBy { sourceFile -> sourceFiles.sumBy { sourceFile ->
val text = sourceFile.text val text = sourceFile.text
StringUtil.getLineBreakCount(text) + (if (StringUtil.endsWithLineBreak(text)) 0 else 1) StringUtil.getLineBreakCount(text) + (if (StringUtil.endsWithLineBreak(text)) 0 else 1)
} }
private fun updateClasspathFromRootsIndex(index: JvmDependenciesIndex) { private fun updateClasspathFromRootsIndex(index: JvmDependenciesIndex) {
index.indexedRoots.forEach { index.indexedRoots.forEach {
@@ -363,7 +371,7 @@ class KotlinCoreEnvironment private constructor(
} }
internal fun findLocalFile(path: String): VirtualFile? = internal fun findLocalFile(path: String): VirtualFile? =
applicationEnvironment.localFileSystem.findFileByPath(path) applicationEnvironment.localFileSystem.findFileByPath(path)
private fun findExistingRoot(root: JvmContentRoot, rootDescription: String): VirtualFile? { private fun findExistingRoot(root: JvmContentRoot, rootDescription: String): VirtualFile? {
return findLocalFile(root.file.absolutePath).also { return findLocalFile(root.file.absolutePath).also {
@@ -374,7 +382,7 @@ class KotlinCoreEnvironment private constructor(
} }
private fun findJarRoot(file: File): VirtualFile? = private fun findJarRoot(file: File): VirtualFile? =
applicationEnvironment.jarFileSystem.findFileByPath("$file${URLUtil.JAR_SEPARATOR}") applicationEnvironment.jarFileSystem.findFileByPath("$file${URLUtil.JAR_SEPARATOR}")
private fun getSourceRootsCheckingForDuplicates(): Collection<String> { private fun getSourceRootsCheckingForDuplicates(): Collection<String> {
val uniqueSourceRoots = linkedSetOf<String>() val uniqueSourceRoots = linkedSetOf<String>()
@@ -405,7 +413,7 @@ class KotlinCoreEnvironment private constructor(
@JvmStatic @JvmStatic
fun createForProduction( fun createForProduction(
parentDisposable: Disposable, configuration: CompilerConfiguration, configFiles: EnvironmentConfigFiles parentDisposable: Disposable, configuration: CompilerConfiguration, configFiles: EnvironmentConfigFiles
): KotlinCoreEnvironment { ): KotlinCoreEnvironment {
setCompatibleBuild() setCompatibleBuild()
// If not disabled explicitly, we should always support at least the standard script definition // If not disabled explicitly, we should always support at least the standard script definition
@@ -421,7 +429,7 @@ class KotlinCoreEnvironment private constructor(
// JPS may run many instances of the compiler in parallel (there's an option for compiling independent modules in parallel in IntelliJ) // JPS may run many instances of the compiler in parallel (there's an option for compiling independent modules in parallel in IntelliJ)
// All projects share the same ApplicationEnvironment, and when the last project is disposed, the ApplicationEnvironment is disposed as well // All projects share the same ApplicationEnvironment, and when the last project is disposed, the ApplicationEnvironment is disposed as well
Disposer.register(parentDisposable, Disposable { Disposer.register(parentDisposable, Disposable {
synchronized (APPLICATION_LOCK) { synchronized(APPLICATION_LOCK) {
if (--ourProjectCount <= 0) { if (--ourProjectCount <= 0) {
disposeApplicationEnvironment() disposeApplicationEnvironment()
} }
@@ -430,7 +438,7 @@ class KotlinCoreEnvironment private constructor(
} }
val environment = KotlinCoreEnvironment(parentDisposable, appEnv, configuration, configFiles) val environment = KotlinCoreEnvironment(parentDisposable, appEnv, configuration, configFiles)
synchronized (APPLICATION_LOCK) { synchronized(APPLICATION_LOCK) {
ourProjectCount++ ourProjectCount++
} }
return environment return environment
@@ -447,7 +455,7 @@ class KotlinCoreEnvironment private constructor(
@TestOnly @TestOnly
@JvmStatic @JvmStatic
fun createForTests( fun createForTests(
parentDisposable: Disposable, initialConfiguration: CompilerConfiguration, extensionConfigs: EnvironmentConfigFiles parentDisposable: Disposable, initialConfiguration: CompilerConfiguration, extensionConfigs: EnvironmentConfigFiles
): KotlinCoreEnvironment { ): KotlinCoreEnvironment {
val configuration = initialConfiguration.copy() val configuration = initialConfiguration.copy()
// in tests we assume that standard definition should only be added if no other explicit defs are already added // in tests we assume that standard definition should only be added if no other explicit defs are already added
@@ -458,10 +466,10 @@ class KotlinCoreEnvironment private constructor(
} }
// Tests are supposed to create a single project and dispose it right after use // Tests are supposed to create a single project and dispose it right after use
return KotlinCoreEnvironment( return KotlinCoreEnvironment(
parentDisposable, parentDisposable,
createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true), createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true),
configuration, configuration,
extensionConfigs extensionConfigs
) )
} }
@@ -469,7 +477,7 @@ class KotlinCoreEnvironment private constructor(
val applicationEnvironment: JavaCoreApplicationEnvironment? get() = ourApplicationEnvironment val applicationEnvironment: JavaCoreApplicationEnvironment? get() = ourApplicationEnvironment
private fun getOrCreateApplicationEnvironmentForProduction(configuration: CompilerConfiguration): JavaCoreApplicationEnvironment { private fun getOrCreateApplicationEnvironmentForProduction(configuration: CompilerConfiguration): JavaCoreApplicationEnvironment {
synchronized (APPLICATION_LOCK) { synchronized(APPLICATION_LOCK) {
if (ourApplicationEnvironment != null) if (ourApplicationEnvironment != null)
return ourApplicationEnvironment!! return ourApplicationEnvironment!!
@@ -477,7 +485,7 @@ class KotlinCoreEnvironment private constructor(
ourApplicationEnvironment = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = false) ourApplicationEnvironment = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = false)
ourProjectCount = 0 ourProjectCount = 0
Disposer.register(parentDisposable, Disposable { Disposer.register(parentDisposable, Disposable {
synchronized (APPLICATION_LOCK) { synchronized(APPLICATION_LOCK) {
ourApplicationEnvironment = null ourApplicationEnvironment = null
} }
}) })
@@ -486,7 +494,7 @@ class KotlinCoreEnvironment private constructor(
} }
private fun disposeApplicationEnvironment() { private fun disposeApplicationEnvironment() {
synchronized (APPLICATION_LOCK) { synchronized(APPLICATION_LOCK) {
val environment = ourApplicationEnvironment ?: return val environment = ourApplicationEnvironment ?: return
ourApplicationEnvironment = null ourApplicationEnvironment = null
Disposer.dispose(environment.parentDisposable) Disposer.dispose(environment.parentDisposable)
@@ -495,9 +503,7 @@ class KotlinCoreEnvironment private constructor(
} }
private fun createApplicationEnvironment( private fun createApplicationEnvironment(
parentDisposable: Disposable, parentDisposable: Disposable, configuration: CompilerConfiguration, unitTestMode: Boolean
configuration: CompilerConfiguration,
unitTestMode: Boolean
): JavaCoreApplicationEnvironment { ): JavaCoreApplicationEnvironment {
Extensions.cleanRootArea(parentDisposable) Extensions.cleanRootArea(parentDisposable)
registerAppExtensionPoints() registerAppExtensionPoints()
@@ -514,43 +520,47 @@ class KotlinCoreEnvironment private constructor(
} }
private fun registerAppExtensionPoints() { private fun registerAppExtensionPoints() {
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), BinaryFileStubBuilders.EP_NAME, FileTypeExtensionPoint::class.java) val area = Extensions.getRootArea()
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), FileContextProvider.EP_NAME, FileContextProvider::class.java)
// CoreApplicationEnvironment.registerExtensionPoint(area, BinaryFileStubBuilders.EP_NAME, FileTypeExtensionPoint::class.java)
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), MetaDataContributor.EP_NAME, MetaDataContributor::class.java) CoreApplicationEnvironment.registerExtensionPoint(area, FileContextProvider.EP_NAME, FileContextProvider::class.java)
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), PsiAugmentProvider.EP_NAME, PsiAugmentProvider::class.java)
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), JavaMainMethodProvider.EP_NAME, JavaMainMethodProvider::class.java) CoreApplicationEnvironment.registerExtensionPoint(area, MetaDataContributor.EP_NAME, MetaDataContributor::class.java)
// CoreApplicationEnvironment.registerExtensionPoint(area, PsiAugmentProvider.EP_NAME, PsiAugmentProvider::class.java)
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ContainerProvider.EP_NAME, ContainerProvider::class.java) CoreApplicationEnvironment.registerExtensionPoint(area, JavaMainMethodProvider.EP_NAME, JavaMainMethodProvider::class.java)
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ClassFileDecompilers.EP_NAME, ClassFileDecompilers.Decompiler::class.java)
// CoreApplicationEnvironment.registerExtensionPoint(area, ContainerProvider.EP_NAME, ContainerProvider::class.java)
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), TypeAnnotationModifier.EP_NAME, TypeAnnotationModifier::class.java) CoreApplicationEnvironment.registerExtensionPoint(
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), MetaLanguage.EP_NAME, MetaLanguage::class.java) area, ClassFileDecompilers.EP_NAME, ClassFileDecompilers.Decompiler::class.java
// )
IdeaExtensionPoints.registerVersionSpecificAppExtensionPoints(Extensions.getRootArea())
CoreApplicationEnvironment.registerExtensionPoint(area, TypeAnnotationModifier.EP_NAME, TypeAnnotationModifier::class.java)
CoreApplicationEnvironment.registerExtensionPoint(area, MetaLanguage.EP_NAME, MetaLanguage::class.java)
IdeaExtensionPoints.registerVersionSpecificAppExtensionPoints(area)
} }
private fun registerApplicationExtensionPointsAndExtensionsFrom(configuration: CompilerConfiguration, configFilePath: String) { private fun registerApplicationExtensionPointsAndExtensionsFrom(configuration: CompilerConfiguration, configFilePath: String) {
fun File.hasConfigFile(configFile: String): Boolean = fun File.hasConfigFile(configFile: String): Boolean =
if (isDirectory) File(this, "META-INF" + File.separator + configFile).exists() if (isDirectory) File(this, "META-INF" + File.separator + configFile).exists()
else try { else try {
ZipFile(this).use { ZipFile(this).use {
it.getEntry("META-INF/" + configFile) != null it.getEntry("META-INF/$configFile") != null
}
}
catch (e: Throwable) {
false
} }
} catch (e: Throwable) {
false
}
val pluginRoot = val pluginRoot =
configuration.get(CLIConfigurationKeys.INTELLIJ_PLUGIN_ROOT)?.let(::File) configuration.get(CLIConfigurationKeys.INTELLIJ_PLUGIN_ROOT)?.let(::File)
?: configuration.get(CLIConfigurationKeys.COMPILER_JAR_LOCATOR)?.compilerJar ?: configuration.get(CLIConfigurationKeys.COMPILER_JAR_LOCATOR)?.compilerJar
?: PathUtil.getResourcePathForClass(this::class.java).takeIf { it.hasConfigFile(configFilePath) } ?: PathUtil.getResourcePathForClass(this::class.java).takeIf { it.hasConfigFile(configFilePath) }
// hack for load extensions when compiler run directly from project directory (e.g. in tests) // hack for load extensions when compiler run directly from project directory (e.g. in tests)
?: File("idea/src").takeIf { it.hasConfigFile(configFilePath) } ?: File("idea/src").takeIf { it.hasConfigFile(configFilePath) }
?: throw IllegalStateException( ?: throw IllegalStateException(
"Unable to find extension point configuration $configFilePath " + "Unable to find extension point configuration $configFilePath " +
"(cp:\n ${(Thread.currentThread().contextClassLoader as? UrlClassLoader)?.urls?.joinToString("\n ") { it.file }})") "(cp:\n ${(Thread.currentThread().contextClassLoader as? UrlClassLoader)?.urls?.joinToString("\n ") { it.file }})"
)
CoreApplicationEnvironment.registerExtensionPointAndExtensions(pluginRoot, configFilePath, Extensions.getRootArea()) CoreApplicationEnvironment.registerExtensionPointAndExtensions(pluginRoot, configFilePath, Extensions.getRootArea())
} }
@@ -562,7 +572,7 @@ class KotlinCoreEnvironment private constructor(
} }
// made public for Upsource // made public for Upsource
@Suppress("MemberVisibilityCanPrivate") @Suppress("MemberVisibilityCanBePrivate")
@JvmStatic @JvmStatic
fun registerApplicationServices(applicationEnvironment: JavaCoreApplicationEnvironment) { fun registerApplicationServices(applicationEnvironment: JavaCoreApplicationEnvironment) {
with(applicationEnvironment) { with(applicationEnvironment) {
@@ -576,7 +586,9 @@ class KotlinCoreEnvironment private constructor(
} }
private fun registerProjectExtensionPoints(area: ExtensionsArea) { private fun registerProjectExtensionPoints(area: ExtensionsArea) {
CoreApplicationEnvironment.registerExtensionPoint(area, PsiTreeChangePreprocessor.EP_NAME, PsiTreeChangePreprocessor::class.java) CoreApplicationEnvironment.registerExtensionPoint(
area, PsiTreeChangePreprocessor.EP_NAME, PsiTreeChangePreprocessor::class.java
)
CoreApplicationEnvironment.registerExtensionPoint(area, PsiElementFinder.EP_NAME, PsiElementFinder::class.java) CoreApplicationEnvironment.registerExtensionPoint(area, PsiElementFinder.EP_NAME, PsiElementFinder::class.java)
IdeaExtensionPoints.registerVersionSpecificProjectExtensionPoints(area) IdeaExtensionPoints.registerVersionSpecificProjectExtensionPoints(area)
@@ -585,10 +597,13 @@ class KotlinCoreEnvironment private constructor(
// made public for Upsource // made public for Upsource
@JvmStatic @JvmStatic
fun registerProjectServices(projectEnvironment: JavaCoreProjectEnvironment, messageCollector: MessageCollector?) { fun registerProjectServices(projectEnvironment: JavaCoreProjectEnvironment, messageCollector: MessageCollector?) {
with (projectEnvironment.project) { with(projectEnvironment.project) {
val scriptDefinitionProvider = CliScriptDefinitionProvider() val scriptDefinitionProvider = CliScriptDefinitionProvider()
registerService(ScriptDefinitionProvider::class.java, scriptDefinitionProvider) registerService(ScriptDefinitionProvider::class.java, scriptDefinitionProvider)
registerService(ScriptDependenciesProvider::class.java, CliScriptDependenciesProvider(projectEnvironment.project, scriptDefinitionProvider)) registerService(
ScriptDependenciesProvider::class.java,
CliScriptDependenciesProvider(projectEnvironment.project, scriptDefinitionProvider)
)
registerService(KotlinJavaPsiFacade::class.java, KotlinJavaPsiFacade(this)) registerService(KotlinJavaPsiFacade::class.java, KotlinJavaPsiFacade(this))
registerService(KtLightClassForFacade.FacadeStubCache::class.java, KtLightClassForFacade.FacadeStubCache(this)) registerService(KtLightClassForFacade.FacadeStubCache::class.java, KtLightClassForFacade.FacadeStubCache(this))
registerService(ModuleAnnotationsResolver::class.java, CliModuleAnnotationsResolver()) registerService(ModuleAnnotationsResolver::class.java, CliModuleAnnotationsResolver())
@@ -603,7 +618,6 @@ class KotlinCoreEnvironment private constructor(
* Note that Kapt may restart code analysis process, and CLI services should be aware of that. * Note that Kapt may restart code analysis process, and CLI services should be aware of that.
* Use PsiManager.getModificationTracker() to ensure that all the data you cached is still valid. * Use PsiManager.getModificationTracker() to ensure that all the data you cached is still valid.
*/ */
} }
private fun CompilerConfiguration.setupJdkClasspathRoots(configFiles: EnvironmentConfigFiles) { private fun CompilerConfiguration.setupJdkClasspathRoots(configFiles: EnvironmentConfigFiles) {
@@ -618,8 +632,7 @@ class KotlinCoreEnvironment private constructor(
put(JVMConfigurationKeys.JDK_HOME, javaHome) put(JVMConfigurationKeys.JDK_HOME, javaHome)
javaHome to PathUtil.getJdkClassesRootsFromCurrentJre() javaHome to PathUtil.getJdkClassesRootsFromCurrentJre()
} } else {
else {
jdkHome to PathUtil.getJdkClassesRoots(jdkHome) jdkHome to PathUtil.getJdkClassesRoots(jdkHome)
} }
@@ -627,12 +640,10 @@ class KotlinCoreEnvironment private constructor(
if (classesRoots.isEmpty()) { if (classesRoots.isEmpty()) {
val messageCollector = get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) val messageCollector = get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
messageCollector?.report(ERROR, "No class roots are found in the JDK path: $javaRoot") messageCollector?.report(ERROR, "No class roots are found in the JDK path: $javaRoot")
} } else {
else {
addJvmSdkRoots(classesRoots) addJvmSdkRoots(classesRoots)
} }
} }
} }
} }
} }