@@ -20,7 +20,7 @@ import java.io.File
2020
2121internal 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
100104internal 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,
0 commit comments