コード例 #1
0
        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(),
            });
        }
コード例 #2
0
            public ConvertContext Fork(ITypeSymbol source, ITypeSymbol target)
            {
                var newMappingInfo = ConvertMappingInfo.Create(source, target, this.HostClass);

                return(new ConvertContext(this, newMappingInfo));
            }
コード例 #3
0
 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);
 }
コード例 #4
0
 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);
 }