[Analysis API Standalone] do not force users to provide a project for building KtModule as it's already known

^KT-60884
This commit is contained in:
Ilya Kirillov
2023-08-29 11:10:24 +02:00
committed by Space Team
parent dca4015cba
commit 3f689494ad
9 changed files with 56 additions and 44 deletions
@@ -75,7 +75,7 @@ public class StandaloneAnalysisAPISessionBuilder(
private lateinit var projectStructureProvider: KtStaticProjectStructureProvider
public fun buildKtModuleProvider(init: KtModuleProviderBuilder.() -> Unit) {
projectStructureProvider = buildProjectStructureProvider(init)
projectStructureProvider = buildProjectStructureProvider(kotlinCoreProjectEnvironment, init)
}
@Deprecated(
@@ -87,8 +87,8 @@ public class StandaloneAnalysisAPISessionBuilder(
) {
val project = kotlinCoreProjectEnvironment.project
projectStructureProvider = buildKtModuleProviderByCompilerConfiguration(
kotlinCoreProjectEnvironment,
compilerConfiguration,
project,
getPsiFilesFromPaths(project, getSourceFilePaths(compilerConfiguration)),
)
}
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.analysis.project.structure.builder
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule
import org.jetbrains.kotlin.analysis.project.structure.impl.KtLibraryModuleImpl
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@KtModuleBuilderDsl
public class KtLibraryModuleBuilder : KtBinaryModuleBuilder() {
public class KtLibraryModuleBuilder(
private val kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment
) : KtBinaryModuleBuilder() {
public lateinit var libraryName: String
public var librarySources: KtLibrarySourceModule? = null
@@ -24,7 +27,7 @@ public class KtLibraryModuleBuilder : KtBinaryModuleBuilder() {
directFriendDependencies,
contentScope,
platform,
project,
kotlinCoreProjectEnvironment.project,
binaryRoots,
libraryName,
librarySources,
@@ -33,9 +36,9 @@ public class KtLibraryModuleBuilder : KtBinaryModuleBuilder() {
}
@OptIn(ExperimentalContracts::class)
public inline fun buildKtLibraryModule(init: KtLibraryModuleBuilder.() -> Unit): KtLibraryModule {
public inline fun KtModuleProviderBuilder.buildKtLibraryModule(init: KtLibraryModuleBuilder.() -> Unit): KtLibraryModule {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return KtLibraryModuleBuilder().apply(init).build()
return KtLibraryModuleBuilder(kotlinCoreProjectEnvironment).apply(init).build()
}
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.analysis.project.structure.builder
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule
import org.jetbrains.kotlin.analysis.project.structure.impl.KtLibrarySourceModuleImpl
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@KtModuleBuilderDsl
public class KtLibrarySourceModuleBuilder : KtModuleBuilder() {
public class KtLibrarySourceModuleBuilder(
private val kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment
) : KtModuleBuilder() {
public lateinit var libraryName: String
public lateinit var binaryLibrary: KtLibraryModule
@@ -24,7 +27,7 @@ public class KtLibrarySourceModuleBuilder : KtModuleBuilder() {
directFriendDependencies,
contentScope,
platform,
project,
kotlinCoreProjectEnvironment.project,
libraryName,
binaryLibrary
)
@@ -32,9 +35,9 @@ public class KtLibrarySourceModuleBuilder : KtModuleBuilder() {
}
@OptIn(ExperimentalContracts::class)
public inline fun buildKtLibrarySourceModule(init: KtLibrarySourceModuleBuilder.() -> Unit): KtLibrarySourceModule {
public inline fun KtModuleProviderBuilder.buildKtLibrarySourceModule(init: KtLibrarySourceModuleBuilder.() -> Unit): KtLibrarySourceModule {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return KtLibrarySourceModuleBuilder().apply(init).build()
return KtLibrarySourceModuleBuilder(kotlinCoreProjectEnvironment).apply(init).build()
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.analysis.project.structure.builder
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.platform.TargetPlatform
@@ -30,7 +29,6 @@ public abstract class KtModuleBuilder {
public lateinit var contentScope: GlobalSearchScope
public lateinit var platform: TargetPlatform
public lateinit var project: Project
public abstract fun build(): KtModule
}
@@ -5,17 +5,18 @@
package org.jetbrains.kotlin.analysis.project.structure.builder
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticProjectStructureProvider
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.impl.KtModuleProviderImpl
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import org.jetbrains.kotlin.platform.TargetPlatform
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticProjectStructureProvider
@KtModuleBuilderDsl
public class KtModuleProviderBuilder {
public class KtModuleProviderBuilder(
public val kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment
) {
private val mainModules: MutableList<KtModule> = mutableListOf()
public fun addModule(module: KtModule) {
@@ -23,21 +24,23 @@ public class KtModuleProviderBuilder {
}
public lateinit var platform: TargetPlatform
public lateinit var project: Project
public fun build(): KtStaticProjectStructureProvider {
return KtModuleProviderImpl(
platform,
project,
kotlinCoreProjectEnvironment.project,
mainModules,
)
}
}
@OptIn(ExperimentalContracts::class)
public inline fun buildProjectStructureProvider(init: KtModuleProviderBuilder.() -> Unit): KtStaticProjectStructureProvider {
internal inline fun buildProjectStructureProvider(
kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment,
init: KtModuleProviderBuilder.() -> Unit,
): KtStaticProjectStructureProvider {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return KtModuleProviderBuilder().apply(init).build()
return KtModuleProviderBuilder(kotlinCoreProjectEnvironment).apply(init).build()
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.project.structure.builder
import org.jetbrains.kotlin.analysis.project.structure.KtScriptModule
import org.jetbrains.kotlin.analysis.project.structure.impl.KtScriptModuleImpl
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -17,7 +18,9 @@ import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@KtModuleBuilderDsl
public class KtScriptModuleBuilder : KtModuleBuilder() {
public class KtScriptModuleBuilder(
private val kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment
) : KtModuleBuilder() {
public lateinit var file: KtFile
public var languageVersionSettings: LanguageVersionSettings =
@@ -29,7 +32,7 @@ public class KtScriptModuleBuilder : KtModuleBuilder() {
directDependsOnDependencies,
directFriendDependencies,
platform,
project,
kotlinCoreProjectEnvironment.project,
file,
languageVersionSettings
)
@@ -37,9 +40,9 @@ public class KtScriptModuleBuilder : KtModuleBuilder() {
}
@OptIn(ExperimentalContracts::class)
public inline fun buildKtScriptModule(init: KtScriptModuleBuilder.() -> Unit): KtScriptModule {
public inline fun KtModuleProviderBuilder.buildKtScriptModule(init: KtScriptModuleBuilder.() -> Unit): KtScriptModule {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return KtScriptModuleBuilder().apply(init).build()
return KtScriptModuleBuilder(kotlinCoreProjectEnvironment).apply(init).build()
}
@@ -7,12 +7,15 @@ package org.jetbrains.kotlin.analysis.project.structure.builder
import org.jetbrains.kotlin.analysis.project.structure.KtSdkModule
import org.jetbrains.kotlin.analysis.project.structure.impl.KtSdkModuleImpl
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@KtModuleBuilderDsl
public class KtSdkModuleBuilder : KtBinaryModuleBuilder() {
public class KtSdkModuleBuilder(
private val kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment
) : KtBinaryModuleBuilder() {
public lateinit var sdkName: String
override fun build(): KtSdkModule {
@@ -22,7 +25,7 @@ public class KtSdkModuleBuilder : KtBinaryModuleBuilder() {
directFriendDependencies,
contentScope,
platform,
project,
kotlinCoreProjectEnvironment.project,
binaryRoots,
sdkName
)
@@ -30,9 +33,9 @@ public class KtSdkModuleBuilder : KtBinaryModuleBuilder() {
}
@OptIn(ExperimentalContracts::class)
public inline fun buildKtSdkModule(init: KtSdkModuleBuilder.() -> Unit): KtSdkModule {
public inline fun KtModuleProviderBuilder.buildKtSdkModule(init: KtSdkModuleBuilder.() -> Unit): KtSdkModule {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return KtSdkModuleBuilder().apply(init).build()
return KtSdkModuleBuilder(kotlinCoreProjectEnvironment).apply(init).build()
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.project.structure.builder
import com.intellij.psi.PsiFileSystemItem
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.analysis.project.structure.impl.KtSourceModuleImpl
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -17,7 +18,9 @@ import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@KtModuleBuilderDsl
public class KtSourceModuleBuilder : KtModuleBuilder() {
public class KtSourceModuleBuilder(
private val kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment
) : KtModuleBuilder() {
public lateinit var moduleName: String
public var languageVersionSettings: LanguageVersionSettings =
LanguageVersionSettingsImpl(LanguageVersion.LATEST_STABLE, ApiVersion.LATEST)
@@ -38,7 +41,7 @@ public class KtSourceModuleBuilder : KtModuleBuilder() {
directFriendDependencies,
contentScope,
platform,
project,
kotlinCoreProjectEnvironment.project,
moduleName,
languageVersionSettings,
sourceRoots,
@@ -47,9 +50,9 @@ public class KtSourceModuleBuilder : KtModuleBuilder() {
}
@OptIn(ExperimentalContracts::class)
public inline fun buildKtSourceModule(init: KtSourceModuleBuilder.() -> Unit): KtSourceModule {
public inline fun KtModuleProviderBuilder.buildKtSourceModule(init: KtSourceModuleBuilder.() -> Unit): KtSourceModule {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return KtSourceModuleBuilder().apply(init).build()
return KtSourceModuleBuilder(kotlinCoreProjectEnvironment).apply(init).build()
}
@@ -16,8 +16,10 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.ProjectScope
import com.intellij.util.io.URLUtil
import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticProjectStructureProvider
import org.jetbrains.kotlin.analysis.project.structure.builder.*
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.cli.jvm.config.javaSourceRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
@@ -43,7 +45,6 @@ import org.jetbrains.kotlin.wasm.resolve.WasmJsPlatformAnalyzerServices
import java.io.IOException
import java.nio.file.*
import java.nio.file.attribute.BasicFileAttributes
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticProjectStructureProvider
internal fun TargetPlatform.getAnalyzerServices(): PlatformDependentAnalyzerServices {
return when {
@@ -151,10 +152,10 @@ internal inline fun <reified T : PsiFileSystemItem> getPsiFilesFromPaths(
}
internal fun buildKtModuleProviderByCompilerConfiguration(
kotlinCoreProjectEnvironment: KotlinCoreProjectEnvironment,
compilerConfig: CompilerConfiguration,
project: Project,
ktFiles: List<KtFile>,
): KtStaticProjectStructureProvider = buildProjectStructureProvider {
): KtStaticProjectStructureProvider = buildProjectStructureProvider(kotlinCoreProjectEnvironment) {
val (scriptFiles, ordinaryFiles) = ktFiles.partition { it.isScript() }
val platform = JvmPlatforms.defaultJvmPlatform
@@ -162,9 +163,8 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
val libraryRoots = compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots
addRegularDependency(
buildKtLibraryModule {
contentScope = ProjectScope.getLibrariesScope(project)
contentScope = ProjectScope.getLibrariesScope(kotlinCoreProjectEnvironment.project)
this.platform = platform
this.project = project
binaryRoots = libraryRoots.map { it.toPath() }
libraryName = "Library for $moduleName"
}
@@ -178,9 +178,8 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
}
addRegularDependency(
buildKtSdkModule {
contentScope = GlobalSearchScope.fileScope(project, jdkHomeVirtualFile)
contentScope = GlobalSearchScope.fileScope(kotlinCoreProjectEnvironment.project, jdkHomeVirtualFile)
this.platform = platform
this.project = project
this.binaryRoots = binaryRoots
sdkName = "JDK for $moduleName"
}
@@ -193,7 +192,6 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
for (scriptFile in scriptFiles) {
buildKtScriptModule {
configLanguageVersionSettings?.let { this.languageVersionSettings = it }
this.project = project
this.platform = platform
this.file = scriptFile
@@ -203,16 +201,15 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
buildKtSourceModule {
configLanguageVersionSettings?.let { this.languageVersionSettings = it }
this.project = project
this.platform = platform
this.moduleName = compilerConfig.get(CommonConfigurationKeys.MODULE_NAME) ?: "<no module name provided>"
addModuleDependencies(moduleName)
contentScope = TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, ordinaryFiles)
contentScope = TopDownAnalyzerFacadeForJVM.newModuleSearchScope(kotlinCoreProjectEnvironment.project, ordinaryFiles)
addSourceRoots(
getPsiFilesFromPaths(
project,
kotlinCoreProjectEnvironment.project,
getSourceFilePaths(compilerConfig, includeDirectoryRoot = true)
)
)
@@ -220,5 +217,4 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
this.platform = platform
this.project = project
}