public void VisitSignature(ISignature signature) { this.Visit(signature.GetType(Context)); this.Visit(signature.GetParameters(Context)); this.Visit(signature.RefCustomModifiers); this.Visit(signature.ReturnValueCustomModifiers); }
public static JObject Describe([NotNull] ISignature signature) { var parts = signature.Parts.Select(p => p.AcceptForValue(Instance)); var result = new JObject { ["args"] = new JArray(parts), ["minArgs"] = signature.MinArgs, }; if (signature.MaxArgs != null) { result["maxArgs"] = signature.MaxArgs; } // TODO: make visitor methods for this? switch (signature) { case SubrSignature _: result["context"] = "mdl"; break; case ZBuiltinSignature bs: result["context"] = "zcode"; result["minVersion"] = bs.MinVersion; result["maxVersion"] = bs.MaxVersion; if (bs.ReturnPart.Constraint != Constraint.AnyObject) { var retPart = bs.ReturnPart.AcceptForValue(Instance); retPart.Remove("name"); result["returns"] = retPart; } break; default: throw new ArgumentException($"Unexpected signature class: {signature.GetType()}"); } return(result); }