Skip to content

Commit 23a0b37

Browse files
refactor: make similar code more similar. Add comments.
1 parent eebc4d1 commit 23a0b37

File tree

4 files changed

+37
-27
lines changed

4 files changed

+37
-27
lines changed

src/main/kotlin/com/autonomousapps/internal/analyzer/AndroidSources.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,16 @@ internal open class DefaultAndroidSources(
8282
?: project.provider { emptyList() }
8383
}
8484

85+
// nb: android res is a superset of layouts. This means layouts will get parsed twice. This is currently simpler than
86+
// rewriting a bunch of code (the two parsers look for different things).
8587
override fun getAndroidRes(): Provider<Iterable<File>> {
8688
// https://github.com/autonomousapps/dependency-analysis-gradle-plugin/issues/1112
8789
// https://issuetracker.google.com/issues/325307775
8890
return try {
8991
sources.res?.all
9092
?.map { layers -> layers.flatten() }
9193
?.map { directories ->
94+
// Sometimes there's weird nonsense in the layout directories
9295
directories.map { directory -> directory.asFileTree.matching(Language.filterOf(Language.XML)) }
9396
}
9497
?.map { trees -> trees.flatten() }
@@ -105,13 +108,14 @@ internal open class DefaultAndroidSources(
105108
sources.res?.all
106109
?.map { layers -> layers.flatten() }
107110
?.map { directories -> directories.map { directory -> directory.asFileTree } }
108-
?.map { fileTrees ->
109-
fileTrees.map { fileTree ->
110-
fileTree.matching {
111+
?.map { trees ->
112+
trees.map { tree ->
113+
tree.matching {
111114
include("**/layout/**/*.xml")
112115
}
113-
}.flatten()
116+
}
114117
}
118+
?.map { trees -> trees.flatten() }
115119
?: project.provider { emptyList() }
116120
} catch (_: Exception) {
117121
project.provider { emptyList() }

src/main/kotlin/com/autonomousapps/internal/parse/explodeAndroidResSource.kt

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import java.io.File
2020

2121
internal class AndroidLayoutParser(
2222
private val projectDir: File,
23-
private val layouts: Set<File>,
23+
private val layouts: Iterable<File>,
2424
) {
2525

2626
val explodedLayouts: Set<ExplodedLayout> = parseLayouts()
@@ -31,7 +31,8 @@ internal class AndroidLayoutParser(
3131
layoutFile to buildDocument(layoutFile).getElementsByTagName("*")
3232
.map { it.nodeName }
3333
.filterToOrderedSet { JAVA_FQCN_REGEX_DOTTY.matches(it) }
34-
}.map { (file, classes) ->
34+
}
35+
.map { (file, classes) ->
3536
ExplodedLayout(
3637
relativePath = file.toRelativeString(projectDir),
3738
usedClasses = classes
@@ -55,7 +56,7 @@ internal class AndroidResParser(
5556

5657
private val container = Container()
5758

58-
val androidResSource: Set<ExplodedRes> = resources
59+
val androidResSource: Set<ExplodedRes> = resources.asSequence()
5960
.mapNotNull {
6061
try {
6162
it to buildDocument(it)
@@ -64,7 +65,7 @@ internal class AndroidResParser(
6465
null
6566
}
6667
}
67-
.mapToSet { (file, doc) ->
68+
.map { (file, doc) ->
6869
// Populate the container
6970
extractAttrsFromResourceXml(doc)
7071
extractContentReferencesFromResourceXml(doc)
@@ -75,14 +76,17 @@ internal class AndroidResParser(
7576
attrRefs = container.nonLocalAttrRefs()
7677
)
7778
}
79+
.toSet()
7880

7981
// e.g., "Theme.AppCompat.Light.DarkActionBar"
8082
private fun extractStyleParentsFromResourceXml(doc: Document): Set<AndroidResSource.StyleParentRef> =
81-
doc.getElementsByTagName("style").mapNotNull {
82-
it.attributes.getNamedItem("parent")?.nodeValue
83-
}.mapToSet {
84-
AndroidResSource.StyleParentRef.of(it)
85-
}
83+
doc.getElementsByTagName("style")
84+
.mapNotNull {
85+
it.attributes.getNamedItem("parent")?.nodeValue
86+
}
87+
.mapToSet {
88+
AndroidResSource.StyleParentRef.of(it)
89+
}
8690

8791
private fun extractAttrsFromResourceXml(doc: Document) {
8892
doc.attrs().forEach {
@@ -98,15 +102,16 @@ internal class AndroidResParser(
98102
}
99103

100104
internal class AndroidManifestParser(
101-
private val manifests: Iterable<File>,
102105
private val projectDir: File,
106+
private val manifests: Iterable<File>,
103107
private val namespace: String,
104108
) {
105109

106110
private val parser = ManifestParser(namespace)
107-
val explodedManifests: List<ExplodedManifest> = compute()
108111

109-
private fun compute(): List<ExplodedManifest> {
112+
val explodedManifests: Set<ExplodedManifest> = compute()
113+
114+
private fun compute(): Set<ExplodedManifest> {
110115
// If we have a namespace defined by the Android DSL, it is safe to parse the manifests immediately.
111116
if (namespace.isNotBlank()) return parseManifests()
112117

@@ -131,23 +136,24 @@ internal class AndroidManifestParser(
131136
parseResults += remainder to malformedParser.parse(remainder)
132137
}
133138

134-
return parseResults.toExplodedManifests()
139+
return parseResults.asSequence().toExplodedManifests()
135140
}
136141

137-
private fun parseManifests(): List<ExplodedManifest> = manifests
142+
private fun parseManifests(): Set<ExplodedManifest> = manifests.asSequence()
138143
.filter { it.exists() }
139144
.map { it to parser.parse(it) }
140145
.toExplodedManifests()
141146

142-
private fun Iterable<Pair<File, ParseResult>>.toExplodedManifests(): List<ExplodedManifest> {
143-
return map { it.toExplodedManifest() }
147+
private fun Sequence<Pair<File, ParseResult>>.toExplodedManifests(): Set<ExplodedManifest> {
148+
return map { it.toExplodedManifest() }.toSet()
144149
}
145150

146151
private fun Pair<File, ParseResult>.toExplodedManifest(): ExplodedManifest {
147152
val file = first
148153
val parseResult = second
149154
val applicationName = parseResult.applicationName
150155
val theme = AndroidResSource.AttrRef.style(parseResult.theme)
156+
151157
return ExplodedManifest(
152158
relativePath = file.toRelativeString(projectDir),
153159
applicationName = applicationName,

src/main/kotlin/com/autonomousapps/tasks/XmlSourceExploderTask.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,17 @@ abstract class XmlSourceExploderTask @Inject constructor(
9595

9696
val projectDir = parameters.projectDir.get().asFile
9797

98-
val explodedLayouts = AndroidLayoutParser(
99-
layouts = parameters.layouts.files,
100-
projectDir = projectDir
101-
).explodedLayouts
10298
val explodedResources = AndroidResParser(
99+
projectDir = projectDir,
103100
resources = parameters.androidRes,
104-
projectDir = projectDir
105101
).androidResSource
102+
val explodedLayouts = AndroidLayoutParser(
103+
projectDir = projectDir,
104+
layouts = parameters.layouts,
105+
).explodedLayouts
106106
val explodedManifests = AndroidManifestParser(
107-
manifests = parameters.manifests,
108107
projectDir = projectDir,
108+
manifests = parameters.manifests,
109109
namespace = parameters.namespace.get(),
110110
).explodedManifests
111111

src/test/groovy/com/autonomousapps/internal/parse/AndroidManifestParserTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ final class AndroidManifestParserTest extends Specification {
3232
]
3333
def projectDir = dir.resolve('project').toFile()
3434
def namespace = ''
35-
def parser = new AndroidManifestParser(manifests, projectDir, namespace)
35+
def parser = new AndroidManifestParser(projectDir, manifests, namespace)
3636

3737
when:
3838
parser.explodedManifests

0 commit comments

Comments
 (0)