Skip to content

Commit 925356d

Browse files
authored
fix(types): Reorder nested types for legacy protos w/ java_outer_class in one file [ggj] (#724)
* fix(types): Use fully-qualified message type names * fix: cleanup * fix(types): Reorder nested types for legacy protos w/o java_multiple_files set
1 parent cc5475f commit 925356d

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

src/main/java/com/google/api/generator/engine/ast/Reference.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public interface Reference extends AstNode {
3434

3535
boolean useFullName();
3636

37+
// The nested types in left-to-right order, if any.
38+
// Example: com.google.Foo.Bar.Car.ThisType will have the outer types listed in the order
39+
// [Foo, Bar, Car].
3740
@Nullable
3841
ImmutableList<String> enclosingClassNames();
3942

src/main/java/com/google/api/generator/gapic/protoparser/TypeParser.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ static Reference parseMessageReference(@Nonnull Descriptor messageDescriptor) {
147147
// Handles nesting.
148148
while (containingType != null) {
149149
// Outermost type in the nested type hierarchy lies at index 0.
150-
outerNestedTypeNames.add(0, containingType.getName());
150+
// If the Java outer proto class has already been set, apapend after it at index 1.
151+
outerNestedTypeNames.add(hasJavaOuterClass ? 1 : 0, containingType.getName());
151152
containingType = containingType.getContainingType();
152153
}
153154

@@ -158,15 +159,17 @@ static Reference parseMessageReference(@Nonnull Descriptor messageDescriptor) {
158159
.setPakkage(pakkage)
159160
.setEnclosingClassNames(outerNestedTypeNames)
160161
.build();
162+
161163
String protoPackage = messageDescriptor.getFile().getPackage();
162164
String messageFullName = messageDescriptor.getFullName();
163165
if (hasJavaOuterClass) {
166+
int packageIndex = protoPackage.length();
164167
messageFullName =
165168
String.format(
166169
"%s.%s.%s",
167-
messageFullName.substring(0, messageFullName.lastIndexOf(DOT)),
170+
messageFullName.substring(0, packageIndex),
168171
javaOuterClassname,
169-
messageFullName.substring(messageFullName.lastIndexOf(DOT) + 1));
172+
messageFullName.substring(packageIndex + 1));
170173
}
171174
Preconditions.checkState(
172175
messageReference.fullName().replace(pakkage, protoPackage).equals(messageFullName),
@@ -207,7 +210,8 @@ static Reference parseEnumReference(@Nonnull EnumDescriptor enumDescriptor) {
207210
// Handles nesting.
208211
while (containingType != null) {
209212
// Outermost type in the nested type hierarchy lies at index 0.
210-
outerNestedTypeNames.add(0, containingType.getName());
213+
// If the Java outer proto class has already been set, apapend after it at index 1.
214+
outerNestedTypeNames.add(hasJavaOuterClass ? 1 : 0, containingType.getName());
211215
containingType = containingType.getContainingType();
212216
}
213217

@@ -221,12 +225,13 @@ static Reference parseEnumReference(@Nonnull EnumDescriptor enumDescriptor) {
221225
String protoPackage = enumDescriptor.getFile().getPackage();
222226
String enumFullName = enumDescriptor.getFullName();
223227
if (hasJavaOuterClass) {
228+
int packageIndex = protoPackage.length();
224229
enumFullName =
225230
String.format(
226231
"%s.%s.%s",
227-
enumFullName.substring(0, enumFullName.lastIndexOf(DOT)),
232+
enumFullName.substring(0, packageIndex),
228233
javaOuterClassname,
229-
enumFullName.substring(enumFullName.lastIndexOf(DOT) + 1));
234+
enumFullName.substring(packageIndex + 1));
230235
}
231236

232237
Preconditions.checkState(

0 commit comments

Comments
 (0)