Skip to content

Commit 49f60af

Browse files
committed
fixed class name conversion for names not in lower_underscore case format
1 parent 871a518 commit 49f60af

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

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

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

3+
import HELLOworld.FunWITHcasEs;
4+
import HELLOworld.HelloUPPERRequest;
35
import com.google.common.io.ByteStreams;
46
import com.google.protobuf.DescriptorProtos;
57
import com.google.protobuf.ExtensionRegistry;
@@ -63,6 +65,11 @@ public void nestedTypeMappings() {
6365
assertProtoTypeMapping(".nested.Outer.MiddleBB.Inner", nested.NestedOuterClass.Outer.MiddleBB.Inner.class);
6466
}
6567

68+
@Test
69+
public void nestedTypeCamelCase() {
70+
assertProtoTypeMapping(".pkg.Inner", pkg.NestedCamelCase.Inner.class);
71+
}
72+
6673
/**
6774
* Verify that nested proto message types map correctly when {@code option java_multiple_files = true}.
6875
*/
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
syntax = "proto3";
2+
3+
// release id
4+
package pkg;
5+
6+
message Inner {
7+
optional int32 value = 1;
8+
}
9+

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

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,7 @@ private static String getJavaOuterClassname(
121121
}
122122

123123
filename = makeInvalidCharactersUnderscores(filename);
124-
filename = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, filename);
125-
filename = upcaseAfterNumber(filename);
124+
filename = convertToCamelCase(filename);
126125
filename = appendOuterClassSuffix(filename, fileDescriptor);
127126
return filename;
128127
}
@@ -157,15 +156,32 @@ private static String makeInvalidCharactersUnderscores(String filename) {
157156
}
158157

159158
/**
160-
* Upper case characters after numbers, like {@code Weyland9Yutani}.
159+
* Adjust a class name to follow the JavaBean spec.
160+
* - capitalize the first letter
161+
* - remove embedded underscores & capitalize the following letter
162+
* - capitalize letter after a number
163+
*
164+
* @param name method name
165+
* @return lower name
161166
*/
162-
private static String upcaseAfterNumber(String filename) {
163-
char[] filechars = filename.toCharArray();
164-
for (int i = 1; i < filechars.length; i++) {
165-
if (CharMatcher.inRange('0', '9').matches(filechars[i - 1])) {
166-
filechars[i] = Character.toUpperCase(filechars[i]);
167+
private static String convertToCamelCase(String name) {
168+
StringBuilder sb = new StringBuilder();
169+
sb.append(Character.toUpperCase(name.charAt(0)));
170+
171+
for (int i = 1; i < name.length(); i++) {
172+
char c = name.charAt(i);
173+
char prev = name.charAt(i - 1);
174+
175+
if (c != '_') {
176+
if (prev == '_' || CharMatcher.inRange('0', '9').matches(prev)) {
177+
sb.append(Character.toUpperCase(c));
178+
} else {
179+
sb.append(c);
180+
}
167181
}
168182
}
169-
return new String(filechars);
183+
184+
return sb.toString();
170185
}
186+
171187
}

0 commit comments

Comments
 (0)