Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Lindgren <simon.n.lindgren@gmail.com>2013-08-08 19:27:22 +0400
committerSimon Lindgren <simon.n.lindgren@gmail.com>2013-08-20 17:17:42 +0400
commitb84f00ca6598d18f74071bde8727fe0bbce8d726 (patch)
tree8fad53761b11af5f858b00fdc9563ca582c02324 /main/src/addins
parent9e427418b5792652ea11792ba5fb8f0a750cddea (diff)
[Refactoring] Add CodeIssue instrumentation.
Diffstat (limited to 'main/src/addins')
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring.CodeIssues/NRefactoryIssueProvider.cs14
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeAnalysisBatchRunner.cs11
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.CodeIssues/CodeIssuePad.cs3
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ExtensionMethods.cs13
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;