From 69b15d96cebdbb7201b1849b4f62786633d70b8d Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 1 Nov 2017 10:56:09 -0700 Subject: Introduce WiX Intermediate Representation --- src/WixToolset.Data/IntermediateTuple.cs | 70 ++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/WixToolset.Data/IntermediateTuple.cs (limited to 'src/WixToolset.Data/IntermediateTuple.cs') diff --git a/src/WixToolset.Data/IntermediateTuple.cs b/src/WixToolset.Data/IntermediateTuple.cs new file mode 100644 index 00000000..36cee2aa --- /dev/null +++ b/src/WixToolset.Data/IntermediateTuple.cs @@ -0,0 +1,70 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Data +{ + using SimpleJson; + + public class IntermediateTuple + { + //public IntermediateTuple(IntermediateTupleDefinition definition) : this(definition, null, null) + //{ + //} + + public IntermediateTuple(IntermediateTupleDefinition definition, SourceLineNumber sourceLineNumber, Identifier id = null) + { + this.Definition = definition; + this.Fields = new IntermediateField[definition.FieldDefinitions.Length]; + this.SourceLineNumbers = sourceLineNumber; + this.Id = id; + } + + public IntermediateTupleDefinition Definition { get; } + + public IntermediateField[] Fields { get; } + + public SourceLineNumber SourceLineNumbers { get; set; } + + public Identifier Id { get; set; } + + public IntermediateField this[int index] => this.Fields[index]; + + internal static IntermediateTuple Deserialize(ITupleDefinitionCreator creator, JsonObject jsonObject) + { + var definitionName = jsonObject.GetValueOrDefault("def"); + var fieldsJson = jsonObject.GetValueOrDefault("fields"); + + creator.TryGetTupleDefinitionByName(definitionName, out var definition); // TODO: this isn't sufficient. + var tuple = definition.CreateTuple(); + + for (var i = 0; i < fieldsJson.Count; ++i) + { + if (tuple.Fields.Length > i && fieldsJson[i] is JsonObject fieldJson) + { + tuple.Fields[i] = IntermediateField.Deserialize(tuple.Definition.FieldDefinitions[i], fieldJson); + } + } + + return tuple; + } + + internal JsonObject Serialize() + { + var jsonObject = new JsonObject + { + { "def", this.Definition.Name } + }; + + var fieldsJson = new JsonArray(this.Fields.Length); + + foreach (var field in this.Fields) + { + var fieldJson = field?.Serialize(); + fieldsJson.Add(fieldJson); + } + + jsonObject.Add("fields", fieldsJson); + + return jsonObject; + } + } +} -- cgit v1.2.3-55-g6feb