Skip to content

Commit 9c92fb7

Browse files
committed
(WIP)
1 parent fef8cd0 commit 9c92fb7

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

sonar-kotlin-api/src/main/java/org/sonarsource/kotlin/api/frontend/KotlinCoreEnvironmentTools.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@ import org.jetbrains.kotlin.psi.KtPsiFactory
4343
import org.jetbrains.kotlin.resolve.BindingContext
4444
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
4545
import java.io.File
46+
import java.net.URLClassLoader
4647

4748
class Environment(
4849
val classpath: List<String>,
4950
kotlinLanguageVersion: LanguageVersion,
5051
javaLanguageVersion: JvmTarget = JvmTarget.JVM_1_8,
51-
numberOfThreads: Int? = null
52+
numberOfThreads: Int? = null,
5253
) {
5354
val disposable = Disposer.newDisposable()
5455
val configuration = compilerConfiguration(classpath, kotlinLanguageVersion, javaLanguageVersion, numberOfThreads)
@@ -114,6 +115,9 @@ fun compilerConfiguration(
114115
numberOfThreads: Int?,
115116
): CompilerConfiguration {
116117
val classpathFiles = classpath.map(::File)
118+
119+
println(version(classpathFiles))
120+
117121
val versionSettings = LanguageVersionSettingsImpl(
118122
languageVersion,
119123
ApiVersion.createByLanguageVersion(languageVersion),
@@ -128,3 +132,22 @@ fun compilerConfiguration(
128132
}
129133
}
130134

135+
fun version(classpathFiles: List<File>): String {
136+
class Loader(classpath: List<File>) : URLClassLoader(classpath.map { it.toURI().toURL() }.toTypedArray(), null) {
137+
override fun loadClass(name: String): Class<*> {
138+
if (name.startsWith("java.lang.")) {
139+
return super.loadClass(name)
140+
}
141+
val loadedClass = findLoadedClass(name)
142+
if (loadedClass != null) {
143+
return loadedClass
144+
}
145+
return findClass(name);
146+
}
147+
}
148+
Loader(classpathFiles).use {
149+
// FIXME ClassNotFoundException, NoSuchFieldException
150+
val kotlinVersion = it.loadClass("kotlin.KotlinVersion").getField("CURRENT").get(null)
151+
return kotlinVersion.javaClass.getMethod("toString").invoke(kotlinVersion).toString()
152+
}
153+
}

0 commit comments

Comments
 (0)