|
61 | 61 | import java.util.Objects; |
62 | 62 | import java.util.Optional; |
63 | 63 | import java.util.Set; |
| 64 | +import java.util.function.Function; |
64 | 65 | import java.util.stream.Collectors; |
65 | 66 |
|
66 | 67 | public class Parser { |
@@ -133,21 +134,31 @@ public static GapicContext parse(CodeGeneratorRequest request) { |
133 | 134 | serviceConfigOpt); |
134 | 135 |
|
135 | 136 | Preconditions.checkState(!services.isEmpty(), "No services found to generate"); |
| 137 | + Function<ResourceName, String> typeNameFn = |
| 138 | + r -> r.resourceTypeString().substring(r.resourceTypeString().indexOf("/") + 1); |
| 139 | + Function<Set<ResourceName>, Set<String>> typeStringSetFn = |
| 140 | + sr -> sr.stream().map(r -> typeNameFn.apply(r)).collect(Collectors.toSet()); |
136 | 141 |
|
137 | 142 | // Include all resource names present in message types for backwards-compatibility with the |
138 | 143 | // monolith. In the future, this should be removed on a client library major semver update. |
| 144 | + // Resolve type name collisions with the ones present in the method arguments. |
| 145 | + final Set<String> typeStringSet = typeStringSetFn.apply(outputArgResourceNames); |
139 | 146 | outputArgResourceNames.addAll( |
140 | 147 | resourceNames.values().stream() |
141 | | - .filter(r -> r.hasParentMessageName()) |
| 148 | + .filter(r -> r.hasParentMessageName() && !typeStringSet.contains(typeNameFn.apply(r))) |
142 | 149 | .collect(Collectors.toSet())); |
143 | 150 |
|
144 | 151 | String servicePackage = services.get(0).pakkage(); |
145 | 152 | Map<String, ResourceName> patternsToResourceNames = |
146 | 153 | ResourceParserHelpers.createPatternResourceNameMap(resourceNames); |
147 | 154 | for (ResourceReference resourceReference : outputResourceReferencesSeen) { |
| 155 | + final Set<String> interimTypeStringSet = typeStringSetFn.apply(outputArgResourceNames); |
148 | 156 | outputArgResourceNames.addAll( |
149 | 157 | ResourceReferenceParser.parseResourceNames( |
150 | | - resourceReference, servicePackage, null, resourceNames, patternsToResourceNames)); |
| 158 | + resourceReference, servicePackage, null, resourceNames, patternsToResourceNames) |
| 159 | + .stream() |
| 160 | + .filter(r -> !interimTypeStringSet.contains(typeNameFn.apply(r))) |
| 161 | + .collect(Collectors.toSet())); |
151 | 162 | } |
152 | 163 |
|
153 | 164 | return GapicContext.builder() |
|
0 commit comments