public static SyntaxTree BuildDto(EntityMetadata entity, SyntaxTree existingDto = null, string dtoNamespace = null, string mapperNamespace = null, bool generateMapper = true, bool addContractAttrs = false) { CompilationUnitSyntax root = null; if (existingDto == null) { var rawTree = BuildOutline(dtoNamespace, entity); var commentAppender = new EmptyTreeCommentAppender(); root = commentAppender.Visit(rawTree.GetRoot()) as CompilationUnitSyntax; } else { var existingRoot = existingDto.GetRoot(); var finder = new CustomCodeLocator(); finder.Visit(existingRoot); var rewriter = new GeneratedCodeRemover(finder); existingRoot = rewriter.Visit(existingRoot); if (rewriter.FirstCustomProperty == null) { var commentAppender = new EmptyTreeCommentAppender(); root = commentAppender.Visit(existingRoot) as CompilationUnitSyntax; } else { var commentWrapper = new CustomCodeCommentWrapper(rewriter); root = commentWrapper.Visit(existingRoot) as CompilationUnitSyntax; } } if (generateMapper) { root = root.AppendUsing(mapperNamespace, entity.Namespace); } if (addContractAttrs) { root = root.AppendUsing("System.Runtime.Serialization"); } var generatedPropertiesAppender = new GeneratedPropertiesAppender(entity, addContractAttrs); root = generatedPropertiesAppender.Visit(root) as CompilationUnitSyntax; var newLineRemover = new NewLineRemover(); root = newLineRemover.Visit(root) as CompilationUnitSyntax; if (!generateMapper) { var mapperRemover = new MapperRemover(); root = mapperRemover.Visit(root) as CompilationUnitSyntax; } return(SyntaxFactory.SyntaxTree(root)); }