Refactor KotlinCoreEnvironment, fix warnings
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user