Skip to content

Commit a372250

Browse files
GooglerLeFrosch
authored andcommitted
Update BepParser to distinguish between aspects
For a build (especially with a portable manifest aspect), we may receive build events with the same output group, target, and config but different aspects. They need to be distinguished in order to avoid wrongly hitting the "already present" error on Line 148. Bug:399949720 Test: existing Change-Id: I1253be790d7e799fdc1b18741c313b5edaded05c AOSP: 1154956dcf00e4da4ac14180f38d58e2c38a3c3b
1 parent 38c83bd commit a372250

File tree

1 file changed

+20
-12
lines changed
  • base/src/com/google/idea/blaze/base/command/buildresult/bepparser

1 file changed

+20
-12
lines changed

base/src/com/google/idea/blaze/base/command/buildresult/bepparser/BepParser.kt

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -125,24 +125,27 @@ private data class OutputGroupTargetConfigFileSets(
125125
/**
126126
* A data structure allowing to associate file set names with output group, targets and configs and allowing to retrieve them efficiently
127127
* at each level of the hierarchy.
128+
*
129+
* For each config, the file set names are stored as <aspect, List<file set name>> map to avoid duplicate file set names for the same
130+
* config but different aspects. While retrieving, a flatmap for the given config is returned.
128131
*/
129132
private class OutputGroupTargetConfigFileSetMap {
130-
private val data: MutableMap<String, MutableMap<String, MutableMap<String, List<String>>>> = mutableMapOf()
133+
private val data: MutableMap<String, MutableMap<String, MutableMap<String, MutableMap<String, List<String>>>>> = mutableMapOf()
131134

132-
private fun getOutputGroup(outputGroup: String): MutableMap<String, MutableMap<String, List<String>>> {
135+
private fun getOutputGroup(outputGroup: String): MutableMap<String, MutableMap<String, MutableMap<String, List<String>>>> {
133136
return data.computeIfAbsent(outputGroup) { mutableMapOf() }
134137
}
135138

136-
private fun getOutputGroupTarget(outputGroup: String, target: String): MutableMap<String, List<String>> {
139+
private fun getOutputGroupTarget(outputGroup: String, target: String): MutableMap<String, MutableMap<String, List<String>>> {
137140
return getOutputGroup(outputGroup).computeIfAbsent(target) { mutableMapOf() }
138141
}
139142

140-
private fun getOutputGroupTargetConfig(outputGroup: String, target: String, config: String): List<String> {
141-
return getOutputGroupTarget(outputGroup, target)[config] ?: emptyList()
143+
private fun getOutputGroupTargetConfig(outputGroup: String, target: String, config: String): MutableMap<String, List<String>> {
144+
return getOutputGroupTarget(outputGroup, target).computeIfAbsent(config){mutableMapOf()}
142145
}
143146

144-
fun setOutputGroupTargetConfig(outputGroup: String, target: String, config: String, fileSetNames: List<String>) {
145-
val previous = getOutputGroupTarget(outputGroup, target).put(config, fileSetNames.toList())
147+
fun setOutputGroupTargetConfigAspect(outputGroup: String, target: String, config: String, aspect: String, fileSetNames: List<String>) {
148+
val previous = getOutputGroupTargetConfig(outputGroup, target, config).put(aspect, fileSetNames.toList())
146149
if (previous != null) {
147150
error("$outputGroup:$target:$config already present")
148151
}
@@ -153,7 +156,7 @@ private class OutputGroupTargetConfigFileSetMap {
153156
outputGroup.value.entries.asSequence().flatMap { target ->
154157
target.value.entries.asSequence().map { config ->
155158
OutputGroupTargetConfigFileSets(outputGroup.key, target.key,
156-
config.key, config.value)
159+
config.key, config.value.entries.flatMap { it.value })
157160
}
158161
}
159162
}
@@ -164,7 +167,7 @@ private class OutputGroupTargetConfigFileSetMap {
164167
return outputGroupData.entries.asSequence().flatMap { target ->
165168
target.value.entries.asSequence().map { config ->
166169
OutputGroupTargetConfigFileSets(outputGroup, target.key,
167-
config.key, config.value)
170+
config.key, config.value.entries.flatMap { it.value })
168171
}
169172
}
170173
}
@@ -174,7 +177,7 @@ private class OutputGroupTargetConfigFileSetMap {
174177
val outputGroupTargetData = outputGroupData[target] ?: return emptySequence()
175178
return outputGroupTargetData.entries.asSequence().map { config ->
176179
OutputGroupTargetConfigFileSets(outputGroup, target,
177-
config.key, config.value)
180+
config.key, config.value.entries.flatMap { it.value })
178181
}
179182
}
180183
}
@@ -316,11 +319,16 @@ private fun parseBep(stream: BuildEventStreamProvider, nullableInterner: Interne
316319
TARGET_COMPLETED -> {
317320
val label = event.id.targetCompleted.label
318321
val configId = event.id.targetCompleted.configuration.id
322+
val aspect = event.id.targetCompleted.aspect
319323

320324
for (o in event.completed.outputGroupList) {
321325
val fileSetNames = getFileSets(o, interner)
322-
state.outputs.setOutputGroupTargetConfig(interner.intern(o.name), interner.intern(label), interner.intern(configId),
323-
fileSetNames)
326+
state.outputs.setOutputGroupTargetConfigAspect(
327+
interner.intern(o.name),
328+
interner.intern(label),
329+
interner.intern(configId),
330+
interner.intern(aspect),
331+
fileSetNames)
324332
}
325333
}
326334

0 commit comments

Comments
 (0)