public void Analyze() { var typeSymbol = SemanticModel.GetDeclaredSymbol(TypeDecl); if (typeSymbol == null) { return; } if (typeSymbol.IsAbstract || typeSymbol.IsStatic || (typeSymbol.IsReferenceType && !typeSymbol.IsSealed) || !InheritsFromDefault(typeSymbol)) { return; } var varMembers = new VariableMemberCollector(SemanticModel).Collect(TypeDecl); // Don't generate record-like implementation for empty types. if (!varMembers.Any()) { return; } // Mutable type can't be record-like. var isImmutable = varMembers.All(m => m.IsReadOnly); if (!isImmutable) { return; } AnalysisContext.ReportDiagnostic(Diagnostic.Create(DiagnosticProvider.ImplGeneration, TypeDecl.GetLocation(), TypeDecl.Identifier.Text)); }
public async Task <Document> FixAsync(Document document) { var tree = await document.GetSyntaxTreeAsync(CancellationToken).ConfigureAwait(false); var root = await tree.GetRootAsync(CancellationToken); var factory = new RecordlikeImplFactory(LanguageVersion); var varMembers = new VariableMemberCollector(SemanticModel).Collect(TypeDecl); var members = factory.Members( SemanticModel, TypeDecl, varMembers ); return (document.WithSyntaxRoot( root.ReplaceNode( TypeDecl, TypeDecl.AddMembers(members) ))); }