diff options
author | Daniel Grunwald <daniel@danielgrunwald.de> | 2011-08-27 16:48:51 +0400 |
---|---|---|
committer | Daniel Grunwald <daniel@danielgrunwald.de> | 2011-08-27 16:48:51 +0400 |
commit | a5865bdd8e678de40e8b8a51424676da0b9f781f (patch) | |
tree | 5fc9999dd4f02c2e34fabe54b438d5d70d589b7c /ICSharpCode.NRefactory.Demo | |
parent | 33abc64eecd56a1335daf91306487b5ba92b6e0b (diff) |
Implemented "Find References".
Diffstat (limited to 'ICSharpCode.NRefactory.Demo')
-rw-r--r-- | ICSharpCode.NRefactory.Demo/CSDemo.Designer.cs | 21 | ||||
-rw-r--r-- | ICSharpCode.NRefactory.Demo/CSDemo.cs | 52 |
2 files changed, 69 insertions, 4 deletions
diff --git a/ICSharpCode.NRefactory.Demo/CSDemo.Designer.cs b/ICSharpCode.NRefactory.Demo/CSDemo.Designer.cs index c4315cc4..079e531e 100644 --- a/ICSharpCode.NRefactory.Demo/CSDemo.Designer.cs +++ b/ICSharpCode.NRefactory.Demo/CSDemo.Designer.cs @@ -48,6 +48,7 @@ namespace ICSharpCode.NRefactory.Demo { this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.csharpCodeTextBox = new System.Windows.Forms.TextBox(); + this.findReferencesButton = new System.Windows.Forms.Button(); this.resolveButton = new System.Windows.Forms.Button(); this.csharpTreeView = new System.Windows.Forms.TreeView(); this.csharpGenerateCodeButton = new System.Windows.Forms.Button(); @@ -71,6 +72,7 @@ namespace ICSharpCode.NRefactory.Demo // // splitContainer1.Panel2 // + this.splitContainer1.Panel2.Controls.Add(this.findReferencesButton); this.splitContainer1.Panel2.Controls.Add(this.resolveButton); this.splitContainer1.Panel2.Controls.Add(this.csharpTreeView); this.splitContainer1.Panel2.Controls.Add(this.csharpGenerateCodeButton); @@ -97,10 +99,22 @@ namespace ICSharpCode.NRefactory.Demo this.csharpCodeTextBox.WordWrap = false; this.csharpCodeTextBox.TextChanged += new System.EventHandler(this.CsharpCodeTextBoxTextChanged); // + // findReferencesButton + // + this.findReferencesButton.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.findReferencesButton.Enabled = false; + this.findReferencesButton.Location = new System.Drawing.Point(344, 4); + this.findReferencesButton.Name = "findReferencesButton"; + this.findReferencesButton.Size = new System.Drawing.Size(100, 23); + this.findReferencesButton.TabIndex = 4; + this.findReferencesButton.Text = "Find References"; + this.findReferencesButton.UseVisualStyleBackColor = true; + this.findReferencesButton.Click += new System.EventHandler(this.FindReferencesButtonClick); + // // resolveButton // this.resolveButton.Anchor = System.Windows.Forms.AnchorStyles.Top; - this.resolveButton.Location = new System.Drawing.Point(187, 3); + this.resolveButton.Location = new System.Drawing.Point(132, 4); this.resolveButton.Name = "resolveButton"; this.resolveButton.Size = new System.Drawing.Size(100, 23); this.resolveButton.TabIndex = 3; @@ -123,7 +137,7 @@ namespace ICSharpCode.NRefactory.Demo // csharpGenerateCodeButton // this.csharpGenerateCodeButton.Anchor = System.Windows.Forms.AnchorStyles.Top; - this.csharpGenerateCodeButton.Location = new System.Drawing.Point(293, 2); + this.csharpGenerateCodeButton.Location = new System.Drawing.Point(238, 4); this.csharpGenerateCodeButton.Name = "csharpGenerateCodeButton"; this.csharpGenerateCodeButton.Size = new System.Drawing.Size(100, 23); this.csharpGenerateCodeButton.TabIndex = 1; @@ -134,7 +148,7 @@ namespace ICSharpCode.NRefactory.Demo // csharpParseButton // this.csharpParseButton.Anchor = System.Windows.Forms.AnchorStyles.Top; - this.csharpParseButton.Location = new System.Drawing.Point(81, 3); + this.csharpParseButton.Location = new System.Drawing.Point(26, 4); this.csharpParseButton.Name = "csharpParseButton"; this.csharpParseButton.Size = new System.Drawing.Size(100, 23); this.csharpParseButton.TabIndex = 0; @@ -156,6 +170,7 @@ namespace ICSharpCode.NRefactory.Demo this.splitContainer1.ResumeLayout(false); this.ResumeLayout(false); } + private System.Windows.Forms.Button findReferencesButton; private System.Windows.Forms.Button csharpParseButton; private System.Windows.Forms.Button csharpGenerateCodeButton; private System.Windows.Forms.TreeView csharpTreeView; diff --git a/ICSharpCode.NRefactory.Demo/CSDemo.cs b/ICSharpCode.NRefactory.Demo/CSDemo.cs index 317da797..1ccb5de5 100644 --- a/ICSharpCode.NRefactory.Demo/CSDemo.cs +++ b/ICSharpCode.NRefactory.Demo/CSDemo.cs @@ -22,12 +22,12 @@ using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.IO; +using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; - using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp.Resolver; using ICSharpCode.NRefactory.TypeSystem; @@ -71,6 +71,7 @@ namespace ICSharpCode.NRefactory.Demo } SelectCurrentNode(csharpTreeView.Nodes); resolveButton.Enabled = true; + findReferencesButton.Enabled = true; } TreeNode MakeTreeNode(AstNode node) @@ -245,6 +246,55 @@ namespace ICSharpCode.NRefactory.Demo void CsharpCodeTextBoxTextChanged(object sender, EventArgs e) { resolveButton.Enabled = false; + findReferencesButton.Enabled = false; + } + + void FindReferencesButtonClick(object sender, EventArgs e) + { + if (csharpTreeView.SelectedNode == null) + return; + + SimpleProjectContent project = new SimpleProjectContent(); + var parsedFile = new TypeSystemConvertVisitor(project, "dummy.cs").Convert(compilationUnit); + project.UpdateProjectContent(null, parsedFile); + + List<ITypeResolveContext> projects = new List<ITypeResolveContext>(); + projects.Add(project); + projects.AddRange(builtInLibs.Value); + + using (var context = new CompositeTypeResolveContext(projects).Synchronize()) { + CSharpResolver resolver = new CSharpResolver(context); + + AstNode node = (AstNode)csharpTreeView.SelectedNode.Tag; + IResolveVisitorNavigator navigator = new NodeListResolveVisitorNavigator(new[] { node }); + ResolveVisitor visitor = new ResolveVisitor(resolver, parsedFile, navigator); + visitor.Scan(compilationUnit); + IEntity entity; + MemberResolveResult mrr = visitor.GetResolveResult(node) as MemberResolveResult; + TypeResolveResult trr = visitor.GetResolveResult(node) as TypeResolveResult; + if (mrr != null) { + entity = mrr.Member; + } else if (trr != null) { + entity = trr.Type.GetDefinition(); + } else { + return; + } + + FindReferences fr = new FindReferences(); + int referenceCount = 0; + fr.ReferenceFound += delegate { referenceCount++; }; + + var searchScopes = fr.GetSearchScopes(entity); + navigator = new CompositeResolveVisitorNavigator(searchScopes.ToArray()); + visitor = new ResolveVisitor(resolver, parsedFile, navigator); + visitor.Scan(compilationUnit); + + csharpTreeView.BeginUpdate(); + ShowResolveResultsInTree(csharpTreeView.Nodes, visitor); + csharpTreeView.EndUpdate(); + + MessageBox.Show("Found " + referenceCount + " references to " + entity.FullName); + } } } } |