private CodeFile ProcessClass(INamedTypeSymbol classSymbol, CodeWriter codeWriter) { if (!classSymbol.HasAttribute(typeof(ConvertToAttribute))) { return(null); } CsharpCodeBuilder codeBuilder = new CsharpCodeBuilder(); AppendUsingLines(classSymbol, codeBuilder); AppendNamespace(classSymbol, codeBuilder); AppendClassDefinition(classSymbol, codeBuilder); foreach (var convertToAttr in classSymbol.GetAttributes()) { if (!convertToAttr.AttributeClass.SafeEquals(typeof(ConvertToAttribute))) { continue; } var convertMappingInfo = ConvertMappingInfo.FromAttributeData(convertToAttr); if (ConvertMappingInfo.CanMappingSubObject(convertMappingInfo.SourceType, convertMappingInfo.TargetType)) { AppendConvertToFunctions(new ConvertContext( classSymbol, codeWriter.Compilation, codeBuilder, convertMappingInfo)); } else { // TOTO report error } } codeBuilder.EndAllSegments(); return(new CodeFile { BasicName = classSymbol.GetCodeFileBasicName(), Content = codeBuilder.ToString(), }); }
public ConvertContext Fork(ITypeSymbol source, ITypeSymbol target) { var newMappingInfo = ConvertMappingInfo.Create(source, target, this.HostClass); return(new ConvertContext(this, newMappingInfo)); }
private ConvertContext(ConvertContext baseConvertContext, ConvertMappingInfo convertMappingInfo) : this(baseConvertContext.HostClass, baseConvertContext.Compilation, baseConvertContext.CodeBuilder, convertMappingInfo) { this.WorkedPaths = new List <ITypeSymbol>(baseConvertContext.WorkedPaths); this.WorkedPaths.Add(convertMappingInfo.TargetType); }
public ConvertContext(INamedTypeSymbol hostClass, Compilation compilation, CsharpCodeBuilder codeBuilder, ConvertMappingInfo convertMappingInfo) { this.HostClass = hostClass; this.Compilation = compilation; this.MappingInfo = convertMappingInfo; this.CodeBuilder = codeBuilder; this.WorkedPaths.Add(convertMappingInfo.TargetType); }