diff --git a/src/Benchmarks/EnumUtilityBenchmarks.cs b/src/Benchmarks/EnumUtilityBenchmarks.cs index 527acc7653..1ea5258531 100644 --- a/src/Benchmarks/EnumUtilityBenchmarks.cs +++ b/src/Benchmarks/EnumUtilityBenchmarks.cs @@ -3,6 +3,8 @@ using Hl7.Fhir.Utility; using System; +#nullable enable + namespace Firely.Sdk.Benchmarks { [MemoryDiagnoser] @@ -16,7 +18,7 @@ public string EnumToString() => SearchParamType.String.ToString(); [Benchmark] - public string EnumGetName() + public string? EnumGetName() => Enum.GetName(StringSearchParam); [Benchmark] @@ -37,18 +39,18 @@ public SearchParamType EnumParseIgnoreCase() [Benchmark] public SearchParamType EnumUtilityParseLiteral() - => EnumUtility.ParseLiteral("string").Value; + => EnumUtility.ParseLiteral("string")!.Value; [Benchmark] - public Enum EnumUtilityParseLiteralNonGeneric() + public Enum? EnumUtilityParseLiteralNonGeneric() => EnumUtility.ParseLiteral("string", typeof(SearchParamType)); [Benchmark] public SearchParamType EnumUtilityParseLiteralIgnoreCase() - => EnumUtility.ParseLiteral("string", true).Value; + => EnumUtility.ParseLiteral("string", true)!.Value; [Benchmark] - public Enum EnumUtilityParseLiteralIgnoreCaseNonGeneric() + public Enum? EnumUtilityParseLiteralIgnoreCaseNonGeneric() => EnumUtility.ParseLiteral("string", typeof(SearchParamType), true); [Benchmark] @@ -56,7 +58,8 @@ public Enum EnumUtilityParseLiteralIgnoreCaseNonGeneric() => EnumUtility.GetSystem(StringSearchParam); [Benchmark] - public string EnumUtilityGetSystemNonGeneric() + public string? EnumUtilityGetSystemNonGeneric() => EnumUtility.GetSystem(StringSearchParamEnum); } } +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/Adapters/ScopedNodeToTypedElementAdapter.cs b/src/Hl7.Fhir.Base/ElementModel/Adapters/ScopedNodeToTypedElementAdapter.cs new file mode 100644 index 0000000000..3d0814c177 --- /dev/null +++ b/src/Hl7.Fhir.Base/ElementModel/Adapters/ScopedNodeToTypedElementAdapter.cs @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023, Firely (info@fire.ly) and contributors + * See the file CONTRIBUTORS for details. + * + * This file is licensed under the BSD 3-Clause license + * available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE + */ + +#nullable enable + +using Hl7.Fhir.Specification; +using System.Collections.Generic; +using System.Linq; + +namespace Hl7.Fhir.ElementModel +{ + /// + /// An adapter from to . + /// + /// Be careful, this adapter does not implement the and + /// property. + /// + internal class ScopedNodeToTypedElementAdapter : ITypedElement + { + private readonly IScopedNode _adaptee; + + public ScopedNodeToTypedElementAdapter(IScopedNode adaptee) + { + _adaptee = adaptee; + } + + public string Location => throw new System.NotImplementedException(); + + public IElementDefinitionSummary Definition => throw new System.NotImplementedException(); + + public string Name => _adaptee.Name; + + public string InstanceType => _adaptee.InstanceType; + + public object Value => _adaptee.Value; + + public IEnumerable Children(string? name = null) => + _adaptee.Children(name).Select(n => new ScopedNodeToTypedElementAdapter(n)); + } +} + +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/ElementNodeExtensions.cs b/src/Hl7.Fhir.Base/ElementModel/ElementNodeExtensions.cs index 75f3ce82d0..b228dcfb62 100644 --- a/src/Hl7.Fhir.Base/ElementModel/ElementNodeExtensions.cs +++ b/src/Hl7.Fhir.Base/ElementModel/ElementNodeExtensions.cs @@ -108,5 +108,14 @@ public static IReadOnlyCollection ChildDefinitions(th public static ScopedNode ToScopedNode(this ITypedElement node) => node as ScopedNode ?? new ScopedNode(node); + + /// + /// Convert a to a . + /// + /// An + /// + internal static IScopedNode AsScopedNode(this ITypedElement node) => ToScopedNode(node); } } + +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/IBaseElementNavigator.cs b/src/Hl7.Fhir.Base/ElementModel/IBaseElementNavigator.cs new file mode 100644 index 0000000000..988ca77f8d --- /dev/null +++ b/src/Hl7.Fhir.Base/ElementModel/IBaseElementNavigator.cs @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2023, Firely (info@fire.ly) and contributors + * See the file CONTRIBUTORS for details. + * + * This file is licensed under the BSD 3-Clause license + * available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE + */ + +using System; +using System.Collections.Generic; + +#nullable enable + +namespace Hl7.Fhir.ElementModel +{ + /// + /// The base interface for and ."/> + /// + /// + [Obsolete("WARNING! Intended for internal API usage exclusively, this interface ideally should be kept internal. " + + "However, due to its derivation by the public interface ITypedElement, maintaining its internal status is impossible.")] + public interface IBaseElementNavigator where TDerived : IBaseElementNavigator + { + /// + /// Enumerate the child nodes present in the source representation (if any) + /// + /// Return only the children with the given name. + /// + IEnumerable Children(string? name = null); + + /// + /// Name of the node, e.g. "active", "value". + /// + string Name { get; } + + /// + /// Type of the node. If a FHIR type, this is just a simple string, otherwise a StructureDefinition url for a type defined as a logical model. + /// + string InstanceType { get; } + + /// + /// The value of the node (if it represents a primitive FHIR value) + /// + /// + /// FHIR primitives are mapped to underlying C# types as follows: + /// + /// instant Hl7.Fhir.ElementModel.Types.DateTime + /// time Hl7.Fhir.ElementModel.Types.Time + /// date Hl7.Fhir.ElementModel.Types.Date + /// dateTime Hl7.Fhir.ElementModel.Types.DateTime + /// decimal decimal + /// boolean bool + /// integer int + /// unsignedInt int + /// positiveInt int + /// long/integer64 long (name will be finalized in R5) + /// string string + /// code string + /// id string + /// uri, oid, uuid, + /// canonical, url string + /// markdown string + /// base64Binary string (uuencoded) + /// xhtml string + /// + object Value { get; } + } +} + +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/IScopedNode.cs b/src/Hl7.Fhir.Base/ElementModel/IScopedNode.cs new file mode 100644 index 0000000000..fdd8fab486 --- /dev/null +++ b/src/Hl7.Fhir.Base/ElementModel/IScopedNode.cs @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023, Firely (info@fire.ly) and contributors + * See the file CONTRIBUTORS for details. + * + * This file is licensed under the BSD 3-Clause license + * available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE + */ + +#nullable enable + +namespace Hl7.Fhir.ElementModel +{ + /// + /// An element within a tree of typed FHIR data with also a parent element. + /// + /// + /// This interface represents FHIR data as a tree of elements, including type information either present in + /// the instance or derived from fully aware of the FHIR definitions and types + /// +#pragma warning disable CS0618 // Type or member is obsolete + internal interface IScopedNode : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete + { + /// + /// The parent node of this node, or null if this is the root node. + /// + IScopedNode? Parent { get; } + } +} + +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/IScopedNodeExtensions.cs b/src/Hl7.Fhir.Base/ElementModel/IScopedNodeExtensions.cs new file mode 100644 index 0000000000..09fa7e6641 --- /dev/null +++ b/src/Hl7.Fhir.Base/ElementModel/IScopedNodeExtensions.cs @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023, Firely (info@fire.ly) and contributors + * See the file CONTRIBUTORS for details. + * + * This file is licensed under the BSD 3-Clause license + * available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE + */ + +#nullable enable + + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Hl7.Fhir.ElementModel +{ + internal static class IScopedNodeExtensions + { + /// + /// Converts a to a . + /// + /// An node + /// An implementation of + /// Be careful when using this method, the returned does not implement + /// the methods and . + /// + [Obsolete("WARNING! For internal API use only. Turning an IScopedNode into an ITypedElement will cause problems for" + + "Location and Definitions. Those properties are not implemented using this method and can cause problems " + + "elsewhere. Please don't use this method unless you know what you are doing.")] + public static ITypedElement AsTypedElement(this IScopedNode node) => + node is ITypedElement ite ? ite : new ScopedNodeToTypedElementAdapter(node); + + /// + /// Returns the parent resource of this node, or null if this node is not part of a resource. + /// + /// + /// + /// + public static IEnumerable Children(this IEnumerable nodes, string? name = null) => + nodes.SelectMany(n => n.Children(name)); + } +} + +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/ITypedElement.cs b/src/Hl7.Fhir.Base/ElementModel/ITypedElement.cs index bb7e8403a8..0335bb020c 100644 --- a/src/Hl7.Fhir.Base/ElementModel/ITypedElement.cs +++ b/src/Hl7.Fhir.Base/ElementModel/ITypedElement.cs @@ -7,7 +7,6 @@ */ using Hl7.Fhir.Specification; -using System.Collections.Generic; namespace Hl7.Fhir.ElementModel { @@ -19,51 +18,11 @@ namespace Hl7.Fhir.ElementModel /// the instance or derived from fully aware of the FHIR definitions and types /// - public interface ITypedElement +#pragma warning disable CS0618 // Type or member is obsolete + public interface ITypedElement : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { - /// - /// Enumerate the child nodes present in the source representation (if any) - /// - /// Return only the children with the given name. - /// - IEnumerable Children(string name = null); - - /// - /// Name of the node, e.g. "active", "value". - /// - string Name { get; } - /// - /// Type of the node. If a FHIR type, this is just a simple string, otherwise a StructureDefinition url for a type defined as a logical model. - /// - string InstanceType { get; } - - /// - /// The value of the node (if it represents a primitive FHIR value) - /// - /// - /// FHIR primitives are mapped to underlying C# types as follows: - /// - /// instant Hl7.Fhir.ElementModel.Types.DateTime - /// time Hl7.Fhir.ElementModel.Types.Time - /// date Hl7.Fhir.ElementModel.Types.Date - /// dateTime Hl7.Fhir.ElementModel.Types.DateTime - /// decimal decimal - /// boolean bool - /// integer int - /// unsignedInt int - /// positiveInt int - /// long/integer64 long (name will be finalized in R5) - /// string string - /// code string - /// id string - /// uri, oid, uuid, - /// canonical, url string - /// markdown string - /// base64Binary string (uuencoded) - /// xhtml string - /// - object Value { get; } /// /// An indication of the location of this node within the data represented by the ITypedElement. diff --git a/src/Hl7.Fhir.Base/ElementModel/ScopedNode.cs b/src/Hl7.Fhir.Base/ElementModel/ScopedNode.cs index 72001de883..6373448fa9 100644 --- a/src/Hl7.Fhir.Base/ElementModel/ScopedNode.cs +++ b/src/Hl7.Fhir.Base/ElementModel/ScopedNode.cs @@ -16,7 +16,7 @@ namespace Hl7.Fhir.ElementModel { - public class ScopedNode : ITypedElement, IAnnotated, IExceptionSource + public class ScopedNode : ITypedElement, IScopedNode, IAnnotated, IExceptionSource { private class Cache { @@ -32,6 +32,7 @@ private class Cache private readonly Cache _cache = new(); public readonly ITypedElement Current; + private readonly ScopedNode? _parent; public ScopedNode(ITypedElement wrapped, string? instanceUri = null) { @@ -45,6 +46,7 @@ public ScopedNode(ITypedElement wrapped, string? instanceUri = null) private ScopedNode(ScopedNode parentNode, ScopedNode? parentResource, ITypedElement wrapped, string? fullUrl) { Current = wrapped; + _parent = parentNode; ExceptionHandler = parentNode.ExceptionHandler; ParentResource = parentNode.AtResource ? parentNode : parentResource; @@ -217,8 +219,7 @@ public string? InstanceUri { // Scan up until the first parent that knowns the instance uri (at the last the // root, if it has been supplied). - if (_cache.InstanceUri is null) - _cache.InstanceUri = ParentResources().SkipWhile(p => p.InstanceUri is null).FirstOrDefault()?.InstanceUri; + _cache.InstanceUri ??= ParentResources().SkipWhile(p => p.InstanceUri is null).FirstOrDefault()?.InstanceUri; return _cache.InstanceUri; } @@ -229,11 +230,24 @@ private set } } + /// + + + IScopedNode? IScopedNode.Parent => _parent; + /// public IEnumerable Annotations(Type type) => type == typeof(ScopedNode) ? (new[] { this }) : Current.Annotations(type); + private IEnumerable childrenInternal(string? name = null) => + Current.Children(name).Select(c => new ScopedNode(this, ParentResource, c, _fullUrl)); + /// public IEnumerable Children(string? name = null) => - Current.Children(name).Select(c => new ScopedNode(this, ParentResource, c, _fullUrl)); + childrenInternal(name); + + IEnumerable IBaseElementNavigator.Children(string? name) => + childrenInternal(name); } } + +#nullable restore \ No newline at end of file diff --git a/src/Hl7.Fhir.Base/ElementModel/TypedElementExtensions.cs b/src/Hl7.Fhir.Base/ElementModel/TypedElementExtensions.cs index 986e54c602..8b8958ddef 100644 --- a/src/Hl7.Fhir.Base/ElementModel/TypedElementExtensions.cs +++ b/src/Hl7.Fhir.Base/ElementModel/TypedElementExtensions.cs @@ -37,7 +37,9 @@ public static ITypedElement ToTypedElement(this Base @base, ModelInspector model /// When true the order of the children is discarded. When false the order of children is part /// of the equation. /// true when the ITypedElements are equal, false otherwise. - public static bool IsExactlyEqualTo(this ITypedElement left, ITypedElement right, bool ignoreOrder = false) +#pragma warning disable CS0618 // Type or member is obsolete + public static bool IsExactlyEqualTo(this T left, T right, bool ignoreOrder = false) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { if (left == null && right == null) return true; if (left == null || right == null) return false; @@ -95,7 +97,9 @@ public static bool ValueEquality(T1 val1, T2 val2) /// /// /// true when matches the , false otherwise. - public static bool Matches(this ITypedElement value, ITypedElement pattern) +#pragma warning disable CS0618 // Type or member is obsolete + public static bool Matches(this T value, T pattern) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { if (value == null && pattern == null) return true; if (value == null || pattern == null) return false; diff --git a/src/Hl7.Fhir.Base/ElementModel/TypedElementParseExtensions.cs b/src/Hl7.Fhir.Base/ElementModel/TypedElementParseExtensions.cs index 08b0f6d57a..495c2ef9ef 100644 --- a/src/Hl7.Fhir.Base/ElementModel/TypedElementParseExtensions.cs +++ b/src/Hl7.Fhir.Base/ElementModel/TypedElementParseExtensions.cs @@ -15,6 +15,7 @@ namespace Hl7.Fhir.ElementModel { public static class TypedElementParseExtensions { + # region ParseBindable /// /// Parses a bindeable type (code, Coding, CodeableConcept, Quantity, string, uri) into a FHIR coded datatype. /// Extensions will be parsed from the 'value' of the (simple) extension. @@ -31,16 +32,37 @@ public static class TypedElementParseExtensions /// 'string' => code /// 'uri' => code /// - public static Element ParseBindable(this ITypedElement instance) - { + public static Element ParseBindable(this ITypedElement instance) => instance.parseBindable(); + + /// + /// Parses a bindeable type (code, Coding, CodeableConcept, Quantity, string, uri) into a FHIR coded datatype. + /// Extensions will be parsed from the 'value' of the (simple) extension. + /// + /// + /// An Element of a coded type (code, Coding or CodeableConcept) dependin on the instance type, + /// or null if no bindable instance data was found + /// The instance type is mapped to a codable type as follows: + /// 'code' => code + /// 'Coding' => Coding + /// 'CodeableConcept' => CodeableConcept + /// 'Quantity' => Coding + /// 'Extension' => depends on value[x] + /// 'string' => code + /// 'uri' => code + /// + internal static Element ParseBindable(this IScopedNode instance) => instance.parseBindable(); +#pragma warning disable CS0618 // Type or member is obsolete + private static Element parseBindable(this IBaseElementNavigator instance) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete + { return instance.InstanceType switch { - FhirTypeConstants.CODE => instance.ParsePrimitive(), - FhirTypeConstants.STRING => new Code(instance.ParsePrimitive()?.Value), - FhirTypeConstants.URI => new Code(instance.ParsePrimitive()?.Value), - FhirTypeConstants.CODING => instance.ParseCoding(), - FhirTypeConstants.CODEABLE_CONCEPT => instance.ParseCodeableConcept(), + FhirTypeConstants.CODE => instance.parsePrimitive(), + FhirTypeConstants.STRING => new Code(instance.parsePrimitive()?.Value), + FhirTypeConstants.URI => new Code(instance.parsePrimitive()?.Value), + FhirTypeConstants.CODING => instance.parseCoding(), + FhirTypeConstants.CODEABLE_CONCEPT => instance.parseCodeableConcept(), FhirTypeConstants.QUANTITY => parseQuantity(), FhirTypeConstants.EXTENSION => parseExtension(), _ => null, @@ -49,20 +71,27 @@ public static Element ParseBindable(this ITypedElement instance) Coding parseQuantity() { var newCoding = new Coding(); - var q = instance.ParseQuantity(); + var q = instance.parseQuantity(); newCoding.Code = q.Code; newCoding.System = q.System ?? "http://unitsofmeasure.org"; return newCoding; } - Element parseExtension() { var valueChild = instance.Children("value").FirstOrDefault(); - return valueChild?.ParseBindable(); + return valueChild?.parseBindable(); } } + #endregion + + #region ParseQuantity + public static Model.Quantity ParseQuantity(this ITypedElement instance) => parseQuantity(instance); - public static Model.Quantity ParseQuantity(this ITypedElement instance) + internal static Model.Quantity ParseQuantity(this IScopedNode instance) => parseQuantity(instance); + +#pragma warning disable CS0618 // Type or member is obsolete + private static Quantity parseQuantity(this IBaseElementNavigator instance) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { var newQuantity = new Quantity { @@ -78,12 +107,30 @@ public static Model.Quantity ParseQuantity(this ITypedElement instance) return newQuantity; } + #endregion + #region ParsePrimitive public static T ParsePrimitive(this ITypedElement instance) where T : PrimitiveType, new() - => new T() { ObjectValue = instance.Value }; + => parsePrimitive(instance); + + internal static T ParsePrimitive(this IScopedNode instance) where T : PrimitiveType, new() + => parsePrimitive(instance); + +#pragma warning disable CS0618 // Type or member is obsolete + private static T parsePrimitive(this IBaseElementNavigator instance) where T : PrimitiveType, new() where U : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete + => new() { ObjectValue = instance.Value }; + + #endregion + #region ParseCoding + public static Coding ParseCoding(this ITypedElement instance) => parseCoding(instance); - public static Coding ParseCoding(this ITypedElement instance) + internal static Coding ParseCoding(this IScopedNode instance) => parseCoding(instance); + +#pragma warning disable CS0618 // Type or member is obsolete + private static Coding parseCoding(this IBaseElementNavigator instance) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { return new Coding() { @@ -94,8 +141,16 @@ public static Coding ParseCoding(this ITypedElement instance) UserSelected = instance.Children("userSelected").SingleOrDefault()?.Value as bool? }; } + #endregion + + #region ParseResourceReference + public static ResourceReference ParseResourceReference(this ITypedElement instance) => instance.parseResourceReference(); + + internal static ResourceReference ParseResourceReference(this IScopedNode instance) => instance.parseResourceReference(); - public static ResourceReference ParseResourceReference(this ITypedElement instance) +#pragma warning disable CS0618 // Type or member is obsolete + private static ResourceReference parseResourceReference(this IBaseElementNavigator instance) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { return new ResourceReference() { @@ -103,17 +158,27 @@ public static ResourceReference ParseResourceReference(this ITypedElement instan Display = instance.Children("display").GetString() }; } + #endregion - public static CodeableConcept ParseCodeableConcept(this ITypedElement instance) + #region ParseCodeableConcept + public static CodeableConcept ParseCodeableConcept(this ITypedElement instance) => instance.parseCodeableConcept(); + internal static CodeableConcept ParseCodeableConcept(this IScopedNode instance) => instance.parseCodeableConcept(); +#pragma warning disable CS0618 // Type or member is obsolete + private static CodeableConcept parseCodeableConcept(this IBaseElementNavigator instance) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete { return new CodeableConcept() { Coding = - instance.Children("coding").Select(codingNav => codingNav.ParseCoding()).ToList(), + instance.Children("coding").Select(codingNav => codingNav.parseCoding()).ToList(), Text = instance.Children("text").GetString() }; } + #endregion - public static string GetString(this IEnumerable instance) => instance.SingleOrDefault()?.Value as string; +#pragma warning disable CS0618 // Type or member is obsolete + public static string GetString(this IEnumerable instance) where T : IBaseElementNavigator +#pragma warning restore CS0618 // Type or member is obsolete + => instance.SingleOrDefault()?.Value as string; } } diff --git a/src/Hl7.Fhir.Base/FhirPath/CompiledExpression.cs b/src/Hl7.Fhir.Base/FhirPath/CompiledExpression.cs index 5a8ae6a4b4..54072a9c50 100644 --- a/src/Hl7.Fhir.Base/FhirPath/CompiledExpression.cs +++ b/src/Hl7.Fhir.Base/FhirPath/CompiledExpression.cs @@ -50,6 +50,7 @@ public static bool IsTrue(this CompiledExpression evaluator, ITypedElement input return result is not null && result.Value; } + /// /// Evaluates if the result of an expression is equal to a given boolean. /// diff --git a/src/Hl7.Fhir.Base/Properties/AssemblyInfo.cs b/src/Hl7.Fhir.Base/Properties/AssemblyInfo.cs index 744c396e65..7a39b60caf 100644 --- a/src/Hl7.Fhir.Base/Properties/AssemblyInfo.cs +++ b/src/Hl7.Fhir.Base/Properties/AssemblyInfo.cs @@ -33,6 +33,15 @@ [assembly: InternalsVisibleTo("Hl7.FhirPath.R4.Tests")] [assembly: InternalsVisibleTo("Hl7.Fhir.Support.Tests")] [assembly: InternalsVisibleTo("Hl7.Fhir.Support.Poco.Tests")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Enterprise")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Tests")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.STU3")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.R4")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.R5")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Compilation.STU3.Tests")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Compilation.R4.Tests")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Compilation.R5.Tests")] #endif #if RELEASE @@ -60,4 +69,13 @@ [assembly: InternalsVisibleTo("Hl7.FhirPath.R4.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001001717d77343870eca52515a2ff9ba7ef2ff314f2f1e651f4a069401e35193d4d5124b33379a6380d510239044f012f720d395064192157eae8f67b3e4d524b79daadebd4e65ce67db327949b77bf26ca6c0f97c4ca1a578811202a537e4d112fffb2e42e852afdd71c3295c694911cdf0535f709b72ba172c40a2b1f2b607ffdc")] [assembly: InternalsVisibleTo("Hl7.Fhir.Support.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001001717d77343870eca52515a2ff9ba7ef2ff314f2f1e651f4a069401e35193d4d5124b33379a6380d510239044f012f720d395064192157eae8f67b3e4d524b79daadebd4e65ce67db327949b77bf26ca6c0f97c4ca1a578811202a537e4d112fffb2e42e852afdd71c3295c694911cdf0535f709b72ba172c40a2b1f2b607ffdc")] [assembly: InternalsVisibleTo("Hl7.Fhir.Support.Poco.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001001717d77343870eca52515a2ff9ba7ef2ff314f2f1e651f4a069401e35193d4d5124b33379a6380d510239044f012f720d395064192157eae8f67b3e4d524b79daadebd4e65ce67db327949b77bf26ca6c0f97c4ca1a578811202a537e4d112fffb2e42e852afdd71c3295c694911cdf0535f709b72ba172c40a2b1f2b607ffdc")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Enterprise, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.STU3, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.R4, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.R5, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Compilation.STU3.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Compilation.R4.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] +[assembly: InternalsVisibleTo("Firely.Fhir.Validation.Compilation.R5.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c11eea5df3095844b027f018b356bc326a5a30b1f245010ad789589aa685569b2eb7f5f2ea5c49dafed338e3d9969eab21848c6c20a6b0a22c5ff7797d9a5062d7f3e42478e905d72a3dde344086a003f2df9deeb838e206d92c8cc59150c3151e9490381321f77a716e0a2b24a585b302ba2b3db37966a3da9abe4c601ba4c1")] #endif