x/ref: Disallow uppercase acronyms in VDL identifiers.
The purpose of this change is to ensure code in each generated
language is idiomatic and looks reasonable. The problem with
uppercase acronyms is they either look bad or are non-reversible,
when converted to camelCase or CONST_CASE.
E.g. EOF is converted to eOF, which looks bad. MyTTL is
converted to MY_TTL, which is non-reversible.
Const identifiers are currently special-cased to avoid this rule.
In the future we may choose to change to the same rule for const
identifiers; this is less important since const identifiers are
never sent over the wire.
MultiPart: 2/3
Change-Id: I1673c92763bb09257a285c381a256ec2d773ee3c
diff --git a/lib/vdl/codegen/golang/type_test.go b/lib/vdl/codegen/golang/type_test.go
index 164c9d3..fb26f6f 100644
--- a/lib/vdl/codegen/golang/type_test.go
+++ b/lib/vdl/codegen/golang/type_test.go
@@ -2,6 +2,8 @@
import (
"testing"
+ "unicode"
+ "unicode/utf8"
"v.io/v23/vdl"
"v.io/x/ref/lib/vdl/compile"
@@ -147,10 +149,11 @@
}
data := goData{Env: compile.NewEnv(-1)}
for _, test := range tests {
+ firstLetter, _ := utf8.DecodeRuneInString(test.T.Name())
def := &compile.TypeDef{
NamePos: compile.NamePos{Name: test.T.Name()},
Type: test.T,
- Exported: compile.ValidExportedIdent(test.T.Name(), compile.ReservedNormal) == nil,
+ Exported: unicode.IsUpper(firstLetter),
}
switch test.T.Kind() {
case vdl.Enum:
diff --git a/lib/vdl/codegen/java/file_array.go b/lib/vdl/codegen/java/file_array.go
index 919208c..12bb657 100644
--- a/lib/vdl/codegen/java/file_array.go
+++ b/lib/vdl/codegen/java/file_array.go
@@ -7,6 +7,7 @@
"strings"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const arrayTmpl = `// This file was auto-generated by the veyron vdl tool.
@@ -52,7 +53,7 @@
// genJavaArrayFile generates the Java class file for the provided named array type.
func genJavaArrayFile(tdef *compile.TypeDef, env *compile.Env) JavaFileInfo {
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
elemType := javaType(tdef.Type.Elem(), true, env)
elems := strings.TrimSuffix(strings.Repeat(javaZeroValue(tdef.Type.Elem(), env)+", ", tdef.Type.Len()), ", ")
zeroValue := fmt.Sprintf("new %s[] {%s}", elemType, elems)
diff --git a/lib/vdl/codegen/java/file_client_factory.go b/lib/vdl/codegen/java/file_client_factory.go
index 1251bb2..e5d988c 100644
--- a/lib/vdl/codegen/java/file_client_factory.go
+++ b/lib/vdl/codegen/java/file_client_factory.go
@@ -6,6 +6,7 @@
"path"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const clientFactoryTmpl = `// This file was auto-generated by the veyron vdl tool.
@@ -30,7 +31,7 @@
// genJavaClientFactoryFile generates the Java file containing client bindings for
// all interfaces in the provided package.
func genJavaClientFactoryFile(iface *compile.Interface, env *compile.Env) JavaFileInfo {
- javaServiceName := toUpperCamelCase(iface.Name)
+ javaServiceName := vdlutil.FirstRuneToUpper(iface.Name)
data := struct {
AccessModifier string
Sources string
diff --git a/lib/vdl/codegen/java/file_client_interface.go b/lib/vdl/codegen/java/file_client_interface.go
index 0ea8327..7a8c072 100644
--- a/lib/vdl/codegen/java/file_client_interface.go
+++ b/lib/vdl/codegen/java/file_client_interface.go
@@ -72,7 +72,7 @@
func processClientInterfaceMethod(iface *compile.Interface, method *compile.Method, env *compile.Env) clientInterfaceMethod {
retArgs := make([]clientInterfaceArg, len(method.OutArgs))
for i := 0; i < len(method.OutArgs); i++ {
- retArgs[i].Name = vdlutil.ToCamelCase(method.OutArgs[i].Name)
+ retArgs[i].Name = vdlutil.FirstRuneToLower(method.OutArgs[i].Name)
retArgs[i].Type = javaType(method.OutArgs[i].Type, false, env)
}
return clientInterfaceMethod{
@@ -80,7 +80,7 @@
Args: javaDeclarationArgStr(method.InArgs, env, true),
Doc: method.Doc,
IsMultipleRet: len(retArgs) > 1,
- Name: vdlutil.ToCamelCase(method.Name),
+ Name: vdlutil.FirstRuneToLower(method.Name),
RetArgs: retArgs,
RetType: clientInterfaceOutArg(iface, method, false, env),
UppercaseMethodName: method.Name,
@@ -90,7 +90,7 @@
// genJavaClientInterfaceFile generates the Java interface file for the provided
// interface.
func genJavaClientInterfaceFile(iface *compile.Interface, env *compile.Env) JavaFileInfo {
- javaServiceName := toUpperCamelCase(iface.Name)
+ javaServiceName := vdlutil.FirstRuneToUpper(iface.Name)
methods := make([]clientInterfaceMethod, len(iface.Methods))
for i, method := range iface.Methods {
methods[i] = processClientInterfaceMethod(iface, method, env)
diff --git a/lib/vdl/codegen/java/file_client_stub.go b/lib/vdl/codegen/java/file_client_stub.go
index b820015..55ac9e1 100644
--- a/lib/vdl/codegen/java/file_client_stub.go
+++ b/lib/vdl/codegen/java/file_client_stub.go
@@ -194,7 +194,7 @@
func processClientStubMethod(iface *compile.Interface, method *compile.Method, env *compile.Env) clientStubMethod {
outArgs := make([]clientStubMethodOutArg, len(method.OutArgs))
for i := 0; i < len(method.OutArgs); i++ {
- outArgs[i].FieldName = vdlutil.ToCamelCase(method.OutArgs[i].Name)
+ outArgs[i].FieldName = vdlutil.FirstRuneToLower(method.OutArgs[i].Name)
outArgs[i].Type = javaType(method.OutArgs[i].Type, true, env)
}
return clientStubMethod{
@@ -206,14 +206,14 @@
DeclaredObjectRetType: clientInterfaceNonStreamingOutArg(iface, method, true, env),
IsVoid: len(method.OutArgs) < 1,
MultipleReturn: len(method.OutArgs) > 1,
- Name: vdlutil.ToCamelCase(method.Name),
+ Name: vdlutil.FirstRuneToLower(method.Name),
NotStreaming: !isStreamingMethod(method),
OutArgs: outArgs,
RecvType: javaType(method.OutStream, true, env),
RetType: clientInterfaceOutArg(iface, method, false, env),
Returns: len(method.OutArgs) >= 1 || isStreamingMethod(method),
SendType: javaType(method.InStream, true, env),
- ServiceName: toUpperCamelCase(iface.Name),
+ ServiceName: vdlutil.FirstRuneToUpper(iface.Name),
}
}
@@ -222,8 +222,8 @@
AccessModifier: accessModifierForName(embedMethod.Name),
CallingArgsLeadingComma: javaCallingArgStr(embedMethod.InArgs, true),
DeclarationArgs: javaDeclarationArgStr(embedMethod.InArgs, env, true),
- LocalStubVarName: vdlutil.ToCamelCase(iface.Name) + "ClientStub",
- Name: vdlutil.ToCamelCase(embedMethod.Name),
+ LocalStubVarName: vdlutil.FirstRuneToLower(iface.Name) + "ClientStub",
+ Name: vdlutil.FirstRuneToLower(embedMethod.Name),
RetType: clientInterfaceOutArg(iface, embedMethod, false, env),
Returns: len(embedMethod.OutArgs) >= 1 || isStreamingMethod(embedMethod),
}
@@ -234,8 +234,8 @@
embeds := []clientStubEmbed{}
for _, embed := range allEmbeddedIfaces(iface) {
embeds = append(embeds, clientStubEmbed{
- LocalStubVarName: vdlutil.ToCamelCase(embed.Name) + "ClientStub",
- StubClassName: javaPath(javaGenPkgPath(path.Join(embed.File.Package.GenPath, toUpperCamelCase(embed.Name)+"ClientStub"))),
+ LocalStubVarName: vdlutil.FirstRuneToLower(embed.Name) + "ClientStub",
+ StubClassName: javaPath(javaGenPkgPath(path.Join(embed.File.Package.GenPath, vdlutil.FirstRuneToUpper(embed.Name)+"ClientStub"))),
})
}
embedMethods := []clientStubEmbedMethod{}
@@ -246,7 +246,7 @@
for i, method := range iface.Methods {
methods[i] = processClientStubMethod(iface, method, env)
}
- javaServiceName := toUpperCamelCase(iface.Name)
+ javaServiceName := vdlutil.FirstRuneToUpper(iface.Name)
data := struct {
AccessModifier string
EmbedMethods []clientStubEmbedMethod
diff --git a/lib/vdl/codegen/java/file_complex.go b/lib/vdl/codegen/java/file_complex.go
index f415419..8ca15cb 100644
--- a/lib/vdl/codegen/java/file_complex.go
+++ b/lib/vdl/codegen/java/file_complex.go
@@ -7,6 +7,7 @@
"v.io/v23/vdl"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const complexTmpl = `
@@ -49,7 +50,7 @@
default:
panic(fmt.Errorf("val: unhandled kind: %v", kind))
}
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/file_enum.go b/lib/vdl/codegen/java/file_enum.go
index 166650c..00b82d7 100644
--- a/lib/vdl/codegen/java/file_enum.go
+++ b/lib/vdl/codegen/java/file_enum.go
@@ -5,6 +5,7 @@
"log"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const enumTmpl = `
@@ -52,7 +53,7 @@
for i := 0; i < tdef.Type.NumEnumLabel(); i++ {
labels[i] = tdef.Type.EnumLabel(i)
}
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
EnumLabels []string
diff --git a/lib/vdl/codegen/java/file_errors.go b/lib/vdl/codegen/java/file_errors.go
index 0dee049..090242a 100644
--- a/lib/vdl/codegen/java/file_errors.go
+++ b/lib/vdl/codegen/java/file_errors.go
@@ -110,7 +110,7 @@
errors[j].ActionName = vdlutil.ToConstCase(err.RetryCode.String())
errors[j].EnglishFmt = err.English
errors[j].Formats = formats
- errors[j].MethodName = "make" + toUpperCamelCase(err.Name)
+ errors[j].MethodName = "make" + vdlutil.FirstRuneToUpper(err.Name)
errors[j].MethodArgs = javaDeclarationArgStr(err.Params, env, true)
errors[j].Params = javaCallingArgStr(err.Params, false)
errors[j].ParamTypes = javaCallingArgTypeStr(err.Params, env)
diff --git a/lib/vdl/codegen/java/file_list.go b/lib/vdl/codegen/java/file_list.go
index 1a392e3..2aa4359 100644
--- a/lib/vdl/codegen/java/file_list.go
+++ b/lib/vdl/codegen/java/file_list.go
@@ -5,6 +5,7 @@
"log"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const listTmpl = `// This file was auto-generated by the veyron vdl tool.
@@ -33,7 +34,7 @@
// genJavaListFile generates the Java class file for the provided named list type.
func genJavaListFile(tdef *compile.TypeDef, env *compile.Env) JavaFileInfo {
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/file_map.go b/lib/vdl/codegen/java/file_map.go
index 078878a..85fa698 100644
--- a/lib/vdl/codegen/java/file_map.go
+++ b/lib/vdl/codegen/java/file_map.go
@@ -5,6 +5,7 @@
"log"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const mapTmpl = `// This file was auto-generated by the veyron vdl tool.
@@ -34,7 +35,7 @@
// genJavaMapFile generates the Java class file for the provided named map type.
func genJavaMapFile(tdef *compile.TypeDef, env *compile.Env) JavaFileInfo {
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/file_primitive.go b/lib/vdl/codegen/java/file_primitive.go
index e392a77..c54bc4b 100644
--- a/lib/vdl/codegen/java/file_primitive.go
+++ b/lib/vdl/codegen/java/file_primitive.go
@@ -6,6 +6,7 @@
"v.io/v23/vdl"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const primitiveTmpl = `
@@ -67,7 +68,7 @@
// genJavaPrimitiveFile generates the Java class file for the provided user-defined type.
func genJavaPrimitiveFile(tdef *compile.TypeDef, env *compile.Env) JavaFileInfo {
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/file_server_interface.go b/lib/vdl/codegen/java/file_server_interface.go
index aeec6e0..88ceac4 100644
--- a/lib/vdl/codegen/java/file_server_interface.go
+++ b/lib/vdl/codegen/java/file_server_interface.go
@@ -55,7 +55,7 @@
AccessModifier: accessModifierForName(method.Name),
Args: args,
Doc: method.Doc,
- Name: vdlutil.ToCamelCase(method.Name),
+ Name: vdlutil.FirstRuneToLower(method.Name),
RetType: serverInterfaceOutArg(method, iface, env),
}
}
@@ -67,7 +67,7 @@
for i, method := range iface.Methods {
methods[i] = processServerInterfaceMethod(method, iface, env)
}
- javaServiceName := toUpperCamelCase(iface.Name)
+ javaServiceName := vdlutil.FirstRuneToUpper(iface.Name)
data := struct {
AccessModifier string
Extends string
diff --git a/lib/vdl/codegen/java/file_server_wrapper.go b/lib/vdl/codegen/java/file_server_wrapper.go
index cc975b4..0b25bb1 100644
--- a/lib/vdl/codegen/java/file_server_wrapper.go
+++ b/lib/vdl/codegen/java/file_server_wrapper.go
@@ -189,7 +189,7 @@
CallingArgTypes: callArgTypes,
DeclarationArgs: javaDeclarationArgStr(method.InArgs, env, true),
IsStreaming: isStreamingMethod(method),
- Name: vdlutil.ToCamelCase(method.Name),
+ Name: vdlutil.FirstRuneToLower(method.Name),
RecvType: javaType(method.InStream, true, env),
RetType: clientInterfaceOutArg(iface, method, true, env),
RetJavaTypes: retArgTypes,
@@ -205,8 +205,8 @@
AccessModifier: accessModifierForName(embedMethod.Name),
CallingArgs: javaCallingArgStr(embedMethod.InArgs, true),
DeclarationArgs: javaDeclarationArgStr(embedMethod.InArgs, env, true),
- LocalWrapperVarName: vdlutil.ToCamelCase(iface.Name) + "Wrapper",
- Name: vdlutil.ToCamelCase(embedMethod.Name),
+ LocalWrapperVarName: vdlutil.FirstRuneToLower(iface.Name) + "Wrapper",
+ Name: vdlutil.FirstRuneToLower(embedMethod.Name),
RetType: clientInterfaceOutArg(iface, embedMethod, true, env),
Returns: len(embedMethod.OutArgs) >= 1,
}
@@ -218,8 +218,8 @@
embeds := []serverWrapperEmbed{}
for _, embed := range allEmbeddedIfaces(iface) {
embeds = append(embeds, serverWrapperEmbed{
- WrapperClassName: javaPath(javaGenPkgPath(path.Join(embed.File.Package.GenPath, toUpperCamelCase(embed.Name+"ServerWrapper")))),
- LocalWrapperVarName: vdlutil.ToCamelCase(embed.Name) + "Wrapper",
+ WrapperClassName: javaPath(javaGenPkgPath(path.Join(embed.File.Package.GenPath, vdlutil.FirstRuneToUpper(embed.Name+"ServerWrapper")))),
+ LocalWrapperVarName: vdlutil.FirstRuneToLower(embed.Name) + "Wrapper",
})
}
methodTags := make(map[string][]methodTag)
@@ -234,15 +234,14 @@
tags[j].Value = javaConstVal(tag, env)
tags[j].Type = javaReflectType(tag.Type(), env)
}
- name := vdlutil.ToCamelCase(method.Name)
- methodTags[name] = tags
+ methodTags[vdlutil.FirstRuneToLower(method.Name)] = tags
methods[i] = processServerWrapperMethod(iface, method, env, tags)
}
embedMethods := []serverWrapperEmbedMethod{}
for _, embedMao := range dedupedEmbeddedMethodAndOrigins(iface) {
embedMethods = append(embedMethods, processServerWrapperEmbedMethod(embedMao.Origin, embedMao.Method, env))
}
- javaServiceName := toUpperCamelCase(iface.Name)
+ javaServiceName := vdlutil.FirstRuneToUpper(iface.Name)
data := struct {
AccessModifier string
EmbedMethods []serverWrapperEmbedMethod
diff --git a/lib/vdl/codegen/java/file_set.go b/lib/vdl/codegen/java/file_set.go
index 433afb6..c922558 100644
--- a/lib/vdl/codegen/java/file_set.go
+++ b/lib/vdl/codegen/java/file_set.go
@@ -5,6 +5,7 @@
"log"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const setTmpl = `// This file was auto-generated by the veyron vdl tool.
@@ -34,7 +35,7 @@
// genJavaSetFile generates the Java class file for the provided named set type.
func genJavaSetFile(tdef *compile.TypeDef, env *compile.Env) JavaFileInfo {
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/file_struct.go b/lib/vdl/codegen/java/file_struct.go
index 50c2ccd..3ec3800 100644
--- a/lib/vdl/codegen/java/file_struct.go
+++ b/lib/vdl/codegen/java/file_struct.go
@@ -137,7 +137,7 @@
buf.WriteString("final ")
buf.WriteString(javaType(fld.Type, false, env))
buf.WriteString(" ")
- buf.WriteString(vdlutil.ToCamelCase(fld.Name))
+ buf.WriteString(vdlutil.FirstRuneToLower(fld.Name))
}
return buf.String()
}
@@ -150,17 +150,17 @@
fields[i] = structDefinitionField{
AccessModifier: accessModifierForName(fld.Name),
Class: javaType(fld.Type, true, env),
- HashcodeComputation: javaHashCode(vdlutil.ToCamelCase(fld.Name), fld.Type, env),
+ HashcodeComputation: javaHashCode(vdlutil.FirstRuneToLower(fld.Name), fld.Type, env),
IsClass: isClass(fld.Type, env),
IsArray: isJavaNativeArray(fld.Type, env),
- LowercaseName: vdlutil.ToCamelCase(fld.Name),
+ LowercaseName: vdlutil.FirstRuneToLower(fld.Name),
Name: fld.Name,
Type: javaType(fld.Type, false, env),
ZeroValue: javaZeroValue(fld.Type, env),
}
}
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/file_union.go b/lib/vdl/codegen/java/file_union.go
index a5cc3f3..e8fd054 100644
--- a/lib/vdl/codegen/java/file_union.go
+++ b/lib/vdl/codegen/java/file_union.go
@@ -5,6 +5,7 @@
"log"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
const unionTmpl = `
@@ -76,7 +77,7 @@
ZeroValue: javaZeroValue(fld.Type, env),
}
}
- javaTypeName := toUpperCamelCase(tdef.Name)
+ javaTypeName := vdlutil.FirstRuneToUpper(tdef.Name)
data := struct {
AccessModifier string
Doc string
diff --git a/lib/vdl/codegen/java/util_case.go b/lib/vdl/codegen/java/util_case.go
deleted file mode 100644
index 76ded03..0000000
--- a/lib/vdl/codegen/java/util_case.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package java
-
-import (
- "unicode"
- "unicode/utf8"
-)
-
-// toUpperCamelCase converts thisString to ThisString.
-func toUpperCamelCase(s string) string {
- if s == "" {
- return ""
- }
- r, n := utf8.DecodeRuneInString(s)
- return string(unicode.ToUpper(r)) + s[n:]
-}
diff --git a/lib/vdl/codegen/java/util_interface.go b/lib/vdl/codegen/java/util_interface.go
index 4ac709b..43b7c52 100644
--- a/lib/vdl/codegen/java/util_interface.go
+++ b/lib/vdl/codegen/java/util_interface.go
@@ -5,6 +5,7 @@
"path"
"v.io/x/ref/lib/vdl/compile"
+ "v.io/x/ref/lib/vdl/vdlutil"
)
// allEmbeddedIfaces returns all unique interfaces in the embed tree
@@ -13,7 +14,7 @@
added := make(map[string]bool)
for _, eIface := range iface.Embeds {
for _, eIface = range append(allEmbeddedIfaces(eIface), eIface) {
- path := path.Join(eIface.File.Package.GenPath, toUpperCamelCase(eIface.Name))
+ path := path.Join(eIface.File.Package.GenPath, vdlutil.FirstRuneToUpper(eIface.Name))
if _, ok := added[path]; ok { // already added iface
continue
}
@@ -27,7 +28,7 @@
// interfaceFullyQualifiedName outputs the fully qualified name of an interface
// e.g. "com.a.B"
func interfaceFullyQualifiedName(iface *compile.Interface) string {
- return path.Join(javaGenPkgPath(iface.File.Package.GenPath), toUpperCamelCase(iface.Name))
+ return path.Join(javaGenPkgPath(iface.File.Package.GenPath), vdlutil.FirstRuneToUpper(iface.Name))
}
// javaClientExtendsStr creates an extends clause for a client interface
diff --git a/lib/vdl/codegen/java/util_type.go b/lib/vdl/codegen/java/util_type.go
index 5fae3f6..1e3efa1 100644
--- a/lib/vdl/codegen/java/util_type.go
+++ b/lib/vdl/codegen/java/util_type.go
@@ -16,7 +16,7 @@
name, _ := javaBuiltInType(def.Type, forceClass)
return name
}
- return javaPath(path.Join(javaGenPkgPath(def.File.Package.GenPath), toUpperCamelCase(def.Name)))
+ return javaPath(path.Join(javaGenPkgPath(def.File.Package.GenPath), vdlutil.FirstRuneToUpper(def.Name)))
}
// javaReflectType returns java.reflect.Type string for provided VDL type.
diff --git a/lib/vdl/compile/compile.go b/lib/vdl/compile/compile.go
index fb07047..0913c99 100644
--- a/lib/vdl/compile/compile.go
+++ b/lib/vdl/compile/compile.go
@@ -103,8 +103,8 @@
}
// Initialize each file and put it in pkg.
pkgName := parse.InferPackageName(pfiles, env.Errors)
- if _, err := ValidIdent(pkgName, ReservedNormal); err != nil {
- env.Errors.Errorf("package %s is invalid: %s", pkgName, err.Error())
+ if _, err := validIdent(pkgName, reservedNormal); err != nil {
+ env.Errors.Errorf("package %s invalid name (%s)", pkgName, err.Error())
return nil
}
pkg := newPackage(pkgName, pkgpath, genpath, config)
diff --git a/lib/vdl/compile/compile_test.go b/lib/vdl/compile/compile_test.go
index 66e1831..ddc84bb 100644
--- a/lib/vdl/compile/compile_test.go
+++ b/lib/vdl/compile/compile_test.go
@@ -3,7 +3,6 @@
import (
"fmt"
"path"
- "strings"
"testing"
"v.io/x/ref/lib/vdl/build"
@@ -11,76 +10,6 @@
"v.io/x/ref/lib/vdl/vdltest"
)
-func TestValidExportedIdent(t *testing.T) {
- tests := []struct {
- ident string
- errstr string
- }{
- {"", `"" invalid`},
- {"xFirstLetterLower", `"xFirstLetterLower" must be exported`},
- {"0FirstLetterDigit", `"0FirstLetterDigit" invalid`},
- {"_FirstLetterPunct", `"_FirstLetterPunct" invalid`},
- {" FirstLetterSpace", `" FirstLetterSpace" invalid`},
- {"X.InvalidPunct", `"X.InvalidPunct" invalid`},
- {"X InvalidSpace", `"X InvalidSpace" invalid`},
- {"X\nNonAlphaNum", `"X\nNonAlphaNum" invalid`},
- {"X", ""},
- {"XYZ", ""},
- {"Xyz", ""},
- {"Xyz123", ""},
- {"Xyz_123", ""},
- }
- for _, test := range tests {
- err := compile.ValidExportedIdent(test.ident, compile.ReservedNormal)
- errstr := fmt.Sprint(err)
- if test.errstr != "" && !strings.Contains(errstr, test.errstr) {
- t.Errorf(`ValidExportedIdent(%s) got error %q, want substr %q`, test.ident, errstr, test.errstr)
- }
- if test.errstr == "" && err != nil {
- t.Errorf(`ValidExportedIdent(%s) got error %q, want nil`, test.ident, errstr)
- }
- }
-}
-
-func TestValidIdent(t *testing.T) {
- tests := []struct {
- name string
- exported bool
- errstr string
- }{
- {"", false, `"" invalid`},
- {"0FirstLetterDigit", false, `"0FirstLetterDigit" invalid`},
- {"_FirstLetterPunct", false, `"_FirstLetterPunct" invalid`},
- {" FirstLetterSpace", false, `" FirstLetterSpace" invalid`},
- {"x.InvalidPunct", false, `"x.InvalidPunct" invalid`},
- {"x InvalidSpace", false, `"x InvalidSpace" invalid`},
- {"x\nNonAlphaNum", false, `"x\nNonAlphaNum" invalid`},
- {"X", true, ""},
- {"XYZ", true, ""},
- {"Xyz", true, ""},
- {"Xyz123", true, ""},
- {"Xyz_123", true, ""},
- {"x", false, ""},
- {"xYZ", false, ""},
- {"xyz", false, ""},
- {"xyz123", false, ""},
- {"xyz_123", false, ""},
- }
- for _, test := range tests {
- exported, err := compile.ValidIdent(test.name, compile.ReservedNormal)
- errstr := fmt.Sprint(err)
- if test.errstr != "" && !strings.Contains(errstr, test.errstr) {
- t.Errorf(`ValidIdent(%s) got error %q, want substr %q`, test.name, errstr, test.errstr)
- }
- if test.errstr == "" && err != nil {
- t.Errorf(`ValidIdent(%s) got error %q, want nil`, test.name, errstr)
- }
- if got, want := exported, test.exported; got != want {
- t.Errorf(`ValidIdent(%s) got exported %v, want %v`, test.name, got, want)
- }
- }
-}
-
type f map[string]string
func TestParseAndCompile(t *testing.T) {
@@ -91,7 +20,7 @@
expect func(t *testing.T, name string, pkg *compile.Package)
}{
{"test1", f{"1.vdl": pkg1file1, "2.vdl": pkg1file2}, "", expectPkg1},
- {"test2", f{"1.vdl": "package native"}, `"native" invalid identifier`, nil},
+ {"test2", f{"1.vdl": "package native"}, `reserved word in a generated language`, nil},
}
for _, test := range tests {
path := path.Join("a/b", test.name)
diff --git a/lib/vdl/compile/const.go b/lib/vdl/compile/const.go
index 1e151ea..1f49c4b 100644
--- a/lib/vdl/compile/const.go
+++ b/lib/vdl/compile/const.go
@@ -63,7 +63,7 @@
for ix := range cd.pkg.Files {
file, pfile := cd.pkg.Files[ix], cd.pfiles[ix]
for _, pdef := range pfile.ConstDefs {
- export, err := ValidIdent(pdef.Name, ReservedNormal)
+ export, err := validConstIdent(pdef.Name, reservedNormal)
if err != nil {
cd.env.prefixErrorf(file, pdef.Pos, err, "const %s invalid name", pdef.Name)
continue // keep going to catch more errors
diff --git a/lib/vdl/compile/error.go b/lib/vdl/compile/error.go
index cf19df5..c02e612 100644
--- a/lib/vdl/compile/error.go
+++ b/lib/vdl/compile/error.go
@@ -37,7 +37,7 @@
file, pfile := pkg.Files[index], pfiles[index]
for _, ped := range pfile.ErrorDefs {
name, detail := ped.Name, identDetail("error", file, ped.Pos)
- export, err := ValidIdent(name, ReservedNormal)
+ export, err := validIdent(name, reservedNormal)
if err != nil {
env.prefixErrorf(file, ped.Pos, err, "error %s invalid name", name)
continue
@@ -104,7 +104,7 @@
continue
}
seen[pname] = pparam
- if _, err := ValidIdent(pname, ReservedCamelCase); err != nil {
+ if _, err := validIdent(pname, reservedFirstRuneLower); err != nil {
env.prefixErrorf(file, pos, err, "error %s param %s invalid", name, pname)
continue
}
diff --git a/lib/vdl/compile/interface.go b/lib/vdl/compile/interface.go
index a1f0962..1bd0651 100644
--- a/lib/vdl/compile/interface.go
+++ b/lib/vdl/compile/interface.go
@@ -44,7 +44,7 @@
for ix := range id.pkg.Files {
file, pfile := id.pkg.Files[ix], id.pfiles[ix]
for _, pdef := range pfile.Interfaces {
- export, err := ValidIdent(pdef.Name, ReservedNormal)
+ export, err := validIdent(pdef.Name, reservedNormal)
if err != nil {
id.env.prefixErrorf(file, pdef.Pos, err, "interface %s invalid name", pdef.Name)
continue // keep going to catch more errors
@@ -151,7 +151,7 @@
continue // keep going to catch more errors
}
seen[pm.Name] = pm
- if err := ValidExportedIdent(pm.Name, ReservedCamelCase); err != nil {
+ if err := validExportedIdent(pm.Name, reservedFirstRuneLower); err != nil {
id.env.Errorf(file, pm.Pos, "method %s name (%s)", pm.Name, err)
continue // keep going to catch more errors
}
@@ -185,7 +185,7 @@
continue // keep going to catch more errors
}
if parg.Name != "" {
- if _, err := ValidIdent(parg.Name, ReservedCamelCase); err != nil {
+ if _, err := validIdent(parg.Name, reservedFirstRuneLower); err != nil {
id.env.prefixErrorf(file, parg.Pos, err, "method %s invalid arg %s", method.Name, parg.Name)
continue // keep going to catch more errors
}
diff --git a/lib/vdl/compile/reserved_words.go b/lib/vdl/compile/reserved_words.go
index e73b9d3..df625e2 100644
--- a/lib/vdl/compile/reserved_words.go
+++ b/lib/vdl/compile/reserved_words.go
@@ -4,27 +4,27 @@
"v.io/x/ref/lib/vdl/vdlutil"
)
-// ReservedMode indicates which mode to perform reserved-word checking:
-// ReservedNormal - Check the given identifier.
-// ReservedCamelCase - Check the given identifier in lower-camel-case.
-type ReservedMode int
+// reservedMode indicates which mode to perform reserved-word checking:
+// reservedNormal - Check identifier as-is.
+// reservedFirstRuneLower - Check identifier with the first rune lowercased.
+type reservedMode int
const (
- ReservedNormal ReservedMode = iota
- ReservedCamelCase
+ reservedNormal reservedMode = iota
+ reservedFirstRuneLower
)
// reservedWord checks if identifiers are reserved after they are converted to the native form for the language.
-func reservedWord(ident string, mode ReservedMode) bool {
+func reservedWord(ident string, mode reservedMode) bool {
return reservedWordJava(ident, mode) ||
reservedWordJavascript(ident, mode) ||
reservedWordGo(ident)
// TODO(bprosnitz) Other identifiers? (set, assert, raise, with, etc)
}
-func reservedWordJava(ident string, mode ReservedMode) bool {
- if mode == ReservedCamelCase {
- ident = vdlutil.ToCamelCase(ident)
+func reservedWordJava(ident string, mode reservedMode) bool {
+ if mode == reservedFirstRuneLower {
+ ident = vdlutil.FirstRuneToLower(ident)
}
_, isReserved := javaReservedWords[ident]
return isReserved
@@ -116,9 +116,9 @@
"var": true,
}
-func reservedWordJavascript(ident string, mode ReservedMode) bool {
- if mode == ReservedCamelCase {
- ident = vdlutil.ToCamelCase(ident)
+func reservedWordJavascript(ident string, mode reservedMode) bool {
+ if mode == reservedFirstRuneLower {
+ ident = vdlutil.FirstRuneToLower(ident)
}
_, isReserved := javascriptReservedWords[ident]
return isReserved
diff --git a/lib/vdl/compile/result.go b/lib/vdl/compile/result.go
index dc34b7c..9094eef 100644
--- a/lib/vdl/compile/result.go
+++ b/lib/vdl/compile/result.go
@@ -5,6 +5,7 @@
"path"
"regexp"
"strings"
+ "unicode"
"v.io/v23/vdl"
"v.io/v23/vdlroot/vdltool"
@@ -481,28 +482,60 @@
regexpIdent = regexp.MustCompile("^[A-Za-z][A-Za-z0-9_]*$")
)
-// ValidIdent returns (exported, err) where err is non-nil iff the identifer is
-// valid, and exported is true if the identifier is exported.
-// Valid: "^[A-Za-z][A-Za-z0-9_]*$"
-func ValidIdent(ident string, mode ReservedMode) (bool, error) {
+// hasUpperAcronym returns true if s contains an uppercase acronym; if s
+// contains a run of two uppercase letters not followed by a lowercase letter.
+// The lowercase letter special-case is to allow identifiers like "AMethod".
+func hasUpperAcronym(s string) bool {
+ upperRun := 0
+ for _, r := range s {
+ switch {
+ case upperRun == 2 && !unicode.IsLower(r):
+ return true
+ case unicode.IsUpper(r):
+ upperRun++
+ default:
+ upperRun = 0
+ }
+ }
+ return upperRun >= 2
+}
+
+// validConstIdent returns (exported, err) where err is non-nil iff the
+// identifer is valid as the name of a const. Exported is true if the
+// identifier is exported. Valid: "^[A-Za-z][A-Za-z0-9_]*$"
+func validConstIdent(ident string, mode reservedMode) (bool, error) {
if re := regexpIdent; !re.MatchString(ident) {
- return false, fmt.Errorf("%q invalid, allowed regexp: %q", ident, re)
+ return false, fmt.Errorf("allowed regexp: %q", re)
}
if reservedWord(ident, mode) {
- return false, fmt.Errorf("%q invalid identifier (keyword in a generated language)", ident)
+ return false, fmt.Errorf("reserved word in a generated language")
}
return ident[0] >= 'A' && ident[0] <= 'Z', nil
}
-// ValidExportedIdent returns a non-nil error iff the identifier is valid and
+// validIdent is like validConstIdent, but applies to all non-const identifiers.
+// It adds an additional check for uppercase acronyms.
+func validIdent(ident string, mode reservedMode) (bool, error) {
+ exported, err := validConstIdent(ident, mode)
+ if err != nil {
+ return false, err
+ }
+ if hasUpperAcronym(ident) {
+ // TODO(toddw): Link to documentation explaining why.
+ return false, fmt.Errorf("acronyms must use CamelCase")
+ }
+ return exported, nil
+}
+
+// validExportedIdent returns a non-nil error iff the identifier is valid and
// exported.
-func ValidExportedIdent(ident string, mode ReservedMode) error {
- exported, err := ValidIdent(ident, mode)
+func validExportedIdent(ident string, mode reservedMode) error {
+ exported, err := validIdent(ident, mode)
if err != nil {
return err
}
if !exported {
- return fmt.Errorf("%q must be exported", ident)
+ return fmt.Errorf("must be exported")
}
return nil
}
diff --git a/lib/vdl/compile/result_test.go b/lib/vdl/compile/result_test.go
new file mode 100644
index 0000000..b91c064
--- /dev/null
+++ b/lib/vdl/compile/result_test.go
@@ -0,0 +1,141 @@
+package compile
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+)
+
+func TestValidConstIdent(t *testing.T) {
+ tests := []struct {
+ name string
+ exported bool
+ errstr string
+ }{
+ {"", false, "allowed regexp"},
+ {"0FirstLetterDigit", false, "allowed regexp"},
+ {"_FirstLetterPunct", false, "allowed regexp"},
+ {" FirstLetterSpace", false, "allowed regexp"},
+ {"x.InvalidPunct", false, "allowed regexp"},
+ {"x InvalidSpace", false, "allowed regexp"},
+ {"x\nNonAlphaNum", false, "allowed regexp"},
+ {"ABC", true, ""},
+ {"xxABC", false, ""},
+ {"xxABCyy", false, ""},
+ {"ID", true, ""},
+ {"ID_", true, ""},
+ {"ID2", true, ""},
+ {"xxID", false, ""},
+ {"xxIDyy", false, ""},
+ {"A_M", true, ""},
+ {"B2B", true, ""},
+ {"X", true, ""},
+ {"Xyz", true, ""},
+ {"Xyz123", true, ""},
+ {"Xyz_123", true, ""},
+ {"x", false, ""},
+ {"xyz", false, ""},
+ {"xyz123", false, ""},
+ {"xyz_123", false, ""},
+ }
+ for _, test := range tests {
+ exported, err := validConstIdent(test.name, reservedNormal)
+ errstr := fmt.Sprint(err)
+ if test.errstr != "" && !strings.Contains(errstr, test.errstr) {
+ t.Errorf(`validConstIdent(%s) got error %q, want substr %q`, test.name, errstr, test.errstr)
+ }
+ if test.errstr == "" && err != nil {
+ t.Errorf(`validConstIdent(%s) got error %q, want nil`, test.name, errstr)
+ }
+ if got, want := exported, test.exported; got != want {
+ t.Errorf(`validConstIdent(%s) got exported %v, want %v`, test.name, got, want)
+ }
+ }
+}
+
+func TestValidIdent(t *testing.T) {
+ tests := []struct {
+ name string
+ exported bool
+ errstr string
+ }{
+ {"", false, "allowed regexp"},
+ {"0FirstLetterDigit", false, "allowed regexp"},
+ {"_FirstLetterPunct", false, "allowed regexp"},
+ {" FirstLetterSpace", false, "allowed regexp"},
+ {"x.InvalidPunct", false, "allowed regexp"},
+ {"x InvalidSpace", false, "allowed regexp"},
+ {"x\nNonAlphaNum", false, "allowed regexp"},
+ {"ABC", false, "acronyms must use CamelCase"},
+ {"xxABC", false, "acronyms must use CamelCase"},
+ {"xxABCyy", false, "acronyms must use CamelCase"},
+ {"ID", false, "acronyms must use CamelCase"},
+ {"ID_", false, "acronyms must use CamelCase"},
+ {"ID2", false, "acronyms must use CamelCase"},
+ {"xxID", false, "acronyms must use CamelCase"},
+ {"xxIDyy", false, ""},
+ {"A_M", true, ""},
+ {"B2B", true, ""},
+ {"X", true, ""},
+ {"Xyz", true, ""},
+ {"Xyz123", true, ""},
+ {"Xyz_123", true, ""},
+ {"x", false, ""},
+ {"xyz", false, ""},
+ {"xyz123", false, ""},
+ {"xyz_123", false, ""},
+ }
+ for _, test := range tests {
+ exported, err := validIdent(test.name, reservedNormal)
+ errstr := fmt.Sprint(err)
+ if test.errstr != "" && !strings.Contains(errstr, test.errstr) {
+ t.Errorf(`validIdent(%s) got error %q, want substr %q`, test.name, errstr, test.errstr)
+ }
+ if test.errstr == "" && err != nil {
+ t.Errorf(`validIdent(%s) got error %q, want nil`, test.name, errstr)
+ }
+ if got, want := exported, test.exported; got != want {
+ t.Errorf(`validIdent(%s) got exported %v, want %v`, test.name, got, want)
+ }
+ }
+}
+
+func TestValidExportedIdent(t *testing.T) {
+ tests := []struct {
+ ident string
+ errstr string
+ }{
+ {"", "allowed regexp"},
+ {"xFirstLetterLower", "must be exported"},
+ {"0FirstLetterDigit", "allowed regexp"},
+ {"_FirstLetterPunct", "allowed regexp"},
+ {" FirstLetterSpace", "allowed regexp"},
+ {"X.InvalidPunct", "allowed regexp"},
+ {"X InvalidSpace", "allowed regexp"},
+ {"X\nNonAlphaNum", "allowed regexp"},
+ {"ABC", "acronyms must use CamelCase"},
+ {"XxABC", "acronyms must use CamelCase"},
+ {"XxABCyy", "acronyms must use CamelCase"},
+ {"ID", "acronyms must use CamelCase"},
+ {"ID_", "acronyms must use CamelCase"},
+ {"ID2", "acronyms must use CamelCase"},
+ {"XxID", "acronyms must use CamelCase"},
+ {"XxIDyy", ""},
+ {"A_M", ""},
+ {"B2B", ""},
+ {"X", ""},
+ {"Xyz", ""},
+ {"Xyz123", ""},
+ {"Xyz_123", ""},
+ }
+ for _, test := range tests {
+ err := validExportedIdent(test.ident, reservedNormal)
+ errstr := fmt.Sprint(err)
+ if test.errstr != "" && !strings.Contains(errstr, test.errstr) {
+ t.Errorf(`validExportedIdent(%s) got error %q, want substr %q`, test.ident, errstr, test.errstr)
+ }
+ if test.errstr == "" && err != nil {
+ t.Errorf(`validExportedIdent(%s) got error %q, want nil`, test.ident, errstr)
+ }
+ }
+}
diff --git a/lib/vdl/compile/type.go b/lib/vdl/compile/type.go
index 46c9f77..ebe9fe8 100644
--- a/lib/vdl/compile/type.go
+++ b/lib/vdl/compile/type.go
@@ -97,7 +97,7 @@
}
func (td typeDefiner) makeTypeDefBuilder(file *File, pdef *parse.TypeDef) *typeDefBuilder {
- export, err := ValidIdent(pdef.Name, ReservedNormal)
+ export, err := validIdent(pdef.Name, reservedNormal)
if err != nil {
td.env.prefixErrorf(file, pdef.Pos, err, "type %s invalid name", pdef.Name)
return nil
@@ -114,7 +114,7 @@
ret.def.LabelDoc = make([]string, len(pt.Labels))
ret.def.LabelDocSuffix = make([]string, len(pt.Labels))
for index, plabel := range pt.Labels {
- if err := ValidExportedIdent(plabel.Name, ReservedCamelCase); err != nil {
+ if err := validExportedIdent(plabel.Name, reservedFirstRuneLower); err != nil {
td.env.prefixErrorf(file, plabel.Pos, err, "invalid enum label name %s", plabel.Name)
return nil
}
@@ -133,7 +133,7 @@
ret.def.FieldDoc = make([]string, len(fields))
ret.def.FieldDocSuffix = make([]string, len(fields))
for index, pfield := range fields {
- if err := ValidExportedIdent(pfield.Name, ReservedCamelCase); err != nil {
+ if err := validExportedIdent(pfield.Name, reservedFirstRuneLower); err != nil {
env.prefixErrorf(file, pfield.Pos, err, "invalid field name %s", pfield.Name)
return nil
}
diff --git a/lib/vdl/testdata/base/base.vdl b/lib/vdl/testdata/base/base.vdl
index 1a6976a..e1d14bb 100644
--- a/lib/vdl/testdata/base/base.vdl
+++ b/lib/vdl/testdata/base/base.vdl
@@ -187,23 +187,23 @@
FiveSquared = Five*Five
Six = uint64(6)
- CTObool = typeobject(bool)
- CTOstring = typeobject(string)
- CTObytes = typeobject([]byte)
- CTObyte = typeobject(byte)
- CTOuint16 = typeobject(uint16)
- CTOint16 = typeobject(int16)
- CTOfloat32 = typeobject(float32)
- CTOcomplex64 = typeobject(complex64)
- CTOenum = typeobject(NamedEnum)
- CTOArray = typeobject(NamedArray)
- CTOList = typeobject([]string)
- CTOSet = typeobject(set[string])
- CTOMap = typeobject(map[string]int64)
- CTOStruct = typeobject(Scalars)
- CTOUnion = typeobject(NamedUnion)
- CTOTypeObject = typeobject(typeobject)
- CTOAny = typeobject(any)
+ CTypeObject_bool = typeobject(bool)
+ CTypeObject_string = typeobject(string)
+ CTypeObject_bytes = typeobject([]byte)
+ CTypeObject_byte = typeobject(byte)
+ CTypeObject_uint16 = typeobject(uint16)
+ CTypeObject_int16 = typeobject(int16)
+ CTypeObject_float32 = typeobject(float32)
+ CTypeObject_complex64 = typeobject(complex64)
+ CTypeObject_enum = typeobject(NamedEnum)
+ CTypeObject_Array = typeobject(NamedArray)
+ CTypeObject_List = typeobject([]string)
+ CTypeObject_Set = typeobject(set[string])
+ CTypeObject_Map = typeobject(map[string]int64)
+ CTypeObject_Struct = typeobject(Scalars)
+ CTypeObject_Union = typeobject(NamedUnion)
+ CTypeObject_TypeObject = typeobject(typeobject)
+ CTypeObject_Any = typeobject(any)
)
type ServiceA interface {
diff --git a/lib/vdl/testdata/base/base.vdl.go b/lib/vdl/testdata/base/base.vdl.go
index b3e3731..10357c9 100644
--- a/lib/vdl/testdata/base/base.vdl.go
+++ b/lib/vdl/testdata/base/base.vdl.go
@@ -519,42 +519,42 @@
const FiveSquared = int32(25)
-var CTObool = vdl.TypeOf(false)
+var CTypeObject_bool = vdl.TypeOf(false)
-var CTOstring = vdl.TypeOf("")
+var CTypeObject_string = vdl.TypeOf("")
-var CTObytes = vdl.TypeOf([]byte(nil))
+var CTypeObject_bytes = vdl.TypeOf([]byte(nil))
-var CTObyte = vdl.TypeOf(byte(0))
+var CTypeObject_byte = vdl.TypeOf(byte(0))
-var CTOuint16 = vdl.TypeOf(uint16(0))
+var CTypeObject_uint16 = vdl.TypeOf(uint16(0))
-var CTOint16 = vdl.TypeOf(int16(0))
+var CTypeObject_int16 = vdl.TypeOf(int16(0))
-var CTOfloat32 = vdl.TypeOf(float32(0))
+var CTypeObject_float32 = vdl.TypeOf(float32(0))
-var CTOcomplex64 = vdl.TypeOf(complex64(0))
+var CTypeObject_complex64 = vdl.TypeOf(complex64(0))
-var CTOenum = vdl.TypeOf(NamedEnumA)
+var CTypeObject_enum = vdl.TypeOf(NamedEnumA)
-var CTOArray = vdl.TypeOf(NamedArray{})
+var CTypeObject_Array = vdl.TypeOf(NamedArray{})
-var CTOList = vdl.TypeOf([]string(nil))
+var CTypeObject_List = vdl.TypeOf([]string(nil))
-var CTOSet = vdl.TypeOf(map[string]struct{}(nil))
+var CTypeObject_Set = vdl.TypeOf(map[string]struct{}(nil))
-var CTOMap = vdl.TypeOf(map[string]int64(nil))
+var CTypeObject_Map = vdl.TypeOf(map[string]int64(nil))
-var CTOStruct = vdl.TypeOf(Scalars{
+var CTypeObject_Struct = vdl.TypeOf(Scalars{
A15: vdl.AnyType,
B14: NamedUnionA{false},
})
-var CTOUnion = vdl.TypeOf(NamedUnion(NamedUnionA{false}))
+var CTypeObject_Union = vdl.TypeOf(NamedUnion(NamedUnionA{false}))
-var CTOTypeObject = vdl.TypeObjectType
+var CTypeObject_TypeObject = vdl.TypeObjectType
-var CTOAny = vdl.AnyType
+var CTypeObject_Any = vdl.AnyType
var (
ErrNoParams1 = verror.Register("v.io/x/ref/lib/vdl/testdata/base.NoParams1", verror.NoRetry, "{1:}{2:} en msg")
diff --git a/lib/vdl/vdlutil/util.go b/lib/vdl/vdlutil/util.go
index 64eb424..2015283 100644
--- a/lib/vdl/vdlutil/util.go
+++ b/lib/vdl/vdlutil/util.go
@@ -6,12 +6,6 @@
"unicode/utf8"
)
-// ToCamelCase converts ThisString to thisString.
-// TODO(toddw): Remove this function, replace calls with FirstRuneToLower.
-func ToCamelCase(s string) string {
- return FirstRuneToLower(s)
-}
-
// FirstRuneToLower returns s with its first rune in lowercase.
func FirstRuneToLower(s string) string {
if s == "" {
@@ -55,8 +49,8 @@
s = s[size:]
prev, cur = cur, next
next, size = utf8.DecodeRuneInString(s)
- // We avoid checking boundary conditions because, for a rune r that is zero or utf8.RuneError:
- // unicode.Is{Letter,Digit,Lower,Upper}(r) == false
+ // We avoid checking boundary conditions because, for a rune r that is zero
+ // or utf8.RuneError: unicode.Is{Letter,Digit,Lower,Upper}(r) == false
if unicode.IsDigit(prev) && unicode.IsLetter(cur) || // Rule (1)
unicode.IsLetter(prev) && unicode.IsDigit(cur) || // Rule (2)
unicode.IsLower(prev) && unicode.IsUpper(cur) || // Rule (3)