From e2cfb8aaf1030475294cdbb68a72f0422cef1177 Mon Sep 17 00:00:00 2001 From: Kuba Ober Date: Fri, 30 Aug 2019 11:23:44 -0400 Subject: [PATCH 1/6] Test constants in imported non-generated structures and interfaces. --- .../Properties/Resources.Designer.cs | 10 ++++++++++ capnpc-csharp.tests/Properties/Resources.resx | 3 +++ .../Resources/UnitTest11.capnp.bin | Bin 0 -> 2080 bytes capnpc-csharp.tests/UnitTest11.capnp | 15 +++++++++++++++ capnpc-csharp.tests/UnitTest11b.capnp | 9 +++++++++ capnpc-csharp.tests/UnitTests.cs | 7 +++++++ 6 files changed, 44 insertions(+) create mode 100644 capnpc-csharp.tests/Resources/UnitTest11.capnp.bin create mode 100644 capnpc-csharp.tests/UnitTest11.capnp create mode 100644 capnpc-csharp.tests/UnitTest11b.capnp diff --git a/capnpc-csharp.tests/Properties/Resources.Designer.cs b/capnpc-csharp.tests/Properties/Resources.Designer.cs index 7c7c2e9..0f7df65 100644 --- a/capnpc-csharp.tests/Properties/Resources.Designer.cs +++ b/capnpc-csharp.tests/Properties/Resources.Designer.cs @@ -90,6 +90,16 @@ namespace capnpc_csharp.Tests.Properties { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] UnitTest11_capnp { + get { + object obj = ResourceManager.GetObject("UnitTest11_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 6d2bda3..2404b46 100644 --- a/capnpc-csharp.tests/Properties/Resources.resx +++ b/capnpc-csharp.tests/Properties/Resources.resx @@ -136,4 +136,7 @@ ..\Resources\schema-with-offsets.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\UnitTest11.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/capnpc-csharp.tests/Resources/UnitTest11.capnp.bin b/capnpc-csharp.tests/Resources/UnitTest11.capnp.bin new file mode 100644 index 0000000000000000000000000000000000000000..536360967d118087b8d9a5df18835172038d5730 GIT binary patch literal 2080 zcmeHIO=}cE5Urhw@f$Rt5;3TVm<5e4Y6Q_s^ss1n_&X+Fj+Pe1O?9;P>A3m z5`*U8MNm)=qL&=J>Op^iMkJ`moV+N$>YlgVGwiBAz*@TNqpPZWURC#sh=e6fhB{;; z_;?`lHWb+oxdTI&PeXqSF0#_h+c2+?PU-&ma_h<2{x55dwf)qCBvV-44Zf$nTXW@6 zv@n0^`TSfLEV}>o-e0@!FTHup{pq+9i_1{xC9wq^iv$ZL(#kzNxP!BT%nW4`Q7V0TPyJ< z;_qN#8vI}Ieb700cK@||vwB{|fpskAzJ+`N#tep!??dQ%esacLzR`bsYA#;f0Rvow z`xJ4|^A2EWULS|M&|BefJ{e1g5FRhq>j{vR$(sTNBmbqAHm?hs$azzoJ`}! zP}-P`QfQf8O<)|YMX`v>KVmmHT1^r!!rp_Dyo-(;EMGkJ3dfXl7}0n#k=BxQNRxuv zx~roKM8%VI0D{IH1J}5*9BLvPGDqHL#*uTKI=RW?p{9MR#QSSCH*?)t ztmN>@>Y6#QZ+I^D4fC^a@?9Webnjd)zh4jMz&i6@D3${l7aFyCJ#LuO{Jp--e0_eL zR_1@5Z9(<_sDutA&en>0LC|-r-TTIOg8s)L=zGMzpq-rWF?DkG4fP%fnuqTa?VBLz xd9-f4VMfeNym7X^t^90X1 Date: Fri, 30 Aug 2019 11:35:25 -0400 Subject: [PATCH 2/6] Assert that non-file definitions must have a parent. --- capnpc-csharp/Model/Annotation.cs | 4 +++- capnpc-csharp/Model/Constant.cs | 4 +++- capnpc-csharp/Model/GenFile.cs | 2 +- capnpc-csharp/Model/SchemaModel.cs | 1 + capnpc-csharp/Model/TypeDefinition.cs | 2 ++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/capnpc-csharp/Model/Annotation.cs b/capnpc-csharp/Model/Annotation.cs index 6dbbd9a..1f5a9c0 100644 --- a/capnpc-csharp/Model/Annotation.cs +++ b/capnpc-csharp/Model/Annotation.cs @@ -1,4 +1,5 @@ - +using System.Diagnostics; + namespace CapnpC.Model { class Annotation : IDefinition @@ -11,6 +12,7 @@ namespace CapnpC.Model public Annotation(ulong id, IHasNestedDefinitions parent) { + Trace.Assert(parent != null); Id = id; DeclaringElement = parent; parent.NestedDefinitions.Add(this); diff --git a/capnpc-csharp/Model/Constant.cs b/capnpc-csharp/Model/Constant.cs index a992ca0..64e9107 100644 --- a/capnpc-csharp/Model/Constant.cs +++ b/capnpc-csharp/Model/Constant.cs @@ -1,4 +1,5 @@ - +using System.Diagnostics; + namespace CapnpC.Model { class Constant : IDefinition @@ -11,6 +12,7 @@ namespace CapnpC.Model public Constant(ulong id, IHasNestedDefinitions parent) { + Trace.Assert(parent != null); Id = id; DeclaringElement = parent; parent.NestedDefinitions.Add(this); diff --git a/capnpc-csharp/Model/GenFile.cs b/capnpc-csharp/Model/GenFile.cs index f912303..15b7918 100644 --- a/capnpc-csharp/Model/GenFile.cs +++ b/capnpc-csharp/Model/GenFile.cs @@ -6,7 +6,7 @@ namespace CapnpC.Model { public ulong Id { get; } public TypeTag Tag { get => TypeTag.File; } - public IHasNestedDefinitions DeclaringElement { get; } + public IHasNestedDefinitions DeclaringElement { get => null; } public string Name { get; set; } public string[] Namespace { get; set; } diff --git a/capnpc-csharp/Model/SchemaModel.cs b/capnpc-csharp/Model/SchemaModel.cs index 4ebafec..4aca4f7 100644 --- a/capnpc-csharp/Model/SchemaModel.cs +++ b/capnpc-csharp/Model/SchemaModel.cs @@ -137,6 +137,7 @@ namespace CapnpC.Model if (def == null) { + Trace.Assert(state.parent != null, $"The {node.GetTypeTag().ToString()} node {node.StrId()} was expected to have a parent."); var typeDef = _typeDefMgr.CreateTypeDef(id, node.GetTypeTag(), state.parent); typeDef.Name = name; def = typeDef; diff --git a/capnpc-csharp/Model/TypeDefinition.cs b/capnpc-csharp/Model/TypeDefinition.cs index 910d4bd..19fb166 100644 --- a/capnpc-csharp/Model/TypeDefinition.cs +++ b/capnpc-csharp/Model/TypeDefinition.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics; using System.Linq; namespace CapnpC.Model { @@ -18,6 +19,7 @@ namespace CapnpC.Model public TypeDefinition(TypeTag tag, ulong id, IHasNestedDefinitions parent) { + Trace.Assert(parent != null); Tag = tag; Id = id; DeclaringElement = parent; From 024ecbbced001d29c7524dbb84d4b198892a320d Mon Sep 17 00:00:00 2001 From: Kuba Ober Date: Fri, 30 Aug 2019 11:16:02 -0400 Subject: [PATCH 3/6] Fix categorization of generated vs. non-generated nodes. --- capnpc-csharp/Model/Annotation.cs | 2 + capnpc-csharp/Model/Constant.cs | 2 + capnpc-csharp/Model/DefinitionManager.cs | 6 +-- capnpc-csharp/Model/GenFile.cs | 4 +- capnpc-csharp/Model/IDefinition.cs | 1 + capnpc-csharp/Model/SchemaModel.cs | 51 +++++++++++++----------- capnpc-csharp/Model/TypeDefinition.cs | 2 + 7 files changed, 40 insertions(+), 28 deletions(-) diff --git a/capnpc-csharp/Model/Annotation.cs b/capnpc-csharp/Model/Annotation.cs index 1f5a9c0..36191b6 100644 --- a/capnpc-csharp/Model/Annotation.cs +++ b/capnpc-csharp/Model/Annotation.cs @@ -5,6 +5,7 @@ namespace CapnpC.Model class Annotation : IDefinition { public ulong Id { get; } + public bool IsGenerated { get; } public TypeTag Tag { get => TypeTag.Annotation; } public IHasNestedDefinitions DeclaringElement { get; } @@ -14,6 +15,7 @@ namespace CapnpC.Model { Trace.Assert(parent != null); Id = id; + IsGenerated = (parent as IDefinition).IsGenerated; DeclaringElement = parent; parent.NestedDefinitions.Add(this); } diff --git a/capnpc-csharp/Model/Constant.cs b/capnpc-csharp/Model/Constant.cs index 64e9107..5879100 100644 --- a/capnpc-csharp/Model/Constant.cs +++ b/capnpc-csharp/Model/Constant.cs @@ -5,6 +5,7 @@ namespace CapnpC.Model class Constant : IDefinition { public ulong Id { get; } + public bool IsGenerated { get; } public TypeTag Tag { get => TypeTag.Const; } public IHasNestedDefinitions DeclaringElement { get; } @@ -14,6 +15,7 @@ namespace CapnpC.Model { Trace.Assert(parent != null); Id = id; + IsGenerated = (parent as IDefinition).IsGenerated; DeclaringElement = parent; parent.NestedDefinitions.Add(this); } diff --git a/capnpc-csharp/Model/DefinitionManager.cs b/capnpc-csharp/Model/DefinitionManager.cs index 4a88fc6..95b9183 100644 --- a/capnpc-csharp/Model/DefinitionManager.cs +++ b/capnpc-csharp/Model/DefinitionManager.cs @@ -8,12 +8,12 @@ namespace CapnpC.Model { readonly Dictionary _id2def = new Dictionary(); - public GenFile CreateFile(ulong id) - => CreateId(id, () => new GenFile(id)); + public GenFile CreateFile(ulong id, bool isGenerated) + => CreateId(id, () => new GenFile(id, isGenerated)); public GenFile GetExistingFile(ulong id) => GetId(id, TypeTag.File); - public TypeDefinition CreateTypeDef(ulong id, TypeTag tag, IHasNestedDefinitions decl) + public TypeDefinition CreateTypeDef(ulong id, TypeTag tag, IHasNestedDefinitions decl) => CreateId(id, () => new TypeDefinition(tag, id, decl)); public TypeDefinition GetExistingTypeDef(ulong id, TypeTag tag) { diff --git a/capnpc-csharp/Model/GenFile.cs b/capnpc-csharp/Model/GenFile.cs index 15b7918..f889fce 100644 --- a/capnpc-csharp/Model/GenFile.cs +++ b/capnpc-csharp/Model/GenFile.cs @@ -5,6 +5,7 @@ namespace CapnpC.Model class GenFile: IDefinition, IHasNestedDefinitions { public ulong Id { get; } + public bool IsGenerated { get; } public TypeTag Tag { get => TypeTag.File; } public IHasNestedDefinitions DeclaringElement { get => null; } @@ -15,9 +16,10 @@ namespace CapnpC.Model public ICollection NestedDefinitions { get; } = new List(); public ICollection Constants { get; } = new List(); - public GenFile(ulong id) + public GenFile(ulong id, bool isGenerated) { Id = id; + IsGenerated = isGenerated; } } } diff --git a/capnpc-csharp/Model/IDefinition.cs b/capnpc-csharp/Model/IDefinition.cs index e226d40..9bd8572 100644 --- a/capnpc-csharp/Model/IDefinition.cs +++ b/capnpc-csharp/Model/IDefinition.cs @@ -4,6 +4,7 @@ namespace CapnpC.Model interface IDefinition { ulong Id { get; } + bool IsGenerated { get; } TypeTag Tag { get; } IHasNestedDefinitions DeclaringElement { get; } } diff --git a/capnpc-csharp/Model/SchemaModel.cs b/capnpc-csharp/Model/SchemaModel.cs index 4aca4f7..8d0a9fd 100644 --- a/capnpc-csharp/Model/SchemaModel.cs +++ b/capnpc-csharp/Model/SchemaModel.cs @@ -61,7 +61,6 @@ namespace CapnpC.Model struct Pass1State { public HashSet unprocessedNodes; - public bool isGenerated; public IHasNestedDefinitions parent; } @@ -74,17 +73,11 @@ namespace CapnpC.Model foreach (var node in _id2node.Values.Where(n => n.IsFile)) { GenFile file; - state.isGenerated = requestedFiles.TryGetValue(node.Id, out var req); - state.parent = null; - if (state.isGenerated) - { - file = (GenFile)ProcessNodePass1(node.Id, req.Filename, state); + bool isGenerated = requestedFiles.TryGetValue(node.Id, out var req); + var filename = isGenerated ? req.Filename : node.DisplayName; + file = ProcessFilePass1(node.Id, filename, state, isGenerated); + if (isGenerated) _generatedFiles.Add(file); - } - else - { - file = (GenFile)ProcessNodePass1(node.Id, node.DisplayName, state); - } } if (state.unprocessedNodes.Count != 0) { @@ -92,9 +85,20 @@ namespace CapnpC.Model } } + GenFile ProcessFilePass1(ulong id, string name, Pass1State state, bool isGenerated) + { + var file = _typeDefMgr.CreateFile(id, isGenerated); + var node = IdToNode(id); + state.parent = null; + file.Namespace = GetNamespaceAnnotation(node); + file.Name = name; + return ProcessNodePass1(id, name, state) as GenFile; + } + IDefinition ProcessNodePass1(ulong id, string name, Pass1State state) { - if (!(IdToNode(id, state.isGenerated) is Schema.Node.Reader node)) + bool mustExist = state.parent == null || (state.parent as IDefinition).IsGenerated; + if (!(IdToNode(id, mustExist) is Schema.Node.Reader node)) return null; if (!state.unprocessedNodes.Remove(id)) return null; @@ -112,10 +116,11 @@ namespace CapnpC.Model return _typeDefMgr.CreateConstant(id, state.parent); case NodeKind.File: if (state.parent != null) - throw new InvalidSchemaException("Did not expect file nodes to appear as nested nodes"); - var file = _typeDefMgr.CreateFile(id); + throw new InvalidSchemaException($"Did not expect a file node {node.StrId()} to be a nested node."); + var file = _typeDefMgr.GetExistingFile(id); file.Namespace = GetNamespaceAnnotation(node); file.Name = name; + state.parent = file; def = file; processNestedNodes = true; break; @@ -140,9 +145,9 @@ namespace CapnpC.Model Trace.Assert(state.parent != null, $"The {node.GetTypeTag().ToString()} node {node.StrId()} was expected to have a parent."); var typeDef = _typeDefMgr.CreateTypeDef(id, node.GetTypeTag(), state.parent); typeDef.Name = name; + state.parent = typeDef; def = typeDef; } - state.parent = def as IHasNestedDefinitions; if (processNestedNodes && node.NestedNodes != null) foreach (var nested in node.NestedNodes) @@ -187,7 +192,6 @@ namespace CapnpC.Model struct Pass2State { public Method currentMethod; - public bool isGenerated; public HashSet processedNodes; } @@ -197,16 +201,15 @@ namespace CapnpC.Model foreach (var file in _typeDefMgr.Files) { var node = IdToNode(file.Id); - state.isGenerated = requestedFiles.ContainsKey(file.Id); - ProcessNestedNodes(node.NestedNodes, state); + ProcessNestedNodes(node.NestedNodes, state, file.IsGenerated); } } - void ProcessNestedNodes(IEnumerable nestedNodes, Pass2State state) + void ProcessNestedNodes(IEnumerable nestedNodes, Pass2State state, bool mustExist) { foreach (var nestedNode in nestedNodes) { - ProcessNode(nestedNode.Id, state); + ProcessNode(nestedNode.Id, state, mustExist); } } @@ -534,7 +537,7 @@ namespace CapnpC.Model } } - ProcessNestedNodes(reader.NestedNodes, state); + ProcessNestedNodes(reader.NestedNodes, state, def.File.IsGenerated); ProcessFields(reader, def, def.Fields, state); @@ -683,7 +686,7 @@ namespace CapnpC.Model TypeDefinition ProcessTypeDef(ulong id, Pass2State state, TypeTag tag = default) { - var def = ProcessNode(id, state, tag); + var def = ProcessNode(id, state, true, tag); var typeDef = def as TypeDefinition; if (def == null) throw new ArgumentException( @@ -692,9 +695,9 @@ namespace CapnpC.Model return typeDef; } - IDefinition ProcessNode(ulong id, Pass2State state, TypeTag tag = default) + IDefinition ProcessNode(ulong id, Pass2State state, bool mustExist, TypeTag tag = default) { - if (!(IdToNode(id, state.isGenerated) is Schema.Node.Reader node)) return null; + if (!(IdToNode(id, mustExist) is Schema.Node.Reader node)) return null; var kind = node.GetKind(); if (tag == TypeTag.Unknown) tag = kind.GetTypeTag(); var def = _typeDefMgr.GetExistingDef(id, tag); diff --git a/capnpc-csharp/Model/TypeDefinition.cs b/capnpc-csharp/Model/TypeDefinition.cs index 19fb166..dcbe512 100644 --- a/capnpc-csharp/Model/TypeDefinition.cs +++ b/capnpc-csharp/Model/TypeDefinition.cs @@ -22,6 +22,7 @@ namespace CapnpC.Model Trace.Assert(parent != null); Tag = tag; Id = id; + IsGenerated = (parent as IDefinition).IsGenerated; DeclaringElement = parent; if (tag == TypeTag.Group) ((TypeDefinition)parent).NestedGroups.Add(this); @@ -30,6 +31,7 @@ namespace CapnpC.Model } public ulong Id { get; } + public bool IsGenerated { get; } public IHasNestedDefinitions DeclaringElement { get; } public Method UsingMethod { get; set; } From 2460467fa46a587d8d8cc1aec242822597600010 Mon Sep 17 00:00:00 2001 From: Kuba Ober Date: Fri, 30 Aug 2019 13:54:47 -0400 Subject: [PATCH 4/6] Factor out common code in unit tests. --- capnpc-csharp.tests/UnitTests.cs | 53 +++++++++++++++++++------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/capnpc-csharp.tests/UnitTests.cs b/capnpc-csharp.tests/UnitTests.cs index 1be2f38..0211867 100644 --- a/capnpc-csharp.tests/UnitTests.cs +++ b/capnpc-csharp.tests/UnitTests.cs @@ -11,6 +11,7 @@ namespace CapnpC [TestClass] public class UnitTests { + static readonly Dictionary GeneratedCode = new Dictionary(); [TestMethod] public void Test00Enumerant() @@ -22,11 +23,9 @@ namespace CapnpC [TestMethod] public void Test01NestedClash() { - var model = Load(Resources.UnitTest1_capnp); - var structFoo = GetTypeDef(0x93db6ba5509bac24, model); - var codeGen = NewGeneratorFor(model); - codeGen.Transform(model.FilesToGenerate.First()); - var names = codeGen.GetNames(); + var run = LoadAndGenerate(Resources.UnitTest1_capnp, 1); + var structFoo = GetTypeDef(0x93db6ba5509bac24, run.Model); + var names = run.CodeGen.GetNames(); var fieldName = names.GetCodeIdentifier(structFoo.Fields[0]).ToString(); Assert.AreEqual("Foo", structFoo.Name); Assert.AreNotEqual(structFoo.Name, fieldName); @@ -35,30 +34,26 @@ namespace CapnpC [TestMethod] public void Test02ForwardInheritance() { - var model = Load(Resources.UnitTest2_capnp); - var codeGen = NewGeneratorFor(model); - codeGen.Transform(model.FilesToGenerate.First()); + LoadAndGenerate(Resources.UnitTest2_capnp, 2); // Should not throw } [TestMethod] public void Test03NonGeneratedNodeSkip() { - var model = Load(Resources.UnitTest3_capnp); + LoadAndGenerate(Resources.UnitTest3_capnp, 3); // 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 run = LoadAndGenerate(Resources.UnitTest10_capnp, 10); + var outerTypeDef = run.FirstFile.NestedTypes.First(); var outerType = Model.Types.FromDefinition(outerTypeDef); var innerType = outerTypeDef.Fields[0].Type; var innerTypeDef = innerType.Definition; - var names = codeGen.GetNames(); + var names = run.CodeGen.GetNames(); var outerNameSyntax = names.GetQName(outerType, outerTypeDef); var innerNameSyntax = names.GetQName(innerType, outerTypeDef); string[] outerNamespace = { "Foo", "Bar", "Baz" }; @@ -74,31 +69,47 @@ namespace CapnpC [TestMethod] public void Test11ImportedConst() { - var model = Load(Resources.UnitTest11_capnp); + LoadAndGenerate(Resources.UnitTest11_capnp, 11); // Should not throw } [TestMethod] public void Test20AnnotationAndConst() { - var model = Load(Resources.UnitTest20_capnp); - var codeGen = NewGeneratorFor(model); - codeGen.Transform(model.FilesToGenerate.First()); + LoadAndGenerate(Resources.UnitTest20_capnp, 20); // Should not throw } [TestMethod] public void Test30SchemaCapnp() { - var model = Load(Resources.schema_with_offsets_capnp); - var codeGen = NewGeneratorFor(model); - codeGen.Transform(model.FilesToGenerate.First()); + LoadAndGenerate(Resources.schema_with_offsets_capnp); // Should not throw } + struct Run + { + public Model.SchemaModel Model; + public Generator.CodeGenerator CodeGen; + public Model.GenFile FirstFile; + public string Code; + } + static Generator.CodeGenerator NewGeneratorFor(Model.SchemaModel model) => new Generator.CodeGenerator(model, new Generator.GeneratorOptions()); + Run LoadAndGenerate(byte[] input, int? testNum = null) + { + var run = new Run(); + run.Model = Load(input); + run.CodeGen = NewGeneratorFor(run.Model); + run.FirstFile = run.Model.FilesToGenerate.First(); + run.Code = run.CodeGen.Transform(run.FirstFile); + if (testNum is int num) + GeneratedCode[num] = run.Code; + return run; + } + static Model.TypeDefinition GetTypeDef(ulong id, Model.SchemaModel model) { foreach (var defs in model.FilesToGenerate.Select(f => f.NestedTypes)) From 8b210d8b6686fe4c0346a781e9f894fa213808f2 Mon Sep 17 00:00:00 2001 From: Kuba Ober Date: Fri, 30 Aug 2019 13:55:41 -0400 Subject: [PATCH 5/6] Test mutually recursive dependencies between nodes. --- .../Properties/Resources.Designer.cs | 10 ++++++++++ capnpc-csharp.tests/Properties/Resources.resx | 3 +++ .../Resources/UnitTest4.capnp.bin | Bin 0 -> 3304 bytes capnpc-csharp.tests/UnitTest4.capnp | 16 ++++++++++++++++ capnpc-csharp.tests/UnitTest4b.capnp | 15 +++++++++++++++ capnpc-csharp.tests/UnitTests.cs | 7 +++++++ capnpc-csharp/Model/SchemaModel.cs | 6 +++--- 7 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 capnpc-csharp.tests/Resources/UnitTest4.capnp.bin create mode 100644 capnpc-csharp.tests/UnitTest4.capnp create mode 100644 capnpc-csharp.tests/UnitTest4b.capnp diff --git a/capnpc-csharp.tests/Properties/Resources.Designer.cs b/capnpc-csharp.tests/Properties/Resources.Designer.cs index 0f7df65..5148dec 100644 --- a/capnpc-csharp.tests/Properties/Resources.Designer.cs +++ b/capnpc-csharp.tests/Properties/Resources.Designer.cs @@ -129,5 +129,15 @@ namespace capnpc_csharp.Tests.Properties { return ((byte[])(obj)); } } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] UnitTest4_capnp { + get { + object obj = ResourceManager.GetObject("UnitTest4_capnp", resourceCulture); + return ((byte[])(obj)); + } + } } } diff --git a/capnpc-csharp.tests/Properties/Resources.resx b/capnpc-csharp.tests/Properties/Resources.resx index 2404b46..b4ecfef 100644 --- a/capnpc-csharp.tests/Properties/Resources.resx +++ b/capnpc-csharp.tests/Properties/Resources.resx @@ -139,4 +139,7 @@ ..\Resources\UnitTest11.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\UnitTest4.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/capnpc-csharp.tests/Resources/UnitTest4.capnp.bin b/capnpc-csharp.tests/Resources/UnitTest4.capnp.bin new file mode 100644 index 0000000000000000000000000000000000000000..f93feb27a4e5c2b709d77a3cafed0b0d25619de7 GIT binary patch literal 3304 zcmb_eUx-vy7(cWB)GTzuSo6g)Va?sv-7sYrRBRt&V6oa13=+A{PBNe~gEN+kF1Wh| zr5Nl>h(tvMffN)$6cxfgs3^AXg5paLrM-v*ih?3azu!IQH}~GNGrI|X!@1u%-@p4i z-}%mW#~5QiOW_exlSzY5HX8GMi!sYFZ^EE@N3$`DLc4ib8PkE$Y+6j;(dX_oO=oXE z5lZVnF2Hvb>M8K`;CH|ozaDk$Jbdc&d#8U{41;DM7}?VG^TFY}zx($05NDb;4aQhx z&I0Sk5P8x=apuB%)8Qq~HiSqc-fVdPEw0O4{Ald_Gq8nAj1s8Kvxu`IX%MrWIeq5dK2V64NQFe&($BMuGzS$YTRTNjd=k72{<<+S*@`kX{>9- z6+Yf4=J)Ie$G`aGg*QiHuHm#B%C9i%0q4CCy^S@`QCxDxStvmrz8U^Upv!<0?>6w+ z>UUcqU)h=~SJrlBgHoYno`g>dKh+8Mu^L15_>^1gycb~oD#n)LU=GY=3hx%l`}PFo za<1(9NQ2S6W?yMQeCC~R;``#nGakUG;)*LV4^ghkwzpfny@gd{ z(b{_0x$IuTgy%0>g$e!Eg43_y>VkDdQeD|q^prl5*jd)q5&H^Bb!S)6Q~F3^XMSE( zr_^#Mtj9)tX+-Mhs(0dw?@xB(^yGbYN8-d$ru_HoUeNIWp35>9m8{meSoO?viTnBI zlJB-&%A5MEl}1nLBZ-~mU-l)Bwyx%7mn-Z{cV|2|j24{_Pf3)lTlS+BQi0n#xBZ3n zSKhxX)M_8<`!Sb<-j~m>uYxW@q6dv z9}Fr1F(r3RNs{X6Yv2zZ)#raau>H!f{oh|>ofC)ZfO%!zD_`t?%(L!~&WgDZ=^imJ z{(EJkyy-hh+^o}#t4FJUeBX->#7?0TsjmyiTwMPbeLH=JeYyUh`Eun`@(q|Q!tncG zkCQ9kvVX9gM@eQQm2H1Vi~|J#xLq`vU+`NY!|*pGf{6%KM!I literal 0 HcmV?d00001 diff --git a/capnpc-csharp.tests/UnitTest4.capnp b/capnpc-csharp.tests/UnitTest4.capnp new file mode 100644 index 0000000..edfb8c7 --- /dev/null +++ b/capnpc-csharp.tests/UnitTest4.capnp @@ -0,0 +1,16 @@ +@0xf463d204f5208b43; +$import "/capnp/c++.capnp".namespace("UnitTest4"); + +interface Node { + getInfo @0 () -> Info; +} + +struct Info { + node @0 :Node; + classes @1 :Classes; +} + +struct Classes { + i1 @0 :import "UnitTest4b.capnp".I1.Classes; + i2 @1: Void; +} \ No newline at end of file diff --git a/capnpc-csharp.tests/UnitTest4b.capnp b/capnpc-csharp.tests/UnitTest4b.capnp new file mode 100644 index 0000000..3bfe83a --- /dev/null +++ b/capnpc-csharp.tests/UnitTest4b.capnp @@ -0,0 +1,15 @@ +@0x8151238e9f9884c8; +$import "/capnp/c++.capnp".namespace("UnitTest4"); + +using Base = import "UnitTest4.capnp"; + +interface I1 { + interface Node extends (Base.Node) {} + struct Classes { + sub @0: Sub; + } + struct Sub { + const prototype :Base.Classes = ( i1 = (sub = ()) ); + data @0: Bool; + } +} diff --git a/capnpc-csharp.tests/UnitTests.cs b/capnpc-csharp.tests/UnitTests.cs index 0211867..f7d59fd 100644 --- a/capnpc-csharp.tests/UnitTests.cs +++ b/capnpc-csharp.tests/UnitTests.cs @@ -45,6 +45,13 @@ namespace CapnpC // Should not throw } + [TestMethod] + public void Test04MutualDependencies() + { + LoadAndGenerate(Resources.UnitTest4_capnp, 4); + // Should not throw + } + [TestMethod] public void Test10ImportedNamespaces() { diff --git a/capnpc-csharp/Model/SchemaModel.cs b/capnpc-csharp/Model/SchemaModel.cs index 8d0a9fd..bd758c6 100644 --- a/capnpc-csharp/Model/SchemaModel.cs +++ b/capnpc-csharp/Model/SchemaModel.cs @@ -688,7 +688,7 @@ namespace CapnpC.Model { var def = ProcessNode(id, state, true, tag); var typeDef = def as TypeDefinition; - if (def == null) + if (typeDef == null) throw new ArgumentException( $"Expected node {id.StrId()} to be a TypeDefinition but got {def.GetType().Name} instead.", nameof(id)); @@ -748,10 +748,10 @@ namespace CapnpC.Model => node.DisplayName.Substring((int)node.DisplayNamePrefixLength); public static string StrId(this Schema.Node.Reader node) - => $"0x{node.Id.ToString("X")}"; + => $"0x{node.Id:X}"; public static string StrId(this ulong nodeId) - => $"0x{nodeId.ToString("X")}"; + => $"0x{nodeId:X}"; public static NodeKind GetKind(this Schema.Node.Reader node) { From 778613dccb3524631382a629b8a5a7cf12282482 Mon Sep 17 00:00:00 2001 From: Kuba Ober Date: Fri, 30 Aug 2019 15:01:16 -0400 Subject: [PATCH 6/6] Mark a bug. From ReSharper code analysis. --- capnpc-csharp/Model/Type.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/capnpc-csharp/Model/Type.cs b/capnpc-csharp/Model/Type.cs index c1017df..e6e4fc3 100644 --- a/capnpc-csharp/Model/Type.cs +++ b/capnpc-csharp/Model/Type.cs @@ -67,7 +67,7 @@ namespace CapnpC.Model declaringType = (declaringType as TypeDefinition)?.DeclaringElement as IHasGenericParameters; } - ElementType?.InheritFreeParameters(declaringType); + ElementType?.InheritFreeParameters(declaringType); // BUG: this is always null } Type SubstituteGenerics(Type type)