1
1
package com.pinterest.ktlint.rule.engine.internal
2
2
3
- import com.pinterest.ktlint.rule.engine.api.KtLintRuleEngine
4
- import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
3
+ import com.pinterest.ktlint.rule.engine.core.util.cast
5
4
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
6
5
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
7
6
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
@@ -14,43 +13,32 @@ import org.jetbrains.kotlin.com.intellij.pom.PomModelAspect
14
13
import org.jetbrains.kotlin.com.intellij.pom.PomTransaction
15
14
import org.jetbrains.kotlin.com.intellij.pom.impl.PomTransactionBase
16
15
import org.jetbrains.kotlin.com.intellij.pom.tree.TreeAspect
16
+ import org.jetbrains.kotlin.com.intellij.psi.PsiFile
17
17
import org.jetbrains.kotlin.com.intellij.psi.PsiFileFactory
18
18
import org.jetbrains.kotlin.config.CommonConfigurationKeys
19
19
import org.jetbrains.kotlin.config.CompilerConfiguration
20
+ import org.jetbrains.kotlin.idea.KotlinLanguage
20
21
import sun.reflect.ReflectionFactory
21
- import java.nio.file.Files
22
- import java.nio.file.Path
23
22
import org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger as DiagnosticLogger
24
23
25
- internal class KotlinPsiFileFactoryProvider {
26
- private lateinit var psiFileFactory: PsiFileFactory
24
+ internal object KotlinCompiler {
25
+ private val psiFileFactory = initPsiFileFactory()
27
26
28
- @Synchronized
29
- fun getKotlinPsiFileFactory (ktLintRuleEngine : KtLintRuleEngine ): PsiFileFactory =
30
- if (::psiFileFactory.isInitialized) {
31
- psiFileFactory
32
- } else {
33
- initPsiFileFactory(ktLintRuleEngine).also { psiFileFactory = it }
34
- }
27
+ fun createFileFromText (
28
+ psiFileName : String ,
29
+ normalizedText : String ,
30
+ ): PsiFile = psiFileFactory.createFileFromText(psiFileName, KotlinLanguage .INSTANCE , normalizedText)
35
31
}
36
32
37
33
/* *
38
34
* Initialize Kotlin Lexer.
39
35
*/
40
- internal fun initPsiFileFactory (ktLintRuleEngine : KtLintRuleEngine ): PsiFileFactory {
36
+ private fun initPsiFileFactory (): PsiFileFactory {
41
37
DiagnosticLogger .setFactory(LoggerFactory ::class .java)
42
38
43
- val compilerConfiguration = CompilerConfiguration ()
44
- compilerConfiguration.put(CommonConfigurationKeys .MESSAGE_COLLECTOR_KEY , MessageCollector .NONE )
45
- // Special workaround on JDK 1.8 when KtLint is used from shipped CLI
46
- // to prevent Kotlin compiler initialization error
47
- if (ktLintRuleEngine.isInvokedFromCli && System .getProperty(" java.specification.version" ) == " 1.8" ) {
48
- val extensionPath = extractCompilerExtension()
49
- compilerConfiguration.put(
50
- CLIConfigurationKeys .INTELLIJ_PLUGIN_ROOT ,
51
- extensionPath.toAbsolutePath().toString(),
52
- )
53
- }
39
+ val compilerConfiguration =
40
+ CompilerConfiguration ()
41
+ .apply { put(CommonConfigurationKeys .MESSAGE_COLLECTOR_KEY , MessageCollector .NONE ) }
54
42
55
43
val disposable = Disposer .newDisposable()
56
44
try {
@@ -60,8 +48,9 @@ internal fun initPsiFileFactory(ktLintRuleEngine: KtLintRuleEngine): PsiFileFact
60
48
disposable,
61
49
compilerConfiguration,
62
50
EnvironmentConfigFiles .JVM_CONFIG_FILES ,
63
- ).project as MockProject
64
- project.registerFormatPomModel()
51
+ ).project
52
+ .cast<MockProject >()
53
+ .apply { registerFormatPomModel() }
65
54
66
55
return PsiFileFactory .getInstance(project)
67
56
} finally {
@@ -72,26 +61,6 @@ internal fun initPsiFileFactory(ktLintRuleEngine: KtLintRuleEngine): PsiFileFact
72
61
}
73
62
}
74
63
75
- /* *
76
- * Note: this only works in CLI shadowed jar! 'extensions/compiler.xml' is absent in non-shadowed jar.
77
- */
78
- private fun extractCompilerExtension (): Path {
79
- KtLintRuleEngine ::class .java.getResourceAsStream(" /META-INF/extensions/compiler.xml" ).use { input ->
80
- val tempDir = Files .createTempDirectory(" ktlint" )
81
- tempDir.toFile().deleteOnExit()
82
-
83
- val extensionsDir =
84
- tempDir.resolve(" META-INF/extensions" ).also {
85
- Files .createDirectories(it)
86
- }
87
- extensionsDir.resolve(" compiler.xml" ).toFile().outputStream().buffered().use {
88
- input!! .copyTo(it)
89
- }
90
-
91
- return tempDir
92
- }
93
- }
94
-
95
64
/* *
96
65
* Do not print anything to the stderr when lexer is unable to match input.
97
66
*/
0 commit comments