diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyDecompilerService.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyDecompilerService.cs index ba2b485a5b..ea29fac22d 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyDecompilerService.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyDecompilerService.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -12,6 +13,7 @@ using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.Ast; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom.ClassBrowser; using Mono.Cecil; namespace ICSharpCode.ILSpyAddIn @@ -19,7 +21,7 @@ namespace ICSharpCode.ILSpyAddIn /// /// Description of DecompilerService. /// - public class ILSpyDecompilerService + public static class ILSpyDecompilerService { public static ILSpyUnresolvedFile DecompileType(DecompiledTypeReference name) { diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs index 443d22b3ed..b4ec755972 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs @@ -13,6 +13,8 @@ using ICSharpCode.NRefactory.CSharp.Resolver; using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom.ClassBrowser; using ICSharpCode.SharpDevelop.Editor.Search; using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project; @@ -65,6 +67,11 @@ namespace ICSharpCode.ILSpyAddIn public ICompilation CreateCompilationForSingleFile(FileName fileName, IUnresolvedFile unresolvedFile) { + DecompiledTypeReference reference = DecompiledTypeReference.FromFileName(fileName); + if (reference != null) { +// var model = SD.GetService().FindAssemblyModel(reference.AssemblyFile); +// return SD.AssemblyParserService.CreateCompilationForAssembly(model); + } return new CSharpProjectContent() .AddAssemblyReferences(defaultReferences.Value) .AddOrUpdateFiles(unresolvedFile) diff --git a/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceModel.cs b/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceModel.cs index 9e3e1da6e6..d093409f91 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceModel.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceModel.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Runtime.CompilerServices; using ICSharpCode.TreeView; namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -21,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - protected virtual void OnPropertyChanged(string propertyName) + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); @@ -35,10 +36,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser set { if (assemblyList != value) { assemblyList = value; - OnPropertyChanged("AssemblyList"); + OnPropertyChanged(); } } } + public WorkspaceModel() { this.specialNodes = new SimpleModelCollection(); diff --git a/src/Main/Base/Project/Dom/IAssemblyModel.cs b/src/Main/Base/Project/Dom/IAssemblyModel.cs index f3df5c2589..29f32dd122 100644 --- a/src/Main/Base/Project/Dom/IAssemblyModel.cs +++ b/src/Main/Base/Project/Dom/IAssemblyModel.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Linq; +using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Parser; namespace ICSharpCode.SharpDevelop.Dom { @@ -47,6 +49,11 @@ namespace ICSharpCode.SharpDevelop.Dom /// Gets the of this assembly model. /// IEntityModelContext Context { get; } + + /// + /// Returns the assembly references. + /// + IReadOnlyList References { get; } } /// @@ -103,6 +110,10 @@ namespace ICSharpCode.SharpDevelop.Dom return null; } } + + public IReadOnlyList References { + get { return EmptyList.Instance; } + } } } diff --git a/src/Main/Base/Project/Dom/IModelFactory.cs b/src/Main/Base/Project/Dom/IModelFactory.cs index ea2facca6e..932bb90b17 100644 --- a/src/Main/Base/Project/Dom/IModelFactory.cs +++ b/src/Main/Base/Project/Dom/IModelFactory.cs @@ -15,6 +15,6 @@ namespace ICSharpCode.SharpDevelop.Dom { ITypeDefinitionModel CreateTypeDefinitionModel(IEntityModelContext context, params IUnresolvedTypeDefinition[] parts); IMemberModel CreateMemberModel(IEntityModelContext context, IUnresolvedMember member); - IAssemblyModel CreateAssemblyModel(IEntityModelContext context); + IUpdateableAssemblyModel CreateAssemblyModel(IEntityModelContext context); } } diff --git a/src/Main/Base/Project/Parser/IAssemblyParserService.cs b/src/Main/Base/Project/Parser/IAssemblyParserService.cs index d0fa44ac21..8982d3ecc5 100644 --- a/src/Main/Base/Project/Parser/IAssemblyParserService.cs +++ b/src/Main/Base/Project/Parser/IAssemblyParserService.cs @@ -7,6 +7,8 @@ using System.Threading.Tasks; using ICSharpCode.Core; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Dom.ClassBrowser; namespace ICSharpCode.SharpDevelop.Parser { @@ -41,5 +43,34 @@ namespace ICSharpCode.SharpDevelop.Parser /// May return null if on-disk caching is disabled. /// string DomPersistencePath { get; } + + /// + /// Creates a compilation for the specified assembly. + /// + ICompilation CreateCompilationForAssembly(IAssemblyModel assembly); + } + + public interface IAssemblySearcher + { + FileName FindAssembly(DomAssemblyName fullName); + } + + public class DefaultAssemblySearcher : IAssemblySearcher + { + FileName mainAssemblyFileName; + DirectoryName baseDirectory; + + public DefaultAssemblySearcher(FileName mainAssemblyFileName) + { + if (mainAssemblyFileName == null) + throw new ArgumentNullException("mainAssemblyFileName"); + this.mainAssemblyFileName = mainAssemblyFileName; + this.baseDirectory = mainAssemblyFileName.GetParentDirectory(); + } + + public FileName FindAssembly(DomAssemblyName fullName) + { + throw new NotImplementedException(); + } } } diff --git a/src/Main/SharpDevelop/Dom/AssemblyModel.cs b/src/Main/SharpDevelop/Dom/AssemblyModel.cs index b10684186e..8b72f19f8f 100644 --- a/src/Main/SharpDevelop/Dom/AssemblyModel.cs +++ b/src/Main/SharpDevelop/Dom/AssemblyModel.cs @@ -129,5 +129,9 @@ namespace ICSharpCode.SharpDevelop.Dom d.Dispose(); } } + + public IReadOnlyList References { + get { throw new NotImplementedException(); } + } } } \ No newline at end of file diff --git a/src/Main/SharpDevelop/Dom/ModelFactory.cs b/src/Main/SharpDevelop/Dom/ModelFactory.cs index da921a5031..97b9ea6faf 100644 --- a/src/Main/SharpDevelop/Dom/ModelFactory.cs +++ b/src/Main/SharpDevelop/Dom/ModelFactory.cs @@ -8,7 +8,7 @@ namespace ICSharpCode.SharpDevelop.Dom { sealed class ModelFactory : IModelFactory { - public IAssemblyModel CreateAssemblyModel(IEntityModelContext context) + public IUpdateableAssemblyModel CreateAssemblyModel(IEntityModelContext context) { return new AssemblyModel(context); } diff --git a/src/Main/SharpDevelop/Parser/AssemblyParserService.cs b/src/Main/SharpDevelop/Parser/AssemblyParserService.cs index 10248f16b4..1797c43253 100644 --- a/src/Main/SharpDevelop/Parser/AssemblyParserService.cs +++ b/src/Main/SharpDevelop/Parser/AssemblyParserService.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Diagnostics; +using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; @@ -12,7 +13,9 @@ using System.Xml; using ICSharpCode.Core; using ICSharpCode.NRefactory.Documentation; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.NRefactory.Utils; +using ICSharpCode.SharpDevelop.Dom; using Mono.Cecil; namespace ICSharpCode.SharpDevelop.Parser @@ -305,5 +308,19 @@ namespace ICSharpCode.SharpDevelop.Parser } } #endregion + + public ICompilation CreateCompilationForAssembly(IAssemblyModel assembly) + { + var mainAssembly = GetAssembly(new FileName(assembly.Context.Location)); + var references = assembly.References + .Select(r => FindAssembly(r, assembly)) + .Where(f => f != null); + return new SimpleCompilation(mainAssembly, references.Select(fn => GetAssembly(fn))); + } + + FileName FindAssembly(DomAssemblyName name, IAssemblyModel mainAssembly) + { + throw new NotImplementedException(); + } } }