Skip to content

Commit c7f3ecc

Browse files
authored
Merge pull request #95 from tagantroy/master
Fix problem with underscores in rpc names
2 parents a0ce9b7 + 045e1ee commit c7f3ecc

File tree

4 files changed

+61
-3
lines changed

4 files changed

+61
-3
lines changed

compiler/src/main/java/io/grpc/kotlin/generator/TopLevelConstantsGenerator.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ class TopLevelConstantsGenerator(config: GeneratorConfig): ServiceCodeGenerator(
4343
.getter(
4444
FunSpec.getterBuilder()
4545
.addAnnotation(JvmStatic::class)
46-
.addStatement("return %T.get%LMethod()", service.grpcClass, method.methodName)
46+
.addStatement("return %T.%L()",
47+
service.grpcClass,
48+
method.methodName
49+
.toMemberSimpleName()
50+
.withPrefix("get")
51+
.withSuffix("Method")
52+
)
4753
.build()
4854
)
4955
.build()

compiler/src/main/java/io/grpc/kotlin/generator/protoc/ProtoMethodName.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,23 @@ import com.google.protobuf.Descriptors.MethodDescriptor
2222

2323
/** Represents the unqualified name of an RPC method in a proto file, in UpperCamelCase. */
2424
data class ProtoMethodName(val name: String) : CharSequence by name {
25-
fun toMemberSimpleName(): MemberSimpleName =
26-
MemberSimpleName(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, name))
25+
fun toMemberSimpleName(): MemberSimpleName {
26+
val name = MemberSimpleName(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, name))
27+
if (containsSpecialCharacters(name)) {
28+
return handleSpecialCharacters(name)
29+
}
30+
return name
31+
}
32+
33+
private fun containsSpecialCharacters(name: MemberSimpleName): Boolean {
34+
return name.contains("_")
35+
}
36+
37+
private fun handleSpecialCharacters(name: MemberSimpleName): MemberSimpleName {
38+
return name.split("_")
39+
.map(::MemberSimpleName)
40+
.reduce { acc, simpleName -> acc + simpleName }
41+
}
2742

2843
override fun toString() = name
2944
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.grpc.kotlin.generator.protoc
2+
3+
import com.google.common.truth.Truth.assertThat
4+
import org.junit.Test
5+
import org.junit.runner.RunWith
6+
import org.junit.runners.JUnit4
7+
8+
/** Tests for [ProtoMethodName]. */
9+
@RunWith(JUnit4::class)
10+
class ProtoMethodNameTest {
11+
@Test
12+
fun toMemberSimpleNameWithSingleUnderscore(){
13+
assertThat(ProtoMethodName("say_hello").toMemberSimpleName())
14+
.isEqualTo(MemberSimpleName("sayHello"))
15+
}
16+
17+
@Test
18+
fun toMemberSimpleNameWithMultipleUnderscores(){
19+
assertThat(ProtoMethodName("say_hello_again").toMemberSimpleName())
20+
.isEqualTo(MemberSimpleName("sayHelloAgain"))
21+
}
22+
23+
@Test
24+
fun toMemberSimpleNameWithRecommendedNamingStyle(){
25+
assertThat(ProtoMethodName("SayHello").toMemberSimpleName())
26+
.isEqualTo(MemberSimpleName("sayHello"))
27+
}
28+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
syntax = "proto3";
2+
package io.grpc.testing.underscore;
3+
option java_multiple_files = true;
4+
service NameContainsUnderscore {
5+
rpc say_hello (HelloRequest) returns (HelloReply);
6+
rpc say_hello_again (HelloRequest) returns (HelloReply);
7+
}
8+
message HelloRequest {}
9+
message HelloReply {}

0 commit comments

Comments
 (0)