func (a *api) outputDispatchers(f simprogtext.SimProgFile) { mCallParam := simprogtext.NewSimpleVar("mc") errVar := simprogtext.NewSimpleVar("err") argsVar := simprogtext.NewSimpleVar("arg") rcvVar := simprogtext.NewSimpleVar("r") for rcvTypeName, methods := range a.Methods { f.AddLineIndent( "func (%s *%s) Dispatch(%s *vesupro.MethodCall) "+ "(vesupro.VesuproObject, error) {", rcvVar.VarName(), rcvTypeName, mCallParam.VarName()) f.AddLine("var %s error", errVar.VarName()) f.AddLine("%s := %s.Arguments", argsVar.VarName(), mCallParam.VarName()) f.AddLine("switch %s.Name {", mCallParam.VarName()) for _, _m := range methods { m := (*method)(_m) f.AddLineIndent("case %q:", m.Name) m.outputCall(f, mCallParam, argsVar, errVar, rcvVar, []string{"nil"}) f.Unindent() } f.AddLineIndent("default:") f.AddLine(`return nil,fmt.Errorf("Unknown function %%s.", %s.Name)`, mCallParam.VarName()) f.AddLineUnindent("}") // switch f.AddLineUnindent("}") // DispatchCall function } }
func (m *method) outputCall(f simprogtext.SimProgFile, mCallVar, argsVar, errVar, rcvVar simprogtext.Var, nilRetVals []string) error { paramVars := make([]simprogtext.DynSSAVar, len(m.Params)) finalParams := make([]string, len(m.Params)) f.AddLineIndent("if len(%s.Arguments) != %d {", mCallVar.VarName(), len(m.Params)) f.AddLine( `fmt.Errof("Method \"%s\": Wrong number of arguments: %%d (want: %d)",`+ `len(%s))`, m.Name, len(m.Params), argsVar.VarName()) f.AddLineUnindent("}") var err error for i, param := range m.Params { paramVars[i] = simprogtext.NewDynSSAVar(fmt.Sprintf( "param_%d", param.Position), "") // parse Argument err = (*parameter)(param).OutputParseArgument(f, paramVars[i], simprogtext.NewSimpleVar(fmt.Sprintf("%s[%d]", argsVar.VarName(), i)), errVar) // go sucks if err != nil { return err } // check error outputCheckErrorReturn(f, errVar, nilRetVals) } for i, param := range m.Params { if param.IsStruct { finalParams[i] = paramVars[i].VarName() } else { finalParams[i] = fmt.Sprintf("%s(%s)", param.TypeName, paramVars[i].VarName()) } } f.AddLine("return %s.%s(%s)", rcvVar.VarName(), m.Name, strings.Join(finalParams, ", ")) return nil }