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); } }
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(); } }); }
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); } }