예제 #1
0
    internal static Func <AssemblyCSharpBuilder, CSharpCompilation, CSharpCompilation> Creator()
    {
        return((builder, compilation) =>
        {
            SyntaxTree tree = compilation.SyntaxTrees[0];
            var semantiModel = compilation.GetSemanticModel(tree);
            CompilationUnitSyntax root = tree.GetCompilationUnitRoot();
            var methodNodes = from methodDeclaration in root.DescendantNodes()
                              .OfType <MethodDeclarationSyntax>()
                              select methodDeclaration;


            var diagnostics = new HashSet <Location>(semantiModel.GetDiagnostics().Where(item => item.Id == "CS0103").Select(item => item.Location));
            foreach (var methodNode in methodNodes)
            {
                string argument = string.Empty;
                if (methodNode.ParameterList != null)
                {
                    if (methodNode.ParameterList.Parameters.Count > 0)
                    {
                        argument = methodNode.ParameterList.Parameters[0].Identifier.ValueText;
                    }
                    else
                    {
                        continue;
                    }
                }
                else
                {
                    continue;
                }
                IdentifierNameSyntax instance = SyntaxFactory.IdentifierName(argument);
                var body = methodNode.Body;
                if (body != null)
                {
                    var nodes = from CS0103Node in body.DescendantNodes().OfType <IdentifierNameSyntax>()
                                where diagnostics.Contains(CS0103Node.GetLocation())
                                select CS0103Node;

                    foreach (var node in nodes)
                    {
                        var symbolInfo = semantiModel.GetSymbolInfo(node);
                        if (symbolInfo.Symbol == null && symbolInfo.CandidateSymbols.Length == 0)
                        {
                            var member = SyntaxFactory.IdentifierName(node.Identifier.ValueText.Trim());
                            var newNode = SyntaxFactory.MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                instance,
                                member);
                            root = root.ReplaceNode(node, newNode);
                        }
                    }
                }
            }
            return compilation.ReplaceSyntaxTree(tree, root.SyntaxTree);
        });
    }
예제 #2
0
    internal static Func <CSharpCompilation, CSharpCompilation> Creator(string argument)
    {
        return((compilation) =>
        {
            IdentifierNameSyntax instance = SyntaxFactory.IdentifierName(argument);
            SyntaxTree tree = compilation.SyntaxTrees[0];
            var semantiModel = compilation.GetSemanticModel(tree);
            CompilationUnitSyntax root = tree.GetCompilationUnitRoot();
            var methodNodes = from methodDeclaration in root.DescendantNodes()
                              .OfType <MethodDeclarationSyntax>()
                              select methodDeclaration;

            var diagnostics = new HashSet <Location>(semantiModel.GetDiagnostics().Where(item => item.Id == "CS0103").Select(item => item.Location));
            var eiditor = new SyntaxEditor(root, new AdhocWorkspace());
            foreach (var methodNode in methodNodes)
            {
                var body = methodNode.Body;
                var nodes = from CS0103Node in body.DescendantNodes().OfType <IdentifierNameSyntax>()
                            where diagnostics.Contains(CS0103Node.GetLocation())
                            select CS0103Node;

                foreach (var node in nodes)
                {
                    var symbolInfo = semantiModel.GetSymbolInfo(node);
                    if (symbolInfo.Symbol == null && symbolInfo.CandidateSymbols.Length == 0)
                    {
                        var member = SyntaxFactory.IdentifierName(node.Identifier.ValueText.Trim());
                        var newNode = SyntaxFactory.MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            instance,
                            member);
                        eiditor.ReplaceNode(node, newNode);
                    }
                }
            }

            return compilation.ReplaceSyntaxTree(tree, eiditor.GetChangedRoot().SyntaxTree);
        });
    }