Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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)
                         )));
        }