Skip to content

Commit c395ede

Browse files
authored
Merge pull request #100 from salesforce/bugfix/multi-files
Correctly handle nested types when java_multiple_files=true
2 parents 7ccb0b7 + 83ba34f commit c395ede

File tree

4 files changed

+53
-71
lines changed

4 files changed

+53
-71
lines changed

jprotoc/jprotoc-test/src/test/java/com/salesforce/jprotoc/ProtoTypeMapTest.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.salesforce.jprotoc;
22

33
import com.google.common.io.ByteStreams;
4+
import com.google.protobuf.DescriptorProtos;
45
import com.google.protobuf.ExtensionRegistry;
56
import com.google.protobuf.compiler.PluginProtos;
67
import org.junit.BeforeClass;
@@ -9,6 +10,7 @@
910
import java.io.File;
1011
import java.io.FileInputStream;
1112
import java.io.IOException;
13+
import java.util.List;
1214

1315
import static org.assertj.core.api.Assertions.assertThat;
1416

@@ -29,7 +31,8 @@ public static void buildProtoTypeMap() throws IOException {
2931
byte[] generatorRequestBytes = ByteStreams.toByteArray(new FileInputStream(new File(dumpPath)));
3032
PluginProtos.CodeGeneratorRequest request = PluginProtos.CodeGeneratorRequest.parseFrom(
3133
generatorRequestBytes, ExtensionRegistry.newInstance());
32-
protoTypeMap = ProtoTypeMap.of(request.getProtoFileList());
34+
List<DescriptorProtos.FileDescriptorProto> fileProtos = request.getProtoFileList();
35+
protoTypeMap = ProtoTypeMap.of(fileProtos);
3336
}
3437

3538

@@ -60,6 +63,18 @@ public void nestedTypeMappings() {
6063
assertProtoTypeMapping(".nested.Outer.MiddleBB.Inner", nested.NestedOuterClass.Outer.MiddleBB.Inner.class);
6164
}
6265

66+
/**
67+
* Verify that nested proto message types map correctly when {@code option java_multiple_files = true}.
68+
*/
69+
@Test
70+
public void nestedTypeMappingsMultipleFiles() {
71+
assertProtoTypeMapping(".nested_multiple_files.Outer", nested_multiple_files.Outer.class);
72+
assertProtoTypeMapping(".nested_multiple_files.Outer.MiddleAA", nested_multiple_files.Outer.MiddleAA.class);
73+
assertProtoTypeMapping(".nested_multiple_files.Outer.MiddleAA.Inner", nested_multiple_files.Outer.MiddleAA.Inner.class);
74+
assertProtoTypeMapping(".nested_multiple_files.Outer.MiddleBB", nested_multiple_files.Outer.MiddleBB.class);
75+
assertProtoTypeMapping(".nested_multiple_files.Outer.MiddleBB.Inner", nested_multiple_files.Outer.MiddleBB.Inner.class);
76+
}
77+
6378
/**
6479
* Verify that types with nested enums sharing the same name as a top-level type don't conflict.
6580
*/
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
syntax = "proto3";
2+
3+
package nested_multiple_files;
4+
5+
option java_multiple_files = true;
6+
7+
message Outer { // Level 0
8+
enum FooEnum {
9+
FOO = 0;
10+
BAR = 1;
11+
CHEESE = 2;
12+
}
13+
message MiddleAA { // Level 1
14+
15+
message Inner { // Level 2
16+
int64 ival = 1;
17+
bool booly = 2;
18+
Outer.FooEnum enum = 3;
19+
}
20+
}
21+
message MiddleBB { // Level 1
22+
message Inner { // Level 2
23+
int32 ival = 1;
24+
bool booly = 2;
25+
Outer.FooEnum enum = 3;
26+
}
27+
}
28+
}
29+
30+
service Nested {
31+
rpc doNested (Outer.MiddleAA.Inner) returns (Outer.MiddleBB.Inner) {}
32+
}

jprotoc/jprotoc/src/main/java/com/salesforce/jprotoc/ProtoTypeMap.java

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
import java.util.Collection;
1515

1616
import javax.annotation.Nonnull;
17-
import javax.annotation.Nullable;
1817

1918
/**
2019
* {@code ProtoTypeMap} maintains a dictionary for looking up Java type names when given proto types.
2120
*/
2221
public final class ProtoTypeMap {
2322

23+
private static final Joiner DOT_JOINER = Joiner.on('.').skipNulls();
2424
private final ImmutableMap<String, String> types;
2525

2626
private ProtoTypeMap(@Nonnull ImmutableMap<String, String> types) {
@@ -58,7 +58,7 @@ public static ProtoTypeMap of(@Nonnull Collection<DescriptorProtos.FileDescripto
5858
fileDescriptor.getEnumTypeList().forEach(
5959
e -> types.put(
6060
protoPackage + "." + e.getName(),
61-
toJavaTypeName(e.getName(), enclosingClassName, javaPackage)));
61+
DOT_JOINER.join(javaPackage, enclosingClassName, e.getName())));
6262

6363
// Identify top-level messages, and nested types
6464
fileDescriptor.getMessageTypeList().forEach(
@@ -74,23 +74,21 @@ private static void recursivelyAddTypes(ImmutableMap.Builder<String, String> typ
7474
String protoTypeName = protoPackage + "." + m.getName();
7575
types.put(
7676
protoTypeName,
77-
toJavaTypeName(m.getName(), enclosingClassName, javaPackage));
77+
DOT_JOINER.join(javaPackage, enclosingClassName, m.getName()));
7878

7979
// Identify any nested Enums
8080
m.getEnumTypeList().forEach(
8181
e -> types.put(
8282
protoPackage + "." + m.getName() + "." + e.getName(),
83-
toJavaTypeName(e.getName(),
84-
enclosingClassName + "." + m.getName(),
85-
javaPackage)));
83+
DOT_JOINER.join(javaPackage, enclosingClassName, m.getName(), e.getName())));
8684

8785
// Recursively identify any nested types
8886
m.getNestedTypeList().forEach(
8987
n -> recursivelyAddTypes(
9088
types,
9189
n,
9290
protoPackage + "." + m.getName(),
93-
enclosingClassName + "." + m.getName(),
91+
DOT_JOINER.join(enclosingClassName, m.getName()),
9492
javaPackage));
9593
}
9694

@@ -104,24 +102,6 @@ public String toJavaTypeName(@Nonnull String protoTypeName) {
104102
return types.get(protoTypeName);
105103
}
106104

107-
/**
108-
* Returns the full Java type name based on the given protobuf type parameters.
109-
*
110-
* @param className the protobuf type name
111-
* @param enclosingClassName the optional enclosing class for the given type
112-
* @param javaPackage the proto file's configured java package name
113-
*/
114-
public static String toJavaTypeName(
115-
@Nonnull String className,
116-
@Nullable String enclosingClassName,
117-
@Nullable String javaPackage) {
118-
119-
Preconditions.checkNotNull(className, "className");
120-
121-
Joiner dotJoiner = Joiner.on('.').skipNulls();
122-
return dotJoiner.join(javaPackage, enclosingClassName, className);
123-
}
124-
125105
private static String getJavaOuterClassname(
126106
DescriptorProtos.FileDescriptorProto fileDescriptor,
127107
DescriptorProtos.FileOptions fileOptions) {

jprotoc/jprotoc/src/test/java/com/salesforce/jprotoc/ProtoTypeUtilsTest.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)