Skip to content

Commit 80f7dda

Browse files
committed
Update gradle script resolver environment:
- JVM options from IDEA config to connect/run daemon with appropriate options (need to be tested) - A lexing function to allow gradle plugin to check whether dependency-defining part of the script is actually changed
1 parent 3b1e749 commit 80f7dda

File tree

1 file changed

+70
-3
lines changed

1 file changed

+70
-3
lines changed

idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616

1717
package org.jetbrains.kotlin.idea.core.script
1818

19+
import com.intellij.execution.configurations.CommandLineTokenizer
1920
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
2021
import com.intellij.openapi.project.Project
2122
import org.gradle.tooling.ProjectConnection
23+
import org.jetbrains.kotlin.lexer.KotlinLexer
24+
import org.jetbrains.kotlin.lexer.KtTokens
2225
import org.jetbrains.kotlin.script.ScriptTemplateProvider
2326
import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper
2427
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings
2528
import java.io.File
29+
import java.util.*
2630

2731
class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
2832

@@ -42,6 +46,15 @@ class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
4246
}
4347
}
4448

49+
private val gradleJvmOptions: List<String> by lazy {
50+
gradleExeSettings?.let { settings ->
51+
CommandLineTokenizer(settings.daemonVmOptions).toList()
52+
.mapNotNull { it?.let { it as? String } }
53+
.filterNot { it.isBlank() }
54+
.distinct()
55+
} ?: emptyList()
56+
}
57+
4558
override val id: String = "Gradle"
4659
override val version: Int = 1
4760
override val isValid: Boolean get() = gradleExeSettings?.gradleHome != null
@@ -54,16 +67,70 @@ class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
5467
?.map { it.canonicalPath }
5568
?: emptyList()
5669
}
57-
override val environment: Map<String, Any?>? by lazy { mapOf(
70+
override val environment: Map<String, Any?>? by lazy {
71+
72+
mapOf(
5873
"gradleHome" to gradleExeSettings?.gradleHome?.let { File(it) },
5974
"projectRoot" to (project.basePath ?: project.baseDir.canonicalPath)?.let { File(it) },
60-
"projectActionExecutor" to { action: (ProjectConnection) -> Unit ->
75+
"gradleWithConnection" to { action: (ProjectConnection) -> Unit ->
6176
GradleExecutionHelper().execute(project.basePath!!, null) { action(it) } },
62-
"gradleJavaHome" to gradleExeSettings?.javaHome)
77+
"gradleJavaHome" to gradleExeSettings?.javaHome,
78+
"gradleJvmOptions" to gradleJvmOptions,
79+
"getScriptSectionTokens" to ::topLevelSectionCodeTextTokens)
6380
}
6481

6582
companion object {
6683
private val depLibsPrefixes = listOf("gradle-script-kotlin", "gradle-core")
6784
}
6885
}
6986

87+
class TopLevelSectionTokensEnumerator(script: CharSequence, identifier: String) : Enumeration<KotlinLexer> {
88+
89+
private val lexer = KotlinLexer().apply {
90+
start(script)
91+
var depth = 0
92+
93+
loop@ while (tokenType != null) {
94+
when (tokenType) {
95+
KtTokens.IDENTIFIER -> if (depth == 0 && tokenText == identifier) {
96+
advance()
97+
skipWhiteSpaceAndComments()
98+
if (tokenType == KtTokens.LBRACE)
99+
break@loop
100+
}
101+
KtTokens.LBRACE -> depth += 1
102+
KtTokens.RBRACE -> depth -= 1
103+
}
104+
advance()
105+
}
106+
}
107+
108+
private var depth = 1
109+
private var finished = false
110+
111+
override fun hasMoreElements(): Boolean = !finished && lexer.tokenType != null
112+
113+
override fun nextElement(): KotlinLexer = lexer.apply {
114+
advance()
115+
when (tokenType) {
116+
KtTokens.LBRACE -> depth += 1
117+
KtTokens.RBRACE -> {
118+
if (depth == 1) {
119+
finished = true
120+
}
121+
depth -= 1
122+
}
123+
}
124+
}
125+
126+
private fun KotlinLexer.skipWhiteSpaceAndComments() {
127+
while (tokenType in KtTokens.WHITE_SPACE_OR_COMMENT_BIT_SET) {
128+
advance()
129+
}
130+
}
131+
}
132+
133+
fun topLevelSectionCodeTextTokens(script: CharSequence, sectionIdentifier: String): Sequence<CharSequence> =
134+
TopLevelSectionTokensEnumerator(script, sectionIdentifier).asSequence()
135+
.filter { it.tokenType !in KtTokens.WHITE_SPACE_OR_COMMENT_BIT_SET }
136+
.map { it.tokenSequence }

0 commit comments

Comments
 (0)