public void VisitSignature(ISignature signature)
 {
     this.Visit(signature.GetType(Context));
     this.Visit(signature.GetParameters(Context));
     this.Visit(signature.RefCustomModifiers);
     this.Visit(signature.ReturnValueCustomModifiers);
 }
示例#2
0
        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);
        }