blob: 44f710d0da020ec7a33e214e8b8f3c51db5c4544 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package java
import (
"bytes"
"fmt"
"log"
"strings"
"v.io/x/ref/lib/vdl/compile"
)
const arrayTmpl = header + `
// Source: {{.SourceFile}}
package {{.Package}};
{{ .Doc }}
@io.v.v23.vdl.GeneratedFromVdl(name = "{{.VdlTypeName}}")
@io.v.v23.vdl.ArrayLength({{.Length}})
{{ .AccessModifier }} class {{.Name}} extends io.v.v23.vdl.VdlArray<{{.ElemType}}> {
private static final long serialVersionUID = 1L;
/**
* Vdl type for {@link {{.Name}}}.
*/
public static final io.v.v23.vdl.VdlType VDL_TYPE =
io.v.v23.vdl.Types.getVdlTypeFromReflect({{.Name}}.class);
/**
* Creates a new instance of {@link {{.Name}}} with the given underlying array.
*
* @param arr underlying array
*/
public {{.Name}}({{.ElemType}}[] arr) {
super(VDL_TYPE, arr);
}
/**
* Creates a new zero-value instance of {@link {{.Name}}}.
*/
public {{.Name}}() {
this({{.ZeroValue}});
}
{{ if .ElemIsPrimitive }}
/**
* Creates a new instance of {@link {{.Name}}} with the given underlying array.
*
* @param arr underlying array
*/
public {{.Name}}({{ .ElemPrimitiveType }}[] arr) {
super(VDL_TYPE, convert(arr));
}
/**
* Converts the array into its primitive (array) type.
*/
public {{ .ElemPrimitiveType }}[] toPrimitiveArray() {
{{ .ElemPrimitiveType }}[] ret = new {{ .ElemPrimitiveType }}[size()];
for (int i = 0; i < size(); ++i) {
ret[i] = get(i);
}
return ret;
}
private static {{ .ElemType }}[] convert({{ .ElemPrimitiveType }}[] arr) {
{{ .ElemType }}[] ret = new {{ .ElemType }}[arr.length];
for (int i = 0; i < arr.length; ++i) {
ret[i] = arr[i];
}
return ret;
}
{{ end }}
}
`
// genJavaArrayFile generates the Java class file for the provided named array type.
func genJavaArrayFile(tdef *compile.TypeDef, env *compile.Env) JavaFileInfo {
name, access := javaTypeName(tdef, env)
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)
data := struct {
AccessModifier string
Doc string
ElemType string
ElemIsPrimitive bool
ElemPrimitiveType string
FileDoc string
Length int
Name string
Package string
SourceFile string
VdlTypeName string
VdlTypeString string
ZeroValue string
}{
AccessModifier: access,
Doc: javaDoc(tdef.Doc, tdef.DocSuffix),
ElemType: elemType,
ElemIsPrimitive: !isClass(tdef.Type.Elem(), env),
ElemPrimitiveType: javaType(tdef.Type.Elem(), false, env),
FileDoc: tdef.File.Package.FileDoc,
Length: tdef.Type.Len(),
Name: name,
Package: javaPath(javaGenPkgPath(tdef.File.Package.GenPath)),
SourceFile: tdef.File.BaseName,
VdlTypeName: tdef.Type.Name(),
VdlTypeString: tdef.Type.String(),
ZeroValue: zeroValue,
}
var buf bytes.Buffer
err := parseTmpl("array", arrayTmpl).Execute(&buf, data)
if err != nil {
log.Fatalf("vdl: couldn't execute array template: %v", err)
}
return JavaFileInfo{
Name: name + ".java",
Data: buf.Bytes(),
}
}