diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt index c9584a612..9315e12d9 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt +++ b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt @@ -348,7 +348,7 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient, override fun executeTasks(vararg tasks: String): CompletableFuture { checkServerStarted() - val message = TaskExecutionMessage(IProject.ROOT_PROJECT_PATH, listOf(*tasks), + val message = TaskExecutionMessage(null, listOf(*tasks), gradleDistributionParams) return performBuildTasks( server!!.executeTasks(message)) diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt index 9591c55d2..7f2301e68 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt @@ -45,9 +45,9 @@ class ProjectTransformer { fun transform(project: IProject): Project? { try { val allProjects = project.getProjects().get() - val selectionResult = project.selectProject(StringParameter(IProject.ROOT_PROJECT_PATH)).get() + val selectionResult = project.selectProject(StringParameter("")).get() check(selectionResult.isSuccessful) { - "Cannot find root project with path '${IProject.ROOT_PROJECT_PATH}'" + "Cannot find root project" } val rootProject = when (project.getType().get()) { diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt index a2eddbe56..3ddb80d87 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt @@ -148,7 +148,11 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : var projectPath = message.projectPath if (projectPath == null) { - projectPath = IProject.ROOT_PROJECT_PATH + projectPath = project.rootProjectPath + } + + checkNotNull(projectPath) { + "Unable to determine root project path" } val project = this.project.run { diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/internal/ProjectImpl.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/internal/ProjectImpl.kt index ae89b306f..dab75f531 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/internal/ProjectImpl.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/internal/ProjectImpl.kt @@ -34,8 +34,11 @@ import java.util.concurrent.CompletableFuture * @author Akash Yadav */ @Suppress("JoinDeclarationAndAssignment") -internal class ProjectImpl(var rootProject: IGradleProject? = null, - var projects: List = emptyList()) : IProject, Serializable { +internal class ProjectImpl( + var rootProject: IGradleProject? = null, + var rootProjectPath: String? = null, + var projects: List = emptyList() +) : IProject, Serializable { private val serialVersionUID = 1L @@ -48,11 +51,14 @@ internal class ProjectImpl(var rootProject: IGradleProject? = null, private val selectedProject: ForwardingProject init { + require((rootProject == null) == (rootProjectPath == null)) { + "rootProject, rootProjectPath: both must be specified or null" + } this.selectedProject = ForwardingProject() } private fun getProject(path: String): IGradleProject? { - return if (IProject.ROOT_PROJECT_PATH == path) rootProject else projects.find { + return if (path.isBlank()) rootProject else projects.find { it.getMetadata().get().projectPath == path } } diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt index 3e937d325..4519bd5a6 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt @@ -49,9 +49,9 @@ class RootModelBuilder(initializationParams: InitializeProjectParams) : val ideaModules = ideaProject.modules val modulePaths = mapOf(*ideaModules.map { it.name to it.gradleProject.path }.toTypedArray()) - val rootModule = ideaModules.find { it.gradleProject.path == IProject.ROOT_PROJECT_PATH } + val rootModule = ideaModules.find { it.gradleProject.parent == null } ?: throw ModelBuilderException( - "No GradleProject model is associated with project path: '${IProject.ROOT_PROJECT_PATH}'") + "Unable to find root project") val rootProjectVersions = getAndroidVersions(rootModule, controller) @@ -68,7 +68,7 @@ class RootModelBuilder(initializationParams: InitializeProjectParams) : ModuleProjectModelBuilderParams(controller, ideaProject, ideaModule, modulePaths)) } - return@action ProjectImpl(rootProject, projects) + return@action ProjectImpl(rootProject, rootModule.gradleProject.path, projects) } finalizeLauncher(executor) diff --git a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt index 20c0ffac0..63da1f48d 100644 --- a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt +++ b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt @@ -118,7 +118,7 @@ class MultiModuleAndroidProjectTest { val isInitialized = server.isServerInitialized().get() assertThat(isInitialized).isTrue() - var selectionResult = project.selectProject(StringParameter(IProject.ROOT_PROJECT_PATH)).get() + var selectionResult = project.selectProject(StringParameter("")).get() assertThat(selectionResult.isSuccessful).isTrue() assertThat(project.getType().get()).isEqualTo(ProjectType.Gradle) diff --git a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProject.kt b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProject.kt index 222217642..343f4b464 100644 --- a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProject.kt +++ b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProject.kt @@ -47,11 +47,6 @@ interface IProject : IProjectQueries { companion object { - /** - * Gradle project path for the root project. - */ - const val ROOT_PROJECT_PATH = ":" - /** * Name that can be used for project whose [BasicProjectMetadata.name] property is null. */ diff --git a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProjectQueries.kt b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProjectQueries.kt index 5ea1ac80e..ec0b203be 100644 --- a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProjectQueries.kt +++ b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/IProjectQueries.kt @@ -50,7 +50,7 @@ interface IProjectQueries { /** * Select the project to work with. This overwrites the existing selection. * - * @param param A [StringParameter] with the project's path as the value. + * @param param A [StringParameter] with the project's path as the value. If the value is an empty string, the root project will be selected. */ @JsonRequest fun selectProject(param: StringParameter): CompletableFuture