Skip to content

Commit

Permalink
update templates
Browse files Browse the repository at this point in the history
  • Loading branch information
mkideal committed Oct 1, 2024
1 parent 93d8743 commit 2211736
Show file tree
Hide file tree
Showing 38 changed files with 370 additions and 249 deletions.
18 changes: 1 addition & 17 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -102,23 +102,7 @@ example/clean:
example/gen:
@echo "Running generate example..."
@rm -rf ${EXAMPLE_DIR}/gen
@NEXTNOCOPYBUILTIN=1 ${BUILD_BIN_DIR}/next \
-D PROJECT_NAME=demo \
-O go=${EXAMPLE_DIR}/gen/go -T go=${EXAMPLE_DIR}/templates/go \
-O java=${EXAMPLE_DIR}/gen/java -T java=${EXAMPLE_DIR}/templates/java \
-O cpp=${EXAMPLE_DIR}/gen/cpp -T cpp=${EXAMPLE_DIR}/templates/cpp \
-O csharp=${EXAMPLE_DIR}/gen/csharp -T csharp=${EXAMPLE_DIR}/templates/csharp \
-O c=${EXAMPLE_DIR}/gen/c -T c=${EXAMPLE_DIR}/templates/c \
-O rust=${EXAMPLE_DIR}/gen/rust/src -T rust=${EXAMPLE_DIR}/templates/rust \
-O protobuf=${EXAMPLE_DIR}/gen/protobuf -T protobuf=${EXAMPLE_DIR}/templates/protobuf \
-O js=${EXAMPLE_DIR}/gen/js -T js=${EXAMPLE_DIR}/templates/js \
-O ts=${EXAMPLE_DIR}/gen/ts -T ts=${EXAMPLE_DIR}/templates/ts \
-O python=${EXAMPLE_DIR}/gen/python -T python=${EXAMPLE_DIR}/templates/python \
-O php=${EXAMPLE_DIR}/gen/php -T php=${EXAMPLE_DIR}/templates/php \
-O lua=${EXAMPLE_DIR}/gen/lua -T lua=${EXAMPLE_DIR}/templates/lua \
-M "c.vector=void*" -M "c.map=void*" \
-s -g ${EXAMPLE_DIR}/grammar.yaml \
${EXAMPLE_DIR}/next/
@NEXTNOCOPYBUILTIN=1 ${BUILD_BIN_DIR}/next build ${EXAMPLE_DIR}
@if [ -d ${EXAMPLE_DIR}/gen/rust ]; then cd ${EXAMPLE_DIR}/gen/rust && cargo init --vcs none -q; fi

.PHONY: clean
Expand Down
12 changes: 8 additions & 4 deletions builtin/c.npl
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ typedef unsigned char _Bool;

{{/* next/c/const:name: Generates the name for a constant */}}
{{- define "next/c/const:name" -}}
{{render "decl.name" (.Name | snakeCase) | upper}}
{{- render "decl.name" (render "node:snake.case.name" .) | upper}}
{{- end}}

{{/* next/c/enum: Generates an enum type declaration */}}
Expand Down Expand Up @@ -154,7 +154,7 @@ typedef struct {{next .Type}} {
{{- define "next/c/enum.member" -}}
{{- next .Doc -}}
{{- if .Decl.MemberType.Kind.IsInteger -}}
{{next .Decl.Type}}_{{render "enum.member:name" .}} = {{next .Value}},{{next .Comment}}
{{- next .Decl.Type}}_{{render "enum.member:name" .}} = {{next .Value}},{{next .Comment}}
{{- else -}}
#define {{next .Decl.Type}}_{{render "enum.member:name" .}} (({{next .Decl.Type}}){ {{- next .Value -}} }){{next .Comment}}
{{- end}}
Expand All @@ -174,6 +174,10 @@ typedef struct {{next .Type}} {
{{render "dict:struct.field.decl" (dict "type" .Type "name" (render "struct.field:name" .))}};{{next .Comment}}
{{end}}

{{- define "next/c/struct.field:name" -}}
{{- render "node:snake.case.name" .}}
{{- end}}

{{- define "next/c/dict:struct.field.decl" -}}
{{- $type := .type -}}
{{- $name := .name -}}
Expand Down Expand Up @@ -205,12 +209,12 @@ struct {{next .Type}} {

{{/* next/c/interface.method:name: Generates the name for an interface method */}}
{{- define "next/c/interface.method:name" -}}
{{snakeCase .Name}}
{{- render "node:snake.case.name" .}}
{{- end}}

{{/* next/c/interface.method.param: Generates a parameter declaration for an interface method */}}
{{- define "next/c/interface.method.param" -}}
{{next .Type}} {{render "interface.method.param:name" .}}
{{- next .Type}} {{render "interface.method.param:name" .}}
{{- end}}

{{/* next/c/interface.method.param:name: Generates the name for an interface method parameter */}}
Expand Down
12 changes: 10 additions & 2 deletions builtin/cpp.npl
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,13 @@ public:
{{- $zero := render "type:zero" .Type -}}
{{- if $zero}}{{$zero = printf " = {%s}" $zero}}{{end -}}
{{- next .Doc -}}
{{- next .Type}} {{render "struct.field:name" . | camelCase}}{{$zero}};{{next .Comment}}
{{- next .Type}} {{render "struct.field:name" .}}{{$zero}};{{next .Comment}}
{{end}}

{{- define "next/cpp/struct.field:name" -}}
{{- render "node:snake.case.name" .}}
{{- end}}

{{/* next/cpp/interface: Generates an abstract base class declaration (interface in C++ is typically implemented as an abstract class) */}}
{{- define "next/cpp/interface" -}}
{{- next .Doc -}}
Expand All @@ -194,14 +198,18 @@ virtual {{next .Result}} {{render "interface.method:name" .}}({{next .Params}})

{{/* next/cpp/interface.method:name: Generates the name for an interface method */}}
{{- define "next/cpp/interface.method:name" -}}
{{- snakeCase .Name}}
{{- render "node:snake.case.name" .}}
{{- end}}

{{/* next/cpp/interface.method.param: Generates a parameter for an interface method */}}
{{- define "next/cpp/interface.method.param" -}}
{{- if not .Annotations.next.mut}}const {{end}}{{next .Type}}& {{render "interface.method.param:name" .}}
{{- end}}

{{- define "next/cpp/interface.method.param:name" -}}
{{- render "node:snake.case.name" .}}
{{- end}}

{{/* next/cpp/interface.method.result: Generates the return type for an interface method */}}
{{- define "next/cpp/interface.method.result" -}}
{{- if .Type -}}
Expand Down
8 changes: 6 additions & 2 deletions builtin/csharp.npl
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ public {{next .Type}} {{render "struct.field:name" .}} { get; set; }{{next .Comm
{{end}}

{{/* next/csharp/struct.field.name: Generates the name for a class property */}}
{{- define "next/csharp/struct.field.name" -}}
{{- .String | pascalCase}}
{{- define "next/csharp/struct.field:name" -}}
{{- render "node:camel.case.name" .}}
{{- end}}

{{/* next/csharp/interface: Generates an interface declaration */}}
Expand All @@ -92,6 +92,10 @@ public interface {{next .Type}}
{{- next .Result}} {{render "interface.method:name" .}}({{next .Params}});{{next .Comment}}
{{end}}

{{- define "next/csharp/interface.method:name" -}}
{{- render "node:pascal.case.name" .}}
{{- end}}

{{/* next/csharp/interface.method.result: Generates the return type for an interface method */}}
{{- define "next/csharp/interface.method.result" -}}
{{- if .Type}}{{next .Type}}{{else}}void{{end}}
Expand Down
54 changes: 42 additions & 12 deletions builtin/go.npl
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,15 @@ import "time"
*/}}
{{- define "next/go/imports:decl"}}
{{- if .Decl.Annotations.next.go_imports}}
{{- range (.Decl.Annotations.next.go_imports | split "," | map (trim | split "." | first | trimPrefix "*") | sort | uniq)}}
import "{{.}}"
{{range (.Decl.Annotations.next.go_imports | split "," | map (trim | removeExt | trimPrefix "*") | sort | uniq)}}
{{- $parts := split " " . | map trim }}
{{- if eq 1 (len $parts)}}
{{- /* import "xxx" */}}
{{- render "dict:import.statement" (dict "value" (index $parts 0))}}
{{- else if eq 2 (len $parts)}}
{{- /* import name "xxx" */}}
{{- render "dict:import.statement" (dict "name" (index $parts 0) "value" (index $parts 1))}}
{{- end}}
{{- end}}
{{- end}}
{{range .TrimmedList}}
Expand All @@ -47,6 +54,10 @@ import "{{.}}"
{{- end}}
{{- end}}

{{- define "next/go/dict:import.statement" -}}
import {{with .name}}{{.}} {{end}}"{{.value}}"
{{end}}

{{/* next/go/import: Generates an import statement for a specific package */}}
{{- define "next/go/import" -}}
import {{.Target.Package.Name}} "{{.Target.Package.Annotations.next.go_package}}"
Expand All @@ -71,33 +82,30 @@ var _ = time.Now
```
*/}}
{{- define "next/go/imports:unused" -}}
{{_}}
{{- if .Decl.Annotations.next.go_imports}}
{{- range (.Decl.Annotations.next.go_imports | split "," | sort | uniq)}}
{{- $pkg := . | split "." | first}}
{{- $pkg := . | removeExt}}
{{- $ptr := (hasPrefix "*" $pkg)}}
{{- $val := . | split "." | last}}
{{- $pkg = $pkg | split "/" | last}}
{{- $pkg = $pkg | split " " | map trim | first | split "/" | last | trimPrefix "*"}}
{{- if $ptr}}
var _ = ({{$pkg}}.{{$val}})(nil)
var _ = (*{{$pkg}}.{{$val}})(nil)
{{- else}}
var _ = {{$pkg}}.{{$val}}
{{- end}}
{{- end}}
{{- end}}
{{_}}
{{- range .TrimmedList}}
{{- if len .Target.Package.Types}}
{{- render "import:unused" .}}
{{_}}
{{- end}}
{{- end}}
{{- end}}

{{/* next/go/import:unused: Generates an unused variable declaration for a specific import */}}
{{- define "next/go/import:unused" -}}
var _ = (*{{.Target.Package.Name}}.{{next (index (.Target.Package.Types) 0)}})(nil)
{{- end}}
{{end}}

{{/* next/go/used.type: Generates a fully qualified type name, including package name if necessary */}}
{{- define "next/go/used.type" -}}
Expand All @@ -108,15 +116,21 @@ var _ = (*{{.Target.Package.Name}}.{{next (index (.Target.Package.Types) 0)}})(n
{{- end}}

{{- define "next/go/consts"}}
{{- if .}}
{{super .}}
{{- end}}
{{- end}}

{{/* next/go/const: Generates a constant declaration */}}
{{- define "next/go/const" -}}
{{- next .Doc -}}
const {{render "const:name" .}} = {{next .Value}}{{next .Comment}}
{{end}}

{{- define "next/go/const:name" -}}
{{- render "node:pascal.case.name" .}}
{{- end}}

{{/* next/go/enum: Generates an enum type declaration, constants */}}
{{- define "next/go/enum" -}}
{{- next .Doc -}}
Expand All @@ -134,7 +148,7 @@ const (
{{end}}

{{- define "next/go/enum.member:name" -}}
{{- next .Decl.Type}}{{.Name | pascalCase}}
{{- next .Decl.Type}}{{render "node:pascal.case.name" .}}
{{- end}}

{{/* next/go/struct: Generates a struct type declaration */}}
Expand All @@ -158,7 +172,7 @@ type {{next .Type}} struct {

{{/* next/go/struct.field.name: Generates the name for a struct field */}}
{{- define "next/go/struct.field:name" -}}
{{- .Name | pascalCase }}
{{- render "node:pascal.case.name" .}}
{{- end}}

{{/* next/go/interface: Generates an interface type declaration */}}
Expand All @@ -169,11 +183,19 @@ type {{next .Type}} interface {
}
{{end}}

{{- define "next/go/interface.method:name" -}}
{{- render "node:pascal.case.name" .}}
{{- end}}

{{/* next/go/interface.method.param: Generates a parameter declaration for an interface method */}}
{{- define "next/go/interface.method.param" -}}
{{- render "interface.method.param:name" .}} {{next .Type}}
{{- end}}

{{- define "next/go/interface.method.param:name" -}}
{{- render "node:camel.case.name" .}}
{{- end}}

{{/* next/go/interface.method.result: Generates the return type(s) for an interface method */}}
{{- define "next/go/interface.method.result" -}}
{{- if .Method.Annotations.next.error}}
Expand Down Expand Up @@ -224,10 +246,18 @@ type HTTPServer interface {
{{- $pkg := (index $parts 0) -}}
{{- $typ := (index $parts 1) -}}
{{- $ptr := (hasPrefix "*" $pkg) -}}
{{- $pkg = (split "/" $pkg | last)}}
{{- $pkg = (split "/" $pkg | last | trimPrefix "*") -}}
{{- if $ptr -}}*{{- end -}}
{{$pkg}}.{{$typ}}
{{- else }}
{{- error "%s: invalid format of %q: MUST be in the form of '[[*]path/to/pkg.]TypeName'" (.Decl.Annotations.next.ValuePos "go_alias") $alias}}
{{- end -}}
{{- end}}

{{- define "next/go/type:zero" -}}
{{- if or (.Kind.IsInterface) (.Kind.IsVector) (.Kind.IsMap) -}}
nil
{{- else -}}
{{super .}}
{{- end}}
{{- end}}
6 changes: 5 additions & 1 deletion builtin/java.npl
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,13 @@ import {{render "package:name" .Target.Package}}.*;
{{/* next/java/const: Generates a single constant declaration */}}
{{- define "next/java/const" -}}
{{- next .Doc -}}
public static final {{next .Type}} {{render "const:name" . | snakeCase | upper}} = {{next .Value}};{{next .Comment}}
public static final {{next .Type}} {{render "const:name" .}} = {{next .Value}};{{next .Comment}}
{{end}}

{{- define "next/java/const:name" -}}
{{- render "node:snake.case.name" . | upper}}
{{- end}}

{{/* next/java/enum: Generates a single enum declaration */}}
{{- define "next/java/enum" -}}
{{- next .Doc -}}
Expand Down
6 changes: 3 additions & 3 deletions builtin/lua.npl
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ _M_.{{next .Type}} = {{next .Type}}

{{/* next/lua/enum.member:name: Generates the name for an enum member */}}
{{- define "next/lua/enum.member:name" -}}
{{- .Name | snakeCase | upper}}
{{- render "node:snake.case.name" . | upper}}
{{- end}}

{{/* next/lua/struct: Generates a table-based class declaration */}}
Expand All @@ -90,7 +90,7 @@ end

{{/* next/lua/struct.field:name: Generates the name for a class field */}}
{{- define "next/lua/struct.field:name" -}}
{{- .Name | camelCase}}
{{- render "node:camel.case.name" .}}
{{- end}}

{{/* next/lua/interface: Generates an interface-like table declaration */}}
Expand All @@ -112,7 +112,7 @@ end{{next .Comment}}

{{/* next/lua/interface.method:name: Generates the name for an interface method */}}
{{- define "next/lua/interface.method:name" -}}
{{- .Name | camelCase}}
{{- render "node:camel.case.name" .}}
{{- end}}

{{/* next/lua/interface.method.param: Generates a parameter for an interface method */}}
Expand Down
50 changes: 42 additions & 8 deletions builtin/next.npl
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,11 @@

{{/* next/decls: Generates code for all declarations in a file, including constants, enums, structs, and interfaces */}}
{{- define "next/decls" -}}
{{- if .Consts}}
{{- next .Consts}}
{{- end}}
{{- if .Enums}}
{{- next .Enums}}
{{- end}}
{{- if .Structs}}
{{- next .Structs}}
{{- end}}
{{- if .Interfaces}}
{{- next .Interfaces}}
{{- end}}
{{- end}}

{{/* next/comment: Generates formatted comment text */}}
{{- define "next/comment" -}}
Expand All @@ -34,6 +26,10 @@
{{- .Format " * " "/**\n" " */"}}
{{- end}}

{{- define "next/package:name" -}}
{{- .Name}}
{{- end}}

{{/* next/imports: Generates code for all import statements in a file */}}
{{- define "next/imports" -}}
{{- range .List}}
Expand Down Expand Up @@ -302,4 +298,42 @@ false
{{- else if .Kind.IsBool -}}
{{render "false" .}}
{{- end}}
{{- end}}

{{- define "next/node:snake.case.name"}}
{{- with .Annotations.next.snake_case}}
{{- .}}
{{- else}}
{{- $.Name | snakeCase}}
{{- end}}
{{- end}}

{{- define "next/node:pascal.case.name"}}
{{- with .Annotations.next.pascal_case}}
{{- .}}
{{- else with .Annotations.next.snake_case}}
{{- . | snakeCase | split "_" | map capitalize | join ""}}
{{- else}}
{{- $.Name | pascalCase}}
{{- end}}
{{- end}}

{{- define "next/node:camel.case.name"}}
{{- with .Annotations.next.camel_case}}
{{- .}}
{{- else with .Annotations.next.snake_case}}
{{- . | snakeCase | split "_" | map capitalize | join "" | uncapitalize}}
{{- else}}
{{- $.Name | camelCase}}
{{- end}}
{{- end}}

{{- define "next/node:kebab.case.name"}}
{{- with .Annotations.next.kebab_case}}
{{- .}}
{{- else with .Annotations.next.snake_case}}
{{- . | snakeCase | replace "_" "-"}}
{{- else}}
{{- $.Name | kebabCase}}
{{- end}}
{{- end}}
Loading

0 comments on commit 2211736

Please sign in to comment.