diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2023-09-20 14:33:46 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2023-09-28 09:53:32 +0000 |
| commit | f73e09b3a31addec5481c03b113a17cc839ded1f (patch) | |
| tree | e0c9af19cfb11359221374c411a82bcabdeff3ce | |
| parent | c2ab1e5d6ed3061c614fe816481094bc3bfb5738 (diff) | |
prog: deduce arg direction during validation
Unless overridden, arg directions are inherited from parent types.
Let's follow the same logic in validation.go.
| -rw-r--r-- | prog/validation.go | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/prog/validation.go b/prog/validation.go index f573d497b..2672507db 100644 --- a/prog/validation.go +++ b/prog/validation.go @@ -101,10 +101,10 @@ func (ctx *validCtx) validateArg(arg Arg, typ Type, dir Dir) error { return fmt.Errorf("bad arg type %#v, expect %#v", arg.Type(), typ) } ctx.args[arg] = true - return arg.validate(ctx) + return arg.validate(ctx, dir) } -func (arg *ConstArg) validate(ctx *validCtx) error { +func (arg *ConstArg) validate(ctx *validCtx, dir Dir) error { switch typ := arg.Type().(type) { case *IntType: if arg.Dir() == DirOut && !isDefault(arg) { @@ -135,7 +135,7 @@ func (arg *ConstArg) validate(ctx *validCtx) error { return nil } -func (arg *ResultArg) validate(ctx *validCtx) error { +func (arg *ResultArg) validate(ctx *validCtx, dir Dir) error { typ, ok := arg.Type().(*ResourceType) if !ok { return fmt.Errorf("result arg %v has bad type %v", arg, arg.Type().Name()) @@ -161,10 +161,13 @@ func (arg *ResultArg) validate(ctx *validCtx) error { return fmt.Errorf("result arg '%v' has broken link (%+v)", typ.Name(), arg.Res.uses) } } + if arg.Dir() == DirIn && len(arg.uses) > 0 { + return fmt.Errorf("result arg '%v' is DirIn, but is used %d times", typ.Name(), len(arg.uses)) + } return nil } -func (arg *DataArg) validate(ctx *validCtx) error { +func (arg *DataArg) validate(ctx *validCtx, dir Dir) error { typ, ok := arg.Type().(*BufferType) if !ok { return fmt.Errorf("data arg %v has bad type %v", arg, arg.Type().Name()) @@ -190,7 +193,7 @@ func (arg *DataArg) validate(ctx *validCtx) error { return nil } -func (arg *GroupArg) validate(ctx *validCtx) error { +func (arg *GroupArg) validate(ctx *validCtx, dir Dir) error { switch typ := arg.Type().(type) { case *StructType: if len(arg.Inner) != len(typ.Fields) { @@ -198,7 +201,7 @@ func (arg *GroupArg) validate(ctx *validCtx) error { typ.Name(), len(typ.Fields), len(arg.Inner)) } for i, field := range arg.Inner { - if err := ctx.validateArg(field, typ.Fields[i].Type, typ.Fields[i].Dir(arg.Dir())); err != nil { + if err := ctx.validateArg(field, typ.Fields[i].Type, typ.Fields[i].Dir(dir)); err != nil { return err } } @@ -209,7 +212,7 @@ func (arg *GroupArg) validate(ctx *validCtx) error { typ.Name(), len(arg.Inner), typ.RangeBegin) } for _, elem := range arg.Inner { - if err := ctx.validateArg(elem, typ.Elem, arg.Dir()); err != nil { + if err := ctx.validateArg(elem, typ.Elem, dir); err != nil { return err } } @@ -219,7 +222,7 @@ func (arg *GroupArg) validate(ctx *validCtx) error { return nil } -func (arg *UnionArg) validate(ctx *validCtx) error { +func (arg *UnionArg) validate(ctx *validCtx, dir Dir) error { typ, ok := arg.Type().(*UnionType) if !ok { return fmt.Errorf("union arg %v has bad type %v", arg, arg.Type().Name()) @@ -228,10 +231,10 @@ func (arg *UnionArg) validate(ctx *validCtx) error { return fmt.Errorf("union arg %v has bad index %v/%v", arg, arg.Index, len(typ.Fields)) } opt := typ.Fields[arg.Index] - return ctx.validateArg(arg.Option, opt.Type, opt.Dir(arg.Dir())) + return ctx.validateArg(arg.Option, opt.Type, opt.Dir(dir)) } -func (arg *PointerArg) validate(ctx *validCtx) error { +func (arg *PointerArg) validate(ctx *validCtx, dir Dir) error { switch typ := arg.Type().(type) { case *VmaType: if arg.Res != nil { |
