@@ -82,49 +82,40 @@ class InstrumentationNamingPlugin : Plugin<Project> {
8282 ): List <NamingViolation > {
8383 val violations = mutableListOf<NamingViolation >()
8484
85- // Get all subdirectories in the instrumentations directory
86- instrumentationsDir.listFiles { file -> file.isDirectory }?.forEach parentLoop@{ parentDir ->
87- val parentName = parentDir.name
85+ fun hasBuildFile ( dir : File ): Boolean = dir.listFiles()?.any {
86+ it.name == " build.gradle " || it.name == " build.gradle.kts "
87+ } ? : false
8888
89- // Skip build directories and other non-instrumentation directories
90- if (parentName in setOf (" build" , " src" , " .gradle" )) {
91- return @parentLoop
92- }
89+ fun traverseModules (currentDir : File , parentName : String? ) {
90+ currentDir.listFiles { file -> file.isDirectory }?.forEach childLoop@{ childDir ->
91+ val moduleName = childDir.name
9392
94- val hasBuildFile = parentDir.listFiles()?.any {
95- it.name == " build.gradle" || it.name == " build.gradle.kts"
96- } ? : false
97-
98- // Check for subdirectories that are modules
99- val subModules = parentDir.listFiles { file -> file.isDirectory }
100- ?.filter { subDir ->
101- val name = subDir.name
102- // Skip build and other non-module directories
103- name !in setOf (" build" , " src" , " .gradle" ) &&
104- // Check if it has a build file
105- subDir.listFiles()?.any { it.name == " build.gradle" || it.name == " build.gradle.kts" } == true
106- } ? : emptyList()
107-
108- if (subModules.isEmpty()) {
109- // No submodules, this is a leaf module
110- if (hasBuildFile && parentName !in exclusions) {
111- validateLeafModuleName(parentName, parentDir.relativeTo(instrumentationsDir).path, suffixes)?.let {
112- violations.add(it)
113- }
93+ // Skip build directories and other non-instrumentation directories
94+ if (moduleName in setOf (" build" , " src" , " .gradle" )) {
95+ return @childLoop
11496 }
115- } else {
116- // Has submodules, validate each one
117- subModules.forEach { moduleDir ->
118- val moduleName = moduleDir.name
119- if (moduleName !in exclusions) {
120- validateModuleName(moduleName, parentName, moduleDir.relativeTo(instrumentationsDir).path, suffixes)?.let {
121- violations.add(it)
122- }
97+
98+ val childHasBuildFile = hasBuildFile(childDir)
99+ val nestedModules = childDir.listFiles { file -> file.isDirectory }?.filter { hasBuildFile(it) } ? : emptyList()
100+
101+ if (childHasBuildFile && moduleName !in exclusions) {
102+ val relativePath = childDir.relativeTo(instrumentationsDir).path
103+ if (parentName == null && nestedModules.isEmpty()) {
104+ validateLeafModuleName(moduleName, relativePath, suffixes)?.let { violations.add(it) }
105+ } else if (parentName != null ) {
106+ validateModuleName(moduleName, parentName, relativePath, suffixes)?.let { violations.add(it) }
123107 }
124108 }
109+
110+ // Continue traversing to validate deeply nested modules
111+ if (nestedModules.isNotEmpty() || ! childHasBuildFile) {
112+ traverseModules(childDir, moduleName)
113+ }
125114 }
126115 }
127116
117+ traverseModules(instrumentationsDir, null )
118+
128119 return violations
129120 }
130121
0 commit comments