Skip to content

Commit a23507b

Browse files
authored
separation of gradle and maven classes Closes #1616 (#1995)
* separation of gradle and maven classes * separation of gradle and maven classes
1 parent 923a312 commit a23507b

File tree

83 files changed

+2878
-2083
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+2878
-2083
lines changed

.idea/gradle.xml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ dependencies {
6262
implementation(project(":jvm-common"))
6363
implementation(project(":python"))
6464
implementation(project(":rider"))
65+
implementation(project(":gradle-support"))
66+
implementation(project(":maven-support"))
6567

6668
riderDotNetObjects(project(mapOf(
6769
"path" to ":rider",

gradle-support/build.gradle.kts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import common.IdeFlavor
2+
import common.logBuildProfile
3+
import common.platformVersion
4+
5+
plugins {
6+
id("plugin-library")
7+
}
8+
9+
10+
dependencies {
11+
compileOnly(project(":ide-common"))
12+
compileOnly(project(":jvm-common"))
13+
}
14+
15+
//jvm module should always build with IC
16+
val platformType by extra(IdeFlavor.IC.name)
17+
18+
logBuildProfile(project)
19+
20+
intellij {
21+
version.set("$platformType-${project.platformVersion()}")
22+
plugins.set(listOf("com.intellij.java", "org.jetbrains.plugins.gradle"))
23+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package org.digma.intellij.plugin.idea.gradle.execution
2+
3+
import com.intellij.execution.configurations.RunConfigurationBase
4+
import com.intellij.execution.configurations.SimpleProgramParameters
5+
import com.intellij.util.keyFMap.KeyFMap
6+
import org.digma.intellij.plugin.idea.execution.ModuleResolver
7+
import org.jetbrains.plugins.gradle.service.execution.GradleRunConfiguration
8+
import org.jetbrains.plugins.gradle.service.task.GradleTaskManager
9+
10+
class GradleModuleResolver(configuration: RunConfigurationBase<*>, params: SimpleProgramParameters) : ModuleResolver(configuration, params) {
11+
12+
override fun findMainClassName(): String? {
13+
14+
//casting must succeed or we have a bug
15+
val myConfiguration = configuration as GradleRunConfiguration
16+
17+
val mainClass = if (containsGradleTestTask(myConfiguration.settings.taskNames)) {
18+
cleanupName(findClassNameFromTestConfiguration(myConfiguration))
19+
} else {
20+
cleanupName(findClassFromProgramConfiguration(myConfiguration))
21+
}
22+
23+
if (mainClass != null) {
24+
return mainClass
25+
}
26+
27+
//try super as last resort
28+
return super.findMainClassName()
29+
}
30+
31+
32+
private fun findClassNameFromTestConfiguration(configuration: GradleRunConfiguration): String? {
33+
34+
//taskNames is actually the whole gradle command as in 'gradle :test --tests my.package.MyClass.myMethod'
35+
//and could be anything like 'gradle build myOtherTask myProject:test --tests my.package.MyClass.myMethod'
36+
//--tests is argument to the test task and must come after it.
37+
//we want to find the test name after --tests which may be a class or method name
38+
val tasks = configuration.settings.taskNames
39+
val hasTestTask = tasks.any {
40+
it.equals(":test") ||
41+
it.endsWith(":test") ||
42+
it.equals("test")
43+
}
44+
val dashTestsIndex = tasks.indexOf("--tests")
45+
if (hasTestTask && dashTestsIndex > -1 && tasks.size > dashTestsIndex) {
46+
val tests = tasks[dashTestsIndex + 1]
47+
if (tests != null) {
48+
return tests.trim('\"', '\'').trim()
49+
}
50+
}
51+
52+
return null
53+
}
54+
55+
56+
private fun findClassFromProgramConfiguration(configuration: GradleRunConfiguration): String? {
57+
val confMap: KeyFMap = configuration.get()
58+
val gradleScriptContent = confMap.get(GradleTaskManager.INIT_SCRIPT_KEY)
59+
return gradleScriptContent?.let {
60+
findMainClassNameInGradleScript(it)
61+
}
62+
}
63+
64+
65+
private fun findMainClassNameInGradleScript(gradleScript: String): String? {
66+
67+
// search for line like this:
68+
// def mainClassToRun = 'ab.cde.AppMain'
69+
val lines = gradleScript.split("\n", "\r", "\r\n")
70+
71+
val mainClassLine = lines.find { it.contains("mainClassToRun") }
72+
73+
return mainClassLine?.let { line ->
74+
//todo: doesn't look logical
75+
val ixLast = line.lastIndexOf('\'')
76+
if (ixLast > -1) {
77+
val ixFirst = line.lastIndexOf('\'', ixLast - 1)
78+
if (ixFirst > -1) {
79+
line.substring(ixFirst + 1, ixLast)
80+
} else {
81+
null
82+
}
83+
} else {
84+
null
85+
}
86+
}
87+
}
88+
89+
90+
private fun containsGradleTestTask(gradleTasks: Collection<String>): Boolean {
91+
return gradleTasks.any { isGradleTestTask(it) }
92+
}
93+
94+
private fun isGradleTestTask(taskName: String): Boolean =
95+
taskName == ":test" ||
96+
taskName.endsWith(":test") ||
97+
taskName == "test"
98+
99+
100+
private fun cleanupName(className: String?): String? {
101+
return className?.replace('$', '.')
102+
}
103+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package org.digma.intellij.plugin.idea.gradle.execution
2+
3+
import com.intellij.execution.configurations.RunConfigurationBase
4+
import com.intellij.execution.configurations.RunnerSettings
5+
import com.intellij.execution.configurations.SimpleProgramParameters
6+
import org.digma.intellij.plugin.buildsystem.BuildSystem
7+
import org.digma.intellij.plugin.execution.RunConfigurationType
8+
import org.digma.intellij.plugin.idea.execution.ConfigurationCleaner
9+
import org.digma.intellij.plugin.idea.execution.ExternalSystemConfigurationCleaner
10+
import org.digma.intellij.plugin.idea.execution.ExternalSystemJavaToolOptionsMerger
11+
import org.digma.intellij.plugin.idea.execution.JavaToolOptionsMerger
12+
import org.digma.intellij.plugin.idea.execution.ModuleResolver
13+
import org.digma.intellij.plugin.idea.execution.ParametersExtractor
14+
import org.digma.intellij.plugin.idea.execution.services.BaseJvmRunConfigurationInstrumentationService
15+
import org.jetbrains.plugins.gradle.service.execution.GradleRunConfiguration
16+
17+
18+
//don't change to light service because it will register always. we want it to register only if gradle is enabled.
19+
// see org.digma.intellij-with-gradle.xml
20+
@Suppress("LightServiceMigrationCode")
21+
class GradleRunConfigurationService : BaseJvmRunConfigurationInstrumentationService() {
22+
23+
override fun isApplicableFor(configuration: RunConfigurationBase<*>): Boolean {
24+
return isApplicable(configuration, null)
25+
}
26+
27+
override fun isApplicableFor(configuration: RunConfigurationBase<*>, params: SimpleProgramParameters): Boolean {
28+
return isApplicable(configuration, params)
29+
}
30+
31+
private fun isApplicable(configuration: RunConfigurationBase<*>, params: SimpleProgramParameters?): Boolean {
32+
if (configuration is GradleRunConfiguration) {
33+
34+
val taskNames = configuration.settings.taskNames
35+
36+
val isMainMethod = taskNames.any {
37+
it.contains(".main")
38+
}
39+
val hasBootRun = taskNames.any {
40+
it.contains(":bootRun") || it.equals("bootRun")
41+
}
42+
43+
//support for the run task of the java application plugin. https://docs.gradle.org/current/userguide/application_plugin.html
44+
val hasRun = taskNames.any {
45+
it.contains(":run") || it.equals("run")
46+
}
47+
48+
if (isMainMethod || hasBootRun || hasRun || isTest(configuration, params)) {
49+
return true
50+
}
51+
}
52+
53+
return false
54+
}
55+
56+
57+
override fun isTest(configuration: RunConfigurationBase<*>, params: SimpleProgramParameters?): Boolean {
58+
return if (configuration is GradleRunConfiguration) {
59+
val taskNames = configuration.settings.taskNames
60+
taskNames.any {
61+
it.equals(":test") ||
62+
it.endsWith(":test") ||
63+
it.equals("test") ||
64+
it.equals(":bootTestRun") ||
65+
it.endsWith(":bootTestRun") ||
66+
it.equals("bootTestRun")
67+
}
68+
} else {
69+
false
70+
}
71+
}
72+
73+
74+
override fun getConfigurationType(configuration: RunConfigurationBase<*>, params: SimpleProgramParameters): RunConfigurationType {
75+
return if (configuration is GradleRunConfiguration) {
76+
if (isTest(configuration, params)) {
77+
RunConfigurationType.GradleTest
78+
} else {
79+
RunConfigurationType.GradleRun
80+
}
81+
} else {
82+
RunConfigurationType.Unknown
83+
}
84+
}
85+
86+
override fun isHandlingType(configuration: RunConfigurationBase<*>): Boolean {
87+
return configuration is GradleRunConfiguration
88+
}
89+
90+
override fun getTaskNames(configuration: RunConfigurationBase<*>): Set<String> {
91+
if (configuration is GradleRunConfiguration) {
92+
return configuration.settings.taskNames.toSet()
93+
}
94+
return setOf()
95+
}
96+
97+
override fun getBuildSystem(configuration: RunConfigurationBase<*>): BuildSystem {
98+
if (configuration is GradleRunConfiguration) {
99+
return BuildSystem.GRADLE
100+
}
101+
return BuildSystem.INTELLIJ
102+
}
103+
104+
override fun shouldCleanConfigurationAfterStart(configuration: RunConfigurationBase<*>): Boolean {
105+
return true
106+
}
107+
108+
109+
override fun getModuleResolver(
110+
configuration: RunConfigurationBase<*>,
111+
params: SimpleProgramParameters,
112+
runnerSettings: RunnerSettings?
113+
): ModuleResolver {
114+
return GradleModuleResolver(configuration, params)
115+
}
116+
117+
118+
override fun getJavaToolOptionsMerger(
119+
configuration: RunConfigurationBase<*>,
120+
params: SimpleProgramParameters,
121+
parametersExtractor: ParametersExtractor
122+
): JavaToolOptionsMerger {
123+
return ExternalSystemJavaToolOptionsMerger(configuration, params, parametersExtractor)
124+
}
125+
126+
override fun getConfigurationCleaner(configuration: RunConfigurationBase<*>): ConfigurationCleaner {
127+
return ExternalSystemConfigurationCleaner(configuration)
128+
}
129+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.digma.intellij.plugin.idea.gradle.helper
2+
3+
import org.digma.intellij.plugin.buildsystem.BuildSystemHelperService
4+
import org.jetbrains.plugins.gradle.util.GradleConstants
5+
6+
//don't change to light service because it will register always. we want it to register only if gradle is enabled.
7+
// see org.digma.intellij-with-gradle.xml
8+
@Suppress("LightServiceMigrationCode")
9+
class GradleService : BuildSystemHelperService {
10+
11+
override fun isBuildSystem(externalSystemId: String): Boolean {
12+
return GradleConstants.SYSTEM_ID.id.equals(externalSystemId, true)
13+
}
14+
}

ide-common/src/main/kotlin/org/digma/intellij/plugin/analytics/BackendConnectionMonitor.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.intellij.util.messages.MessageBusConnection
1010
* no connection message in the plugin window.
1111
* see also class NoConnectionPanel
1212
*/
13+
//todo: change to application service , and AnalyticsServiceConnectionEvent too
1314
@Service(Service.Level.PROJECT)
1415
class BackendConnectionMonitor(val project: Project) : Disposable, AnalyticsServiceConnectionEvent {
1516

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.digma.intellij.plugin.buildsystem
2+
3+
enum class BuildSystem {
4+
MAVEN,
5+
GRADLE,
6+
INTELLIJ,
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.digma.intellij.plugin.buildsystem
2+
3+
interface BuildSystemHelper {
4+
5+
fun isBuildSystem(externalSystemId: String): Boolean
6+
fun getBuildSystem(externalSystemId: String): BuildSystem?
7+
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.digma.intellij.plugin.buildsystem
2+
3+
interface BuildSystemHelperService {
4+
5+
fun isBuildSystem(externalSystemId: String): Boolean
6+
7+
}

0 commit comments

Comments
 (0)