Skip to content

Commit

Permalink
Merge pull request #500 from FirelyTeam/499-external-parameter-naming
Browse files Browse the repository at this point in the history
Fix 499 - generating parameter names for external functions
  • Loading branch information
baseTwo committed Sep 2, 2024
2 parents 40dfa4f + 805b03a commit a44c38b
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 5 deletions.
5 changes: 3 additions & 2 deletions Cql/CodeGeneration.NET/AssemblyCompiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,10 @@ public AssemblyCompiler(

public IReadOnlyDictionary<string, AssemblyData> Compile(
LibrarySet librarySet,
DefinitionDictionary<LambdaExpression>? definitions = null)
DefinitionDictionary<LambdaExpression> definitions)
{
definitions ??= new();
if (definitions is null)
throw new ArgumentNullException(nameof(definitions));

Dictionary<string, AssemblyData> results = new();

Expand Down
5 changes: 4 additions & 1 deletion Cql/Cql.Compiler/ExpressionBuilderContext.StaticHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,10 @@ private static string TypeNameToIdentifier(Type type, ExpressionBuilderContext?
var typeName = type.Name.ToLowerInvariant();
if (type.IsGenericType)
{
var genericTypeNames = string.Join("_", type.GetGenericArguments().Select(t => TypeNameToIdentifier(t, ctx)));
var typeNames = type.GetGenericArguments()
.Select(t => TypeNameToIdentifier(t, ctx)
.TrimStart('@'));
var genericTypeNames = string.Join("_", typeNames);
var tick = typeName.IndexOf('`');
if (tick > -1)
typeName = typeName[..tick];
Expand Down
48 changes: 46 additions & 2 deletions Cql/CqlToElmTests/Base.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Hl7.Cql.Compiler;
using Hl7.Cql.CodeGeneration.NET;
using Hl7.Cql.Compiler;
using Hl7.Cql.CqlToElm.LibraryProviders;
using Hl7.Cql.Elm;
using Hl7.Cql.Fhir;
Expand Down Expand Up @@ -26,6 +27,9 @@ public class Base

internal static LibraryExpressionBuilder LibraryExpressionBuilder;

internal static CSharpLibrarySetToStreamsWriter SourceCodeWriter =>
Services.GetRequiredService<CSharpLibrarySetToStreamsWriter>();

internal static MessageProvider Messaging => Services.GetRequiredService<MessageProvider>();


Expand All @@ -41,7 +45,11 @@ protected static IServiceCollection ServiceCollection(Action<CqlToElmOptions>? o
.AddMessaging()
.AddLogging(builder => builder
.AddConsole())
.AddSingleton(typeof(ILibraryProvider), libraryProviderType ?? typeof(MemoryLibraryProvider));
.AddSingleton(typeof(ILibraryProvider), libraryProviderType ?? typeof(MemoryLibraryProvider))
.AddSingleton(typeof(CSharpLibrarySetToStreamsWriter))
.AddSingleton(typeof(TypeToCSharpConverter))
.AddSingleton(typeof(CqlCompilerFactory))
.AddSingleton(isp => isp.GetRequiredService<CqlCompilerFactory>().TypeResolver);

private class TestLibraryProvider : ILibraryProvider
{
Expand Down Expand Up @@ -276,5 +284,41 @@ internal static void AddFHIRHelpers(MemoryLibraryProvider provider,
provider.Libraries.Add("FHIRHelpers", "4.0.1", builder);
}


internal static string WriteCSharp(Library library)
{
var lambdas = LibraryExpressionBuilder.ProcessLibrary(library);
var ls = new LibrarySet("", library);
var csByNav = new Dictionary<string, string>();
var callbacks = new CSharpSourceCodeWriterCallbacks(onAfterStep: afterWrite);
SourceCodeWriter.ProcessDefinitions(lambdas, ls, callbacks);
return csByNav[library.NameAndVersion()!];

void afterWrite(CSharpSourceCodeStep step)
{
switch (step)
{
case CSharpSourceCodeStep.OnStream onStream:
onStream.Stream.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(onStream.Stream))
{
var code = reader.ReadToEnd();
csByNav.Add(onStream.Name, code);
}
break;
default:
break;
}
}
}

internal static byte[] Compile(Library library)
{
var lambdas = LibraryExpressionBuilder.ProcessLibrary(library);
var ccf = Services.GetRequiredService<CqlCompilerFactory>();
var asm = new AssemblyCompiler(SourceCodeWriter, ccf.TypeManager, default, default);
var dict = asm.Compile(new LibrarySet("",library), lambdas);
return dict.Single().Value.Binary;
}
}
}
13 changes: 13 additions & 0 deletions Cql/CqlToElmTests/FunctionDefinitionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.IO;
using Antlr4.Runtime;
using FluentAssertions;
using Hl7.Cql.Compiler;
using Hl7.Cql.CqlToElm.Grammar;
using Hl7.Cql.CqlToElm.LibraryProviders;
using Hl7.Cql.CqlToElm.Visitors;
Expand Down Expand Up @@ -279,5 +280,17 @@ define function Add(left Integer, right Integer) returns Integer: external
fd.externalSpecified.Should().BeTrue();
fd.expression.Should().BeNull();
}

[TestMethod]
public void CSharp_Keyword_Parameter_Name()
{
var lib = MakeLibrary(@"
library FuncTest version '1.0.0'
define function ToInteger(decimal System.Decimal) returns System.Integer: external
");
var asm = Compile(lib);

}
}
}

0 comments on commit a44c38b

Please sign in to comment.