From a98db7aac2fc84b1217a3d80189977b13aeab44e Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 13 Dec 2022 16:42:59 +0100 Subject: [PATCH] Fixed GetDeterministicHashCodeAsString (use InvariantCulture) (#41) * Akka.Remote example * ToString(CultureInfo.InvariantCulture) * . --- ProxyInterfaceSourceGenerator Solution.sln | 9 ++ omnisharp.json | 5 + .../ProxyInterfaceConsumer.csproj | 2 +- .../Interfaces/ILocalActorRefProvider.cs | 9 ++ .../ProxyInterfaceConsumerForAkka/Program.cs | 13 ++ .../ProxyInterfaceConsumerForAkka.csproj | 29 ++++ .../Extensions/NamedTypeSymbolExtensions.cs | 4 +- .../Extensions/StringExtensions.cs | 4 +- .../Extensions/TypeSymbolExtensions.cs | 2 +- .../AkkaTests.cs | 63 ++++++++ ...Akka.Actor.LocalActorRefProviderProxy.g.cs | 144 ++++++++++++++++++ ...urce.AkkaActor.ILocalActorRefProvider.g.cs | 76 +++++++++ .../PnPTests.cs | 13 -- .../ProxyInterfaceSourceGeneratorTests.csproj | 9 ++ .../AkkaActor/ILocalActorRefProvider.cs | 6 + 15 files changed, 369 insertions(+), 19 deletions(-) create mode 100644 omnisharp.json create mode 100644 src-examples/ProxyInterfaceConsumerForAkka/Interfaces/ILocalActorRefProvider.cs create mode 100644 src-examples/ProxyInterfaceConsumerForAkka/Program.cs create mode 100644 src-examples/ProxyInterfaceConsumerForAkka/ProxyInterfaceConsumerForAkka.csproj create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/AkkaTests.cs create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/Akka.Actor.LocalActorRefProviderProxy.g.cs create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/ProxyInterfaceSourceGeneratorTests.Source.AkkaActor.ILocalActorRefProvider.g.cs create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/Source/AkkaActor/ILocalActorRefProvider.cs diff --git a/ProxyInterfaceSourceGenerator Solution.sln b/ProxyInterfaceSourceGenerator Solution.sln index 6b0b590..e59fa44 100644 --- a/ProxyInterfaceSourceGenerator Solution.sln +++ b/ProxyInterfaceSourceGenerator Solution.sln @@ -30,6 +30,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProxyInterfaceSourceGenerat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProxyInterfaceConsumerForPnP", "src-examples\ProxyInterfaceConsumerForPnP\ProxyInterfaceConsumerForPnP.csproj", "{5F7DA2C5-B908-4B57-9F5F-BADF1216D89C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProxyInterfaceConsumerForAkka", "src-examples\ProxyInterfaceConsumerForAkka\ProxyInterfaceConsumerForAkka.csproj", "{590908DF-A813-467A-94E4-3500020D0D54}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -65,6 +67,12 @@ Global {5F7DA2C5-B908-4B57-9F5F-BADF1216D89C}.DebugAttach|Any CPU.Build.0 = Debug|Any CPU {5F7DA2C5-B908-4B57-9F5F-BADF1216D89C}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F7DA2C5-B908-4B57-9F5F-BADF1216D89C}.Release|Any CPU.Build.0 = Release|Any CPU + {590908DF-A813-467A-94E4-3500020D0D54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {590908DF-A813-467A-94E4-3500020D0D54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {590908DF-A813-467A-94E4-3500020D0D54}.DebugAttach|Any CPU.ActiveCfg = Debug|Any CPU + {590908DF-A813-467A-94E4-3500020D0D54}.DebugAttach|Any CPU.Build.0 = Debug|Any CPU + {590908DF-A813-467A-94E4-3500020D0D54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {590908DF-A813-467A-94E4-3500020D0D54}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -75,6 +83,7 @@ Global {6BEBFEB9-635F-44A2-949C-15DDDF0B7740} = {38BA087F-EDA1-4F8A-A140-85B84791B815} {1BDB9046-D6D1-4FB4-AAB5-F24E33EEAE0A} = {19009F5B-3267-45E2-A8B6-89F2AB47D72C} {5F7DA2C5-B908-4B57-9F5F-BADF1216D89C} = {38BA087F-EDA1-4F8A-A140-85B84791B815} + {590908DF-A813-467A-94E4-3500020D0D54} = {38BA087F-EDA1-4F8A-A140-85B84791B815} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {585F071D-051D-441C-9C6B-226D9E15A1F5} diff --git a/omnisharp.json b/omnisharp.json new file mode 100644 index 0000000..0bad48f --- /dev/null +++ b/omnisharp.json @@ -0,0 +1,5 @@ +{ + "RoslynExtensionsOptions": { + "enableAnalyzersSupport": true + } +} \ No newline at end of file diff --git a/src-examples/ProxyInterfaceConsumer/ProxyInterfaceConsumer.csproj b/src-examples/ProxyInterfaceConsumer/ProxyInterfaceConsumer.csproj index 8c17c0a..6ac3dcc 100644 --- a/src-examples/ProxyInterfaceConsumer/ProxyInterfaceConsumer.csproj +++ b/src-examples/ProxyInterfaceConsumer/ProxyInterfaceConsumer.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Exe enable diff --git a/src-examples/ProxyInterfaceConsumerForAkka/Interfaces/ILocalActorRefProvider.cs b/src-examples/ProxyInterfaceConsumerForAkka/Interfaces/ILocalActorRefProvider.cs new file mode 100644 index 0000000..e56f853 --- /dev/null +++ b/src-examples/ProxyInterfaceConsumerForAkka/Interfaces/ILocalActorRefProvider.cs @@ -0,0 +1,9 @@ +using Akka.Actor; + +namespace ProxyInterfaceConsumerForAkka.Interfaces +{ + [ProxyInterfaceGenerator.Proxy(typeof(LocalActorRefProvider))] + public partial interface ILocalActorRefProvider + { + } +} \ No newline at end of file diff --git a/src-examples/ProxyInterfaceConsumerForAkka/Program.cs b/src-examples/ProxyInterfaceConsumerForAkka/Program.cs new file mode 100644 index 0000000..8fd3715 --- /dev/null +++ b/src-examples/ProxyInterfaceConsumerForAkka/Program.cs @@ -0,0 +1,13 @@ +using Akka.Actor; +using ProxyInterfaceConsumerForAkka.Interfaces; + +namespace ProxyInterfaceConsumerForAkka; + +public class Program +{ + public static void Main() + { + LocalActorRefProvider p = null; + ILocalActorRefProvider proxy = new LocalActorRefProviderProxy(p); + } +} \ No newline at end of file diff --git a/src-examples/ProxyInterfaceConsumerForAkka/ProxyInterfaceConsumerForAkka.csproj b/src-examples/ProxyInterfaceConsumerForAkka/ProxyInterfaceConsumerForAkka.csproj new file mode 100644 index 0000000..2b2d8fa --- /dev/null +++ b/src-examples/ProxyInterfaceConsumerForAkka/ProxyInterfaceConsumerForAkka.csproj @@ -0,0 +1,29 @@ + + + + net6.0 + Exe + enable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + \ No newline at end of file diff --git a/src/ProxyInterfaceSourceGenerator/Extensions/NamedTypeSymbolExtensions.cs b/src/ProxyInterfaceSourceGenerator/Extensions/NamedTypeSymbolExtensions.cs index ef94c9c..f3bbecf 100644 --- a/src/ProxyInterfaceSourceGenerator/Extensions/NamedTypeSymbolExtensions.cs +++ b/src/ProxyInterfaceSourceGenerator/Extensions/NamedTypeSymbolExtensions.cs @@ -41,11 +41,9 @@ internal static class NamedTypeSymbolExtensions // str.AppendFormat("<{0}>", string.Join(", ", namedTypeSymbol.TypeArguments.OfType().Select(typeArg => typeArg.GetFullType()))); //} - return namedTypeSymbol.OriginalDefinition.ToString();// str.ToString(); + return namedTypeSymbol.OriginalDefinition.ToString(); } - - /// /// See https://stackoverflow.com/questions/24157101/roslyns-gettypebymetadataname-and-generic-types /// diff --git a/src/ProxyInterfaceSourceGenerator/Extensions/StringExtensions.cs b/src/ProxyInterfaceSourceGenerator/Extensions/StringExtensions.cs index 07f580c..ddc566a 100644 --- a/src/ProxyInterfaceSourceGenerator/Extensions/StringExtensions.cs +++ b/src/ProxyInterfaceSourceGenerator/Extensions/StringExtensions.cs @@ -1,3 +1,5 @@ +using System.Globalization; + namespace ProxyInterfaceSourceGenerator.Extensions; internal static class StringExtensions @@ -23,7 +25,7 @@ internal static class StringExtensions int result = hash1 + hash2 * 1566083941; - return result.ToString().Replace('-', '_'); + return result.ToString(CultureInfo.InvariantCulture).Replace('-', '_'); } } diff --git a/src/ProxyInterfaceSourceGenerator/Extensions/TypeSymbolExtensions.cs b/src/ProxyInterfaceSourceGenerator/Extensions/TypeSymbolExtensions.cs index e24bd58..807929c 100644 --- a/src/ProxyInterfaceSourceGenerator/Extensions/TypeSymbolExtensions.cs +++ b/src/ProxyInterfaceSourceGenerator/Extensions/TypeSymbolExtensions.cs @@ -21,7 +21,7 @@ internal static class TypeSymbolExtensions } public static bool IsString(this ITypeSymbol ts) => - ts.ToString() == "string" || ts.ToString() == "string?"; + ts.ToString().ToLowerInvariant() == "string" || ts.ToString().ToLowerInvariant() == "string?"; internal static bool IsClass(this ITypeSymbol ts) => ts.IsReferenceType && ts.TypeKind == TypeKind.Class; diff --git a/tests/ProxyInterfaceSourceGeneratorTests/AkkaTests.cs b/tests/ProxyInterfaceSourceGeneratorTests/AkkaTests.cs new file mode 100644 index 0000000..a23d202 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/AkkaTests.cs @@ -0,0 +1,63 @@ +using System.IO; +using System.Linq; +using CSharp.SourceGenerators.Extensions; +using CSharp.SourceGenerators.Extensions.Models; +using CultureAwareTesting.xUnit; +using FluentAssertions; +using ProxyInterfaceSourceGenerator; + +namespace ProxyInterfaceSourceGeneratorTests; + +public class AkkaTests +{ + private bool Write = true; + + private readonly ProxyInterfaceCodeGenerator _sut; + + public AkkaTests() + { + _sut = new ProxyInterfaceCodeGenerator(); + } + + [CulturedFact("sv-SE")] + public void GenerateFiles_Should_GenerateCorrectFiles() + { + // Arrange + var fileNames = new[] + { + "ProxyInterfaceSourceGeneratorTests.Source.AkkaActor.ILocalActorRefProvider.g.cs", + "Akka.Actor.LocalActorRefProviderProxy.g.cs" + }; + + var path = "./Source/AkkaActor/ILocalActorRefProvider.cs"; + var sourceFile = new SourceFile + { + Path = path, + Text = File.ReadAllText(path), + AttributeToAddToInterface = new ExtraAttribute + { + Name = "ProxyInterfaceGenerator.Proxy", + ArgumentList = "typeof(Akka.Actor.LocalActorRefProvider)" + } + }; + + // Act + var result = _sut.Execute(new[] + { + sourceFile + }); + + // Assert + result.Valid.Should().BeTrue(); + result.Files.Should().HaveCount(fileNames.Length + 1); + + foreach (var fileName in fileNames.Select((fileName, index) => new { fileName, index })) + { + var builder = result.Files[fileName.index + 1]; // +1 means skip the attribute + builder.Path.Should().EndWith(fileName.fileName); + + if (Write) File.WriteAllText($"../../../Destination/AkkaGenerated/{fileName.fileName}", builder.Text); + builder.Text.Should().Be(File.ReadAllText($"../../../Destination/AkkaGenerated/{fileName.fileName}")); + } + } +} \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/Akka.Actor.LocalActorRefProviderProxy.g.cs b/tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/Akka.Actor.LocalActorRefProviderProxy.g.cs new file mode 100644 index 0000000..3c806b4 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/Akka.Actor.LocalActorRefProviderProxy.g.cs @@ -0,0 +1,144 @@ +//---------------------------------------------------------------------------------------- +// +// This code was generated by https://github.com/StefH/ProxyInterfaceSourceGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//---------------------------------------------------------------------------------------- + +#nullable enable +using System; + +namespace ProxyInterfaceSourceGeneratorTests.Source.AkkaActor +{ + public partial class LocalActorRefProviderProxy : ILocalActorRefProvider + { + public Akka.Actor.LocalActorRefProvider _Instance { get; } + + + public Akka.Actor.IActorRef DeadLetters { get => _Instance.DeadLetters; } + + public Akka.Actor.IActorRef IgnoreRef { get => _Instance.IgnoreRef; } + + public Akka.Actor.Deployer Deployer { get => _Instance.Deployer; } + + public Akka.Actor.IInternalActorRef RootGuardian { get => _Instance.RootGuardian; } + + public Akka.Actor.ActorPath RootPath { get => _Instance.RootPath; } + + public Akka.Actor.Settings Settings { get => _Instance.Settings; } + + public Akka.Actor.LocalActorRef SystemGuardian { get => _Instance.SystemGuardian; } + + public Akka.Actor.IInternalActorRef TempContainer { get => _Instance.TempContainer; } + + public System.Threading.Tasks.Task TerminationTask { get => _Instance.TerminationTask; } + + public Akka.Actor.LocalActorRef Guardian { get => _Instance.Guardian; } + + public Akka.Event.EventStream EventStream { get => _Instance.EventStream; } + + public Akka.Actor.Address DefaultAddress { get => _Instance.DefaultAddress; } + + public Akka.Serialization.Information SerializationInformation { get => _Instance.SerializationInformation; } + + public Akka.Event.ILoggingAdapter Log { get => _Instance.Log; } + + + + public Akka.Actor.ActorPath TempPath() + { + var result_690338229 = _Instance.TempPath(); + return result_690338229; + } + + public void RegisterExtraName(string name, Akka.Actor.IInternalActorRef actor) + { + string name_ = name; + Akka.Actor.IInternalActorRef actor_ = actor; + _Instance.RegisterExtraName(name_, actor_); + } + + public Akka.Actor.IActorRef RootGuardianAt(Akka.Actor.Address address) + { + Akka.Actor.Address address_ = address; + var result__1703611252 = _Instance.RootGuardianAt(address_); + return result__1703611252; + } + + public void RegisterTempActor(Akka.Actor.IInternalActorRef actorRef, Akka.Actor.ActorPath path) + { + Akka.Actor.IInternalActorRef actorRef_ = actorRef; + Akka.Actor.ActorPath path_ = path; + _Instance.RegisterTempActor(actorRef_, path_); + } + + public void UnregisterTempActor(Akka.Actor.ActorPath path) + { + Akka.Actor.ActorPath path_ = path; + _Instance.UnregisterTempActor(path_); + } + + public Akka.Actor.FutureActorRef CreateFutureRef(System.Threading.Tasks.TaskCompletionSource tcs) + { + System.Threading.Tasks.TaskCompletionSource tcs_ = tcs; + var result_1137255884 = _Instance.CreateFutureRef(tcs_); + return result_1137255884; + } + + public void Init(Akka.Actor.Internal.ActorSystemImpl system) + { + Akka.Actor.Internal.ActorSystemImpl system_ = system; + _Instance.Init(system_); + } + + public Akka.Actor.IActorRef ResolveActorRef(string path) + { + string path_ = path; + var result_1085051580 = _Instance.ResolveActorRef(path_); + return result_1085051580; + } + + public Akka.Actor.IActorRef ResolveActorRef(Akka.Actor.ActorPath path) + { + Akka.Actor.ActorPath path_ = path; + var result_1085051580 = _Instance.ResolveActorRef(path_); + return result_1085051580; + } + + public Akka.Actor.IInternalActorRef ActorOf(Akka.Actor.Internal.ActorSystemImpl system, Akka.Actor.Props props, Akka.Actor.IInternalActorRef supervisor, Akka.Actor.ActorPath path, bool systemService, Akka.Actor.Deploy deploy, bool lookupDeploy, bool @async) + { + Akka.Actor.Internal.ActorSystemImpl system_ = system; + Akka.Actor.Props props_ = props; + Akka.Actor.IInternalActorRef supervisor_ = supervisor; + Akka.Actor.ActorPath path_ = path; + bool systemService_ = systemService; + Akka.Actor.Deploy deploy_ = deploy; + bool lookupDeploy_ = lookupDeploy; + bool @async_ = @async; + var result_540498530 = _Instance.ActorOf(system_, props_, supervisor_, path_, systemService_, deploy_, lookupDeploy_, @async_); + return result_540498530; + } + + public Akka.Actor.Address GetExternalAddressFor(Akka.Actor.Address address) + { + Akka.Actor.Address address_ = address; + var result_1116520814 = _Instance.GetExternalAddressFor(address_); + return result_1116520814; + } + + + + + + public LocalActorRefProviderProxy(Akka.Actor.LocalActorRefProvider instance) + { + _Instance = instance; + + + + } + } +} +#nullable disable \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/ProxyInterfaceSourceGeneratorTests.Source.AkkaActor.ILocalActorRefProvider.g.cs b/tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/ProxyInterfaceSourceGeneratorTests.Source.AkkaActor.ILocalActorRefProvider.g.cs new file mode 100644 index 0000000..5a1b7cd --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/Destination/AkkaGenerated/ProxyInterfaceSourceGeneratorTests.Source.AkkaActor.ILocalActorRefProvider.g.cs @@ -0,0 +1,76 @@ +//---------------------------------------------------------------------------------------- +// +// This code was generated by https://github.com/StefH/ProxyInterfaceSourceGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//---------------------------------------------------------------------------------------- + +#nullable enable +using System; + +namespace ProxyInterfaceSourceGeneratorTests.Source.AkkaActor +{ + public partial interface ILocalActorRefProvider + { + Akka.Actor.LocalActorRefProvider _Instance { get; } + + Akka.Actor.IActorRef DeadLetters { get; } + + Akka.Actor.IActorRef IgnoreRef { get; } + + Akka.Actor.Deployer Deployer { get; } + + Akka.Actor.IInternalActorRef RootGuardian { get; } + + Akka.Actor.ActorPath RootPath { get; } + + Akka.Actor.Settings Settings { get; } + + Akka.Actor.LocalActorRef SystemGuardian { get; } + + Akka.Actor.IInternalActorRef TempContainer { get; } + + System.Threading.Tasks.Task TerminationTask { get; } + + Akka.Actor.LocalActorRef Guardian { get; } + + Akka.Event.EventStream EventStream { get; } + + Akka.Actor.Address DefaultAddress { get; } + + Akka.Serialization.Information SerializationInformation { get; } + + Akka.Event.ILoggingAdapter Log { get; } + + + + Akka.Actor.ActorPath TempPath(); + + void RegisterExtraName(string name, Akka.Actor.IInternalActorRef actor); + + Akka.Actor.IActorRef RootGuardianAt(Akka.Actor.Address address); + + void RegisterTempActor(Akka.Actor.IInternalActorRef actorRef, Akka.Actor.ActorPath path); + + void UnregisterTempActor(Akka.Actor.ActorPath path); + + Akka.Actor.FutureActorRef CreateFutureRef(System.Threading.Tasks.TaskCompletionSource tcs); + + void Init(Akka.Actor.Internal.ActorSystemImpl system); + + Akka.Actor.IActorRef ResolveActorRef(string path); + + Akka.Actor.IActorRef ResolveActorRef(Akka.Actor.ActorPath path); + + Akka.Actor.IInternalActorRef ActorOf(Akka.Actor.Internal.ActorSystemImpl system, Akka.Actor.Props props, Akka.Actor.IInternalActorRef supervisor, Akka.Actor.ActorPath path, bool systemService, Akka.Actor.Deploy deploy, bool lookupDeploy, bool @async); + + Akka.Actor.Address GetExternalAddressFor(Akka.Actor.Address address); + + + + + } +} +#nullable disable \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/PnPTests.cs b/tests/ProxyInterfaceSourceGeneratorTests/PnPTests.cs index 440d97a..2b0132c 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/PnPTests.cs +++ b/tests/ProxyInterfaceSourceGeneratorTests/PnPTests.cs @@ -3,9 +3,7 @@ using System.Linq; using CSharp.SourceGenerators.Extensions; using CSharp.SourceGenerators.Extensions.Models; using FluentAssertions; -using Moq; using ProxyInterfaceSourceGenerator; -using ProxyInterfaceSourceGeneratorTests.Source.PnP; using Xunit; namespace ProxyInterfaceSourceGeneratorTests; @@ -123,15 +121,4 @@ public class PnPTests builder.Text.Should().Be(File.ReadAllText($"../../../Destination/{fileName.fileName}")); } } - - [Fact] - public void X() - { - var webMock = new Mock(); - - - var ccMock = new Mock(); - // ccMock.SetupGet(cc => cc.Web).Returns(webMock.Object); - - } } \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj index 536f4b3..ef27c3e 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj @@ -9,7 +9,9 @@ + + @@ -41,6 +43,13 @@ PreserveNewest + + PreserveNewest + + + + + \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Source/AkkaActor/ILocalActorRefProvider.cs b/tests/ProxyInterfaceSourceGeneratorTests/Source/AkkaActor/ILocalActorRefProvider.cs new file mode 100644 index 0000000..bd959e2 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/Source/AkkaActor/ILocalActorRefProvider.cs @@ -0,0 +1,6 @@ +namespace ProxyInterfaceSourceGeneratorTests.Source.AkkaActor +{ + public partial interface ILocalActorRefProvider + { + } +} \ No newline at end of file