diff options
author | Bradley Smith <smithbradley@google.com> | 2022-05-18 20:00:54 -0700 |
---|---|---|
committer | Bradley Smith <smithbradley@google.com> | 2022-05-23 20:27:42 +0000 |
commit | d396da7b75df3ee0d38caa7157865c92850484a4 (patch) | |
tree | c7b755f913265c14a57230704188a173fb739849 | |
parent | 35704a1bc880deee597e85a8147c513bcc42e9d0 (diff) | |
download | idea-d396da7b75df3ee0d38caa7157865c92850484a4.tar.gz |
Correctly record the number of Gradle projects
We used to use the number of IDE modules to record the number of Gradle
projects when tracking the project structure. This used to be roughly
correct since each Gradle project mapped to a single IDE modules.
As of switching on Module Per Source Set this number became wildly
wrong. This change re-adjusts the number recorded by traversing the
ExternalProject tree that the platform obtains from Gradle. Each
ExternalProject is built from exactly one Gradle project.
Fixes: 233115161
Test: test updated, mannually checked for some larger projects
Change-Id: If9c59c6ed3272a8b32c1eddf13924b775d36093f
3 files changed, 42 insertions, 18 deletions
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java index a039cbe001d..c5cb397cb88 100644 --- a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java +++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java @@ -45,14 +45,14 @@ import com.google.wireless.android.sdk.stats.GradleNativeAndroidModule; import com.google.wireless.android.sdk.stats.GradleNativeAndroidModule.NativeBuildSystemType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import java.util.ArrayList; import java.util.List; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.model.ExternalProject; +import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache; /** * Tracks, using {@link UsageTracker}, the structure of a project. @@ -66,11 +66,13 @@ public class ProjectStructureUsageTracker { myProject = project; } - public void trackProjectStructure() { + public void trackProjectStructure(@NotNull String linkedGradleBuildPath) { ApplicationManager.getApplication().executeOnPooledThread(() -> { - ModuleManager moduleManager = ModuleManager.getInstance(myProject); try { - trackProjectStructure(moduleManager.getModules()); + ExternalProject externalProject = ExternalProjectDataCache.getInstance(myProject).getRootExternalProject(linkedGradleBuildPath); + if (externalProject != null) { + trackProjectStructure(externalProject); + } } catch (Throwable e) { // Any errors in project tracking should not be displayed to the user. @@ -80,7 +82,7 @@ public class ProjectStructureUsageTracker { } @VisibleForTesting - void trackProjectStructure(@NotNull Module[] modules) { + void trackProjectStructure(@NotNull ExternalProject externalProject) { GradleAndroidModel appModel = null; GradleAndroidModel libModel = null; @@ -92,15 +94,23 @@ public class ProjectStructureUsageTracker { for (AndroidFacet facet : ProjectSystemUtil.getAndroidFacets(myProject)) { GradleAndroidModel androidModel = GradleAndroidModel.get(facet); if (androidModel != null) { - if (androidModel.getAndroidProject().getProjectType() == IdeAndroidProjectType.PROJECT_TYPE_LIBRARY) { - libModel = androidModel; - libCount++; - continue; + switch (androidModel.getAndroidProject().getProjectType()) { + case PROJECT_TYPE_LIBRARY: + libModel = androidModel; + libCount++; + break; + case PROJECT_TYPE_APP: + appModel = androidModel; + appCount++; + GradleLibrary gradleLibrary = trackExternalDependenciesInAndroidApp(androidModel); + gradleLibraries.add(gradleLibrary); + break; + case PROJECT_TYPE_ATOM: + case PROJECT_TYPE_DYNAMIC_FEATURE: + case PROJECT_TYPE_FEATURE: + case PROJECT_TYPE_INSTANTAPP: + case PROJECT_TYPE_TEST: } - appModel = androidModel; - appCount++; - GradleLibrary gradleLibrary = trackExternalDependenciesInAndroidApp(androidModel); - gradleLibraries.add(gradleLibrary); } } @@ -119,7 +129,7 @@ public class ProjectStructureUsageTracker { } // @formatter:off - GradleModule gradleModule = GradleModule.newBuilder().setTotalModuleCount(modules.length) + GradleModule gradleModule = GradleModule.newBuilder().setTotalModuleCount(countGradleProjects(externalProject)) .setAppModuleCount(appCount) .setLibModuleCount(libCount) .build(); @@ -217,4 +227,17 @@ public class ProjectStructureUsageTracker { .build(); // @formatter:on } + + private static int countGradleProjects(@NotNull ExternalProject externalProject) { + List<ExternalProject> projects = new ArrayList<>(); + projects.add(externalProject); + int count = 0; + while (!projects.isEmpty()) { + count++; + ExternalProject project = projects.remove(0); + projects.addAll(project.getChildProjects().values()); + } + + return count; + } } diff --git a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt index 5a29d4b997e..7ad14980d83 100644 --- a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt +++ b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt @@ -210,7 +210,9 @@ internal constructor(private val myModuleValidatorFactory: AndroidModuleValidato .checkSettings(project, TimeBasedReminder(project, "memory.settings.postsync", TimeUnit.DAYS.toMillis(1))) } - ProjectStructureUsageTracker(project).trackProjectStructure() + if (projectData != null) { + ProjectStructureUsageTracker(project).trackProjectStructure(projectData.linkedExternalProjectPath) + } SupportedModuleChecker.getInstance().checkForSupportedModules(project) diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java index 037d9168b77..c8164a8bead 100644 --- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java +++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java @@ -21,7 +21,6 @@ import com.android.tools.analytics.LoggedUsage; import com.android.tools.analytics.TestUsageTracker; import com.android.tools.analytics.UsageTracker; import com.android.tools.idea.gradle.plugin.LatestKnownPluginVersionProvider; -import com.android.tools.idea.gradle.project.sync.idea.ModuleUtil; import com.android.tools.idea.gradle.util.GradleVersions; import com.android.tools.idea.stats.AnonymizerUtil; import com.android.tools.idea.testing.AndroidGradleTestCase; @@ -81,7 +80,7 @@ public class ProjectStructureUsageTrackerTest extends AndroidGradleTestCase { .setJarDependencyCount(12) .setAarDependencyCount(49)) .addModules(GradleModule.newBuilder() - .setTotalModuleCount(9) + .setTotalModuleCount(3) .setAppModuleCount(1) .setLibModuleCount(1)) .addAndroidModules(GradleAndroidModule.newBuilder() |