public async Task VerifyGetFixesWhenUsingSystemDoesNotExist()
    {
      var code = File.ReadAllText(
        $@"Targets\{nameof(IsBusinessObjectSerializableMakeSerializableCodeFixTests)}.{(nameof(this.VerifyGetFixesWhenUsingSystemDoesNotExist))}.cs");
      var document = TestHelpers.Create(code);
      var tree = await document.GetSyntaxTreeAsync();
      var diagnostics = await TestHelpers.GetDiagnosticsAsync(code, new IsBusinessObjectSerializableAnalyzer());
      var sourceSpan = diagnostics[0].Location.SourceSpan;

      var actions = new List<CodeAction>();
      var codeActionRegistration = new Action<CodeAction, ImmutableArray<Diagnostic>>(
        (a, _) => { actions.Add(a); });

      var fix = new IsBusinessObjectSerializableMakeSerializableCodeFix();
      var codeFixContext = new CodeFixContext(document, diagnostics[0],
        codeActionRegistration, new CancellationToken(false));
      await fix.RegisterCodeFixesAsync(codeFixContext);

      Assert.AreEqual(2, actions.Count, nameof(actions.Count));

      await TestHelpers.VerifyActionAsync(actions,
        IsBusinessObjectSerializableMakeSerializableCodeFixConstants.AddSystemSerializableDescription, document,
        tree, $"{Environment.NewLine}[System.Serializable]");
      await TestHelpers.VerifyActionAsync(actions,
        IsBusinessObjectSerializableMakeSerializableCodeFixConstants.AddSerializableAndUsingDescription, document,
        tree, $"using System;{Environment.NewLine}{Environment.NewLine}[Serializable]");
    }
Пример #2
0
        public override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

            if (context.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            var diagnostic = context.Diagnostics.First();
            var classNode  = root.FindNode(diagnostic.Location.SourceSpan) as ClassDeclarationSyntax;

            if (context.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            if (root.HasUsing(IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SystemNamespace))
            {
                IsBusinessObjectSerializableMakeSerializableCodeFix.AddCodeFixWhenSystemUsingExists(
                    context, root, diagnostic, classNode);
            }
            else
            {
                IsBusinessObjectSerializableMakeSerializableCodeFix.AddCodeFixWhenSystemUsingDoesNotExist(
                    context, root, diagnostic, classNode);
            }
        }
Пример #3
0
        private static void AddCodeFix(CodeFixContext context, SyntaxNode root,
                                       Diagnostic diagnostic, ClassDeclarationSyntax classNode)
        {
            var newRoot = IsBusinessObjectSerializableMakeSerializableCodeFix.AddAttribute(
                root, classNode, IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SerializableName);

            if (!root.HasUsing(IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SystemNamespace))
            {
                newRoot = (newRoot as CompilationUnitSyntax).AddUsings(
                    SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(
                                                     IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SystemNamespace)));
            }

            if (!root.HasUsing(IsBusinessObjectSerializableMakeSerializableCodeFixConstants.CslaSerializationNamespace))
            {
                newRoot = (newRoot as CompilationUnitSyntax).AddUsings(
                    SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(
                                                     IsBusinessObjectSerializableMakeSerializableCodeFixConstants.CslaSerializationNamespace)));
            }

            context.RegisterCodeFix(
                CodeAction.Create(
                    IsBusinessObjectSerializableMakeSerializableCodeFixConstants.AddSerializableAndUsingDescription,
                    _ => Task.FromResult <Document>(context.Document.WithSyntaxRoot(newRoot))), diagnostic);
        }
    public void VerifyGetFixableDiagnosticIds()
    {
      var fix = new IsBusinessObjectSerializableMakeSerializableCodeFix();
      var ids = fix.FixableDiagnosticIds.ToList();

      Assert.AreEqual(1, ids.Count, nameof(ids.Count));
      Assert.AreEqual(IsBusinessObjectSerializableConstants.DiagnosticId, ids[0],
        nameof(IsBusinessObjectSerializableConstants.DiagnosticId));
    }
    public void VerifyGetFixableDiagnosticIds()
    {
      var fix = new IsBusinessObjectSerializableMakeSerializableCodeFix();
      var ids = fix.FixableDiagnosticIds.ToList();

      Assert.AreEqual(1, ids.Count, nameof(ids.Count));
      Assert.AreEqual(ids[0], Constants.AnalyzerIdentifiers.IsBusinessObjectSerializable,
        nameof(Constants.AnalyzerIdentifiers.IsBusinessObjectSerializable));
    }
Пример #6
0
        private static void AddCodeFixWhenSystemUsingExists(CodeFixContext context, SyntaxNode root,
                                                            Diagnostic diagnostic, ClassDeclarationSyntax classNode)
        {
            var newRoot = IsBusinessObjectSerializableMakeSerializableCodeFix.AddAttribute(
                root, classNode, IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SerializableName);

            context.RegisterCodeFix(
                CodeAction.Create(
                    IsBusinessObjectSerializableMakeSerializableCodeFixConstants.AddSerializableDescription,
                    _ => Task.FromResult <Document>(context.Document.WithSyntaxRoot(newRoot))), diagnostic);
        }
        public override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

            context.CancellationToken.ThrowIfCancellationRequested();

            var diagnostic = context.Diagnostics.First();
            var classNode  = root.FindNode(diagnostic.Location.SourceSpan) as ClassDeclarationSyntax;

            context.CancellationToken.ThrowIfCancellationRequested();

            IsBusinessObjectSerializableMakeSerializableCodeFix.AddCodeFix(
                context, root, diagnostic, classNode);
        }
Пример #8
0
        private static void AddCodeFixWhenSystemUsingDoesNotExist(CodeFixContext context, SyntaxNode root,
                                                                  Diagnostic diagnostic, ClassDeclarationSyntax classNode)
        {
            var qualifiedRoot = IsBusinessObjectSerializableMakeSerializableCodeFix.AddAttribute(
                root, classNode, IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SerializableFullName);

            context.RegisterCodeFix(
                CodeAction.Create(
                    IsBusinessObjectSerializableMakeSerializableCodeFixConstants.AddSystemSerializableDescription,
                    _ => Task.FromResult <Document>(context.Document.WithSyntaxRoot(qualifiedRoot))), diagnostic);

            var unqualifiedRoot = IsBusinessObjectSerializableMakeSerializableCodeFix.AddAttribute(
                root, classNode, IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SerializableName);

            unqualifiedRoot = (unqualifiedRoot as CompilationUnitSyntax).AddUsings(
                SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(
                                                 IsBusinessObjectSerializableMakeSerializableCodeFixConstants.SystemNamespace)));

            context.RegisterCodeFix(
                CodeAction.Create(
                    IsBusinessObjectSerializableMakeSerializableCodeFixConstants.AddSerializableAndUsingDescription,
                    _ => Task.FromResult <Document>(context.Document.WithSyntaxRoot(unqualifiedRoot))), diagnostic);
        }