diff --git a/Cql/CodeGeneration.NET/CSharpSourceCodeWriter.cs b/Cql/CodeGeneration.NET/CSharpSourceCodeWriter.cs index 68d7e544..ff5254b7 100644 --- a/Cql/CodeGeneration.NET/CSharpSourceCodeWriter.cs +++ b/Cql/CodeGeneration.NET/CSharpSourceCodeWriter.cs @@ -198,14 +198,17 @@ private void writeClass(DefinitionDictionary definitions, writer.WriteLine(indentLevel, $"[CqlLibrary(\"{libraryAttribute}\", \"{versionAttribute}\")]"); var className = VariableNameGenerator.NormalizeIdentifier(libraryName); if (PartialClass) - writer.WriteLine(indentLevel, $"partial static class {className}"); + writer.WriteLine(indentLevel, $"public partial class {className}"); else - writer.WriteLine(indentLevel, $"public static class {className}"); + writer.WriteLine(indentLevel, $"public class {className}"); writer.WriteLine(indentLevel, "{"); writer.WriteLine(); indentLevel += 1; // Class { + writer.WriteLine(indentLevel, $"public static {className} Instance {{ get; }} = new();"); + writer.WriteLine(); + writeMethods(definitions, libraryName, writer, indentLevel); indentLevel -= 1; writer.WriteLine(indentLevel, "}"); @@ -219,7 +222,7 @@ private void writeMethods(DefinitionDictionary definitions, st foreach (var overload in kvp.Value) { definitions.TryGetTags(libraryName, kvp.Key, overload.Signature, out var tags); - WriteMemoizedInstanceMethod(libraryName, writer, indentLevel, kvp.Key, overload.T, tags); + writeMethod(libraryName, writer, indentLevel, kvp.Key, overload.T, tags); writer.WriteLine(); } } @@ -277,7 +280,7 @@ private IList DetermineBuildOrder(DirectedGraph minimalGraph) return sorted; } - private void WriteMemoizedInstanceMethod(string libraryName, TextWriter writer, int indentLevel, + private void writeMethod(string libraryName, TextWriter writer, int indentLevel, string cqlName, LambdaExpression overload, ILookup? tags) @@ -321,14 +324,13 @@ private void WriteMemoizedInstanceMethod(string libraryName, TextWriter writer, } } - var func = expressionConverter.ConvertTopLevelFunctionDefinition(indentLevel, overload, methodName!, "public static"); - writer.Write(func); + writer.Write(expressionConverter.ConvertTopLevelFunctionDefinition(indentLevel, overload, methodName!, "public")); } else { writer.WriteLine(indentLevel, $"[CqlDeclaration(\"{cqlName}\")]"); WriteTags(writer, indentLevel, tags); - writer.Write(expressionConverter.ConvertTopLevelFunctionDefinition(indentLevel, overload, methodName!, "public static")); + writer.Write(expressionConverter.ConvertTopLevelFunctionDefinition(indentLevel, overload, methodName!, "public")); // writer.WriteLine(); } } diff --git a/Cql/CodeGeneration.NET/ExpressionConverter.cs b/Cql/CodeGeneration.NET/ExpressionConverter.cs index d9cc143d..c3e18d58 100644 --- a/Cql/CodeGeneration.NET/ExpressionConverter.cs +++ b/Cql/CodeGeneration.NET/ExpressionConverter.cs @@ -65,8 +65,8 @@ private string convertDefinitionCallExpression(int indent, string leadingIndentS { var sb = new StringBuilder(); sb.Append(leadingIndentString); - - var target = VariableNameGenerator.NormalizeIdentifier(dce.LibraryName); + + var target = dce.LibraryName == LibraryName ? "this" : $"{VariableNameGenerator.NormalizeIdentifier(dce.LibraryName)}.Instance"; var csFunctionName = VariableNameGenerator.NormalizeIdentifier(dce.DefinitionName); sb.Append(CultureInfo.InvariantCulture, $"{target}.{csFunctionName}(context)"); @@ -79,7 +79,7 @@ private string convertFunctionCallExpression(int indent, string leadingIndentStr var sb = new StringBuilder(); sb.Append(leadingIndentString); - var target = VariableNameGenerator.NormalizeIdentifier(fce.LibraryName); + var target = fce.LibraryName == LibraryName ? "this" : $"{VariableNameGenerator.NormalizeIdentifier(fce.LibraryName)}.Instance"; var csFunctionName = VariableNameGenerator.NormalizeIdentifier(fce.FunctionName); sb.Append(CultureInfo.InvariantCulture, $"{target}.{csFunctionName}");