public string Convert(ParameterIL parameter)
        {
            var type = typeConverter.Convert(parameter.DataType);

            return(parameter switch
            {
                NamedParameterIL param => $"{type} {nameMangler.Mangle(param.Symbol.Name)}",
                SelfParameterIL _ => $"{type} {nameMangler.SelfName}",
                FieldParameterIL param => $"{type} {nameMangler.Mangle(param.InitializeField.Name)}",
                _ => throw ExhaustiveMatch.Failed(parameter)
            });
        private static string FormatParameter(ParameterIL parameter)
        {
            var format = parameter.IsMutableBinding ? "var {0}: {1}" : "{0}: {1}";

            return(parameter switch
            {
                // TODO what about escaping the name?
                NamedParameterIL param =>
                string.Format(CultureInfo.InvariantCulture, format, param.Symbol.Name, param.DataType),
                // TODO is this the correct name for self?
                SelfParameterIL param =>
                string.Format(CultureInfo.InvariantCulture, format, "self", param.DataType),
                FieldParameterIL param => $".{param.InitializeField.Name}",
                _ => throw ExhaustiveMatch.Failed(parameter)
            });