aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--prog/validation.go23
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 {