public SyntaxVisitor(SemanticModel semanticModel, SerializerSyntaxReceiver syntaxReceiver) { _semanticModel = semanticModel; _syntaxReceiver = syntaxReceiver; }
public static void Main(string[] args) { if (args.Length < 1) { throw new ArgumentException("Usage: dotnet SerializationSchemaGenerator.dll <path to solution>"); } var solutionPath = args[0]; Parallel.ForEach( SourceCodeAnalysis.GetCompilation(solutionPath), (projectCompilation) => { var(project, compilation) = projectCompilation; if (project.Name.EndsWith(".Tests", StringComparison.Ordinal) || project.Name == "Benchmarks") { return; } var projectFile = new FileInfo(project.FilePath !); var projectPath = projectFile.Directory?.FullName; var migrationPath = Path.Join(projectPath, "Migrations"); Directory.CreateDirectory(migrationPath); var syntaxReceiver = new SerializerSyntaxReceiver(); foreach (var syntaxTree in compilation.SyntaxTrees) { var root = syntaxTree.GetRoot(); var syntaxVisitor = new SyntaxVisitor(compilation.GetSemanticModel(syntaxTree), syntaxReceiver); syntaxVisitor.Visit(root); } var jsonOptions = new JsonSerializerOptions { WriteIndented = true, AllowTrailingCommas = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, ReadCommentHandling = JsonCommentHandling.Skip }; var serializableTypes = syntaxReceiver.SerializableList; var embeddedSerializableTypes = syntaxReceiver.EmbeddedSerializableList; foreach (var(classSymbol, (attributeData, fieldsList)) in syntaxReceiver.ClassAndFields) { var source = compilation.GenerateSerializationPartialClass( classSymbol, attributeData, migrationPath, false, jsonOptions, fieldsList.ToImmutableArray(), serializableTypes, embeddedSerializableTypes ); } foreach (var(classSymbol, (attributeData, fieldsList)) in syntaxReceiver.EmbeddedClassAndFields) { var source = compilation.GenerateSerializationPartialClass( classSymbol, attributeData, migrationPath, true, jsonOptions, fieldsList.ToImmutableArray(), serializableTypes, embeddedSerializableTypes ); } }