diff --git a/KustoSchemaTools/Model/Function.cs b/KustoSchemaTools/Model/Function.cs index 9a5b037..146cdec 100644 --- a/KustoSchemaTools/Model/Function.cs +++ b/KustoSchemaTools/Model/Function.cs @@ -1,5 +1,8 @@ -using KustoSchemaTools.Changes; +using Kusto.Language.Syntax; +using Kusto.Language; +using KustoSchemaTools.Changes; using KustoSchemaTools.Parser; +using System.Text; using YamlDotNet.Serialization; namespace KustoSchemaTools.Model @@ -22,9 +25,31 @@ public List<DatabaseScriptContainer> CreateScripts(string name) .Select(p => $"{p.Name}=\"{p.GetValue(this)}\""); var propertiesString = string.Join(", ", properties); - var parameters = string.IsNullOrEmpty(Parameters) - ? Parameters - : string.Join(',', Parameters.Split(',').Select(p => p.Split(':')).Select(itm => $"{itm[0].Trim().BracketIfIdentifier()}:{itm[1]}")); + var parameters = Parameters; + if (!string.IsNullOrWhiteSpace(Parameters)) + { + var dummyFunction = $"let x = ({parameters}) {{print \"abc\"}}"; + var parsed = KustoCode.Parse(dummyFunction); + + var descs = parsed.Syntax + .GetDescendants<FunctionParameters>() + .First() + .GetDescendants<NameDeclaration>() + .ToList(); + + var sb = new StringBuilder(); + int lastPos = 0; + foreach (var desc in descs) + { + var bracketified = desc.Name.ToString().Trim().BracketIfIdentifier(); + sb.Append(dummyFunction[lastPos..desc.TextStart]); + sb.Append(bracketified); + lastPos = desc.End; + } + sb.Append(dummyFunction.Substring(lastPos)); + var replacedFunction = sb.ToString(); + parameters = replacedFunction[9..^15]; + } return new List<DatabaseScriptContainer> { new DatabaseScriptContainer("CreateOrAlterFunction", 40, $".create-or-alter function with({propertiesString}) {name} ({parameters}) {{ {Body} }}") }; }