Browse Source

Don't use the obsolete CecilLoader.GetCecilObject() API in AssemblyAnalyzer.

pull/297/head
Daniel Grunwald 12 years ago
parent
commit
8a733d9b5e
  1. 85
      src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs
  2. 4
      src/Main/Base/Project/Editor/Search/SearchResultMatch.cs
  3. 93
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs

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

@ -22,7 +22,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -22,7 +22,7 @@ namespace ICSharpCode.CodeQuality.Engine
/// </summary>
public class AssemblyAnalyzer
{
CecilLoader loader = new CecilLoader(true) { IncludeInternalMembers = true };
Dictionary<object, object> unresolvedTypeSystemToCecilDict = new Dictionary<object, object>();
ICompilation compilation;
internal Dictionary<IAssembly, AssemblyNode> assemblyMappings;
internal Dictionary<string, NamespaceNode> namespaceMappings;
@ -73,7 +73,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -73,7 +73,7 @@ namespace ICSharpCode.CodeQuality.Engine
public ReadOnlyCollection<AssemblyNode> Analyze()
{
IUnresolvedAssembly[] loadedAssemblies = LoadAssemblies().ToArray();
var loadedAssemblies = LoadAssemblies();
compilation = new SimpleCompilation(loadedAssemblies.First(), loadedAssemblies.Skip(1));
assemblyMappings = new Dictionary<IAssembly, AssemblyNode>();
@ -92,7 +92,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -295,7 +295,7 @@ namespace ICSharpCode.CodeQuality.Engine
}
}
IEnumerable<IUnresolvedAssembly> LoadAssemblies()
IList<IUnresolvedAssembly> 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 @@ -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<IUnresolvedAssembly>();
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 @@ -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;
}

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

@ -62,6 +62,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Search @@ -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;

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

@ -336,99 +336,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -336,99 +336,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
*/
[Obsolete]
public static void ShowAsSearchResults(string title, List<SearchResultMatch> list)
{
if (list == null) return;
List<SearchResultMatch> results = new List<SearchResultMatch>(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<Reference> list, string newName)
{
Dictionary<IDocument, FileView> modifiedDocuments = new Dictionary<IDocument, FileView>();
List<Modification> modifications = new List<Modification>();
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<IDocument, FileView> 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)
{

Loading…
Cancel
Save