diff --git a/capnpc-csharp.tests/Properties/Resources.Designer.cs b/capnpc-csharp.tests/Properties/Resources.Designer.cs index 26b2a07..ad396a7 100644 --- a/capnpc-csharp.tests/Properties/Resources.Designer.cs +++ b/capnpc-csharp.tests/Properties/Resources.Designer.cs @@ -70,6 +70,16 @@ namespace capnpc_csharp.Tests.Properties { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] UnitTest10_capnp { + get { + object obj = ResourceManager.GetObject("UnitTest10_capnp", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// diff --git a/capnpc-csharp.tests/Properties/Resources.resx b/capnpc-csharp.tests/Properties/Resources.resx index 20c6d62..43736d8 100644 --- a/capnpc-csharp.tests/Properties/Resources.resx +++ b/capnpc-csharp.tests/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\UnitTest10.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\UnitTest3.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/capnpc-csharp.tests/Resources/UnitTest10.capnp.bin b/capnpc-csharp.tests/Resources/UnitTest10.capnp.bin new file mode 100644 index 0000000..dade3aa Binary files /dev/null and b/capnpc-csharp.tests/Resources/UnitTest10.capnp.bin differ diff --git a/capnpc-csharp.tests/UnitTest10.capnp b/capnpc-csharp.tests/UnitTest10.capnp new file mode 100644 index 0000000..226e94b --- /dev/null +++ b/capnpc-csharp.tests/UnitTest10.capnp @@ -0,0 +1,9 @@ +@0xbbfd48ae4b99d012; + +using Cxx = import "/capnp/c++.capnp"; + +$Cxx.namespace("Foo::Bar::Baz"); + +struct Outer { + inner @0: import "UnitTest10b.capnp".Inner ; +} diff --git a/capnpc-csharp.tests/UnitTest10b.capnp b/capnpc-csharp.tests/UnitTest10b.capnp new file mode 100644 index 0000000..4d49fee --- /dev/null +++ b/capnpc-csharp.tests/UnitTest10b.capnp @@ -0,0 +1,7 @@ +@0xaf95c1c78b01be97; + +using Cxx = import "/capnp/c++.capnp"; + +$Cxx.namespace("Foo::Garf::Snarf"); + +struct Inner {} diff --git a/capnpc-csharp.tests/UnitTests.cs b/capnpc-csharp.tests/UnitTests.cs index 987f6e1..26389b7 100644 --- a/capnpc-csharp.tests/UnitTests.cs +++ b/capnpc-csharp.tests/UnitTests.cs @@ -1,6 +1,7 @@ using capnpc_csharp.Tests.Properties; using Capnp; using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -47,6 +48,29 @@ namespace CapnpC // Should not throw } + [TestMethod] + public void Test10ImportedNamespaces() + { + var model = Load(Resources.UnitTest10_capnp); + var codeGen = NewGeneratorFor(model); + var genFile = model.FilesToGenerate.First(); + var outerTypeDef = genFile.NestedTypes.First(); + var outerType = Model.Types.FromDefinition(outerTypeDef); + var innerType = outerTypeDef.Fields[0].Type; + var innerTypeDef = innerType.Definition; + var names = codeGen.GetNames(); + var outerNameSyntax = names.GetQName(outerType, outerTypeDef); + var innerNameSyntax = names.GetQName(innerType, outerTypeDef); + string[] outerNamespace = { "Foo", "Bar", "Baz" }; + string[] innerNamespace = { "Foo", "Garf", "Snarf" }; + CollectionAssert.AreEqual(outerNamespace, (outerTypeDef.DeclaringElement as Model.GenFile).Namespace); + CollectionAssert.AreEqual(innerNamespace, (innerType.Definition.DeclaringElement as Model.GenFile).Namespace); + string outerNSStr = String.Join('.', outerNamespace); + string innerNSStr = String.Join('.', innerNamespace); + Assert.AreEqual($"{outerNSStr}.Outer", outerNameSyntax.ToString()); + Assert.AreEqual($"{innerNSStr}.Inner", innerNameSyntax.ToString()); + } + static Generator.CodeGenerator NewGeneratorFor(Model.SchemaModel model) => new Generator.CodeGenerator(model, new Generator.GeneratorOptions()); diff --git a/capnpc-csharp/Generator/GenNames.cs b/capnpc-csharp/Generator/GenNames.cs index f71a253..ea6b3a3 100644 --- a/capnpc-csharp/Generator/GenNames.cs +++ b/capnpc-csharp/Generator/GenNames.cs @@ -235,7 +235,7 @@ namespace CapnpC.Generator return qtype; } - NameSyntax GetQName(Model.Type type, TypeDefinition scope) + internal NameSyntax GetQName(Model.Type type, TypeDefinition scope) { // FIXME: With the help of the 'scope' parameter we will be able to generate abbreviated // qualified names. Unfortunately the commented approach is too naive. It will fail if