private void CompileStringValueType(GrammarSymbol decl)
        {
            var result = new DataModelLeafTypeBuilder(decl);
            var member = new DataModelMember("STRING", "StringValue", "stringValue", null, "stringValue", null, null, null, null, null, 0, false);

            result.Members.Add(member);
            result.ToStringEntries.Add(new ToStringEntry(member));
            this.AddCompiledType(result);
        }
Exemple #2
0
        private static void WriteVisitMember(CodeWriter codeWriter, DataModel model, DataModelMember member)
        {
            DataModelType memberType = model.GetTypeForMember(member);

            switch (memberType.Kind)
            {
            case DataModelTypeKind.BuiltInNumber:
            case DataModelTypeKind.BuiltInString:
            case DataModelTypeKind.BuiltInDictionary:
            case DataModelTypeKind.BuiltInBoolean:
            case DataModelTypeKind.BuiltInUri:
            case DataModelTypeKind.BuiltInVersion:
            case DataModelTypeKind.Enum:
                // Don't visit builtins; overrides would inspect those directly.
                return;

            case DataModelTypeKind.Leaf:
            case DataModelTypeKind.Base:
                // Visit this member
                break;

            case DataModelTypeKind.Default:
            default:
                Debug.Fail("Unexpected DataModelTypeKind");
                return;
            }

            var valueNamer = new LocalVariableNamer("value");

            string sourceVariable = "node." + member.CSharpName;

            for (int idx = 0; idx < member.Rank; ++idx)
            {
                string valueName = valueNamer.MakeName();
                codeWriter.OpenBrace("if ({0} != null)", sourceVariable);
                codeWriter.OpenBrace("foreach (var {0} in {1})", valueName, sourceVariable);
                sourceVariable = valueName;
            }

            codeWriter.WriteLine("this.VisitNullChecked({0});", sourceVariable);

            if (member.Rank == 0)
            {
                return;
            }

            for (int idx = 0; idx < member.Rank; ++idx)
            {
                codeWriter.CloseBrace(); // if (source != null)
                codeWriter.CloseBrace(); // foreach
            }

            codeWriter.WriteLine();
        }
Exemple #3
0
        private static void WritePropertyDeclaration(CodeWriter codeWriter, DataModelMember member, string memberTypeName)
        {
            var decl = new StringBuilder();

            decl.Append("public ");
            AppendRankedTypeName(decl, "IList", memberTypeName, member.Rank);
            decl.Append(' ');
            decl.Append(member.CSharpName);
            decl.Append(" { get; set; }");
            codeWriter.WriteLineConsume(decl);
        }
Exemple #4
0
        private static void WriteArrayStart(CodeWriter codeWriter, DataModelMember member)
        {
            codeWriter.WriteLine(@"""type"": ""array"",");

            if (!string.IsNullOrEmpty(member.MinItems))
            {
                codeWriter.WriteLine(@"""minItems"": " + member.MinItems + ",");
            }

            codeWriter.WriteLine(@"""items"":");
            codeWriter.OpenBrace();
        }
Exemple #5
0
        private static void WritePropertyDataMemberAttribute(CodeWriter codeWriter, DataModelMember member)
        {
            var dataMemberAttribute = new StringBuilder();

            dataMemberAttribute.Append("[DataMember(Name=\"");
            dataMemberAttribute.Append(member.SerializedName);
            dataMemberAttribute.Append("\", IsRequired = ");
            if (member.Required)
            {
                dataMemberAttribute.Append("true)]");
            }
            else
            {
                dataMemberAttribute.Append("false, EmitDefaultValue = false)]");
            }

            codeWriter.WriteLine(dataMemberAttribute.ToString());
        }
Exemple #6
0
        private static void WriteMembers(CodeWriter codeWriter, DataModel model, DataModelType type)
        {
            DataModelMember[] members = type.Members.ToArray();

            for (int i = 0; i < members.Length; i++)
            {
                DataModelMember member     = members[i];
                bool            lastMember = (i == members.Length - 1);

                if (model.MetaData.GenerateLocations && (member.CSharpName == "Length" || member.CSharpName == "Offset"))
                {
                    continue;
                }

                if (i > 0)
                {
                    codeWriter.WriteLine();
                }

                WriteProperty(codeWriter, model, member, lastMember);
            }
        }
Exemple #7
0
        private static ImmutableSortedDictionary <string, HoistAction> GetViableHoistEdgeList(DataModel source)
        {
            ImmutableSortedDictionary <string, HoistAction> .Builder hoistMap = ImmutableSortedDictionary.CreateBuilder <string, HoistAction>();
            foreach (DataModelType candidate in source.Types)
            {
                if (candidate.HasBase)
                {
                    // Can't be hoist because this would break inheritance chains
                    continue;
                }

                if (candidate.Members.Length != 1)
                {
                    // Can't be hoist because the member can't replace the type
                    continue;
                }

                DataModelMember toBe = candidate.Members[0];
                hoistMap.Add(candidate.G4DeclaredName, new HoistAction(toBe.DeclaredName, toBe.Rank));
            }

            return(hoistMap.ToImmutable());
        }
Exemple #8
0
 private static void WriteProperty(CodeWriter codeWriter, DataModel model, DataModelMember member)
 {
     WriteXmlDocCommentsFor(codeWriter, member);
     WritePropertyDataMemberAttribute(codeWriter, member);
     WritePropertyDeclaration(codeWriter, member, model.GetTypeByG4Name(member.DeclaredName).CSharpName);
 }
Exemple #9
0
 private static void WriteParameterForMember(StringBuilder sb, DataModel model, DataModelMember member)
 {
     CodeGenerator.AppendRankedTypeName(sb, "IEnumerable", model.GetTypeForMember(member).CSharpName, member.Rank);
     sb.Append(' ');
     sb.Append(member.ArgumentName);
 }
Exemple #10
0
        private static void WriteInitForMember(CodeWriter codeWriter, DataModel model, DataModelMember member, LocalVariableNamer destNamer, LocalVariableNamer valueNamer)
        {
            DataModelType memberType = model.GetTypeForMember(member);

            if (memberType.IsNullable)
            {
                codeWriter.OpenBrace("if ({0} != null)", member.ArgumentName);
            }

            if (member.Rank == 0)
            {
                codeWriter.WriteLine("this." + member.CSharpName + " = " + GetCopyCreationExpression(memberType, member.ArgumentName) + ";");
            }
            else
            {
                string[] destinations = new string[member.Rank];
                string   source       = member.ArgumentName;
                for (int idx = 0; idx < destinations.Length; ++idx)
                {
                    string currentDest = destNamer.MakeName();
                    destinations[idx] = currentDest;

                    StringBuilder sb = new StringBuilder();
                    sb.Append("var ").Append(currentDest).Append(" = new List<");
                    AppendRankedTypeName(sb, "IList", memberType.CSharpName, member.Rank - idx - 1);
                    sb.Append(">();");
                    codeWriter.WriteLineConsume(sb);
                    codeWriter.OpenBrace("if ({0} != null)", source);
                    string value = valueNamer.MakeName();
                    codeWriter.OpenBrace("foreach (var {0} in {1})", value, source);
                    source = value;
                }

                string lastDestination = destinations[destinations.Length - 1];
                if (memberType.IsNullable)
                {
                    codeWriter.OpenBrace("if ({0} == null)", source);
                    codeWriter.WriteLine(lastDestination + ".Add(null);");
                    codeWriter.CloseBrace();
                    codeWriter.OpenBrace("else");
                }

                codeWriter.WriteLine(lastDestination + ".Add(" + GetCopyCreationExpression(memberType, source) + ");");
                if (memberType.IsNullable)
                {
                    codeWriter.CloseBrace();
                }

                codeWriter.CloseBrace(); // foreach
                codeWriter.CloseBrace(); // if (source != null)
                codeWriter.WriteLine();

                for (int idx = 1; idx < destinations.Length; ++idx)
                {
                    codeWriter.WriteLine("{0}.Add({1});", destinations[member.Rank - idx - 1], destinations[member.Rank - idx]);
                    codeWriter.CloseBrace(); // foreach
                    codeWriter.CloseBrace(); // if (source != null)
                    codeWriter.WriteLine();
                }

                codeWriter.WriteLine("this.{0} = {1};", member.CSharpName, destinations[0]);
            }

            if (memberType.IsNullable)
            {
                codeWriter.CloseBrace();
            }
        }
Exemple #11
0
 public static void WriteXmlDocCommentsFor(CodeWriter sourceCode, DataModelMember member)
 {
     WriteXmlDocComment(sourceCode, "summary", member.SummaryText);
 }
        private void WriteEqualsForMember(DataModelMember member)
        {
            DataModelTypeKind typeKind = _model.GetTypeForMember(member).Kind;

            string sourceVariable = "this." + member.CSharpName;
            string otherVariable  = "other." + member.CSharpName;

            for (int idx = 0; idx < member.Rank; ++idx)
            {
                _codeWriter.OpenBrace("if (!global::System.Object.ReferenceEquals({0}, {1}))", sourceVariable, otherVariable);
                _codeWriter.OpenBrace("if ({0} == null || {1} == null)", sourceVariable, otherVariable);
                _codeWriter.WriteLine("return false;");
                _codeWriter.CloseBrace(); // null check
                _codeWriter.WriteLine();

                _codeWriter.OpenBrace("if ({0}.Count != {1}.Count)", sourceVariable, otherVariable);
                _codeWriter.WriteLine("return false;");
                _codeWriter.CloseBrace(); // different lengths check
                _codeWriter.WriteLine();

                string max   = _maxNamer.MakeName();
                string index = _indexNamer.MakeName();
                _codeWriter.WriteLine("int {0} = {1}.Count;", max, sourceVariable);
                _codeWriter.OpenBrace("for (int {0} = 0; {0} < {1}; ++{0})", index, max);
                string newSource = _valueNamer.MakeName();
                string newOther  = _valueNamer.MakeName();
                _codeWriter.WriteLine("var {0} = {1}[{2}];", newSource, sourceVariable, index);
                _codeWriter.WriteLine("var {0} = {1}[{2}];", newOther, otherVariable, index);
                sourceVariable = newSource;
                otherVariable  = newOther;
            }

            switch (typeKind)
            {
            case DataModelTypeKind.Base:
            case DataModelTypeKind.Leaf:
                _codeWriter.OpenBrace("if (!global::System.Object.Equals({0}, {1}))", sourceVariable, otherVariable);
                _codeWriter.WriteLine("return false;");
                _codeWriter.CloseBrace();
                break;

            case DataModelTypeKind.BuiltInString:
            case DataModelTypeKind.BuiltInNumber:
            case DataModelTypeKind.BuiltInBoolean:
            case DataModelTypeKind.BuiltInUri:
            case DataModelTypeKind.Enum:
            case DataModelTypeKind.BuiltInVersion:
                _codeWriter.OpenBrace("if ({0} != {1})", sourceVariable, otherVariable);
                _codeWriter.WriteLine("return false;");
                _codeWriter.CloseBrace();
                break;

            case DataModelTypeKind.BuiltInDictionary:
                string sourceKvp = _valueNamer.MakeName();
                string otherVal  = _valueNamer.MakeName();
                _codeWriter.OpenBrace("if (!global::System.Object.ReferenceEquals({0}, {1}))", sourceVariable, otherVariable);
                _codeWriter.OpenBrace("if ({0} == null || {1} == null || {0}.Count != {1}.Count)", sourceVariable, otherVariable);
                _codeWriter.WriteLine("return false;");
                _codeWriter.CloseBrace();

                _codeWriter.OpenBrace("foreach (var {0} in {1})", sourceKvp, sourceVariable);
                _codeWriter.WriteLine("string " + otherVal + ";");
                _codeWriter.OpenBrace("if (!{0}.TryGetValue({1}.Key, out {2}) || !global::System.Object.Equals({1}.Value, {2}))", otherVariable, sourceKvp, otherVal);
                _codeWriter.WriteLine("return false;");
                _codeWriter.CloseBrace();     // if
                _codeWriter.CloseBrace();     // foreach
                _codeWriter.CloseBrace();     // if (!referenceequals)
                break;

            default:
                Debug.Fail("Unrecognized DataModelTypeKind");
                throw new InvalidOperationException();
            }


            for (int idx = 0; idx < member.Rank; ++idx)
            {
                _codeWriter.CloseBrace(); // for
                _codeWriter.CloseBrace(); // ReferenceEquals
            }

            _codeWriter.WriteLine();
        }
        private void WriteGetHashCodeMember(DataModelMember member)
        {
            DataModelType     memberType     = _model.GetTypeForMember(member);
            DataModelTypeKind typeKind       = memberType.Kind;
            string            sourceVariable = "this." + member.CSharpName;
            int additionalCloseBraces        = 0;

            // (rank - 1) * 2 OpenBrace calls
            for (int idx = 1; idx < member.Rank; ++idx)
            {
                string nextVariable = _valueNamer.MakeName();
                _codeWriter.OpenBrace("if ({0} != null)", sourceVariable);
                _codeWriter.OpenBrace("foreach (var {0} in {1})", nextVariable, sourceVariable);
                _codeWriter.WriteLine("result = result * {0};", MultiplicativeConstant);
                _codeWriter.OpenBrace("if ({0} != null)", nextVariable);
                sourceVariable = nextVariable;
                ++additionalCloseBraces;
            }

            // rank != 0 ? 1 : 0 OpenBrace calls
            if (member.Rank != 0)
            {
                string nextVariable = _valueNamer.MakeName();
                _codeWriter.OpenBrace("if ({0} != null)", sourceVariable);
                _codeWriter.OpenBrace("foreach (var {0} in {1})", nextVariable, sourceVariable);
                _codeWriter.WriteLine("result = result * {0};", MultiplicativeConstant);

                sourceVariable = nextVariable;
                ++additionalCloseBraces;
            }

            // rank
            if (memberType.IsNullable)
            {
                _codeWriter.OpenBrace("if ({0} != null)", sourceVariable);
            }

            switch (typeKind)
            {
            case DataModelTypeKind.Base:
            case DataModelTypeKind.Leaf:
            case DataModelTypeKind.BuiltInString:
            case DataModelTypeKind.BuiltInUri:
            case DataModelTypeKind.BuiltInVersion:
                _codeWriter.WriteLine("result = (result * {1}) + {0}.GetHashCode();", sourceVariable, MultiplicativeConstant);
                break;

            case DataModelTypeKind.BuiltInNumber:
            case DataModelTypeKind.Enum:
                _codeWriter.WriteLine("result = (result * {1}) + (int){0};", sourceVariable, MultiplicativeConstant);
                break;

            case DataModelTypeKind.BuiltInBoolean:
                _codeWriter.OpenBrace("if (" + sourceVariable + ")");
                _codeWriter.WriteLine("result = (result * " + MultiplicativeConstant + ") + 1;");
                _codeWriter.CloseBrace();
                break;

            case DataModelTypeKind.BuiltInDictionary:
                string xorTempVal = _xorNamer.MakeName();
                string iterVal    = _valueNamer.MakeName();
                _codeWriter.WriteLine("// Use xor for dictionaries to be order-independent");
                _codeWriter.WriteLine("int {0} = 0;", xorTempVal);
                _codeWriter.OpenBrace("foreach (var {0} in {1})", iterVal, sourceVariable);
                _codeWriter.WriteLine("{0} ^= ({1}.Key ?? String.Empty).GetHashCode();", xorTempVal, iterVal);
                _codeWriter.WriteLine("{0} ^= ({1}.Value ?? String.Empty).GetHashCode();", xorTempVal, iterVal);
                _codeWriter.CloseBrace();     // foreach
                _codeWriter.WriteLine();
                _codeWriter.WriteLine("result = (result * {1}) + {0};", xorTempVal, MultiplicativeConstant);
                break;

            default:
                Debug.Fail("Unrecognized DataModelTypeKind");
                break;
            }

            int closeBraces;

            if (member.Rank == 0)
            {
                closeBraces = 0;
            }
            else
            {
                closeBraces = (member.Rank - 1) * 2 + 1;
            }

            if (memberType.IsNullable)
            {
                ++closeBraces;
            }

            closeBraces += additionalCloseBraces;

            for (int idx = 0; idx < closeBraces; ++idx)
            {
                _codeWriter.CloseBrace();
            }
        }
Exemple #14
0
        internal void AddMember(GrammarSymbol declSymbol, int rank, bool required, string delimeter = null)
        {
            string declaredName   = declSymbol.GetLogicalText();
            string annotationName = declSymbol.Annotations.GetAnnotationValue("name");
            string pattern        = declSymbol.Annotations.GetAnnotationValue("pattern");
            string minimum        = declSymbol.Annotations.GetAnnotationValue("minimum");
            string minItems       = declSymbol.Annotations.GetAnnotationValue("minItems");
            string uniqueItems    = declSymbol.Annotations.GetAnnotationValue("uniqueItems");
            string defaultValue   = declSymbol.Annotations.GetAnnotationValue("default");
            string cSharpName     = annotationName ?? LinguisticTransformer.ToCSharpName(declaredName);
            string serializedName = declSymbol.Annotations.GetAnnotationValue("serializedName");

            if (serializedName == null)
            {
                serializedName = LinguisticTransformer.ToJsonName(cSharpName);
            }

            if (serializedName == null)
            {
                serializedName = LinguisticTransformer.ToJsonName(declaredName);
            }

            string argumentName = declSymbol.Annotations.GetAnnotationValue("argumentName");

            if (argumentName == null)
            {
                if (annotationName == null)
                {
                    argumentName = LinguisticTransformer.ToArgumentName(declaredName);
                }
                else
                {
                    argumentName = LinguisticTransformer.ToArgumentName(annotationName);
                }
            }

            foreach (DataModelMember existingMember in this.Members)
            {
                if (existingMember.CSharpName == cSharpName)
                {
                    throw new G4ParseFailureException(declSymbol.GetLocation(), Strings.DuplicateCSharpMemberName, cSharpName);
                }

                if (existingMember.SerializedName == serializedName)
                {
                    throw new G4ParseFailureException(declSymbol.GetLocation(), Strings.DuplicateJsonMemberName, serializedName);
                }

                if (existingMember.ArgumentName == argumentName)
                {
                    throw new G4ParseFailureException(declSymbol.GetLocation(), Strings.DuplicateArgumentName, argumentName);
                }
            }

            DataModelMember newMember = new DataModelMember(
                declaredName,
                cSharpName,
                serializedName,
                declSymbol.Annotations.GetAnnotationValue("summary"),
                argumentName,
                pattern,
                minimum,
                minItems,
                uniqueItems,
                defaultValue,
                rank,
                required
                );


            this.Members.Add(newMember);
            this.ToStringEntries.Add(new ToStringEntry(delimeter, newMember));
        }
Exemple #15
0
 /// <summary>Initializes a new instance of the <see cref="ToStringEntry"/> struct.</summary>
 /// <param name="text">The text which should be used when generating the overload. Note that in
 /// the case of delimited collections this will be the delimiter to use.</param>
 /// <param name="variable">The variable to reference when generating the overload.</param>
 public ToStringEntry(string text, DataModelMember variable)
 {
     Debug.Assert(text != null || variable != null, "Bad ToStringEntry with no data");
     this.Text     = text;
     this.Variable = variable;
 }
Exemple #16
0
 public DataModelType GetTypeForMember(DataModelMember member)
 {
     return(this.GetTypeByG4Name(member.DeclaredName));
 }
        private void AddLocationsToTypes()
        {
            foreach (DataModelLeafTypeBuilder builder in _compiledTypes.Values)
            {
                bool generateLength = true;
                bool generateOffset = true;

                foreach (DataModelMember member in builder.Members)
                {
                    if (member.CSharpName == "Length")
                    {
                        generateLength = false;
                    }

                    if (member.CSharpName == "Offset")
                    {
                        generateOffset = false;
                    }
                }

                if (generateLength)
                {
                    DataModelMember newMember = new DataModelMember(
                        "INTEGER",
                        "Length",
                        "length",
                        "The length of this object in a source text file.",
                        "length",
                        null,
                        null,
                        null,
                        null,
                        null,
                        0,
                        false
                        );

                    builder.Members.Add(newMember);
                    builder.ToStringEntries.Add(new ToStringEntry(newMember));
                }

                if (generateOffset)
                {
                    DataModelMember newMember = new DataModelMember(
                        "INTEGER",
                        "Offset",
                        "offset",
                        "The offset of this object in a source text file.",
                        "offset",
                        null,
                        null,
                        null,
                        null,
                        null,
                        0,
                        false
                        );

                    builder.Members.Add(newMember);
                    builder.ToStringEntries.Add(new ToStringEntry(newMember));
                }
            }
        }
Exemple #18
0
        private static void WriteProperty(CodeWriter codeWriter, DataModel model, DataModelMember member, bool lastMember)
        {
            string        memberName     = member.SerializedName;
            DataModelType memberType     = model.GetTypeByG4Name(member.DeclaredName);
            string        memberTypeName = memberType.G4DeclaredName;

            codeWriter.WriteLine(@"""" + memberName + @""": ");
            codeWriter.OpenBrace();

            codeWriter.WriteLine(@"""description"": """ + BuildDescription(member.SummaryText) + @""",");

            string canonicalizedName, format;
            bool   isPrimitive = CanonicalizeTypeName(memberTypeName, out canonicalizedName, out format);

            int rank = member.Rank;

            while (rank > 0)
            {
                WriteArrayStart(codeWriter, member); rank--;
            }

            string defaultValue = member.Default;
            bool   hasDefault   = !string.IsNullOrEmpty(defaultValue);

            if (isPrimitive)
            {
                string pattern = member.Pattern;
                string minimum = member.Minimum;

                bool hasMinimum = !(string.IsNullOrEmpty(minimum));
                bool hasPattern = !string.IsNullOrEmpty(pattern);
                bool hasFormat  = !string.IsNullOrEmpty(format);

                codeWriter.WriteLine(@"""type"": """ + canonicalizedName + @"""" + ((hasPattern || hasFormat || hasMinimum || hasDefault) ? "," : ""));

                if (hasFormat)
                {
                    codeWriter.WriteLine(@"""format"": """ + format + @"""" + ((hasPattern || hasMinimum || hasDefault) ? "," : ""));
                }

                if (hasPattern)
                {
                    codeWriter.WriteLine(@"""pattern"": """ + pattern + @"""" + ((hasMinimum || hasDefault) ? "," : ""));
                }

                if (hasMinimum)
                {
                    codeWriter.WriteLine(@"""minimum"": " + minimum + (hasDefault ? "," : ""));
                }

                if (hasDefault)
                {
                    codeWriter.WriteLine(@"""default"": " + defaultValue);
                }
            }
            else if (memberType.Kind == DataModelTypeKind.Enum)
            {
                var sb = new StringBuilder();
                sb.Append(@"""enum"": [ ");

                if (hasDefault)
                {
                    codeWriter.WriteLine(@"""default"": " + defaultValue + ",");
                }

                for (int i = 0; i < memberType.G4DeclaredValues.Length; i++)
                {
                    bool   isFinal = i == memberType.G4DeclaredValues.Length - 1;
                    string name    = memberType.G4DeclaredValues[i].Replace("'", "");
                    sb.Append(@"""" + name + @"""" + (isFinal ? "" : ","));
                }
                codeWriter.WriteLine(sb.ToString() + "]");
            }
            else
            {
                codeWriter.WriteLine(@"""$ref"": ""#/definitions/" + canonicalizedName + @"""");
            }
            rank = member.Rank;
            while (rank > 0)
            {
                WriteArrayEnd(codeWriter); rank--;
            }
            codeWriter.CloseBrace(lastMember ? "" : ",");
        }
Exemple #19
0
 /// <summary>Initializes a new instance of the <see cref="ToStringEntry"/> struct.</summary>
 /// <param name="variable">The variable to reference when generating the overload.</param>
 public ToStringEntry(DataModelMember variable)
     : this(null, variable)
 {
 }