Skip to content

Commit da8f404

Browse files
committed
WIP: Use compilation kinds throughout Compiler
1 parent bd86167 commit da8f404

File tree

4 files changed

+52
-47
lines changed

4 files changed

+52
-47
lines changed

server/src/main/kotlin/org/javacs/kt/CompiledFile.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class CompiledFile(
123123
}
124124

125125
val padOffset = " ".repeat(offset)
126-
val recompile = classPath.compiler.createFile(padOffset + surroundingContent, Paths.get(if (isScript) "dummy.virtual.kts" else "dummy.virtual.kt"))
126+
val recompile = classPath.compiler.createFile(padOffset + surroundingContent, Paths.get("dummy.virtual" + if (isScript) ".kts" else ".kt"), kind)
127127
return recompile.findElementAt(cursor)?.findParent<KtElement>()
128128
}
129129

server/src/main/kotlin/org/javacs/kt/Compiler.kt

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -86,38 +86,9 @@ private class CompilationEnvironment(
8686
configuration = KotlinCompilerConfiguration().apply {
8787
put(CommonConfigurationKeys.MODULE_NAME, JvmProtoBufUtil.DEFAULT_MODULE_NAME)
8888
put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, LoggingMessageCollector)
89-
addJvmClasspathRoots(classPath.map { it.toFile() })
90-
// Setup script templates
91-
var scriptDefinitions: List<ScriptDefinition> = listOf()
92-
93-
if (classPath.any { GRADLE_DSL_DEPENDENCY_PATTERN.matches(it.fileName.toString()) }) {
94-
LOG.info("Configuring Kotlin DSL script templates...")
95-
96-
val scriptTemplates = listOf(
97-
// "org.gradle.kotlin.dsl.KotlinInitScript",
98-
// "org.gradle.kotlin.dsl.KotlinSettingsScript",
99-
"org.gradle.kotlin.dsl.KotlinBuildScript"
100-
)
101-
102-
try {
103-
// Load template classes
104-
val scriptClassLoader = URLClassLoader(classPath.map { it.toUri().toURL() }.toTypedArray())
105-
val fileClassPath = classPath.map { it.toFile() }
106-
val scriptHostConfig = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {
107-
configurationDependencies(JvmDependency(fileClassPath))
108-
}
109-
scriptDefinitions = scriptTemplates
110-
.map { object : ScriptDefinition.FromLegacy(defaultJvmScriptingHostConfiguration, KotlinScriptDefinition(scriptClassLoader.loadClass(it).kotlin)) {
111-
override val isDefault = true
112-
} }
113-
} catch (e: Exception) {
114-
LOG.error("Error while loading script template classes")
115-
LOG.printStackTrace(e)
116-
}
117-
}
118-
addAll(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinitions)
119-
put(JVMConfigurationKeys.DISABLE_STANDARD_SCRIPT_DEFINITION, true)
12089
add(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, ScriptingCompilerConfigurationComponentRegistrar())
90+
addJvmClasspathRoots(classPath.map { it.toFile() })
91+
// addAll(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinitions)
12192
},
12293
configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES
12394
)
@@ -129,6 +100,39 @@ private class CompilationEnvironment(
129100

130101
parser = KtPsiFactory(project)
131102
scripts = ScriptDefinitionProvider.getInstance(project)!! as CliScriptDefinitionProvider
103+
104+
// Setup script templates
105+
var scriptDefinitions: List<ScriptDefinition> = listOf()
106+
107+
if (classPath.any { GRADLE_DSL_DEPENDENCY_PATTERN.matches(it.fileName.toString()) }) {
108+
LOG.info("Configuring Kotlin DSL script templates...")
109+
110+
val scriptTemplates = listOf(
111+
// "org.gradle.kotlin.dsl.KotlinInitScript",
112+
// "org.gradle.kotlin.dsl.KotlinSettingsScript",
113+
"org.gradle.kotlin.dsl.KotlinBuildScript"
114+
)
115+
116+
try {
117+
// Load template classes
118+
val scriptClassLoader = URLClassLoader(classPath.map { it.toUri().toURL() }.toTypedArray())
119+
val fileClassPath = classPath.map { it.toFile() }
120+
val scriptHostConfig = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {
121+
configurationDependencies(JvmDependency(fileClassPath))
122+
}
123+
scriptDefinitions = scriptTemplates
124+
.map { object : ScriptDefinition.FromLegacy(defaultJvmScriptingHostConfiguration, KotlinScriptDefinition(scriptClassLoader.loadClass(it).kotlin)) {
125+
override val isDefault = true
126+
} }
127+
} catch (e: Exception) {
128+
LOG.error("Error while loading script template classes")
129+
LOG.printStackTrace(e)
130+
}
131+
}
132+
133+
LOG.info("Definitions: ${scriptDefinitions.map { it?.legacyDefinition?.template?.simpleName }}")
134+
scripts.setScriptDefinitions(scriptDefinitions)
135+
LOG.info("Default def: ${scripts.getDefaultDefinition()?.legacyDefinition?.template?.simpleName}")
132136
}
133137

134138
fun updateConfiguration(config: CompilerConfiguration) {
@@ -189,9 +193,6 @@ class Compiler(classPath: Set<Path>, buildScriptClassPath: Set<Path> = emptySet(
189193
private val buildScriptCompileEnvironment = buildScriptClassPath.takeIf { it.isNotEmpty() }?.let(::CompilationEnvironment)
190194
private val compileLock = ReentrantLock() // TODO: Lock at file-level
191195

192-
val psiFileFactory
193-
get() = PsiFileFactory.getInstance(defaultCompileEnvironment.environment.project)
194-
195196
companion object {
196197
init {
197198
setIdeaIoUseFallback()
@@ -211,26 +212,26 @@ class Compiler(classPath: Set<Path>, buildScriptClassPath: Set<Path> = emptySet(
211212
buildScriptCompileEnvironment?.updateConfiguration(config)
212213
}
213214

214-
fun createFile(content: String, file: Path = Paths.get("dummy.virtual.kt")): KtFile {
215+
fun createFile(content: String, file: Path = Paths.get("dummy.virtual.kt"), kind: CompilationKind = CompilationKind.DEFAULT): KtFile {
215216
assert(!content.contains('\r'))
216217

217-
val new = psiFileFactory.createFileFromText(file.toString(), KotlinLanguage.INSTANCE, content, true, false) as KtFile
218+
val new = psiFileFactoryFor(kind).createFileFromText(file.toString(), KotlinLanguage.INSTANCE, content, true, false) as KtFile
218219
assert(new.virtualFile != null)
219220

220221
return new
221222
}
222223

223-
fun createExpression(content: String, file: Path = Paths.get("dummy.virtual.kt")): KtExpression {
224-
val property = parseDeclaration("val x = $content", file) as KtProperty
224+
fun createExpression(content: String, file: Path = Paths.get("dummy.virtual.kt"), kind: CompilationKind = CompilationKind.DEFAULT): KtExpression {
225+
val property = parseDeclaration("val x = $content", file, kind) as KtProperty
225226

226227
return property.initializer!!
227228
}
228229

229-
fun createDeclaration(content: String, file: Path = Paths.get("dummy.virtual.kt")): KtDeclaration =
230-
parseDeclaration(content, file)
230+
fun createDeclaration(content: String, file: Path = Paths.get("dummy.virtual.kt"), kind: CompilationKind = CompilationKind.DEFAULT): KtDeclaration =
231+
parseDeclaration(content, file, kind)
231232

232-
private fun parseDeclaration(content: String, file: Path): KtDeclaration {
233-
val parse = createFile(content, file)
233+
private fun parseDeclaration(content: String, file: Path, kind: CompilationKind = CompilationKind.DEFAULT): KtDeclaration {
234+
val parse = createFile(content, file, kind)
234235
val declarations = parse.declarations
235236

236237
assert(declarations.size == 1) { "${declarations.size} declarations in $content" }
@@ -252,11 +253,14 @@ class Compiler(classPath: Set<Path>, buildScriptClassPath: Set<Path> = emptySet(
252253
CompilationKind.BUILD_SCRIPT -> buildScriptCompileEnvironment ?: defaultCompileEnvironment
253254
}
254255

256+
fun psiFileFactoryFor(kind: CompilationKind): PsiFileFactory =
257+
PsiFileFactory.getInstance(compileEnvironmentFor(kind).environment.project)
258+
255259
fun compileFile(file: KtFile, sourcePath: Collection<KtFile>, kind: CompilationKind = CompilationKind.DEFAULT): Pair<BindingContext, ComponentProvider> =
256-
compileFiles(listOf(file), sourcePath, kind)
260+
compileFiles(listOf(file), sourcePath, kind)
257261

258262
fun compileFiles(files: Collection<KtFile>, sourcePath: Collection<KtFile>, kind: CompilationKind = CompilationKind.DEFAULT): Pair<BindingContext, ComponentProvider> {
259-
files.forEach { LOG.info("$it -> ScriptDefinition: ${it.findScriptDefinition()?.legacyDefinition?.template?.simpleName}") }
263+
files.forEach { LOG.info("$it -> ScriptDefinition: ${it.findScriptDefinition()?.legacyDefinition?.template?.simpleName}, provider: ${(ScriptDefinitionProvider.getInstance(buildScriptCompileEnvironment?.environment?.project!!) as CliScriptDefinitionProvider).getDefaultDefinition()?.legacyDefinition?.template?.simpleName}") }
260264
compileLock.withLock {
261265
val (container, trace) = compileEnvironmentFor(kind).createContainer(sourcePath)
262266
val topDownAnalyzer = container.get<LazyTopDownAnalyzer>()

server/src/main/kotlin/org/javacs/kt/SourcePath.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class SourcePath(
3737

3838
fun parseIfChanged(): SourceFile {
3939
if (content != parsed?.text) {
40-
parsed = cp.compiler.createFile(content, path ?: Paths.get("sourceFile.virtual.kt"))
40+
parsed = cp.compiler.createFile(content, path ?: Paths.get("sourceFile.virtual.kt"), kind)
4141
}
4242

4343
return this

server/src/main/kotlin/org/javacs/kt/j2k/JavaToKotlinConverter.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import org.jetbrains.kotlin.com.intellij.openapi.project.Project
66
// import org.jetbrains.kotlin.j2k.JavaToKotlinTranslator
77
import org.javacs.kt.LOG
88
import org.javacs.kt.Compiler
9+
import org.javacs.kt.CompilationKind
910
import org.javacs.kt.util.nonNull
1011

1112
fun convertJavaToKotlin(javaCode: String, compiler: Compiler): String {
12-
val psiFactory = compiler.psiFileFactory
13+
val psiFactory = compiler.psiFileFactoryFor(CompilationKind.DEFAULT)
1314
val javaAST = psiFactory.createFileFromText("snippet.java", JavaLanguage.INSTANCE, javaCode)
1415
LOG.info("Parsed {} to {}", javaCode, javaAST)
1516

0 commit comments

Comments
 (0)