示例#1
0
 private ToStringGenerator(CodeWriter codeWriter, DataModel model, DataModelType writtenType)
 {
     _codeWriter  = codeWriter;
     _model       = model;
     _writtenType = writtenType;
     _indexNamer  = new LocalVariableNamer("index");
     _valueNamer  = new LocalVariableNamer("value");
     _labelNamer  = new LocalVariableNamer("label");
 }
        private EqualsGenerator(CodeWriter codeWriter, DataModel model, DataModelType writtenType)
        {
            _codeWriter  = codeWriter;
            _model       = model;
            _writtenType = writtenType;

            _valueNamer = new LocalVariableNamer("value");
            _indexNamer = new LocalVariableNamer("index");
            _maxNamer   = new LocalVariableNamer("max");
            _xorNamer   = new LocalVariableNamer("xor");
        }
示例#3
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();
        }
示例#4
0
        private static void WriteInitFunction(CodeWriter codeWriter, DataModel model, DataModelType type)
        {
            codeWriter.WriteLine();

            var sb = new StringBuilder();

            sb.Append("private void Init(");
            WriteParameters(sb, model, type);
            sb.Append(')');
            codeWriter.OpenBraceConsume(sb);

            var valueNamer = new LocalVariableNamer("value");
            var destNamer  = new LocalVariableNamer("destination");

            foreach (DataModelMember member in type.Members)
            {
                WriteInitForMember(codeWriter, model, member, destNamer, valueNamer);
            }

            codeWriter.CloseBrace(); // Init
        }
示例#5
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();
            }
        }