static FormattingChanges GetFormattingChanges(PolicyContainer policyParent, IEnumerable <string> mimeTypeChain, MonoDevelop.Ide.Gui.Document document, string input, DomRegion formattingRegion, ref int formatStartOffset, ref int formatLength, bool formatLastStatementOnly)
        {
            using (var stubData = TextEditorData.CreateImmutable(input)) {
                stubData.Document.FileName = document.FileName;
                var  parser          = document.HasProject ? new CSharpParser(TypeSystemParser.GetCompilerArguments(document.Project)) : new CSharpParser();
                var  compilationUnit = parser.Parse(stubData);
                bool hadErrors       = parser.HasErrors;
                if (hadErrors)
                {
                    using (var stubData2 = TextEditorData.CreateImmutable(input + "}")) {
                        compilationUnit = parser.Parse(stubData2);
                        hadErrors       = parser.HasErrors;
                    }
                }
                // try it out, if the behavior is better when working only with correct code.
                if (hadErrors)
                {
                    return(null);
                }

                var policy = policyParent.Get <CSharpFormattingPolicy> (mimeTypeChain);

                var formattingVisitor = new ICSharpCode.NRefactory.CSharp.CSharpFormatter(policy.CreateOptions(), document.Editor.CreateNRefactoryTextEditorOptions());
                formattingVisitor.FormattingMode = FormattingMode.Intrusive;
                formattingVisitor.AddFormattingRegion(formattingRegion);


                var changes = formattingVisitor.AnalyzeFormatting(stubData.Document, compilationUnit);

                if (formatLastStatementOnly)
                {
                    AstNode node = compilationUnit.GetAdjacentNodeAt <Statement> (stubData.OffsetToLocation(formatStartOffset + formatLength - 1));
                    if (node != null)
                    {
                        while (node.Role == Roles.EmbeddedStatement || node.Role == IfElseStatement.TrueRole || node.Role == IfElseStatement.FalseRole)
                        {
                            node = node.Parent;
                        }
                        // include indentation if node starts in new line
                        var formatNode = node.GetPrevNode();
                        if (formatNode.Role != Roles.NewLine)
                        {
                            formatNode = node;
                        }
                        var start = stubData.LocationToOffset(formatNode.StartLocation);
                        if (start > formatStartOffset)
                        {
                            var end = stubData.LocationToOffset(node.EndLocation);
                            formatStartOffset = start;
                            formatLength      = end - start;
                        }
                    }
                }
                return(changes);
            }
        }
示例#2
0
        void StartAnalyzation(object sender, EventArgs e)
        {
            var solution = IdeApp.ProjectOperations.CurrentSelectedSolution;

            if (solution == null)
            {
                return;
            }
            runButton.Sensitive = false;
            store.Clear();
            var rootNode = store.AddNode();

            rootNode.SetValue(text, "Analyzing...");
            ThreadPool.QueueUserWorkItem(delegate {
                using (var monitor = IdeApp.Workbench.ProgressMonitors.GetStatusProgressMonitor("Analyzing solution", null, false)) {
                    int work = 0;
                    foreach (var project in solution.GetAllProjects())
                    {
                        work += project.Files.Count(f => f.BuildAction == BuildAction.Compile);
                    }
                    monitor.BeginTask("Analyzing solution", work);
                    int allIssues           = 0;
                    TypeSystemParser parser = null;
                    string lastMime         = null;
                    CodeIssueProvider[] codeIssueProvider = null;
                    foreach (var project in solution.GetAllProjects())
                    {
                        var compilation             = TypeSystemService.GetCompilation(project);
                        List <CodeIssue> codeIssues = new List <CodeIssue> ();
                        Parallel.ForEach(project.Files, file => {
                            if (file.BuildAction != BuildAction.Compile)
                            {
                                return;
                            }

                            var editor = TextFileProvider.Instance.GetReadOnlyTextEditorData(file.FilePath);

                            if (lastMime != editor.MimeType || parser == null)
                            {
                                parser = TypeSystemService.GetParser(editor.MimeType);
                            }
                            if (parser == null)
                            {
                                return;
                            }
                            var reader   = new StreamReader(editor.OpenStream());
                            var document = parser.Parse(true, editor.FileName, reader, project);
                            reader.Close();
                            if (document == null)
                            {
                                return;
                            }

                            var resolver = new CSharpAstResolver(compilation, document.GetAst <SyntaxTree> (), document.ParsedFile as CSharpUnresolvedFile);
                            var context  = document.CreateRefactoringContextWithEditor(editor, resolver, CancellationToken.None);

                            if (lastMime != editor.MimeType || codeIssueProvider == null)
                            {
                                codeIssueProvider = RefactoringService.GetInspectors(editor.MimeType).ToArray();
                            }
                            Parallel.ForEach(codeIssueProvider, (provider) => {
                                var severity = provider.GetSeverity();
                                if (severity == Severity.None)
                                {
                                    return;
                                }
                                try {
                                    foreach (var r in provider.GetIssues(context, CancellationToken.None))
                                    {
                                        lock (codeIssues) {
                                            codeIssues.Add(r);
                                        }
                                    }
                                } catch (Exception ex) {
                                    LoggingService.LogError("Error while running code issue on:" + editor.FileName, ex);
                                }
                            });
                            lastMime = editor.MimeType;
                            monitor.Step(1);
                        });
                        Application.Invoke(delegate {
                            var projectNode = store.AddNode();
                            projectNode.SetValue(text, project.Name + "( " + codeIssues.Count + " issues)");
                            foreach (var issue in codeIssues)
                            {
                                var child = projectNode.AddChild();
                                child.SetValue(text, issue.Description + " - " + issue.Region);
                                child.SetValue(region, issue.Region);
                                child.MoveToParent();
                            }
                            projectNode.MoveToParent();
                            allIssues += codeIssues.Count;
                        });
                    }
                    Application.Invoke(delegate {
                        rootNode.SetValue(text, "Found issues :" + allIssues);
                        runButton.Sensitive = true;
                    });
                    monitor.EndTask();
                }
            });
        }
示例#3
0
        static AstFormattingVisitor GetFormattingChanges(PolicyContainer policyParent, IEnumerable <string> mimeTypeChain, MonoDevelop.Ide.Gui.Document document, string input, DomRegion formattingRegion)
        {
            using (var stubData = TextEditorData.CreateImmutable(input)) {
                stubData.Document.FileName = document.FileName;
                var  parser          = document.HasProject ? new ICSharpCode.NRefactory.CSharp.CSharpParser(TypeSystemParser.GetCompilerArguments(document.Project)) : new ICSharpCode.NRefactory.CSharp.CSharpParser();
                var  compilationUnit = parser.Parse(stubData);
                bool hadErrors       = parser.HasErrors;
                if (hadErrors)
                {
                    using (var stubData2 = TextEditorData.CreateImmutable(input + "}")) {
                        compilationUnit = parser.Parse(stubData2);
                        hadErrors       = parser.HasErrors;
                    }
                }

                // try it out, if the behavior is better when working only with correct code.
                if (hadErrors)
                {
                    return(null);
                }

                var policy = policyParent.Get <CSharpFormattingPolicy> (mimeTypeChain);

                var formattingVisitor = new AstFormattingVisitor(policy.CreateOptions(), stubData.Document, document.Editor.CreateNRefactoryTextEditorOptions())
                {
                    HadErrors        = hadErrors,
                    FormattingRegion = formattingRegion
                };

                compilationUnit.AcceptVisitor(formattingVisitor);
                return(formattingVisitor);
            }
        }