Skip to content

Commit f4a9fbd

Browse files
authored
Merge pull request #165 from pelidan/master
Issue #163 ProtoTypeMap - Outer class incorrect if protobuf name is not lower underscore
2 parents 871a518 + f2912d3 commit f4a9fbd

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ public void nestedTypeMappings() {
6363
assertProtoTypeMapping(".nested.Outer.MiddleBB.Inner", nested.NestedOuterClass.Outer.MiddleBB.Inner.class);
6464
}
6565

66+
@Test
67+
public void nestedTypeCamelCase() {
68+
assertProtoTypeMapping(".pkg.Inner", pkg.NestedCamelCase.Inner.class);
69+
}
70+
6671
/**
6772
* Verify that nested proto message types map correctly when {@code option java_multiple_files = true}.
6873
*/
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)