Skip to content

Commit

Permalink
fix unresolved type if linked api imported
Browse files Browse the repository at this point in the history
  • Loading branch information
kesonan committed Jan 29, 2024
1 parent f54c2e3 commit 5db3302
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 12 deletions.
3 changes: 3 additions & 0 deletions tools/goctl/pkg/parser/api/parser/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,9 @@ func Parse(filename string, src interface{}) (*spec.ApiSpec, error) {
if err != nil {
return nil, err
}
if err := api.SelfCheck(); err != nil {
return nil, err
}

var result = new(spec.ApiSpec)
analyzer := Analyzer{
Expand Down
4 changes: 4 additions & 0 deletions tools/goctl/pkg/parser/api/parser/analyzer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,8 @@ func Test_Parse(t *testing.T) {
_, err := Parse("./testdata/base.api", nil)
assertx.Error(t, err)
})
t.Run("link_import", func(t *testing.T) {
_, err := Parse("./testdata/example2.api", nil)
assert.Nil(t, err)
})
}
15 changes: 6 additions & 9 deletions tools/goctl/pkg/parser/api/parser/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,12 @@ func convert2API(a *ast.AST, importSet map[string]lang.PlaceholderType, is *impo
}
}

if err := api.SelfCheck(); err != nil {
return nil, err
}
return api, nil
}

func (api *API) checkImportStmt() error {
f := newFilter()
b := f.addCheckItem("import value expression")
b := f.addCheckItem(api.Filename, "import value expression")
for _, v := range api.importStmt {
switch val := v.(type) {
case *ast.ImportLiteralStmt:
Expand All @@ -110,7 +107,7 @@ func (api *API) checkInfoStmt() error {
return nil
}
f := newFilter()
b := f.addCheckItem("info key expression")
b := f.addCheckItem(api.Filename, "info key expression")
for _, v := range api.info.Values {
b.check(v.Key)
}
Expand All @@ -119,9 +116,9 @@ func (api *API) checkInfoStmt() error {

func (api *API) checkServiceStmt() error {
f := newFilter()
serviceNameChecker := f.addCheckItem("service name expression")
handlerChecker := f.addCheckItem("handler expression")
pathChecker := f.addCheckItem("path expression")
serviceNameChecker := f.addCheckItem(api.Filename, "service name expression")
handlerChecker := f.addCheckItem(api.Filename, "handler expression")
pathChecker := f.addCheckItem(api.Filename, "path expression")
var serviceName = map[string]string{}
for _, v := range api.ServiceStmts {
name := strings.TrimSuffix(v.Name.Format(""), "-api")
Expand Down Expand Up @@ -150,7 +147,7 @@ func (api *API) checkServiceStmt() error {

func (api *API) checkTypeStmt() error {
f := newFilter()
b := f.addCheckItem("type expression")
b := f.addCheckItem(api.Filename, "type expression")
for _, v := range api.TypeStmt {
switch val := v.(type) {
case *ast.TypeLiteralStmt:
Expand Down
9 changes: 6 additions & 3 deletions tools/goctl/pkg/parser/api/parser/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,19 @@ import (
)

type filterBuilder struct {
filename string
m map[string]placeholder.Type
checkExprName string
errorManager *errorManager
}

func (b *filterBuilder) check(nodes ...*ast.TokenNode) {
for _, node := range nodes {
if _, ok := b.m[node.Token.Text]; ok {
fileNodeText := fmt.Sprintf("%s/%s", b.filename, node.Token.Text)
if _, ok := b.m[fileNodeText]; ok {
b.errorManager.add(ast.DuplicateStmtError(node.Pos(), "duplicate "+b.checkExprName))
} else {
b.m[node.Token.Text] = placeholder.PlaceHolder
b.m[fileNodeText] = placeholder.PlaceHolder
}
}
}
Expand Down Expand Up @@ -46,8 +48,9 @@ func newFilter() *filter {
return &filter{}
}

func (f *filter) addCheckItem(checkExprName string) *filterBuilder {
func (f *filter) addCheckItem(filename, checkExprName string) *filterBuilder {
b := &filterBuilder{
filename: filename,
m: make(map[string]placeholder.Type),
checkExprName: checkExprName,
errorManager: newErrorManager(),
Expand Down
6 changes: 6 additions & 0 deletions tools/goctl/pkg/parser/api/parser/testdata/base/request.api
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
syntax = "v1"

type Baz {
Foo string `json:"foo"`
Baz bool `json:"bar"`
}
11 changes: 11 additions & 0 deletions tools/goctl/pkg/parser/api/parser/testdata/base/response.api
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
syntax = "v1"

import "request.api"
// 结构体组
type Bar {
Foo int `json:"foo"`
Bar bool `json:"bar"`
Baz
Qux map[string]string `json:"qux"`
}

13 changes: 13 additions & 0 deletions tools/goctl/pkg/parser/api/parser/testdata/example2.api
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
syntax = "v1"

import "base/request.api"
import "base/response.api"

// 空结构体
type Foo {}

service demo {
@handler handlerName
get /users/id/:userId (Baz) returns (Bar)
}

0 comments on commit 5db3302

Please sign in to comment.