diff --git a/src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs b/src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs index e37fc741d8..1837ee4aee 100644 --- a/src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs +++ b/src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.CodeQuality.Engine /// public class AssemblyAnalyzer { - CecilLoader loader = new CecilLoader(true) { IncludeInternalMembers = true }; + Dictionary unresolvedTypeSystemToCecilDict = new Dictionary(); ICompilation compilation; internal Dictionary assemblyMappings; internal Dictionary namespaceMappings; @@ -73,7 +73,7 @@ namespace ICSharpCode.CodeQuality.Engine public ReadOnlyCollection Analyze() { - IUnresolvedAssembly[] loadedAssemblies = LoadAssemblies().ToArray(); + var loadedAssemblies = LoadAssemblies(); compilation = new SimpleCompilation(loadedAssemblies.First(), loadedAssemblies.Skip(1)); assemblyMappings = new Dictionary(); @@ -92,7 +92,7 @@ namespace ICSharpCode.CodeQuality.Engine foreach (var field in type.Fields) { var node = new FieldNode(field); fieldMappings.Add(field, node); - var cecilObj = loader.GetCecilObject((IUnresolvedField)field.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedField)field.UnresolvedMember); if (cecilObj != null) cecilMappings[cecilObj] = field; tn.AddChild(node); @@ -101,7 +101,7 @@ namespace ICSharpCode.CodeQuality.Engine foreach (var method in type.Methods) { var node = new MethodNode(method); methodMappings.Add(method, node); - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)method.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)method.UnresolvedMember); if (cecilObj != null) cecilMappings[cecilObj] = method; tn.AddChild(node); @@ -110,16 +110,16 @@ namespace ICSharpCode.CodeQuality.Engine foreach (var property in type.Properties) { var node = new PropertyNode(property); propertyMappings.Add(property, node); - var cecilPropObj = loader.GetCecilObject((IUnresolvedProperty)property.UnresolvedMember); + var cecilPropObj = GetCecilObject((IUnresolvedProperty)property.UnresolvedMember); if (cecilPropObj != null) cecilMappings[cecilPropObj] = property; if (property.CanGet) { - var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)property.Getter.UnresolvedMember); + var cecilMethodObj = GetCecilObject((IUnresolvedMethod)property.Getter.UnresolvedMember); if (cecilMethodObj != null) cecilMappings[cecilMethodObj] = property; } if (property.CanSet) { - var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)property.Setter.UnresolvedMember); + var cecilMethodObj = GetCecilObject((IUnresolvedMethod)property.Setter.UnresolvedMember); if (cecilMethodObj != null) cecilMappings[cecilMethodObj] = property; } @@ -129,21 +129,21 @@ namespace ICSharpCode.CodeQuality.Engine foreach (var @event in type.Events) { var node = new EventNode(@event); eventMappings.Add(@event, node); - var cecilObj = loader.GetCecilObject((IUnresolvedEvent)@event.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedEvent)@event.UnresolvedMember); if (cecilObj != null) cecilMappings[cecilObj] = @event; if (@event.CanAdd) { - var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember); + var cecilMethodObj = GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember); if (cecilMethodObj != null) cecilMappings[cecilMethodObj] = @event; } if (@event.CanInvoke) { - var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember); + var cecilMethodObj = GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember); if (cecilMethodObj != null) cecilMappings[cecilMethodObj] = @event; } if (@event.CanRemove) { - var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember); + var cecilMethodObj = GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember); if (cecilMethodObj != null) cecilMappings[cecilMethodObj] = @event; } @@ -151,7 +151,7 @@ namespace ICSharpCode.CodeQuality.Engine } } - ILAnalyzer analyzer = new ILAnalyzer(loadedAssemblies.Select(asm => loader.GetCecilObject(asm)).ToArray(), this); + ILAnalyzer analyzer = new ILAnalyzer(loadedAssemblies.Select(asm => GetCecilObject(asm)).ToArray(), this); int count = typeMappings.Count + methodMappings.Count + fieldMappings.Count + propertyMappings.Count; int i = 0; @@ -164,7 +164,7 @@ namespace ICSharpCode.CodeQuality.Engine foreach (var element in methodMappings) { ReportProgress(++i / (double)count); - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)element.Key.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)element.Key.UnresolvedMember); if (cecilObj != null) analyzer.Analyze(cecilObj.Body, element.Value); var node = element.Value; @@ -194,12 +194,12 @@ namespace ICSharpCode.CodeQuality.Engine var node = element.Value; var property = element.Key; if (property.CanGet) { - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)element.Key.Getter.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)element.Key.Getter.UnresolvedMember); if (cecilObj != null) analyzer.Analyze(cecilObj.Body, node); } if (property.CanSet) { - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)element.Key.Setter.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)element.Key.Setter.UnresolvedMember); if (cecilObj != null) analyzer.Analyze(cecilObj.Body, node); } @@ -213,17 +213,17 @@ namespace ICSharpCode.CodeQuality.Engine var node = element.Value; var @event = element.Key; if (@event.CanAdd) { - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember); if (cecilObj != null) analyzer.Analyze(cecilObj.Body, node); } if (@event.CanInvoke) { - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember); if (cecilObj != null) analyzer.Analyze(cecilObj.Body, node); } if (@event.CanRemove) { - var cecilObj = loader.GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember); + var cecilObj = GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember); if (cecilObj != null) analyzer.Analyze(cecilObj.Body, node); } @@ -295,7 +295,7 @@ namespace ICSharpCode.CodeQuality.Engine } } - IEnumerable LoadAssemblies() + IList LoadAssemblies() { var resolver = new AssemblyResolver(); foreach (var path in fileNames.Select(f => Path.GetDirectoryName(f)).Distinct(StringComparer.OrdinalIgnoreCase)) @@ -305,13 +305,54 @@ namespace ICSharpCode.CodeQuality.Engine assemblies.Add(resolver.LoadAssemblyFile(file)); foreach (var asm in assemblies.ToArray()) assemblies.AddRange(asm.Modules.SelectMany(m => m.AssemblyReferences).Select(r => resolver.TryResolve(r)).Where(r => r != null)); - return assemblies.Distinct().Select(asm => loader.LoadAssembly(asm)); + CecilLoader loader = new CecilLoader { IncludeInternalMembers = true }; + // Emulate the old CecilLoader.GetCecilObject() API: + loader.OnEntityLoaded = delegate(IUnresolvedEntity entity, MemberReference cecilObj) { + unresolvedTypeSystemToCecilDict[entity] = cecilObj; + }; + var loadedAssemblies = new List(); + foreach (var asm in assemblies.Distinct()) { + var loadedAssembly = loader.LoadAssembly(asm); + loadedAssemblies.Add(loadedAssembly); + unresolvedTypeSystemToCecilDict[loadedAssembly] = asm; + } + return loadedAssemblies; + } + + AssemblyDefinition GetCecilObject(IUnresolvedAssembly assembly) + { + object cecilObj; + if (unresolvedTypeSystemToCecilDict.TryGetValue(assembly, out cecilObj)) { + return cecilObj as AssemblyDefinition; + } else { + return null; + } + } + + MemberReference GetCecilObject(IUnresolvedEntity entity) + { + object cecilObj; + if (unresolvedTypeSystemToCecilDict.TryGetValue(entity, out cecilObj)) { + return cecilObj as MemberReference; + } else { + return null; + } + } + + MethodDefinition GetCecilObject(IUnresolvedMethod method) + { + object cecilObj; + if (unresolvedTypeSystemToCecilDict.TryGetValue(method, out cecilObj)) { + return cecilObj as MethodDefinition; + } else { + return null; + } } NamespaceNode GetOrCreateNamespace(AssemblyNode assembly, string namespaceName) { NamespaceNode result; - var asmDef = loader.GetCecilObject(assembly.AssemblyInfo.UnresolvedAssembly); + var asmDef = GetCecilObject(assembly.AssemblyInfo.UnresolvedAssembly); if (!namespaceMappings.TryGetValue(namespaceName + "," + asmDef.FullName, out result)) { result = new NamespaceNode(namespaceName); assembly.AddChild(result); @@ -343,7 +384,7 @@ namespace ICSharpCode.CodeQuality.Engine throw new Exception("TypeNode not found: " + type.DeclaringTypeDefinition.FullName); } else ns.AddChild(node); - cecilMappings[loader.GetCecilObject(type.Parts.First())] = type; + cecilMappings[GetCecilObject(type.Parts.First())] = type; typeMappings.Add(type, node); return node; } diff --git a/src/Main/Base/Project/Editor/Search/SearchResultMatch.cs b/src/Main/Base/Project/Editor/Search/SearchResultMatch.cs index 96e65e4b75..93d93dccad 100644 --- a/src/Main/Base/Project/Editor/Search/SearchResultMatch.cs +++ b/src/Main/Base/Project/Editor/Search/SearchResultMatch.cs @@ -62,6 +62,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Search { if (fileName == null) throw new ArgumentNullException("fileName"); + if (startLocation.IsEmpty) + throw new ArgumentOutOfRangeException("startLocation"); + if (endLocation.IsEmpty) + throw new ArgumentOutOfRangeException("endLocation"); this.fileName = fileName; this.startLocation = startLocation; this.endLocation = endLocation; diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index 215fd6defc..86cae1aaf6 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -335,99 +335,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } */ - - [Obsolete] - public static void ShowAsSearchResults(string title, List list) - { - if (list == null) return; - List results = new List(list.Count); - ReadOnlyDocument document = null; - ITextSource buffer = null; - FileName fileName = null; - IHighlighter highlighter = null; - foreach (SearchResultMatch r in list) { - if (document == null || fileName != r.FileName) { - if (highlighter != null) { - highlighter.Dispose(); - } - fileName = r.FileName; - buffer = SD.FileService.GetFileContent(r.FileName); - document = new ReadOnlyDocument(buffer, r.FileName); - highlighter = SD.EditorControlService.CreateHighlighter(document); - highlighter.BeginHighlighting(); - } - var start = r.StartLocation; - var end = r.EndLocation; - var startOffset = document.GetOffset(start); - var endOffset = document.GetOffset(end); - var builder = SearchResultsPad.CreateInlineBuilder(start, end, document, highlighter); - var defaultTextColor = highlighter != null ? highlighter.DefaultTextColor : null; - SearchResultMatch res = new SearchResultMatch(fileName, start, end, startOffset, endOffset - startOffset, builder, defaultTextColor); - results.Add(res); - } - if (highlighter != null) { - highlighter.Dispose(); - } - SearchResultsPad.Instance.ShowSearchResults(title, results); - SearchResultsPad.Instance.BringToFront(); - } - - /* - sealed class FileView { - public IViewContent ViewContent; - public OpenedFile OpenedFile; - } - - public static void RenameReferences(List list, string newName) - { - Dictionary modifiedDocuments = new Dictionary(); - List modifications = new List(); - foreach (Reference r in list) { - IDocument document = null; - IViewContent viewContent = null; - - OpenedFile file = FileService.GetOpenedFile(r.FileName); - if (file != null) { - viewContent = file.CurrentView; - IFileDocumentProvider p = viewContent as IFileDocumentProvider; - if (p != null) { - document = p.GetDocumentForFile(file); - } - } - - if (document == null) { - viewContent = FileService.OpenFile(r.FileName, false); - IFileDocumentProvider p = viewContent as IFileDocumentProvider; - if (p != null) { - file = FileService.GetOpenedFile(r.FileName); - System.Diagnostics.Debug.Assert(file != null, "OpenedFile not found after opening the file."); - document = p.GetDocumentForFile(file); - } - } - - if (document == null) { - LoggingService.Warn("RenameReferences: Could not get document for file '" + r.FileName + "'"); - continue; - } - - if (!modifiedDocuments.ContainsKey(document)) { - modifiedDocuments.Add(document, new FileView() {ViewContent = viewContent, OpenedFile = file}); - document.StartUndoableAction(); - } - - ModifyDocument(modifications, document, r.Offset, r.Length, newName); - } - foreach (KeyValuePair entry in modifiedDocuments) { - entry.Key.EndUndoableAction(); - entry.Value.OpenedFile.MakeDirty(); - if (entry.Value.ViewContent is IEditable) { - ParserService.ParseViewContent(entry.Value.ViewContent); - } else { - ParserService.ParseFile(entry.Value.OpenedFile.FileName, entry.Key); - } - } - } - */ /* TODO: these are refactorings and don't belong here public static void MoveClassToFile(IClass c, string newFileName)