protected ResolveResult Resolve(string code) { CompilationUnit cu = new CSharpParser().Parse(new StringReader(code.Replace("$", "")), "code.cs"); TextLocation[] dollars = FindDollarSigns(code).ToArray(); Assert.AreEqual(2, dollars.Length, "Expected 2 dollar signs marking start+end of desired node"); SetUp(); CSharpParsedFile parsedFile = cu.ToTypeSystem(); project = project.UpdateProjectContent(null, parsedFile); compilation = project.CreateCompilation(); FindNodeVisitor fnv = new FindNodeVisitor(dollars[0], dollars[1]); cu.AcceptVisitor(fnv, null); Assert.IsNotNull(fnv.ResultNode, "Did not find DOM node at the specified location"); Debug.WriteLine(new string('=', 70)); Debug.WriteLine("Starting new resolver for " + fnv.ResultNode); CSharpAstResolver resolver = new CSharpAstResolver(compilation, cu, parsedFile); ResolveResult rr = resolver.Resolve(fnv.ResultNode); Assert.IsNotNull(rr, "ResolveResult is null - did something go wrong while navigating to the target node?"); Debug.WriteLine("ResolveResult is " + rr); return(rr); }
protected Tuple <CSharpAstResolver, AstNode> PrepareResolver(string code) { CompilationUnit cu = new CSharpParser().Parse(new StringReader(code.Replace("$", "")), "code.cs"); TextLocation[] dollars = FindDollarSigns(code).ToArray(); Assert.AreEqual(2, dollars.Length, "Expected 2 dollar signs marking start+end of desired node"); SetUp(); CSharpParsedFile parsedFile = cu.ToTypeSystem(); project = project.UpdateProjectContent(null, parsedFile); compilation = project.CreateCompilation(); CSharpAstResolver resolver = new CSharpAstResolver(compilation, cu, parsedFile); return(Tuple.Create(resolver, FindNode(cu, dollars[0], dollars[1]))); }
protected Tuple <CSharpAstResolver, AstNode> PrepareResolver(string code) { CompilationUnit cu = new CSharpParser().Parse(new StringReader(code.Replace("$", "")), "code.cs"); TextLocation[] dollars = FindDollarSigns(code).ToArray(); Assert.AreEqual(2, dollars.Length, "Expected 2 dollar signs marking start+end of desired node"); SetUp(); CSharpParsedFile parsedFile = cu.ToTypeSystem(); project = project.UpdateProjectContent(null, parsedFile); compilation = project.CreateCompilation(); FindNodeVisitor fnv = new FindNodeVisitor(dollars[0], dollars[1]); cu.AcceptVisitor(fnv, null); Assert.IsNotNull(fnv.ResultNode, "Did not find DOM node at the specified location"); CSharpAstResolver resolver = new CSharpAstResolver(compilation, cu, parsedFile); return(Tuple.Create(resolver, fnv.ResultNode)); }
public void SetUp() { pc = new CSharpProjectContent(); pc = pc.SetAssemblyName("MyAssembly"); parsedFile = new CSharpParser().Parse(new StringReader(program), "program.cs").ToTypeSystem(); pc = pc.UpdateProjectContent(null, parsedFile); pc = pc.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib }); compilation = pc.CreateCompilation(); baseClass = compilation.RootNamespace.GetTypeDefinition("Base", 1); nestedClass = baseClass.NestedTypes.Single(); derivedClass = compilation.RootNamespace.GetTypeDefinition("Derived", 2); systemClass = compilation.RootNamespace.GetChildNamespace("NS").GetTypeDefinition("System", 0); }
public virtual IProjectContent GetProjectContext() { if (Project == null) { if (singleFileContext == null) { singleFileContext = new ICSharpCode.NRefactory.CSharp.CSharpProjectContent(); singleFileContext = singleFileContext.AddAssemblyReferences(new [] { Mscorlib, System, SystemCore }); } if (parsedDocument != null) { return(singleFileContext.UpdateProjectContent(null, parsedDocument.ParsedFile)); } return(singleFileContext); } return(TypeSystemService.GetProjectContext(Project)); }
public override IEnumerable<MemberReference> FindReferences (Project project, IProjectContent content, IEnumerable<FilePath> possibleFiles, IEnumerable<object> members) { if (project == null) throw new ArgumentNullException ("project", "Project not set."); if (content == null) throw new ArgumentNullException ("content", "Project content not set."); SetPossibleFiles (possibleFiles); SetSearchedMembers (members); var scopes = searchedMembers.Select (e => refFinder.GetSearchScopes (e as IEntity)); var compilation = TypeSystemService.GetCompilation (project); List<MemberReference> refs = new List<MemberReference> (); foreach (var opendoc in openDocuments) { foreach (var newRef in FindInDocument (opendoc.Item2)) { if (newRef == null || refs.Any (r => r.FileName == newRef.FileName && r.Region == newRef.Region)) continue; refs.Add (newRef); } } foreach (var file in files) { string text = Mono.TextEditor.Utils.TextFileUtility.ReadAllText (file); if (memberName != null && text.IndexOf (memberName, StringComparison.Ordinal) < 0 && (keywordName == null || text.IndexOf (keywordName, StringComparison.Ordinal) < 0)) continue; using (var editor = TextEditorData.CreateImmutable (text)) { editor.Document.FileName = file; var unit = new CSharpParser ().Parse (editor); if (unit == null) continue; var storedFile = content.GetFile (file); var parsedFile = storedFile as CSharpParsedFile; if (parsedFile == null && storedFile is ParsedDocumentDecorator) { parsedFile = ((ParsedDocumentDecorator)storedFile).ParsedFile as CSharpParsedFile; } if (parsedFile == null) { // for fallback purposes - should never happen. parsedFile = unit.ToTypeSystem (); content = content.UpdateProjectContent (content.GetFile (file), parsedFile); compilation = content.CreateCompilation (); } foreach (var scope in scopes) { refFinder.FindReferencesInFile ( scope, parsedFile, unit, compilation, (astNode, result) => { var newRef = GetReference (result, astNode, file, editor); if (newRef == null || refs.Any (r => r.FileName == newRef.FileName && r.Region == newRef.Region)) return; refs.Add (newRef); }, CancellationToken.None ); } } } return refs; }
public override IEnumerable <MemberReference> FindReferences(Project project, IProjectContent content, IEnumerable <FilePath> possibleFiles, IEnumerable <object> members) { if (project == null) { throw new ArgumentNullException("project", "Project not set."); } if (content == null) { throw new ArgumentNullException("content", "Project content not set."); } SetPossibleFiles(possibleFiles); SetSearchedMembers(members); var scopes = searchedMembers.Select(e => refFinder.GetSearchScopes(e as IEntity)); var compilation = TypeSystemService.GetCompilation(project); List <MemberReference> refs = new List <MemberReference> (); foreach (var opendoc in openDocuments) { foreach (var newRef in FindInDocument(opendoc.Item2)) { if (newRef == null || refs.Any(r => r.FileName == newRef.FileName && r.Region == newRef.Region)) { continue; } refs.Add(newRef); } } foreach (var file in files) { string text = Mono.TextEditor.Utils.TextFileUtility.ReadAllText(file); if (memberName != null && text.IndexOf(memberName, StringComparison.Ordinal) < 0 && (keywordName == null || text.IndexOf(keywordName, StringComparison.Ordinal) < 0)) { continue; } using (var editor = TextEditorData.CreateImmutable(text)) { editor.Document.FileName = file; var unit = new CSharpParser().Parse(editor); if (unit == null) { continue; } var storedFile = content.GetFile(file); var parsedFile = storedFile as CSharpParsedFile; if (parsedFile == null && storedFile is ParsedDocumentDecorator) { parsedFile = ((ParsedDocumentDecorator)storedFile).ParsedFile as CSharpParsedFile; } if (parsedFile == null) { // for fallback purposes - should never happen. parsedFile = unit.ToTypeSystem(); content = content.UpdateProjectContent(content.GetFile(file), parsedFile); compilation = content.CreateCompilation(); } foreach (var scope in scopes) { refFinder.FindReferencesInFile( scope, parsedFile, unit, compilation, (astNode, result) => { var newRef = GetReference(result, astNode, file, editor); if (newRef == null || refs.Any(r => r.FileName == newRef.FileName && r.Region == newRef.Region)) { return; } refs.Add(newRef); }, CancellationToken.None ); } } } return(refs); }