@@ -94,10 +94,10 @@ private Stream<File> handleProtoFile(FileDescriptorProto fileDescriptor) {
9494 : protoPackage ;
9595
9696 return fileDescriptor .getMessageTypeList ().stream ()
97- .flatMap (descriptor -> handleMessageProto (descriptor , descriptor . getName ( ), protoPackage , javaPackage ));
97+ .flatMap (descriptor -> handleMessage (descriptor , getFileName ( fileDescriptor , descriptor ), protoPackage , javaPackage ));
9898 }
9999
100- private Stream <File > handleMessageProto (
100+ private Stream <File > handleMessage (
101101 DescriptorProto messageDescriptor ,
102102 String fileName ,
103103 String protoPackage ,
@@ -107,13 +107,13 @@ private Stream<File> handleMessageProto(
107107 String fullMethodName = protoPackage + "." + messageDescriptor .getName ();
108108
109109 return Stream .concat (
110- handleMessage (messageDescriptor , filePath , fullMethodName ),
110+ handleSingleMessage (messageDescriptor , filePath , fullMethodName ),
111111 messageDescriptor .getNestedTypeList ().stream ()
112112 .filter (nestedDescriptor -> !nestedDescriptor .getOptions ().getMapEntry ())
113- .flatMap (nestedDescriptor -> handleMessageProto (nestedDescriptor , fileName , fullMethodName , javaPackage )));
113+ .flatMap (nestedDescriptor -> handleMessage (nestedDescriptor , fileName , fullMethodName , javaPackage )));
114114 }
115115
116- private Stream <File > handleMessage (DescriptorProto messageDescriptor , String filePath , String fullMethodName ) {
116+ private Stream <File > handleSingleMessage (DescriptorProto messageDescriptor , String filePath , String fullMethodName ) {
117117 return Stream .of (
118118 createFile (messageDescriptor , filePath , fullMethodName , BUILDER_SCOPE , this ::createBuilderMethods ),
119119 createFile (messageDescriptor , filePath , fullMethodName , CLASS_SCOPE , this ::createClassMethods ))
@@ -200,6 +200,21 @@ private Optional<String> optionalGet(FieldDescriptorProto fieldDescriptor) {
200200 return Optional .of (applyTemplate (templatePath ("optionalGet.mustache" ), context ));
201201 }
202202
203+ private String getFileName (FileDescriptorProto fileDescriptor , DescriptorProto messageDescriptor ) {
204+ if (fileDescriptor .getOptions ().getJavaMultipleFiles ()) {
205+ return messageDescriptor .getName ();
206+ }
207+ if (fileDescriptor .getOptions ().hasJavaOuterClassname ()) {
208+ return fileDescriptor .getOptions ().getJavaOuterClassname ();
209+ }
210+ String protoPackage = fileDescriptor .hasPackage () ? "." + fileDescriptor .getPackage () : "" ;
211+ String protoTypeName = protoPackage + "." + messageDescriptor .getName ();
212+ return Optional .ofNullable (protoTypeMap .toJavaTypeName (protoTypeName ))
213+ .map (javaType -> javaType .substring (0 , javaType .lastIndexOf ('.' )))
214+ .map (javaType -> javaType .substring (javaType .lastIndexOf ('.' ) + 1 ))
215+ .orElseThrow (() -> new IllegalArgumentException ("Failed to find filename for proto '" + fileDescriptor .getName () + "'" ));
216+ }
217+
203218 private String getJavaMethodName (FieldDescriptorProto fieldDescriptor ) {
204219 return fieldDescriptor .getJsonName ().substring (0 , 1 ).toUpperCase (Locale .ROOT ) + fieldDescriptor .getJsonName ().substring (1 );
205220 }
0 commit comments