Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 8a733d9

Browse files
committed
Don't use the obsolete CecilLoader.GetCecilObject() API in AssemblyAnalyzer.
1 parent f719b07 commit 8a733d9

3 files changed

Lines changed: 67 additions & 115 deletions

File tree

src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace ICSharpCode.CodeQuality.Engine
2222
/// </summary>
2323
public class AssemblyAnalyzer
2424
{
25-
CecilLoader loader = new CecilLoader(true) { IncludeInternalMembers = true };
25+
Dictionary<object, object> unresolvedTypeSystemToCecilDict = new Dictionary<object, object>();
2626
ICompilation compilation;
2727
internal Dictionary<IAssembly, AssemblyNode> assemblyMappings;
2828
internal Dictionary<string, NamespaceNode> namespaceMappings;
@@ -73,7 +73,7 @@ void CreateEdges(NodeBase source)
7373

7474
public ReadOnlyCollection<AssemblyNode> Analyze()
7575
{
76-
IUnresolvedAssembly[] loadedAssemblies = LoadAssemblies().ToArray();
76+
var loadedAssemblies = LoadAssemblies();
7777
compilation = new SimpleCompilation(loadedAssemblies.First(), loadedAssemblies.Skip(1));
7878

7979
assemblyMappings = new Dictionary<IAssembly, AssemblyNode>();
@@ -92,7 +92,7 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
9292
foreach (var field in type.Fields) {
9393
var node = new FieldNode(field);
9494
fieldMappings.Add(field, node);
95-
var cecilObj = loader.GetCecilObject((IUnresolvedField)field.UnresolvedMember);
95+
var cecilObj = GetCecilObject((IUnresolvedField)field.UnresolvedMember);
9696
if (cecilObj != null)
9797
cecilMappings[cecilObj] = field;
9898
tn.AddChild(node);
@@ -101,7 +101,7 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
101101
foreach (var method in type.Methods) {
102102
var node = new MethodNode(method);
103103
methodMappings.Add(method, node);
104-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)method.UnresolvedMember);
104+
var cecilObj = GetCecilObject((IUnresolvedMethod)method.UnresolvedMember);
105105
if (cecilObj != null)
106106
cecilMappings[cecilObj] = method;
107107
tn.AddChild(node);
@@ -110,16 +110,16 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
110110
foreach (var property in type.Properties) {
111111
var node = new PropertyNode(property);
112112
propertyMappings.Add(property, node);
113-
var cecilPropObj = loader.GetCecilObject((IUnresolvedProperty)property.UnresolvedMember);
113+
var cecilPropObj = GetCecilObject((IUnresolvedProperty)property.UnresolvedMember);
114114
if (cecilPropObj != null)
115115
cecilMappings[cecilPropObj] = property;
116116
if (property.CanGet) {
117-
var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)property.Getter.UnresolvedMember);
117+
var cecilMethodObj = GetCecilObject((IUnresolvedMethod)property.Getter.UnresolvedMember);
118118
if (cecilMethodObj != null)
119119
cecilMappings[cecilMethodObj] = property;
120120
}
121121
if (property.CanSet) {
122-
var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)property.Setter.UnresolvedMember);
122+
var cecilMethodObj = GetCecilObject((IUnresolvedMethod)property.Setter.UnresolvedMember);
123123
if (cecilMethodObj != null)
124124
cecilMappings[cecilMethodObj] = property;
125125
}
@@ -129,29 +129,29 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
129129
foreach (var @event in type.Events) {
130130
var node = new EventNode(@event);
131131
eventMappings.Add(@event, node);
132-
var cecilObj = loader.GetCecilObject((IUnresolvedEvent)@event.UnresolvedMember);
132+
var cecilObj = GetCecilObject((IUnresolvedEvent)@event.UnresolvedMember);
133133
if (cecilObj != null)
134134
cecilMappings[cecilObj] = @event;
135135
if (@event.CanAdd) {
136-
var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember);
136+
var cecilMethodObj = GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember);
137137
if (cecilMethodObj != null)
138138
cecilMappings[cecilMethodObj] = @event;
139139
}
140140
if (@event.CanInvoke) {
141-
var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember);
141+
var cecilMethodObj = GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember);
142142
if (cecilMethodObj != null)
143143
cecilMappings[cecilMethodObj] = @event;
144144
}
145145
if (@event.CanRemove) {
146-
var cecilMethodObj = loader.GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember);
146+
var cecilMethodObj = GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember);
147147
if (cecilMethodObj != null)
148148
cecilMappings[cecilMethodObj] = @event;
149149
}
150150
tn.AddChild(node);
151151
}
152152
}
153153

154-
ILAnalyzer analyzer = new ILAnalyzer(loadedAssemblies.Select(asm => loader.GetCecilObject(asm)).ToArray(), this);
154+
ILAnalyzer analyzer = new ILAnalyzer(loadedAssemblies.Select(asm => GetCecilObject(asm)).ToArray(), this);
155155
int count = typeMappings.Count + methodMappings.Count + fieldMappings.Count + propertyMappings.Count;
156156
int i = 0;
157157

@@ -164,7 +164,7 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
164164

165165
foreach (var element in methodMappings) {
166166
ReportProgress(++i / (double)count);
167-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)element.Key.UnresolvedMember);
167+
var cecilObj = GetCecilObject((IUnresolvedMethod)element.Key.UnresolvedMember);
168168
if (cecilObj != null)
169169
analyzer.Analyze(cecilObj.Body, element.Value);
170170
var node = element.Value;
@@ -194,12 +194,12 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
194194
var node = element.Value;
195195
var property = element.Key;
196196
if (property.CanGet) {
197-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)element.Key.Getter.UnresolvedMember);
197+
var cecilObj = GetCecilObject((IUnresolvedMethod)element.Key.Getter.UnresolvedMember);
198198
if (cecilObj != null)
199199
analyzer.Analyze(cecilObj.Body, node);
200200
}
201201
if (property.CanSet) {
202-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)element.Key.Setter.UnresolvedMember);
202+
var cecilObj = GetCecilObject((IUnresolvedMethod)element.Key.Setter.UnresolvedMember);
203203
if (cecilObj != null)
204204
analyzer.Analyze(cecilObj.Body, node);
205205
}
@@ -213,17 +213,17 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
213213
var node = element.Value;
214214
var @event = element.Key;
215215
if (@event.CanAdd) {
216-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember);
216+
var cecilObj = GetCecilObject((IUnresolvedMethod)@event.AddAccessor.UnresolvedMember);
217217
if (cecilObj != null)
218218
analyzer.Analyze(cecilObj.Body, node);
219219
}
220220
if (@event.CanInvoke) {
221-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember);
221+
var cecilObj = GetCecilObject((IUnresolvedMethod)@event.InvokeAccessor.UnresolvedMember);
222222
if (cecilObj != null)
223223
analyzer.Analyze(cecilObj.Body, node);
224224
}
225225
if (@event.CanRemove) {
226-
var cecilObj = loader.GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember);
226+
var cecilObj = GetCecilObject((IUnresolvedMethod)@event.RemoveAccessor.UnresolvedMember);
227227
if (cecilObj != null)
228228
analyzer.Analyze(cecilObj.Body, node);
229229
}
@@ -295,7 +295,7 @@ public override IType VisitTypeDefinition(ITypeDefinition type)
295295
}
296296
}
297297

298-
IEnumerable<IUnresolvedAssembly> LoadAssemblies()
298+
IList<IUnresolvedAssembly> LoadAssemblies()
299299
{
300300
var resolver = new AssemblyResolver();
301301
foreach (var path in fileNames.Select(f => Path.GetDirectoryName(f)).Distinct(StringComparer.OrdinalIgnoreCase))
@@ -305,13 +305,54 @@ IEnumerable<IUnresolvedAssembly> LoadAssemblies()
305305
assemblies.Add(resolver.LoadAssemblyFile(file));
306306
foreach (var asm in assemblies.ToArray())
307307
assemblies.AddRange(asm.Modules.SelectMany(m => m.AssemblyReferences).Select(r => resolver.TryResolve(r)).Where(r => r != null));
308-
return assemblies.Distinct().Select(asm => loader.LoadAssembly(asm));
308+
CecilLoader loader = new CecilLoader { IncludeInternalMembers = true };
309+
// Emulate the old CecilLoader.GetCecilObject() API:
310+
loader.OnEntityLoaded = delegate(IUnresolvedEntity entity, MemberReference cecilObj) {
311+
unresolvedTypeSystemToCecilDict[entity] = cecilObj;
312+
};
313+
var loadedAssemblies = new List<IUnresolvedAssembly>();
314+
foreach (var asm in assemblies.Distinct()) {
315+
var loadedAssembly = loader.LoadAssembly(asm);
316+
loadedAssemblies.Add(loadedAssembly);
317+
unresolvedTypeSystemToCecilDict[loadedAssembly] = asm;
318+
}
319+
return loadedAssemblies;
320+
}
321+
322+
AssemblyDefinition GetCecilObject(IUnresolvedAssembly assembly)
323+
{
324+
object cecilObj;
325+
if (unresolvedTypeSystemToCecilDict.TryGetValue(assembly, out cecilObj)) {
326+
return cecilObj as AssemblyDefinition;
327+
} else {
328+
return null;
329+
}
330+
}
331+
332+
MemberReference GetCecilObject(IUnresolvedEntity entity)
333+
{
334+
object cecilObj;
335+
if (unresolvedTypeSystemToCecilDict.TryGetValue(entity, out cecilObj)) {
336+
return cecilObj as MemberReference;
337+
} else {
338+
return null;
339+
}
340+
}
341+
342+
MethodDefinition GetCecilObject(IUnresolvedMethod method)
343+
{
344+
object cecilObj;
345+
if (unresolvedTypeSystemToCecilDict.TryGetValue(method, out cecilObj)) {
346+
return cecilObj as MethodDefinition;
347+
} else {
348+
return null;
349+
}
309350
}
310351

311352
NamespaceNode GetOrCreateNamespace(AssemblyNode assembly, string namespaceName)
312353
{
313354
NamespaceNode result;
314-
var asmDef = loader.GetCecilObject(assembly.AssemblyInfo.UnresolvedAssembly);
355+
var asmDef = GetCecilObject(assembly.AssemblyInfo.UnresolvedAssembly);
315356
if (!namespaceMappings.TryGetValue(namespaceName + "," + asmDef.FullName, out result)) {
316357
result = new NamespaceNode(namespaceName);
317358
assembly.AddChild(result);
@@ -343,7 +384,7 @@ TypeNode ReadType(ITypeDefinition type)
343384
throw new Exception("TypeNode not found: " + type.DeclaringTypeDefinition.FullName);
344385
} else
345386
ns.AddChild(node);
346-
cecilMappings[loader.GetCecilObject(type.Parts.First())] = type;
387+
cecilMappings[GetCecilObject(type.Parts.First())] = type;
347388
typeMappings.Add(type, node);
348389
return node;
349390
}

src/Main/Base/Project/Editor/Search/SearchResultMatch.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ public SearchResultMatch(FileName fileName, TextLocation startLocation, TextLoca
6262
{
6363
if (fileName == null)
6464
throw new ArgumentNullException("fileName");
65+
if (startLocation.IsEmpty)
66+
throw new ArgumentOutOfRangeException("startLocation");
67+
if (endLocation.IsEmpty)
68+
throw new ArgumentOutOfRangeException("endLocation");
6569
this.fileName = fileName;
6670
this.startLocation = startLocation;
6771
this.endLocation = endLocation;

src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -335,99 +335,6 @@ public static void ModifyDocument(List<Modification> modifications, IDocument do
335335
}
336336
}
337337
*/
338-
339-
[Obsolete]
340-
public static void ShowAsSearchResults(string title, List<SearchResultMatch> list)
341-
{
342-
if (list == null) return;
343-
List<SearchResultMatch> results = new List<SearchResultMatch>(list.Count);
344-
ReadOnlyDocument document = null;
345-
ITextSource buffer = null;
346-
FileName fileName = null;
347-
IHighlighter highlighter = null;
348-
foreach (SearchResultMatch r in list) {
349-
if (document == null || fileName != r.FileName) {
350-
if (highlighter != null) {
351-
highlighter.Dispose();
352-
}
353-
fileName = r.FileName;
354-
buffer = SD.FileService.GetFileContent(r.FileName);
355-
document = new ReadOnlyDocument(buffer, r.FileName);
356-
highlighter = SD.EditorControlService.CreateHighlighter(document);
357-
highlighter.BeginHighlighting();
358-
}
359-
var start = r.StartLocation;
360-
var end = r.EndLocation;
361-
var startOffset = document.GetOffset(start);
362-
var endOffset = document.GetOffset(end);
363-
var builder = SearchResultsPad.CreateInlineBuilder(start, end, document, highlighter);
364-
var defaultTextColor = highlighter != null ? highlighter.DefaultTextColor : null;
365-
SearchResultMatch res = new SearchResultMatch(fileName, start, end, startOffset, endOffset - startOffset, builder, defaultTextColor);
366-
results.Add(res);
367-
}
368-
if (highlighter != null) {
369-
highlighter.Dispose();
370-
}
371-
SearchResultsPad.Instance.ShowSearchResults(title, results);
372-
SearchResultsPad.Instance.BringToFront();
373-
}
374-
375-
/*
376-
sealed class FileView {
377-
public IViewContent ViewContent;
378-
public OpenedFile OpenedFile;
379-
}
380-
381-
public static void RenameReferences(List<Reference> list, string newName)
382-
{
383-
Dictionary<IDocument, FileView> modifiedDocuments = new Dictionary<IDocument, FileView>();
384-
List<Modification> modifications = new List<Modification>();
385-
foreach (Reference r in list) {
386-
IDocument document = null;
387-
IViewContent viewContent = null;
388-
389-
OpenedFile file = FileService.GetOpenedFile(r.FileName);
390-
if (file != null) {
391-
viewContent = file.CurrentView;
392-
IFileDocumentProvider p = viewContent as IFileDocumentProvider;
393-
if (p != null) {
394-
document = p.GetDocumentForFile(file);
395-
}
396-
}
397-
398-
if (document == null) {
399-
viewContent = FileService.OpenFile(r.FileName, false);
400-
IFileDocumentProvider p = viewContent as IFileDocumentProvider;
401-
if (p != null) {
402-
file = FileService.GetOpenedFile(r.FileName);
403-
System.Diagnostics.Debug.Assert(file != null, "OpenedFile not found after opening the file.");
404-
document = p.GetDocumentForFile(file);
405-
}
406-
}
407-
408-
if (document == null) {
409-
LoggingService.Warn("RenameReferences: Could not get document for file '" + r.FileName + "'");
410-
continue;
411-
}
412-
413-
if (!modifiedDocuments.ContainsKey(document)) {
414-
modifiedDocuments.Add(document, new FileView() {ViewContent = viewContent, OpenedFile = file});
415-
document.StartUndoableAction();
416-
}
417-
418-
ModifyDocument(modifications, document, r.Offset, r.Length, newName);
419-
}
420-
foreach (KeyValuePair<IDocument, FileView> entry in modifiedDocuments) {
421-
entry.Key.EndUndoableAction();
422-
entry.Value.OpenedFile.MakeDirty();
423-
if (entry.Value.ViewContent is IEditable) {
424-
ParserService.ParseViewContent(entry.Value.ViewContent);
425-
} else {
426-
ParserService.ParseFile(entry.Value.OpenedFile.FileName, entry.Key);
427-
}
428-
}
429-
}
430-
*/
431338

432339
/* TODO: these are refactorings and don't belong here
433340
public static void MoveClassToFile(IClass c, string newFileName)

0 commit comments

Comments
 (0)