diff options
author | Simon Lindgren <simon.n.lindgren@gmail.com> | 2013-08-08 19:27:22 +0400 |
---|---|---|
committer | Simon Lindgren <simon.n.lindgren@gmail.com> | 2013-08-20 17:17:42 +0400 |
commit | b84f00ca6598d18f74071bde8727fe0bbce8d726 (patch) | |
tree | 8fad53761b11af5f858b00fdc9563ca582c02324 /main/src/addins | |
parent | 9e427418b5792652ea11792ba5fb8f0a750cddea (diff) |
[Refactoring] Add CodeIssue instrumentation.
Diffstat (limited to 'main/src/addins')
4 files changed, 33 insertions, 8 deletions
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NRefactoryIssueProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NRefactoryIssueProvider.cs index 47e1442cf6..6b3a2bf9ab 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NRefactoryIssueProvider.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NRefactoryIssueProvider.cs @@ -34,6 +34,7 @@ using MonoDevelop.CodeIssues; using MonoDevelop.CSharp.Refactoring.CodeActions; using MonoDevelop.Core; using Mono.TextEditor; +using MonoDevelop.Core.Instrumentation; namespace MonoDevelop.CSharp.Refactoring.CodeIssues { @@ -42,6 +43,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeIssues readonly ICSharpCode.NRefactory.CSharp.Refactoring.CodeIssueProvider issueProvider; readonly IssueDescriptionAttribute attr; readonly string providerIdString; + TimerCounter counter; public override string IdString { get { @@ -91,6 +93,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeIssues DefaultSeverity = attr.Severity; SetMimeType ("text/x-csharp"); subIssues = issueProvider.SubIssues.Select (subIssue => (BaseCodeIssueProvider)new BaseNRefactoryIssueProvider (this, subIssue)).ToList (); + counter = InstrumentationService.CreateTimerCounter (IdString, "CodeIssueProvider run times"); } public override IEnumerable<CodeIssue> GetIssues (object ctx, CancellationToken cancellationToken) @@ -101,7 +104,14 @@ namespace MonoDevelop.CSharp.Refactoring.CodeIssues // Holds all the actions in a particular sibling group. var actionGroups = new Dictionary<object, IList<ICSharpCode.NRefactory.CSharp.Refactoring.CodeAction>> (); - foreach (var action in issueProvider.GetIssues (context)) { + IList<ICSharpCode.NRefactory.CSharp.Refactoring.CodeIssue> issues; + using (var timer = counter.BeginTiming ()) { + // We need to enumerate here in order to time it. + // This shouldn't be a problem since there are current very few (if any) lazy providers. + var _issues = issueProvider.GetIssues (context); + issues = _issues as IList<ICSharpCode.NRefactory.CSharp.Refactoring.CodeIssue> ?? _issues.ToList (); + } + foreach (var action in issues) { if (cancellationToken.IsCancellationRequested) yield break; if (action.Actions == null) { @@ -120,7 +130,7 @@ namespace MonoDevelop.CSharp.Refactoring.CodeIssues if (act.SiblingKey != null) { // make sure the action has a list of its siblings IList<ICSharpCode.NRefactory.CSharp.Refactoring.CodeAction> siblingGroup; - if (!actionGroups.TryGetValue(act.SiblingKey, out siblingGroup)) { + if (!actionGroups.TryGetValue (act.SiblingKey, out siblingGroup)) { siblingGroup = new List<ICSharpCode.NRefactory.CSharp.Refactoring.CodeAction> (); actionGroups.Add (act.SiblingKey, siblingGroup); } diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeAnalysisBatchRunner.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeAnalysisBatchRunner.cs index bf0ea189e9..f3d1c671cc 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeAnalysisBatchRunner.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeAnalysisBatchRunner.cs @@ -39,9 +39,11 @@ using MonoDevelop.Refactoring; using ICSharpCode.NRefactory.Refactoring; using MonoDevelop.Core; using System.Collections.Concurrent; -using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; using Mono.TextEditor; +using System.Collections.Generic; +using MonoDevelop.Core.Instrumentation; +using MonoDevelop.Refactoring; namespace MonoDevelop.CodeIssues { @@ -190,7 +192,12 @@ namespace MonoDevelop.CodeIssues return; var compilation = content.AddOrUpdateFiles (document.ParsedFile).CreateCompilation (); - var resolver = new CSharpAstResolver (compilation, document.GetAst<SyntaxTree> (), document.ParsedFile as ICSharpCode.NRefactory.CSharp.TypeSystem.CSharpUnresolvedFile); + + CSharpAstResolver resolver; + using (var timer = ExtensionMethods.ResolveCounter.BeginTiming ()) { + resolver = new CSharpAstResolver (compilation, document.GetAst<SyntaxTree> (), document.ParsedFile as ICSharpCode.NRefactory.CSharp.TypeSystem.CSharpUnresolvedFile); + resolver.ApplyNavigator (new ExtensionMethods.ConstantModeResolveVisitorNavigator (ResolveVisitorNavigationMode.Resolve, null)); + } var context = document.CreateRefactoringContextWithEditor (editor, resolver, tokenSource.Token); CodeIssueProvider[] codeIssueProvider = RefactoringService.GetInspectors (editor.MimeType).ToArray (); diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePad.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePad.cs index 6880d31cea..59402b09bb 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePad.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePad.cs @@ -215,6 +215,9 @@ namespace MonoDevelop.CodeIssues case AnalysisState.Cancelled: text = string.Format ("Found issues: {0} (Cancelled)", rootGroup.IssueCount); break; + case AnalysisState.Error: + text = string.Format ("Found issues: {0} (Failed)", rootGroup.IssueCount); + break; case AnalysisState.Completed: text = string.Format ("Found issues: {0}", rootGroup.IssueCount); break; diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs index 0f81201359..029cb9eff3 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs @@ -33,6 +33,7 @@ using ICSharpCode.NRefactory.Semantics; using System.Threading.Tasks; using MonoDevelop.Core; using System.Threading; +using MonoDevelop.Core.Instrumentation; namespace MonoDevelop.Refactoring { @@ -74,6 +75,8 @@ namespace MonoDevelop.Refactoring } + public static TimerCounter ResolveCounter = InstrumentationService.CreateTimerCounter("Resolve document", "Parsing"); + /// <summary> /// Returns a full C# syntax tree resolver which is shared between semantic highlighting, source analysis and refactoring. /// For code analysis tasks this should be used instead of generating an own resolver. Only exception is if a local resolving is done using a @@ -104,9 +107,11 @@ namespace MonoDevelop.Refactoring var token = sharedTokenSource.Token; var resolveTask = Task.Factory.StartNew (delegate { try { - var result = new CSharpAstResolver (compilation, unit, parsedFile); - result.ApplyNavigator (new ConstantModeResolveVisitorNavigator (ResolveVisitorNavigationMode.Resolve, null), token); - return result; + using (var timer = ResolveCounter.BeginTiming ()) { + var result = new CSharpAstResolver (compilation, unit, parsedFile); + result.ApplyNavigator (new ConstantModeResolveVisitorNavigator (ResolveVisitorNavigationMode.Resolve, null), token); + return result; + } } catch (OperationCanceledException) { return null; } catch (Exception e) { @@ -122,7 +127,7 @@ namespace MonoDevelop.Refactoring return wrapper; } - sealed class ConstantModeResolveVisitorNavigator : IResolveVisitorNavigator + public sealed class ConstantModeResolveVisitorNavigator : IResolveVisitorNavigator { readonly ResolveVisitorNavigationMode mode; readonly IResolveVisitorNavigator targetForResolveCalls; |