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"); }
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(); }
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 }
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(); } }