diff options
author | 2017-05-22 18:40:35 +0200 | |
---|---|---|
committer | 2017-05-23 12:46:00 +0200 | |
commit | 7cc7ae4a018936e08982fb58fd749dfada37f82e (patch) | |
tree | 256c6f29154a61c1992c8887e4d2c11f8aa0a18b /src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java | |
parent | f1c23532d1f05b731f28d2c474ec146e2332606e (diff) |
Move the field name out of the FieldInitializer
RELNOTES: None
PiperOrigin-RevId: 156747534
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java b/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java index 45ffadf66d..ae8307ed90 100644 --- a/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java +++ b/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializers.java @@ -16,65 +16,78 @@ package com.google.devtools.build.android.resources; import com.android.resources.ResourceType; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.MultimapBuilder; -import com.google.common.collect.SortedSetMultimap; +import com.google.common.collect.ImmutableSortedMap; +import com.google.common.collect.Sets; import java.util.Collection; +import java.util.EnumMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import java.util.SortedSet; +import java.util.TreeMap; /** * Represents a collection of resource symbols and values suitable for writing java sources and * classes. */ public class FieldInitializers - implements Iterable<Entry<ResourceType, Collection<FieldInitializer>>> { + implements Iterable<Entry<ResourceType, Map<String, FieldInitializer>>> { - private final Map<ResourceType, Collection<FieldInitializer>> initializers; + private final Map<ResourceType, Map<String, FieldInitializer>> initializers; - private FieldInitializers(Map<ResourceType, Collection<FieldInitializer>> initializers) { + private FieldInitializers(Map<ResourceType, Map<String, FieldInitializer>> initializers) { this.initializers = initializers; } /** Creates a {@link FieldInitializers} copying the contents from a {@link Map}. */ public static FieldInitializers copyOf( - Map<ResourceType, Collection<FieldInitializer>> initializers) { + Map<ResourceType, Map<String, FieldInitializer>> initializers) { return new FieldInitializers(ImmutableMap.copyOf(initializers)); } - public Iterable<Entry<ResourceType, Collection<FieldInitializer>>> filter( - FieldInitializers fieldsToWrite) { - final SortedSetMultimap<ResourceType, FieldInitializer> initializersToWrite = - MultimapBuilder.enumKeys(ResourceType.class).treeSetValues().build(); - - // Create a map to filter with. - final SortedSetMultimap<ResourceType, String> symbolsToWrite = - MultimapBuilder.enumKeys(ResourceType.class).treeSetValues().build(); - for (Entry<ResourceType, Collection<FieldInitializer>> entry : - fieldsToWrite.initializers.entrySet()) { - for (FieldInitializer initializer : entry.getValue()) { - final SortedSet<String> fieldNames = symbolsToWrite.get(entry.getKey()); - initializer.addTo(fieldNames); + public static FieldInitializers mergedFrom(Collection<FieldInitializers> toMerge) { + final Map<ResourceType, Map<String, FieldInitializer>> merged = + new EnumMap<>(ResourceType.class); + for (FieldInitializers mergee : toMerge) { + for (Entry<ResourceType, Map<String, FieldInitializer>> entry : mergee) { + final Map<String, FieldInitializer> fieldMap = + merged.containsKey(entry.getKey()) + ? merged.get(entry.getKey()) + : new TreeMap<String, FieldInitializer>(); + merged.put(entry.getKey(), fieldMap); + for (Entry<String, FieldInitializer> field : entry.getValue().entrySet()) { + fieldMap.put(field.getKey(), field.getValue()); + } } } + return copyOf(merged); + } - for (Entry<ResourceType, Collection<String>> entry : symbolsToWrite.asMap().entrySet()) { - // Resource type may be missing if resource overriding eliminates resources at the binary - // level, which were originally present at the library level. + public Iterable<Entry<ResourceType, Map<String, FieldInitializer>>> filter( + FieldInitializers fieldsToWrite) { + Map<ResourceType, Map<String, FieldInitializer>> initializersToWrite = + new EnumMap<>(ResourceType.class); + + for (Entry<ResourceType, Map<String, FieldInitializer>> entry : + fieldsToWrite.initializers.entrySet()) { if (initializers.containsKey(entry.getKey())) { - for (FieldInitializer field : initializers.get(entry.getKey())) { - if (field.nameIsIn(entry.getValue())) { - initializersToWrite.put(entry.getKey(), field); - } + final Map<String, FieldInitializer> valueFields = initializers.get(entry.getKey()); + final ImmutableMap.Builder<String, FieldInitializer> fields = + ImmutableSortedMap.naturalOrder(); + // Resource type may be missing if resource overriding eliminates resources at the binary + // level, which were originally present at the library level. + for (String fieldName : + Sets.intersection(entry.getValue().keySet(), valueFields.keySet())) { + fields.put(fieldName, valueFields.get(fieldName)); } + initializersToWrite.put(entry.getKey(), fields.build()); } } - return initializersToWrite.asMap().entrySet(); + + return initializersToWrite.entrySet(); } @Override - public Iterator<Entry<ResourceType, Collection<FieldInitializer>>> iterator() { + public Iterator<Entry<ResourceType, Map<String, FieldInitializer>>> iterator() { return initializers.entrySet().iterator(); } |