diff options
author | Lluis Sanchez <llsan@microsoft.com> | 2019-03-21 03:02:26 +0300 |
---|---|---|
committer | Lluis Sanchez <llsan@microsoft.com> | 2019-03-21 12:08:48 +0300 |
commit | e466141ef7b2c39585e29f94c28f6deb82e8be97 (patch) | |
tree | a8e8661e23ea0eac955ea0fe106f14453f8997cf /main/src/addins/MonoDevelop.AssemblyBrowser | |
parent | ea8b962d5ed27ad8dd52594124d35eb0bea4b714 (diff) | |
parent | 228695e2dc646fb2ad812c06bebfe33ca9f69601 (diff) |
Merge branch 'new-service-model' into new-doc-model
Diffstat (limited to 'main/src/addins/MonoDevelop.AssemblyBrowser')
28 files changed, 1475 insertions, 1454 deletions
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/Makefile.am b/main/src/addins/MonoDevelop.AssemblyBrowser/Makefile.am deleted file mode 100644 index c9cc87438f..0000000000 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -include $(top_srcdir)/xbuild.include diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser.csproj b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser.csproj index 40d6c6408e..88a8e5c326 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser.csproj +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser.csproj @@ -8,54 +8,18 @@ <TargetFrameworkVersion>$(MDFrameworkVersion)</TargetFrameworkVersion> <OutputPath>..\..\..\build\AddIns\DisplayBindings\AssemblyBrowser</OutputPath> <AllowUnsafeBlocks>True</AllowUnsafeBlocks> + <!-- + This needs to be ported to the new editor, and currently makes use of many deprecated APIs. + --> + <NoWarn>$(NoWarn);618;612</NoWarn> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " /> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " /> <ItemGroup> <Reference Include="System" /> - <Reference Include="ICSharpCode.Decompiler"> - <HintPath>..\..\..\packages\ICSharpCode.Decompiler.3.2.0.3856\lib\net46\ICSharpCode.Decompiler.dll</HintPath> - <Private>false</Private> - </Reference> <Reference Include="System.Core" /> <Reference Include="monodoc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" /> <Reference Include="System.Xml" /> - <Reference Include="System.Reflection.Metadata"> - <HintPath>..\..\..\build\bin\System.Reflection.Metadata.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="System.Collections.Immutable"> - <HintPath>..\..\..\build\bin\System.Collections.Immutable.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="Microsoft.CodeAnalysis"> - <HintPath>..\..\..\build\bin\Microsoft.CodeAnalysis.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="Mono.Cecil"> - <HintPath>..\..\..\packages\Mono.Cecil.0.10.0-beta6\lib\net40\Mono.Cecil.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="Mono.Cecil.Mdb"> - <HintPath>..\..\..\packages\Mono.Cecil.0.10.0-beta6\lib\net40\Mono.Cecil.Mdb.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="Mono.Cecil.Pdb"> - <HintPath>..\..\..\packages\Mono.Cecil.0.10.0-beta6\lib\net40\Mono.Cecil.Pdb.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="Mono.Cecil.Rocks"> - <HintPath>..\..\..\packages\Mono.Cecil.0.10.0-beta6\lib\net40\Mono.Cecil.Rocks.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="System.ValueTuple"> - <HintPath>..\..\..\build\bin\System.ValueTuple.dll</HintPath> - <Private>False</Private> - </Reference> - <Reference Include="Microsoft.CodeAnalysis.Workspaces"> - <HintPath>..\..\..\build\bin\Microsoft.CodeAnalysis.Workspaces.dll</HintPath> - <Private>False</Private> - </Reference> </ItemGroup> <ItemGroup> <ProjectReference Include="..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj"> @@ -137,12 +101,10 @@ <Compile Include="MonoDevelop.AssemblyBrowser\AssemblyBrowserHandler.cs" /> <Compile Include="MonoDevelop.AssemblyBrowser\AssemblyBrowserWidget.AssemblyBrowserTreeView.cs" /> <Compile Include="MonoDevelop.AssemblyBrowser\AssemblyBrowserWidget.SearchIdleRunner.cs" /> + <Compile Include="MonoDevelop.AssemblyBrowser\MetadataExtensions.cs" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="MonoDevelop.AssemblyBrowser.addin.xml" /> </ItemGroup> - <ItemGroup> - <None Include="packages.config" /> - </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> </Project> diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.SearchIdleRunner.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.SearchIdleRunner.cs index 88fc84e688..93f46c4277 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.SearchIdleRunner.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.SearchIdleRunner.cs @@ -28,12 +28,12 @@ using System; using System.Collections.Generic; - -using Mono.Cecil; + using MonoDevelop.Ide; using System.Threading; using MonoDevelop.Core.Text; using System.Collections.Immutable; +using ICSharpCode.Decompiler.TypeSystem; namespace MonoDevelop.AssemblyBrowser { @@ -43,7 +43,7 @@ namespace MonoDevelop.AssemblyBrowser { readonly AssemblyBrowserWidget assemblyBrowserWidget; readonly CancellationToken token; - readonly List<IMemberDefinition> memberList = new List<IMemberDefinition> (); + readonly List<IEntity> memberList = new List<IEntity> (); readonly bool publicOnly; readonly string pattern; readonly ImmutableList<AssemblyLoader> definitions; @@ -52,7 +52,7 @@ namespace MonoDevelop.AssemblyBrowser bool fillStepFinished; int currentDefinition; int i = 0; - IEnumerator<TypeDefinition> currentTypeEnumerator; + IEnumerator<ITypeDefinition> currentTypeEnumerator; public SearchIdleRunner (AssemblyBrowserWidget assemblyBrowserWidget, string pattern, CancellationToken token) { @@ -102,8 +102,9 @@ namespace MonoDevelop.AssemblyBrowser return; } var unit = definitions [currentDefinition]; + var typeSystem = unit.DecompilerTypeSystem; if (currentTypeEnumerator == null) { - currentTypeEnumerator = unit.Assembly.MainModule.Types.GetEnumerator (); + currentTypeEnumerator = typeSystem.GetAllTypeDefinitions ().GetEnumerator (); if (!currentTypeEnumerator.MoveNext ()) { currentTypeEnumerator = null; currentDefinition++; @@ -121,14 +122,12 @@ namespace MonoDevelop.AssemblyBrowser case SearchMode.Member: if (token.IsCancellationRequested) return; - if (!type.IsPublic && publicOnly) + if (!type.IsPublic () && publicOnly) return; foreach (var member in type.Methods) { if (token.IsCancellationRequested) return; - if (!member.IsPublic && publicOnly) - continue; - if (member.IsSpecialName || member.IsRuntimeSpecialName) + if (!member.IsPublic () && publicOnly) continue; if (matcher.IsMatch (member.Name)) memberList.Add (member); @@ -136,9 +135,7 @@ namespace MonoDevelop.AssemblyBrowser foreach (var member in type.Fields) { if (token.IsCancellationRequested) return; - if (!member.IsPublic && publicOnly) - continue; - if (member.IsSpecialName || member.IsRuntimeSpecialName) + if (!member.IsPublic () && publicOnly) continue; if (matcher.IsMatch (member.Name)) memberList.Add (member); @@ -146,10 +143,8 @@ namespace MonoDevelop.AssemblyBrowser foreach (var member in type.Properties) { if (token.IsCancellationRequested) return; - var accessor = member.GetMethod ?? member.SetMethod; - if (!accessor.IsPublic && publicOnly) - continue; - if (member.IsSpecialName || member.IsRuntimeSpecialName) + var accessor = member.Getter ?? member.Setter; + if (!accessor.IsPublic () && publicOnly) continue; if (matcher.IsMatch (member.Name)) memberList.Add (member); @@ -157,19 +152,17 @@ namespace MonoDevelop.AssemblyBrowser foreach (var member in type.Events) { if (token.IsCancellationRequested) return; - if (member.IsSpecialName || member.IsRuntimeSpecialName) - continue; - var accessor = member.AddMethod ?? member.RemoveMethod; - if (!accessor.IsPublic && publicOnly) + var accessor = member.AddAccessor ?? member.RemoveAccessor; + if (!accessor.IsPublic () && publicOnly) continue; if (matcher.IsMatch (member.Name)) memberList.Add (member); } break; case SearchMode.Type: - if (!type.IsPublic && publicOnly) + if (!type.IsPublic () && publicOnly) return; - if (type.IsSpecialName || type.IsRuntimeSpecialName || type.Name == "<Module>") + if (type.Name == "<Module>") return; if (matcher.IsMatch (type.FullName)) memberList.Add (type); @@ -177,9 +170,9 @@ namespace MonoDevelop.AssemblyBrowser case SearchMode.TypeAndMembers: if (token.IsCancellationRequested) return; - if (!type.IsPublic && publicOnly) + if (!type.IsPublic () && publicOnly) return; - if (type.IsSpecialName || type.IsRuntimeSpecialName || type.Name == "<Module>") + if (type.Name == "<Module>") return; if (matcher.IsMatch (type.FullName)) memberList.Add (type); diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs index 9da9528358..4744bf114f 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs @@ -33,7 +33,6 @@ using System.Text; using System.Xml; using Gtk; -using Mono.Cecil; using MonoDevelop.Components.Commands; using MonoDevelop.Core; using MonoDevelop.Ide; @@ -42,6 +41,8 @@ using MonoDevelop.Ide.Gui.Components; using System.Linq; using MonoDevelop.Ide.TypeSystem; using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.Decompiler.Metadata; +using ICSharpCode.Decompiler.Documentation; using MonoDevelop.Projects; using ICSharpCode.Decompiler.TypeSystem.Implementation; using XmlDocIdLib; @@ -93,6 +94,10 @@ namespace MonoDevelop.AssemblyBrowser if (referencedSegment == null) return null; + return null; + + // TODO fixme + /* var td = referencedSegment.Reference as TypeDefinition; if (td != null) { isNotPublic = !td.IsPublic; @@ -128,6 +133,7 @@ namespace MonoDevelop.AssemblyBrowser } return referencedSegment.Reference.ToString (); + */ } @@ -208,7 +214,6 @@ namespace MonoDevelop.AssemblyBrowser new ErrorNodeBuilder (), new ProjectNodeBuilder (this), new AssemblyNodeBuilder (this), - new ModuleReferenceNodeBuilder (), new AssemblyReferenceNodeBuilder (this), //new AssemblyReferenceFolderNodeBuilder (this), new AssemblyResourceFolderNodeBuilder (), @@ -260,7 +265,7 @@ namespace MonoDevelop.AssemblyBrowser notebook1.Page = 0; //this.searchWidget.Visible = false; - resultListStore = new Gtk.ListStore (typeof(IMemberDefinition)); + resultListStore = new Gtk.ListStore (typeof(IMember)); CreateColumns (); // this.searchEntry.Changed += SearchEntryhandleChanged; @@ -332,7 +337,7 @@ namespace MonoDevelop.AssemblyBrowser { TreeIter selectedIter; if (searchTreeview.Selection.GetSelected (out selectedIter)) { - var member = (IMemberDefinition)resultListStore.GetValue (selectedIter, 0); + var member = (IMember)resultListStore.GetValue (selectedIter, 0); var nav = SearchMember (member); if (nav != null) { @@ -365,9 +370,10 @@ namespace MonoDevelop.AssemblyBrowser TreeView.GrabFocus (); } - ITreeNavigator SearchMember (IMemberDefinition member, bool expandNode = true) + ITreeNavigator SearchMember (IMember member, bool expandNode = true) { - return SearchMember (Mono.Cecil.Rocks.DocCommentId.GetDocCommentId (member), expandNode); + //return SearchMember (Mono.Cecil.Rocks.DocCommentId.GetDocCommentId (member), expandNode); + return SearchMember (member.ReflectionName, expandNode); } ITreeNavigator SearchMember (string helpUrl, bool expandNode = true) @@ -376,24 +382,23 @@ namespace MonoDevelop.AssemblyBrowser if (nav != null) return nav; // Constructor may be a generated default without implementation. - var ctorIdx = helpUrl.IndexOf (".#ctor", StringComparison.Ordinal); - if (helpUrl.StartsWith ("M:", StringComparison.Ordinal) && ctorIdx > 0) { - return SearchMember ("T" + helpUrl.Substring (1, ctorIdx - 1), expandNode); - } + //var ctorIdx = helpUrl.IndexOf (".#ctor", StringComparison.Ordinal); + //if (helpUrl.StartsWith ("M:", StringComparison.Ordinal) && ctorIdx > 0) { + // return SearchMember ("T" + helpUrl.Substring (1, ctorIdx - 1), expandNode); + //} return null; } bool IsMatch (ITreeNavigator nav, string helpUrl, bool searchType) { - var member = nav.DataItem as IMemberDefinition; - if (member == null) - return false; - return Mono.Cecil.Rocks.DocCommentId.GetDocCommentId (member) == helpUrl; + if (nav.DataItem is IEntity entity) + return entity.GetIdString () == helpUrl; + return false; } static bool SkipChildren (ITreeNavigator nav, string helpUrl, bool searchType) { - if (nav.DataItem is IMemberDefinition && !(nav.DataItem is TypeDefinition)) + if (nav.DataItem is IMember && !(nav.DataItem is ITypeDefinition)) return true; if (nav.DataItem is BaseTypeFolder) return true; @@ -411,7 +416,7 @@ namespace MonoDevelop.AssemblyBrowser int idx = helpUrl.IndexOf ('~', startIndex); if (idx > 0) endIndex = idx; - var type = nav.DataItem as TypeDefinition; + var type = nav.DataItem as ITypeDefinition; if (type != null && helpUrl.IndexOf (type.FullName, startIndex, Math.Min (endIndex - startIndex, type.FullName.Length), StringComparison.Ordinal) == -1) return true; var @namespace = nav.DataItem as NamespaceData; @@ -544,14 +549,14 @@ namespace MonoDevelop.AssemblyBrowser void RenderDeclaringTypeOrNamespace (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { var ct = (Gtk.CellRendererText)cell; - var entity = tree_model.GetValue (iter, 0) as IMemberDefinition; + var entity = tree_model.GetValue (iter, 0) as IEntity; if (entity != null) { if (entity.DeclaringType != null) { ct.Text = entity.DeclaringType.FullName; return; } - if (entity is TypeDefinition) { - ct.Text = ((TypeDefinition)entity).Namespace; + if (entity is ITypeDefinition type) { + ct.Text = type.Namespace; } else { ct.Text = entity.DeclaringType.Namespace; } @@ -561,7 +566,7 @@ namespace MonoDevelop.AssemblyBrowser void RenderText (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { var ct = (Gtk.CellRendererText)cell; - var entity = tree_model.GetValue (iter, 0) as IMemberDefinition; + var entity = tree_model.GetValue (iter, 0) as INamedElement; if (entity != null) ct.Text = entity.Name; } @@ -569,32 +574,28 @@ namespace MonoDevelop.AssemblyBrowser void RenderImage (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { var ct = (CellRendererImage)cell; - var evt = tree_model.GetValue (iter, 0) as EventDefinition; - if (evt != null) { + var entity = tree_model.GetValue (iter, 0) as IEntity; + if (entity is IEvent evt) { ct.Image = ImageService.GetIcon (EventDefinitionNodeBuilder.GetStockIcon (evt), Gtk.IconSize.Menu); return; } - var field = tree_model.GetValue (iter, 0) as FieldDefinition; - if (field != null) { + if (entity is IField field) { ct.Image = ImageService.GetIcon (FieldDefinitionNodeBuilder.GetStockIcon (field), Gtk.IconSize.Menu); return; } - var method = tree_model.GetValue (iter, 0) as MethodDefinition; - if (method != null) { + if (entity is IMethod method) { ct.Image = ImageService.GetIcon (MethodDefinitionNodeBuilder.GetStockIcon (method), Gtk.IconSize.Menu); return; } - var property = tree_model.GetValue (iter, 0) as PropertyDefinition; - if (property != null) { + if (entity is IProperty property) { ct.Image = ImageService.GetIcon (PropertyDefinitionNodeBuilder.GetStockIcon (property), Gtk.IconSize.Menu); return; } - - var type = tree_model.GetValue (iter, 0) as TypeDefinition; - if (type != null) { + + if (entity is ITypeDefinition type) { ct.Image = ImageService.GetIcon (TypeDefinitionNodeBuilder.GetStockIcon (type), Gtk.IconSize.Menu); return; } @@ -971,13 +972,13 @@ namespace MonoDevelop.AssemblyBrowser int i = 0; System.Action loadNext = null; - var references = cecilObject.MainModule.AssemblyReferences; + var references = cecilObject.AssemblyReferences; loadNext = () => { var reference = references [i]; string fileName = currentAssembly.LookupAssembly (reference.FullName); if (string.IsNullOrEmpty (fileName)) { LoggingService.LogWarning ("Assembly browser: Can't find assembly: " + reference.FullName + "."); - if (++i == references.Count) + if (++i == references.Length) LoggingService.LogError ("Assembly browser: Can't find: " + url + "."); else loadNext (); @@ -992,7 +993,7 @@ namespace MonoDevelop.AssemblyBrowser Application.Invoke ((o, args) => { var nav = SearchMember (url, expandNode); if (nav == null) { - if (++i == references.Count) + if (++i == references.Length) LoggingService.LogError ("Assembly browser: Can't find: " + url + "."); else loadNext (); @@ -1011,8 +1012,8 @@ namespace MonoDevelop.AssemblyBrowser LoggingService.LogWarning ("Assembly browser: Can't find assembly: " + definition.Assembly.FullName + "."); continue; } - foreach (var assemblyNameReference in cecilObject.MainModule.AssemblyReferences) { - var result = AddReferenceByAssemblyName (assemblyNameReference); + foreach (var assemblyNameReference in cecilObject.AssemblyReferences) { + var result = AddReferenceByAssemblyName (assemblyNameReference.FullName); if (result == null) { LoggingService.LogWarning ("Assembly browser: Can't find assembly: " + assemblyNameReference.FullName + "."); } else { @@ -1051,7 +1052,7 @@ namespace MonoDevelop.AssemblyBrowser internal void SelectAssembly (AssemblyLoader loader) { - AssemblyDefinition cu = loader.Assembly; + PEFile cu = loader.Assembly; Application.Invoke ((o, args) => { ITreeNavigator nav = TreeView.GetRootNode (); if (nav == null) @@ -1097,7 +1098,7 @@ namespace MonoDevelop.AssemblyBrowser nav.MoveToFirstChild (); do { - if (nav.DataItem is AssemblyDefinition d) + if (nav.DataItem is PEFile d) d.Dispose (); } while (nav.MoveNext ()); nav.MoveToParent (); @@ -1152,9 +1153,9 @@ namespace MonoDevelop.AssemblyBrowser ImmutableList<AssemblyLoader> definitions = ImmutableList<AssemblyLoader>.Empty; List<Project> projects = new List<Project> (); - internal AssemblyLoader AddReferenceByAssemblyName (AssemblyNameReference reference, bool expand = false) + internal AssemblyLoader AddReferenceByAssemblyName (PEFile reference, bool expand = false) { - return AddReferenceByAssemblyName (reference.Name, expand, querySearch: false); + return AddReferenceByAssemblyName (reference.FullName, expand, querySearch: false); } internal AssemblyLoader AddReferenceByAssemblyName (string assemblyFullName, bool expand = false, bool querySearch = true) @@ -1242,7 +1243,7 @@ namespace MonoDevelop.AssemblyBrowser void HandleCursorChanged (object sender, EventArgs e) { if (!suspendNavigation) { - var selectedEntity = TreeView.GetSelectedNode ()?.DataItem as IMemberDefinition; + var selectedEntity = TreeView.GetSelectedNode ()?.DataItem as IEntity; if (selectedEntity != null) IdeServices.NavigationHistoryService.LogActiveDocument (); } @@ -1253,11 +1254,12 @@ namespace MonoDevelop.AssemblyBrowser public NavigationPoint BuildNavigationPoint () { var node = TreeView.GetSelectedNode (); - var selectedEntity = node?.DataItem as IMemberDefinition; + var selectedEntity = node?.DataItem as INamedElement; AssemblyLoader loader = null; if (selectedEntity != null) { loader = (AssemblyLoader)this.TreeView.GetSelectedNode ().GetParentDataItem (typeof (AssemblyLoader), true); - return new AssemblyBrowserNavigationPoint (definitions, loader, Mono.Cecil.Rocks.DocCommentId.GetDocCommentId (selectedEntity)); + // TODO: fix this + return new AssemblyBrowserNavigationPoint (definitions, loader, selectedEntity.ReflectionName); } loader = node?.DataItem as AssemblyLoader; if (loader != null) diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs index 9f49f87521..4f132fb1e1 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs @@ -24,7 +24,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; -using Mono.Cecil; using ICSharpCode.Decompiler.CSharp; using ICSharpCode.Decompiler.TypeSystem; using System.Threading.Tasks; @@ -32,10 +31,14 @@ using MonoDevelop.Core; using System.IO; using System.Threading; using System.Collections.Generic; +using ICSharpCode.Decompiler.Metadata; +using System.Reflection.Metadata; +using System.Linq; + namespace MonoDevelop.AssemblyBrowser { - class AssemblyLoader : IAssemblyResolver, IDisposable + class AssemblyLoader : IDisposable { readonly CancellationTokenSource src = new CancellationTokenSource (); readonly AssemblyBrowserWidget widget; @@ -45,10 +48,10 @@ namespace MonoDevelop.AssemblyBrowser private set; } - Task<AssemblyDefinition> assemblyLoaderTask; - TaskCompletionSource<AssemblyDefinition> assemblyDefinitionTaskSource; + Task<PEFile> assemblyLoaderTask; + TaskCompletionSource<PEFile> assemblyDefinitionTaskSource; - public Task<AssemblyDefinition> LoadingTask { + public Task<PEFile> LoadingTask { get { return assemblyLoaderTask; } @@ -57,12 +60,12 @@ namespace MonoDevelop.AssemblyBrowser } } - public AssemblyDefinition Assembly => AssemblyTask.Result; - public Task<AssemblyDefinition> AssemblyTask => assemblyDefinitionTaskSource.Task; + public PEFile Assembly => AssemblyTask.Result; + public Task<PEFile> AssemblyTask => assemblyDefinitionTaskSource.Task; - public ModuleDefinition ModuleDefinition { + public MetadataReader ModuleDefinition { get { - return assemblyLoaderTask.Result.MainModule; + return assemblyLoaderTask.Result.Metadata; } } @@ -82,8 +85,7 @@ namespace MonoDevelop.AssemblyBrowser public DecompilerTypeSystem DecompilerTypeSystem { get { if (decompilerTypeSystem == null) { - decompilerTypeSystem = new DecompilerTypeSystem (Assembly.MainModule); - + decompilerTypeSystem = new DecompilerTypeSystem (Assembly, new AssemblyResolver (widget)); } return decompilerTypeSystem; } @@ -102,15 +104,13 @@ namespace MonoDevelop.AssemblyBrowser if (!File.Exists (fileName)) throw new ArgumentException ("File doesn't exist.", nameof (fileName)); - assemblyDefinitionTaskSource = new TaskCompletionSource<AssemblyDefinition> (); + assemblyDefinitionTaskSource = new TaskCompletionSource<PEFile> (); assemblyLoaderTask = Task.Run (() => { try { - var assemblyDefinition = AssemblyDefinition.ReadAssembly (FileName, new ReaderParameters { - AssemblyResolver = this - }); - assemblyDefinitionTaskSource.SetResult (assemblyDefinition); - return assemblyDefinition; + var peFile = new PEFile (FileName, System.Reflection.PortableExecutable.PEStreamOptions.PrefetchEntireImage); + assemblyDefinitionTaskSource.SetResult (peFile); + return peFile; } catch (Exception e) { LoggingService.LogError ("Error while reading assembly " + FileName, e); Error = new Error(e.Message); @@ -120,6 +120,27 @@ namespace MonoDevelop.AssemblyBrowser }); } + class AssemblyResolver : IAssemblyResolver + { + readonly AssemblyBrowserWidget widget; + public AssemblyResolver (AssemblyBrowserWidget widget) + { + this.widget = widget; + } + + public PEFile Resolve (IAssemblyReference reference) + { + var loader = widget.AddReferenceByAssemblyName (reference.FullName); + return loader != null ? loader.Assembly : null; + } + + public PEFile ResolveModule (PEFile mainModule, string moduleName) + { + var loader = widget.AddReferenceByFileName (mainModule.FileName); + return loader != null ? loader.Assembly : null; + } + } + class FastNonInterningProvider : InterningProvider { Dictionary<string, string> stringDict = new Dictionary<string, string> (); @@ -152,20 +173,6 @@ namespace MonoDevelop.AssemblyBrowser } } - #region IAssemblyResolver implementation - AssemblyDefinition IAssemblyResolver.Resolve (AssemblyNameReference name) - { - var loader = widget.AddReferenceByAssemblyName (name); - return loader != null ? loader.Assembly : null; - } - - AssemblyDefinition IAssemblyResolver.Resolve (AssemblyNameReference name, ReaderParameters parameters) - { - var loader = widget.AddReferenceByAssemblyName (name); - return loader != null ? loader.Assembly : null; - } - #endregion - public string LookupAssembly (string fullAssemblyName) { var assemblyFile = Runtime.SystemAssemblyService.DefaultAssemblyContext.GetAssemblyLocation (fullAssemblyName, null); diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyReferenceFolder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyReferenceFolder.cs index 96400f68c0..511d90b77f 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyReferenceFolder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyReferenceFolder.cs @@ -27,38 +27,41 @@ using System; using System.Linq; using System.Text; - -using Mono.Cecil; - + using MonoDevelop.Core; using MonoDevelop.Ide.Gui; using MonoDevelop.Ide.Gui.Pads; using MonoDevelop.Ide.Gui.Components; using System.Collections.Generic; +using ICSharpCode.Decompiler.Metadata; +using ICSharpCode.Decompiler.TypeSystem; namespace MonoDevelop.AssemblyBrowser { class AssemblyReferenceFolder { - AssemblyDefinition definition; + PEFile definition; - public IEnumerable<AssemblyNameReference> AssemblyReferences { + public IEnumerable<AssemblyReference> AssemblyReferences { get { - return definition.MainModule.AssemblyReferences; + return definition.AssemblyReferences; } } + + // Ass - public IEnumerable<ModuleReference> ModuleReferences { + public IEnumerable<IModule> ModuleReferences { get { - return definition.MainModule.ModuleReferences; + // TODO: + yield break; + //foreach (var reference in definition.Metadata.GetModuleReferences ()) + //yield return definition.Metadata.GetModuleReference (reference); } } - public AssemblyReferenceFolder (AssemblyDefinition definition) + public AssemblyReferenceFolder (PEFile definition) { - if (definition == null) - throw new ArgumentNullException ("definition"); - this.definition = definition; + this.definition = definition ?? throw new ArgumentNullException (nameof (definition)); } } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyResourceFolder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyResourceFolder.cs index bcc024e808..e96e6841ba 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyResourceFolder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyResourceFolder.cs @@ -27,26 +27,24 @@ // using System; -using Mono.Cecil; using System.Collections.Generic; +using ICSharpCode.Decompiler.Metadata; namespace MonoDevelop.AssemblyBrowser { class AssemblyResourceFolder { - AssemblyDefinition definition; + PEFile definition; public IEnumerable<Resource> Resources { get { - return definition.MainModule.Resources; + return definition.Resources; } } - public AssemblyResourceFolder (AssemblyDefinition definition) + public AssemblyResourceFolder (PEFile definition) { - if (definition == null) - throw new ArgumentNullException ("definition"); - this.definition = definition; + this.definition = definition ?? throw new ArgumentNullException (nameof (definition)); } } } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/BaseTypeFolder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/BaseTypeFolder.cs index c036cb19d3..091a476763 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/BaseTypeFolder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/BaseTypeFolder.cs @@ -28,18 +28,17 @@ using System; using ICSharpCode.Decompiler.TypeSystem; -using Mono.Cecil; namespace MonoDevelop.AssemblyBrowser { class BaseTypeFolder : IDisposable { - public TypeDefinition Type { + public ITypeDefinition Type { get; private set; } - public BaseTypeFolder (TypeDefinition type) + public BaseTypeFolder (ITypeDefinition type) { this.Type = type; } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/ColoredCSharpFormatter.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/ColoredCSharpFormatter.cs index 61b7e8b97e..2cbbfb0b20 100755 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/ColoredCSharpFormatter.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/ColoredCSharpFormatter.cs @@ -32,6 +32,10 @@ using System.Linq; using MonoDevelop.Core.Text; using MonoDevelop.Ide.Editor; using ICSharpCode.Decompiler.CSharp.Syntax; +using ICSharpCode.Decompiler.Disassembler; +using ICSharpCode.Decompiler.Metadata; +using System.Reflection.Metadata; +using ICSharpCode.Decompiler.TypeSystem; namespace MonoDevelop.AssemblyBrowser { @@ -46,7 +50,9 @@ namespace MonoDevelop.AssemblyBrowser get; set; } - + public bool IsLocal { get; set; } + public bool IsLocalTarget { get; set; } + public ReferenceSegment (int offset, int length, object reference) { this.Reference = reference; @@ -76,8 +82,26 @@ namespace MonoDevelop.AssemblyBrowser return referenceSegment.Segment; } } - - + + sealed class DefinitionLookup + { + internal Dictionary<object, int> definitions = new Dictionary<object, int> (); + + public int GetDefinitionPosition (object definition) + { + if (!definitions.TryGetValue (definition, out int val)) + val = -1; + + return val; + } + + public void AddDefinition (object definition, int offset) + { + definitions [definition] = offset; + } + } + + class ColoredCSharpFormatter : ICSharpCode.Decompiler.ITextOutput { public StringBuilder sb = new StringBuilder(); @@ -86,7 +110,8 @@ namespace MonoDevelop.AssemblyBrowser int indent; public List<IFoldSegment> FoldSegments = new List<IFoldSegment>(); public List<ReferenceSegment> ReferencedSegments = new List<ReferenceSegment>(); - + internal readonly DefinitionLookup DefinitionLookup = new DefinitionLookup (); + public ColoredCSharpFormatter (TextEditor doc) { this.doc = doc; @@ -128,9 +153,62 @@ namespace MonoDevelop.AssemblyBrowser sb.Append (ch); } - void ITextOutput.Write (string text) + public void Write (string text) + { + WriteIndent (); + sb.Append (text); + } + + public void WriteReference (OpCodeInfo opCode) { WriteIndent (); + ReferencedSegments.Add (new ReferenceSegment (sb.Length, opCode.Name.Length, opCode)); + sb.Append (opCode.Name); + } + + public void WriteReference (PEFile module, EntityHandle handle, string text, bool isDefinition = false) + { + WriteIndent (); + if (isDefinition) { + this.DefinitionLookup.AddDefinition ((module, handle), sb.Length); + } + + ReferencedSegments.Add (new ReferenceSegment (sb.Length, text.Length, (module, handle))); + sb.Append (text); + } + + public void WriteReference (IType type, string text, bool isDefinition = false) + { + WriteIndent (); + if (isDefinition) { + this.DefinitionLookup.AddDefinition (type, sb.Length); + } + + ReferencedSegments.Add (new ReferenceSegment (sb.Length, text.Length, type)); + sb.Append (text); + } + + public void WriteReference (IMember member, string text, bool isDefinition = false) + { + WriteIndent (); + if (isDefinition) { + this.DefinitionLookup.AddDefinition (member, sb.Length); + } + ReferencedSegments.Add (new ReferenceSegment (sb.Length, text.Length, member)); + sb.Append (text); + } + + public void WriteLocalReference (string text, object reference, bool isDefinition) + { + WriteIndent (); + + bool isLocalTarget = false; + if (isDefinition) { + this.DefinitionLookup.AddDefinition (reference, sb.Length); + isLocalTarget = true; + } + + ReferencedSegments.Add (new ReferenceSegment (sb.Length, text.Length, reference) { IsLocal = true, IsLocalTarget = isLocalTarget }); sb.Append (text); } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs new file mode 100644 index 0000000000..197fb93c08 --- /dev/null +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs @@ -0,0 +1,62 @@ +// +// MetadataExtensions.cs +// +// Author: +// Marius Ungureanu <maungu@microsoft.com> +// +// Copyright (c) 2019 Microsoft Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using ICSharpCode.Decompiler.TypeSystem; + +namespace MonoDevelop.AssemblyBrowser +{ + static class MetadataExtensions + { + public static bool IsPrivate (this IEntity entity) => + entity.Accessibility == Accessibility.Private || + entity.Accessibility == Accessibility.Internal || + entity.Accessibility == Accessibility.ProtectedAndInternal; + + public static bool IsPublic (this IEntity entity) => + entity.Accessibility == Accessibility.Protected || + entity.Accessibility == Accessibility.ProtectedOrInternal || + entity.Accessibility == Accessibility.Public; + + public static string GetStockIcon (this Accessibility attributes) + { + switch (attributes) { + case Accessibility.Private: + return "private-"; + case Accessibility.Public: + return ""; + case Accessibility.Protected: + return "protected-"; + case Accessibility.Internal: + return "internal-"; + case Accessibility.ProtectedOrInternal: + case Accessibility.ProtectedAndInternal: // FIXME we have no icon here + return "ProtectedOrInternal-"; + default: + return ""; + } + } + } +} diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs index a116fa5de3..acb09dfc83 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs @@ -27,7 +27,6 @@ using MonoDevelop.Ide.Gui.Components; using ICSharpCode.Decompiler.TypeSystem; using System; -using Mono.Cecil; using ICSharpCode.Decompiler.TypeSystem.Implementation; using MonoDevelop.Core; using MonoDevelop.Projects; @@ -60,8 +59,8 @@ namespace MonoDevelop.AssemblyBrowser try { if (thisNode == null || otherNode == null) return -1; - var e1 = thisNode.DataItem as IMemberDefinition; - var e2 = otherNode.DataItem as IMemberDefinition; + var e1 = thisNode.DataItem as IMember; + var e2 = otherNode.DataItem as IMember; if (e1 == null && e2 == null) return 0; @@ -77,7 +76,7 @@ namespace MonoDevelop.AssemblyBrowser } } - public AssemblyBrowserTypeNodeBuilder (AssemblyBrowserWidget assemblyBrowserWidget) + protected AssemblyBrowserTypeNodeBuilder (AssemblyBrowserWidget assemblyBrowserWidget) { this.Widget = assemblyBrowserWidget; } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs index 988df2ea2e..184e865ad9 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs @@ -24,12 +24,13 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
-using Mono.Cecil;
using MonoDevelop.Core;
using MonoDevelop.Ide.Gui.Components;
using MonoDevelop.Ide.Gui;
using System.IO;
+ +using ICSharpCode.Decompiler.Metadata;
namespace MonoDevelop.AssemblyBrowser
{
@@ -60,7 +61,7 @@ namespace MonoDevelop.AssemblyBrowser var referenceFolder = (AssemblyReferenceFolder)dataObject;
var wrapper = (AssemblyLoader)ctx.GetParentDataItem (typeof (AssemblyLoader), false);
- foreach (AssemblyNameReference assemblyNameReference in referenceFolder.AssemblyReferences) {
+ foreach (var assemblyNameReference in referenceFolder.AssemblyReferences) {
try {
string assemblyFile = wrapper.LookupAssembly (assemblyNameReference.FullName);
if (assemblyFile != null && System.IO.File.Exists (assemblyFile)) {
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs index 0e53fa2c13..0db6f14f66 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs @@ -25,11 +25,11 @@ // THE SOFTWARE. using System; -using Mono.Cecil; using MonoDevelop.Ide.Gui.Components; using MonoDevelop.Ide.Gui; using MonoDevelop.Core; +using ICSharpCode.Decompiler.Metadata; namespace MonoDevelop.AssemblyBrowser { @@ -41,7 +41,7 @@ namespace MonoDevelop.AssemblyBrowser } public override Type NodeDataType { - get { return typeof(AssemblyNameReference); } + get { return typeof(AssemblyReference); } } public override Type CommandHandlerType { @@ -56,13 +56,13 @@ namespace MonoDevelop.AssemblyBrowser public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var reference = (AssemblyNameReference)dataObject; + var reference = (AssemblyReference)dataObject; return reference.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo)
{
- var reference = (AssemblyNameReference)dataObject;
+ var reference = (AssemblyReference)dataObject;
nodeInfo.Label = reference.Name;
nodeInfo.Icon = Context.GetIcon (Stock.Reference);
}
@@ -72,8 +72,8 @@ namespace MonoDevelop.AssemblyBrowser try { if (thisNode == null || otherNode == null) return -1; - var e1 = thisNode.DataItem as AssemblyNameReference; - var e2 = otherNode.DataItem as AssemblyNameReference; + var e1 = thisNode.DataItem as AssemblyReference; + var e2 = otherNode.DataItem as AssemblyReference; if (e1 == null && e2 == null) return 0; @@ -94,7 +94,7 @@ namespace MonoDevelop.AssemblyBrowser { public override void ActivateItem () { - var reference = (AssemblyNameReference)CurrentNode.DataItem; + var reference = (AssemblyReference)CurrentNode.DataItem; if (reference == null) return; var loader = (AssemblyLoader)CurrentNode.GetParentDataItem (typeof(AssemblyLoader), false); diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs index e0eeb9f581..93b42c91aa 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs @@ -28,9 +28,7 @@ using System; using System.Collections.Generic; - -using Mono.Cecil; - + using MonoDevelop.Ide.Gui; using MonoDevelop.Ide.Gui.Pads; using MonoDevelop.Ide.Gui.Components; @@ -100,9 +98,9 @@ namespace MonoDevelop.AssemblyBrowser public override void BuildChildNodes (ITreeBuilder builder, object dataObject) { var baseTypeFolder = (BaseTypeFolder)dataObject; - builder.AddChild (baseTypeFolder.Type.BaseType); - builder.AddChildren (baseTypeFolder.Type.Interfaces); + builder.AddChildren (baseTypeFolder.Type.DirectBaseTypes); } + public override bool HasChildNodes (ITreeBuilder builder, object dataObject) { return true; diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs index 78f1ee9934..a0404ce725 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs @@ -30,8 +30,6 @@ using System; using System.Linq; using System.Text; -using Mono.Cecil; - using MonoDevelop.Core; using MonoDevelop.Ide.Gui; using MonoDevelop.Ide.Gui.Components; @@ -39,6 +37,7 @@ using System.Collections.Generic; using System.IO; using MonoDevelop.Ide.Editor; using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.Decompiler.Metadata; namespace MonoDevelop.AssemblyBrowser { @@ -86,19 +85,19 @@ namespace MonoDevelop.AssemblyBrowser var namespaces = new Dictionary<string, NamespaceData> (); bool publicOnly = Widget.PublicApiOnly; - foreach (var type in compilationUnit.ModuleDefinition.Types) { + foreach (var type in compilationUnit.DecompilerTypeSystem.MainModule.TypeDefinitions) { string namespaceName = string.IsNullOrEmpty (type.Namespace) ? "" : type.Namespace; if (!namespaces.ContainsKey (namespaceName)) namespaces [namespaceName] = new NamespaceData (namespaceName); var ns = namespaces [namespaceName]; - ns.Types.Add ((type.IsPublic, type)); + ns.Types.Add ((type.IsPublic (), type)); } treeBuilder.AddChildren (namespaces.Where (ns => ns.Key != "" && (!publicOnly || ns.Value.Types.Any (t => t.isPublic))).Select (n => n.Value)); if (namespaces.ContainsKey ("")) { foreach (var child in namespaces [""].Types) { - if (((TypeDefinition)child.typeObject).Name == "<Module>") + if (((INamedElement)child.typeObject).Name == "<Module>") continue; treeBuilder.AddChild (child); } @@ -108,7 +107,7 @@ namespace MonoDevelop.AssemblyBrowser public override bool HasChildNodes (ITreeBuilder builder, object dataObject) { var compilationUnit = (AssemblyLoader)dataObject; - return compilationUnit.Assembly?.MainModule.HasTypes == true || compilationUnit.Error != null; + return compilationUnit.DecompilerTypeSystem?.MainModule.TypeDefinitions.Any () == true || compilationUnit.Error != null; } public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode) @@ -126,7 +125,7 @@ namespace MonoDevelop.AssemblyBrowser if (e2 == null || e2.Assembly == null) return -1; - return string.Compare (e1.Assembly.Name.Name, e2.Assembly.Name.Name, StringComparison.Ordinal); + return string.Compare (e1.Assembly.Name, e2.Assembly.Name, StringComparison.Ordinal); } catch (Exception e) { LoggingService.LogError ("Exception in assembly browser sort function.", e); return -1; @@ -134,30 +133,17 @@ namespace MonoDevelop.AssemblyBrowser } #region IAssemblyBrowserNodeBuilder - void PrintAssemblyHeader (StringBuilder result, AssemblyDefinition assemblyDefinition) + void PrintAssemblyHeader (StringBuilder result, PEFile assemblyDefinition) { result.Append ("<span style=\"comment\">"); result.Append ("// "); result.Append (string.Format (GettextCatalog.GetString ("Assembly <b>{0}</b>, Version {1}"), - assemblyDefinition.Name.Name, - assemblyDefinition.Name.Version)); + assemblyDefinition.Name, + assemblyDefinition.Metadata.MetadataVersion)); result.Append ("</span>"); result.AppendLine (); } - static string GetTypeString (ModuleKind kind) - { - switch (kind) { - case ModuleKind.Console: - return GettextCatalog.GetString ("Console application"); - case ModuleKind.Dll: - return GettextCatalog.GetString ("Library"); - case ModuleKind.Windows: - return GettextCatalog.GetString ("Application"); - } - return GettextCatalog.GetString ("Unknown"); - } - public List<ReferenceSegment> Disassemble (TextEditor data, ITreeNavigator navigator) { var assemblyLoader = (AssemblyLoader)navigator.DataItem; diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/EventDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/EventDefinitionNodeBuilder.cs index 06e3eddf0a..422286936e 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/EventDefinitionNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/EventDefinitionNodeBuilder.cs @@ -34,12 +34,10 @@ using MonoDevelop.Ide; using ICSharpCode.Decompiler; using System.Threading; using System.Collections.Generic; -using Mono.Cecil; using MonoDevelop.Ide.TypeSystem; using ICSharpCode.Decompiler.TypeSystem; using MonoDevelop.Ide.Editor; using ICSharpCode.Decompiler.CSharp; -using ICSharpCode.ILSpy; using MonoDevelop.Core; namespace MonoDevelop.AssemblyBrowser @@ -47,7 +45,7 @@ namespace MonoDevelop.AssemblyBrowser class EventDefinitionNodeBuilder : AssemblyBrowserTypeNodeBuilder, IAssemblyBrowserNodeBuilder { public override Type NodeDataType { - get { return typeof(EventDefinition); } + get { return typeof(IEvent); } } public EventDefinitionNodeBuilder (AssemblyBrowserWidget widget) : base (widget) @@ -56,37 +54,39 @@ namespace MonoDevelop.AssemblyBrowser public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var evt = (EventDefinition)dataObject; + var evt = (IEvent)dataObject; return evt.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - var evt = (EventDefinition)dataObject; - nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (evt.Name + " : " + CSharpLanguage.Instance.TypeToString (evt.EventType, false, evt)); - var accessor = evt.AddMethod ?? evt.RemoveMethod; + var evt = (IEvent)dataObject; + nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (evt.Name + " : "); + // TODO: Fix this. + //nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (evt.Name + " : " + CSharpLanguage.Instance.TypeToString (evt.ReturnType, false, evt)); + var accessor = evt.AddAccessor ?? evt.RemoveAccessor; - if (!accessor.IsPublic) + if (!accessor.IsPublic ()) nodeInfo.Label = MethodDefinitionNodeBuilder.FormatPrivate (nodeInfo.Label); nodeInfo.Icon = Context.GetIcon (GetStockIcon (evt)); } - public static IconId GetStockIcon (EventDefinition evt) + public static IconId GetStockIcon (IEvent evt) { - var accessor = evt.AddMethod ?? evt.RemoveMethod; + var accessor = evt.AddAccessor ?? evt.RemoveAccessor; return MethodDefinitionNodeBuilder.GetStockIcon (accessor); } public override void BuildChildNodes (ITreeBuilder ctx, object dataObject) { - var evt = (EventDefinition)dataObject; - if (evt.AddMethod != null) - ctx.AddChild (evt.AddMethod); - if (evt.RemoveMethod != null) - ctx.AddChild (evt.RemoveMethod); - if (evt.InvokeMethod != null) - ctx.AddChild (evt.InvokeMethod); + var evt = (IEvent)dataObject; + if (evt.AddAccessor != null) + ctx.AddChild (evt.AddAccessor); + if (evt.RemoveAccessor != null) + ctx.AddChild (evt.RemoveAccessor); + if (evt.InvokeAccessor != null) + ctx.AddChild (evt.InvokeAccessor); } public override bool HasChildNodes (ITreeBuilder builder, object dataObject) @@ -99,18 +99,18 @@ namespace MonoDevelop.AssemblyBrowser { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var evt = (EventDefinition)navigator.DataItem; - return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleEvent (evt)); + var evt = (IEvent)navigator.DataItem; + return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleEvent (evt.ParentModule.PEFile, (System.Reflection.Metadata.EventDefinitionHandle)evt.MetadataToken)); } List<ReferenceSegment> IAssemblyBrowserNodeBuilder.Decompile (TextEditor data, ITreeNavigator navigator, DecompileFlags flags) { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var evt = navigator.DataItem as EventDefinition; + var evt = navigator.DataItem as IEvent; if (evt == null) return null; - return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (evt), flags: flags); + return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (evt.MetadataToken), flags: flags); } #endregion diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/FieldDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/FieldDefinitionNodeBuilder.cs index 670bc298a4..c25e26e82c 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/FieldDefinitionNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/FieldDefinitionNodeBuilder.cs @@ -28,8 +28,7 @@ using System; using System.Collections.Generic; -using ICSharpCode.ILSpy; -using Mono.Cecil; +using ICSharpCode.Decompiler.TypeSystem; using MonoDevelop.Core; using MonoDevelop.Ide.Editor; using MonoDevelop.Ide.Gui.Components; @@ -39,7 +38,7 @@ namespace MonoDevelop.AssemblyBrowser class FieldDefinitionNodeBuilder : AssemblyBrowserTypeNodeBuilder, IAssemblyBrowserNodeBuilder { public override Type NodeDataType { - get { return typeof(FieldDefinition); } + get { return typeof(IField); } } public FieldDefinitionNodeBuilder (AssemblyBrowserWidget widget) : base (widget) @@ -49,45 +48,28 @@ namespace MonoDevelop.AssemblyBrowser public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var field = (FieldDefinition)dataObject; + var field = (IField)dataObject; return field.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - var field = (FieldDefinition)dataObject; - nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (field.Name + " : " + CSharpLanguage.Instance.TypeToString (field.FieldType, false, field)); + var field = (IField)dataObject; + // FIXME? + //nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (field.Name + " : " + CSharpLanguage.Instance.TypeToString (field.FieldType, false, field)); + nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (field.Name + " : " + field.ReturnType.Name); - if (!field.IsPublic) + if (!field.IsPublic ()) nodeInfo.Label = MethodDefinitionNodeBuilder.FormatPrivate (nodeInfo.Label); nodeInfo.Icon = Context.GetIcon (GetStockIcon(field)); } - public static IconId GetStockIcon (FieldDefinition field) + public static IconId GetStockIcon (IField field) { - var isStatic = (field.Attributes & FieldAttributes.Static) != 0; - var source = field.HasConstant ? "literal" : "field"; - var global = field.HasConstant ? "" : (isStatic ? "static-" : ""); - return "md-" + GetAccess (field.Attributes) + global + source; - } - - static string GetAccess (FieldAttributes attributes) - { - switch (attributes & FieldAttributes.FieldAccessMask) { - case FieldAttributes.Private: - return "private-"; - case FieldAttributes.Public: - return ""; - case FieldAttributes.Family: - return "protected-"; - case FieldAttributes.Assembly: - return "internal-"; - case FieldAttributes.FamORAssem: - case FieldAttributes.FamANDAssem: - return "ProtectedOrInternal-"; - default: - return ""; - } + var isStatic = field.IsStatic; + var source = field.IsConst ? "literal" : "field"; + var global = field.IsConst ? "" : (isStatic ? "static-" : ""); + return "md-" + field.Accessibility.GetStockIcon () + global + source; } #region IAssemblyBrowserNodeBuilder @@ -96,20 +78,20 @@ namespace MonoDevelop.AssemblyBrowser { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var field = (FieldDefinition)navigator.DataItem; + var field = (IField)navigator.DataItem; if (field == null) return null; - return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleField (field)); + return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleField (field.ParentModule.PEFile, (System.Reflection.Metadata.FieldDefinitionHandle)field.MetadataToken)); } List<ReferenceSegment> IAssemblyBrowserNodeBuilder.Decompile (TextEditor data, ITreeNavigator navigator, DecompileFlags flags) { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var field = (FieldDefinition)navigator.DataItem; + var field = (IField)navigator.DataItem; if (field == null) return null; - return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (field), flags: flags); + return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (field.MetadataToken), flags: flags); } #endregion diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs index cd3e7a89a3..bb0ea528a4 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs @@ -39,21 +39,18 @@ using ICSharpCode.Decompiler.CSharp.TypeSystem; using ICSharpCode.Decompiler.Disassembler; using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem.Implementation; -using Mono.Cecil; -using Mono.Cecil.Cil; using MonoDevelop.Core; using MonoDevelop.Core.Text; using MonoDevelop.Ide; using MonoDevelop.Ide.Editor; using MonoDevelop.Ide.Gui.Components; -using ICSharpCode.ILSpy; namespace MonoDevelop.AssemblyBrowser { class MethodDefinitionNodeBuilder : AssemblyBrowserTypeNodeBuilder, IAssemblyBrowserNodeBuilder { public override Type NodeDataType { - get { return typeof(MethodDefinition); } + get { return typeof(IMethod); } } public MethodDefinitionNodeBuilder (AssemblyBrowserWidget widget) : base (widget) @@ -62,7 +59,7 @@ namespace MonoDevelop.AssemblyBrowser public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var method = (MethodDefinition)dataObject; + var method = (IMethod)dataObject; if (method.IsConstructor) return method.DeclaringType.Name; return method.Name; @@ -75,7 +72,7 @@ namespace MonoDevelop.AssemblyBrowser public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - var method = (MethodDefinition)dataObject; + var method = (IMethod)dataObject; var ambience = new CSharpAmbience (); try { @@ -84,39 +81,19 @@ namespace MonoDevelop.AssemblyBrowser nodeInfo.Label = method.Name; } - if (method.IsPrivate || method.IsAssembly) + if (method.IsPrivate ()) nodeInfo.Label = MethodDefinitionNodeBuilder.FormatPrivate (nodeInfo.Label); nodeInfo.Icon = Context.GetIcon (GetStockIcon (method)); } - public static IconId GetStockIcon (MethodDefinition method) + public static IconId GetStockIcon (IMethod method) { - var isStatic = (method.Attributes & MethodAttributes.Static) != 0; - var global = isStatic ? "static-" : ""; - return "md-" + GetAccess (method.Attributes) + global + "method"; + var global = method.IsStatic ? "static-" : ""; + return "md-" + method.Accessibility.GetStockIcon () + global + "method"; } - internal static string GetAccess (MethodAttributes attributes) - { - switch (attributes & MethodAttributes.MemberAccessMask) { - case MethodAttributes.Private: - return "private-"; - case MethodAttributes.Public: - return ""; - case MethodAttributes.Family: - return "protected-"; - case MethodAttributes.Assembly: - return "internal-"; - case MethodAttributes.FamORAssem: - case MethodAttributes.FamANDAssem: - return "ProtectedOrInternal-"; - default: - return ""; - } - } - - public static string GetText (MethodDefinition method) + public static string GetText (IMethod method) { var b = StringBuilderCache.Allocate (); try { @@ -124,20 +101,25 @@ namespace MonoDevelop.AssemblyBrowser for (int i = 0; i < method.Parameters.Count; i++) { if (i > 0) b.Append (", "); - b.Append (CSharpLanguage.Instance.TypeToString (method.Parameters [i].ParameterType, false, method.Parameters [i])); - } - if (method.CallingConvention == MethodCallingConvention.VarArg) { - if (method.HasParameters) - b.Append (", "); - b.Append ("..."); + // TODO: Fix this. + //b.Append (CSharpLanguage.Instance.TypeToString (method.Parameters [i].ParameterType, false, method.Parameters [i])); + b.Append (method.Parameters [i].Type.Name); } + //if (method.CallingConvention == MethodCallingConvention.VarArg) { + // if (method.HasParameters) + // b.Append (", "); + // b.Append ("..."); + //} if (method.IsConstructor) { b.Append (')'); } else { b.Append (") : "); - b.Append (CSharpLanguage.Instance.TypeToString (method.ReturnType, false, method.MethodReturnType)); + //b.Append (CSharpLanguage.Instance.TypeToString (method.ReturnType, false, method.MethodReturnType)); + b.Append (method.ReturnType.Name); } - return CSharpLanguage.Instance.FormatMethodName (method) + b; + + //return CSharpLanguage.Instance.FormatMethodName (method) + b; + return method.Name + b; } finally { StringBuilderCache.Free (b); } @@ -154,11 +136,6 @@ namespace MonoDevelop.AssemblyBrowser result.AppendLine (); } - static string GetInstructionOffset (Instruction instruction) - { - return String.Format ("IL_{0:X4}", instruction.Offset); - } - public static AssemblyLoader GetAssemblyLoader (ITreeNavigator navigator) { var nav = navigator.Clone (); @@ -223,10 +200,10 @@ namespace MonoDevelop.AssemblyBrowser { if (HandleSourceCodeEntity (navigator, data)) return null; - var cecilMethod = (MethodDefinition)navigator.DataItem; + var cecilMethod = (IMethod)navigator.DataItem; if (cecilMethod == null) return null; - return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (cecilMethod), flags: flags); + return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (cecilMethod.MetadataToken), flags: flags); } static void AppendLink (StringBuilder sb, string link, string text) @@ -265,10 +242,9 @@ namespace MonoDevelop.AssemblyBrowser { if (HandleSourceCodeEntity (navigator, data)) return null; - var cecilMethod = (MethodDefinition)navigator.DataItem; - if (cecilMethod == null) + if (!(navigator.DataItem is IMethod cecilMethod)) return null; - return Disassemble (data, rd => rd.DisassembleMethod (cecilMethod)); + return Disassemble (data, rd => rd.DisassembleMethod (cecilMethod.ParentModule.PEFile, (System.Reflection.Metadata.MethodDefinitionHandle)cecilMethod.MetadataToken)); } #endregion diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/PropertyDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/PropertyDefinitionNodeBuilder.cs index 0e61a50423..d65dc169cb 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/PropertyDefinitionNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/PropertyDefinitionNodeBuilder.cs @@ -35,11 +35,9 @@ using MonoDevelop.Projects.Text; using ICSharpCode.Decompiler; using System.Threading; using System.Collections.Generic; -using Mono.Cecil; using ICSharpCode.Decompiler.TypeSystem; using MonoDevelop.Ide.TypeSystem; using MonoDevelop.Ide.Editor; -using ICSharpCode.ILSpy; using MonoDevelop.Core; namespace MonoDevelop.AssemblyBrowser @@ -47,7 +45,7 @@ namespace MonoDevelop.AssemblyBrowser class PropertyDefinitionNodeBuilder : AssemblyBrowserTypeNodeBuilder, IAssemblyBrowserNodeBuilder { public override Type NodeDataType { - get { return typeof(PropertyDefinition); } + get { return typeof(IProperty); } } public PropertyDefinitionNodeBuilder (AssemblyBrowserWidget widget) : base (widget) @@ -57,54 +55,57 @@ namespace MonoDevelop.AssemblyBrowser public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var property = (PropertyDefinition)dataObject; + var property = (IProperty)dataObject; return property.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - var property = (PropertyDefinition)dataObject; - nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (GetText (property, property.IsIndexer ())); + var property = (IProperty)dataObject; + nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (GetText (property, property.IsIndexer)); - var accessor = property.GetMethod ?? property.SetMethod; + var accessor = property.Getter ?? property.Setter; - if (!accessor.IsPublic) + if (!accessor.IsPublic ()) nodeInfo.Label = MethodDefinitionNodeBuilder.FormatPrivate (nodeInfo.Label); nodeInfo.Icon = Context.GetIcon (GetStockIcon (property)); } - public static IconId GetStockIcon (PropertyDefinition property) + public static IconId GetStockIcon (IProperty property) { - var accessor = property.GetMethod ?? property.SetMethod; - var isStatic = (accessor.Attributes & MethodAttributes.Static) != 0; - var global = isStatic ? "static-" : ""; - return "md-" + MethodDefinitionNodeBuilder.GetAccess (accessor.Attributes) + global + "property"; + var accessor = property.Getter ?? property.Setter; + var global = accessor.IsStatic ? "static-" : ""; + return "md-" + accessor.Accessibility.GetStockIcon () + global + "property"; } - static string GetText (PropertyDefinition property, bool? isIndexer = null) + static string GetText (IProperty property, bool? isIndexer = null) { - string name = CSharpLanguage.Instance.FormatPropertyName (property, isIndexer); + // TODO: fix this + string name = property.Name;// CSharpLanguage.Instance.FormatPropertyName (property, isIndexer); var b = new System.Text.StringBuilder (); - if (property.HasParameters) { + var parameters = property.Parameters; + if (parameters.Count != 0) { b.Append ('('); - for (int i = 0; i < property.Parameters.Count; i++) { + for (int i = 0; i < parameters.Count; i++) { if (i > 0) b.Append (", "); - b.Append (CSharpLanguage.Instance.TypeToString (property.Parameters [i].ParameterType, false, property.Parameters [i])); - } - var method = property.GetMethod ?? property.SetMethod; - if (method.CallingConvention == MethodCallingConvention.VarArg) { - if (property.HasParameters) - b.Append (", "); - b.Append ("..."); + //b.Append (CSharpLanguage.Instance.TypeToString (property.Parameters [i].ParameterType, false, property.Parameters [i])); + b.Append (parameters [i].Type.Name); } + //var method = property.GetMethod ?? property.SetMethod; + //if (method.CallingConvention == MethodCallingConvention.VarArg) { + // if (property.HasParameters) + // b.Append (", "); + // b.Append ("..."); + //} b.Append (") : "); } else { b.Append (" : "); } - b.Append (CSharpLanguage.Instance.TypeToString (property.PropertyType, false, property)); + //b.Append (CSharpLanguage.Instance.TypeToString (property.PropertyType, false, property)); + b.Append (property.ReturnType.Name); return name + b; } @@ -126,8 +127,8 @@ namespace MonoDevelop.AssemblyBrowser { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var property = (PropertyDefinition)navigator.DataItem; - return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleProperty (property)); + var property = (IProperty)navigator.DataItem; + return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleProperty (property.ParentModule.PEFile, (System.Reflection.Metadata.PropertyDefinitionHandle)property.MetadataToken)); } static string GetBody (string text) @@ -146,10 +147,9 @@ namespace MonoDevelop.AssemblyBrowser { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var property = navigator.DataItem as PropertyDefinition; - if (property == null) + if (!(navigator.DataItem is IProperty property)) return null; - return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (property), flags: flags); + return MethodDefinitionNodeBuilder.Decompile (data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), b => b.Decompile (property.MetadataToken), flags: flags); } #endregion diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs index 002611033a..b317218fea 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs @@ -29,7 +29,6 @@ using System; using System.Text; using System.Linq; -using Mono.Cecil; using MonoDevelop.Core; using MonoDevelop.Ide.Gui.Components; using MonoDevelop.Ide; @@ -42,14 +41,13 @@ using MonoDevelop.Ide.Editor; using MonoDevelop.Ide.Editor.Highlighting; using MonoDevelop.Ide.Gui.Content; using ICSharpCode.Decompiler.CSharp.OutputVisitor; -using ICSharpCode.ILSpy; namespace MonoDevelop.AssemblyBrowser { class TypeDefinitionNodeBuilder : AssemblyBrowserTypeNodeBuilder, IAssemblyBrowserNodeBuilder { public override Type NodeDataType { - get { return typeof(TypeDefinition); } + get { return typeof(ITypeDefinition); } } public override string ContextMenuAddinPath { @@ -62,94 +60,76 @@ namespace MonoDevelop.AssemblyBrowser public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var type = (TypeDefinition)dataObject; + var type = (ITypeDefinition)dataObject; return type.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - var type = (TypeDefinition)dataObject; - nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (CSharpLanguage.Instance.FormatTypeName (type)); - if (!type.IsPublic) + var type = (ITypeDefinition)dataObject; + // TODO: fix this + //nodeInfo.Label = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (CSharpLanguage.Instance.FormatTypeName (type)); + nodeInfo.Label = type.FullTypeName.Name; + if (!type.IsPublic ()) nodeInfo.Label = MethodDefinitionNodeBuilder.FormatPrivate (nodeInfo.Label); nodeInfo.Icon = Context.GetIcon (GetStockIcon(type)); } - public static IconId GetStockIcon (TypeDefinition type) + public static IconId GetStockIcon (ITypeDefinition type) { - return "md-" + GetAccess (type.Attributes) + GetSource (type); + return "md-" + type.Accessibility.GetStockIcon () + GetSource (type); } - static string GetSource (TypeDefinition type) + static string GetSource (ITypeDefinition type) {
- if (type.IsInterface) + if (type.Kind == TypeKind.Interface) return "interface"; - if (type.IsValueType) + if (type.Kind == TypeKind.Struct) return "struct"; - if (type.IsEnum) + if (type.Kind == TypeKind.Enum) return "enum"; - if (type.IsDelegate ()) + if (type.Kind == TypeKind.Delegate) return "delegate"; return "class"; } - static string GetAccess (TypeAttributes attributes) - { - switch (attributes & TypeAttributes.VisibilityMask) { - case TypeAttributes.NestedPrivate: - return "private-"; - case TypeAttributes.Public: - case TypeAttributes.NestedPublic: - return ""; - case TypeAttributes.NestedFamily: - return "protected-"; - case TypeAttributes.NestedAssembly: - return "internal-"; - case TypeAttributes.NestedFamORAssem: - case TypeAttributes.NestedFamANDAssem: - return "ProtectedOrInternal-"; - default: - return ""; - } - } - public override void BuildChildNodes (ITreeBuilder builder, object dataObject) { - var type = (TypeDefinition)dataObject; + var type = (ITypeDefinition)dataObject; var list = new System.Collections.ArrayList (); - if (type.BaseType != null || type.HasInterfaces) + if (type.DirectBaseTypes.Any ()) list.Add (new BaseTypeFolder (type)); bool publicOnly = Widget.PublicApiOnly; foreach (var nestedType in type.NestedTypes.OrderBy (m => m.Name, StringComparer.InvariantCulture)) { - if (publicOnly && !nestedType.IsPublic) + if (publicOnly && !nestedType.IsPublic ()) continue; builder.AddChild (nestedType); } foreach (var field in type.Fields.OrderBy (m => m.Name, StringComparer.InvariantCulture)) { - if (publicOnly && !field.IsPublic) + if (publicOnly && !field.IsPublic ()) continue; builder.AddChild (field); } foreach (var property in type.Properties.OrderBy (m => m.Name, StringComparer.InvariantCulture)) { - var accessor = property.GetMethod ?? property.SetMethod; - if (publicOnly && !accessor.IsPublic) + var accessor = property.Getter ?? property.Setter; + if (publicOnly && !accessor.IsPublic ()) continue; builder.AddChild (property); } foreach (var evt in type.Events.OrderBy (m => m.Name, StringComparer.InvariantCulture)) { - var accessor = evt.AddMethod ?? evt.RemoveMethod; - if (publicOnly && !accessor.IsPublic) + var accessor = evt.AddAccessor ?? evt.RemoveAccessor; + if (publicOnly && !accessor.IsPublic ()) continue; builder.AddChild (evt); } - var accessorMethods = type.GetAccessorMethods (); + var accessorMethods = type.GetAccessors (); foreach (var method in type.Methods.OrderBy (m => m.Name, StringComparer.InvariantCulture)) { - if (publicOnly && !method.IsPublic) + if (publicOnly && !method.IsPublic ()) continue; if (!accessorMethods.Contains (method)) { builder.AddChild (method); @@ -165,13 +145,13 @@ namespace MonoDevelop.AssemblyBrowser #region IAssemblyBrowserNodeBuilder internal static void PrintAssembly (StringBuilder result, ITreeNavigator navigator) { - var assemblyDefinition = (AssemblyDefinition)navigator.GetParentDataItem (typeof (AssemblyDefinition), false); + var assemblyDefinition = (AssemblyLoader)navigator.GetParentDataItem (typeof (AssemblyLoader), false); if (assemblyDefinition == null) return; - + result.Append (GettextCatalog.GetString ("<b>Assembly:</b>\t{0}, Version={1}", - assemblyDefinition.Name.Name, - assemblyDefinition.Name.Version)); + assemblyDefinition.Assembly.Name, + assemblyDefinition.Assembly.Metadata.MetadataVersion)); result.AppendLine (); } @@ -195,11 +175,11 @@ namespace MonoDevelop.AssemblyBrowser { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var type = (TypeDefinition)navigator.DataItem; + var type = (ITypeDefinition)navigator.DataItem; if (type == null) return null; - - return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleType (type)); + + return MethodDefinitionNodeBuilder.Disassemble (data, rd => rd.DisassembleType (type.ParentModule.PEFile, (System.Reflection.Metadata.TypeDefinitionHandle)type.MetadataToken)); } internal static DecompilerSettings CreateDecompilerSettings (bool publicOnly, MonoDevelop.CSharp.Formatting.CSharpFormattingPolicy codePolicy) @@ -222,7 +202,7 @@ namespace MonoDevelop.AssemblyBrowser { if (MethodDefinitionNodeBuilder.HandleSourceCodeEntity (navigator, data)) return null; - var type = (TypeDefinition)navigator.DataItem; + var type = (ITypeDefinition)navigator.DataItem; if (type == null) return null; var settings = MethodDefinitionNodeBuilder.GetDecompilerSettings (data, flags.PublicOnly); @@ -230,7 +210,7 @@ namespace MonoDevelop.AssemblyBrowser return MethodDefinitionNodeBuilder.Decompile ( data, MethodDefinitionNodeBuilder.GetAssemblyLoader (navigator), - builder => builder.DecompileType (type.GetFullTypeName ()), flags: flags); + builder => builder.DecompileType (type.FullTypeName), flags: flags); } #endregion } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ErrorNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ErrorNodeBuilder.cs index ed9c4f4614..ec4c8567ad 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ErrorNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ErrorNodeBuilder.cs @@ -29,8 +29,6 @@ using System; using System.Collections.Generic; -using Mono.Cecil; - using MonoDevelop.Ide.Gui; using MonoDevelop.Ide.Gui.Pads; using MonoDevelop.Ide.Gui.Components; diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs index be49f43061..80205e6c0a 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs @@ -27,29 +27,30 @@ // using System; -using Mono.Cecil; using MonoDevelop.Ide.Gui.Components; using MonoDevelop.Ide.Gui; using MonoDevelop.Core; +using System.Reflection.Metadata; +using ICSharpCode.Decompiler.TypeSystem; namespace MonoDevelop.AssemblyBrowser { class ModuleReferenceNodeBuilder : TypeNodeBuilder { public override Type NodeDataType { - get { return typeof(ModuleReference); } + get { return typeof(IModule); } } public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - var reference = (ModuleReference)dataObject; + var reference = (IModule)dataObject; return reference.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - var reference = (ModuleReference)dataObject; + var reference = (IModule)dataObject; nodeInfo.Label = reference.Name; nodeInfo.Icon = Context.GetIcon (Stock.GenericFile); } @@ -59,8 +60,8 @@ namespace MonoDevelop.AssemblyBrowser try { if (thisNode == null || otherNode == null) return -1; - var e1 = thisNode.DataItem as ModuleReference; - var e2 = otherNode.DataItem as ModuleReference; + var e1 = thisNode.DataItem as IModule; + var e2 = otherNode.DataItem as IModule; if (e1 == null && e2 == null) return 0; diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs index 4fc5a5ecea..56950b7d79 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs @@ -29,7 +29,6 @@ using System; using System.Collections.Generic; using ICSharpCode.Decompiler.TypeSystem; -using Mono.Cecil; namespace MonoDevelop.AssemblyBrowser { diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ResourceNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ResourceNodeBuilder.cs index a9b6fae962..b0727dbfa0 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ResourceNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ResourceNodeBuilder.cs @@ -27,28 +27,28 @@ // using System; -using Mono.Cecil; using MonoDevelop.Ide.Gui.Components; using MonoDevelop.Ide.Gui; - +using ICSharpCode.Decompiler.Metadata; + namespace MonoDevelop.AssemblyBrowser { class ResourceNodeBuilder : TypeNodeBuilder { public override Type NodeDataType { - get { return typeof(Mono.Cecil.Resource); } + get { return typeof(Resource); } } public override string GetNodeName (ITreeNavigator thisNode, object dataObject) { - Mono.Cecil.Resource resource = (Mono.Cecil.Resource)dataObject; + var resource = (Resource)dataObject; return resource.Name; } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - Mono.Cecil.Resource resource = (Mono.Cecil.Resource)dataObject; + var resource = (Resource)dataObject; nodeInfo.Label = Ide.TypeSystem.Ambience.EscapeText (resource.Name); nodeInfo.Icon = Context.GetIcon (Stock.ResourceFileIcon); } diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs index 3615f5c8c6..e65bfd01da 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs @@ -1,4 +1,4 @@ -// +// // ProjectNodeBuilder.cs // // Author: @@ -27,6 +27,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; + using MonoDevelop.Core; using MonoDevelop.Ide; using MonoDevelop.Ide.Gui.Components; diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/Util/CSharpLanguage.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/Util/CSharpLanguage.cs index d195042a85..b0077d2421 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/Util/CSharpLanguage.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/Util/CSharpLanguage.cs @@ -1,395 +1,395 @@ -// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this -// software and associated documentation files (the "Software"), to deal in the Software -// without restriction, including without limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons -// to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or -// substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Resources; - -using ICSharpCode.Decompiler; -using Mono.Cecil; -using ICSharpCode.Decompiler.CSharp; -using ICSharpCode.Decompiler.CSharp.OutputVisitor; -using ICSharpCode.Decompiler.CSharp.Syntax; -using ICSharpCode.Decompiler.TypeSystem; -using ICSharpCode.Decompiler.CSharp.Transforms; - -namespace ICSharpCode.ILSpy -{ - /// <summary> - /// C# decompiler integration into ILSpy. - /// Note: if you're interested in using the decompiler without the ILSpy UI, - /// please directly use the CSharpDecompiler class. - /// </summary> - class CSharpLanguage - { - public static readonly CSharpLanguage Instance = new CSharpLanguage (); - string name = "C#"; - int transformCount = int.MaxValue; - -#if DEBUG - internal static IEnumerable<CSharpLanguage> GetDebugLanguages () - { - var decompiler = new CSharpDecompiler (ModuleDefinition.CreateModule ("Dummy", ModuleKind.Dll), new DecompilerSettings ()); - string lastTransformName = "no transforms"; - int transformCount = 0; - foreach (var transform in decompiler.AstTransforms) { - yield return new CSharpLanguage { - transformCount = transformCount, - name = "C# - " + lastTransformName, - }; - lastTransformName = "after " + transform.GetType ().Name; - transformCount++; - } - yield return new CSharpLanguage { - name = "C# - " + lastTransformName, - }; - } -#endif - - public string Name { - get { return name; } - } - - public string FileExtension { - get { return ".cs"; } - } - - public string ProjectFileExtension { - get { return ".csproj"; } - } - - - CSharpDecompiler CreateDecompiler (ModuleDefinition module, DecompilerSettings options) - { - CSharpDecompiler decompiler = new CSharpDecompiler (module, options); - //decompiler.CancellationToken = options.CancellationToken; - while (decompiler.AstTransforms.Count > transformCount) - decompiler.AstTransforms.RemoveAt (decompiler.AstTransforms.Count - 1); - return decompiler; - } - - void WriteCode (ITextOutput output, DecompilerSettings settings, SyntaxTree syntaxTree, IDecompilerTypeSystem typeSystem) - { - syntaxTree.AcceptVisitor (new InsertParenthesesVisitor { InsertParenthesesForReadability = true }); - TokenWriter tokenWriter = new TextTokenWriter (output, settings, typeSystem) { FoldBraces = settings.FoldBraces, /*ExpandMemberDefinitions = settings.ExpandMemberDefinitions */}; - syntaxTree.AcceptVisitor (new CSharpOutputVisitor (tokenWriter, settings.CSharpFormattingOptions)); - } - - public void DecompileMethod (MethodDefinition method, ITextOutput output, DecompilerSettings options) - { - AddReferenceWarningMessage (method.Module.Assembly, output); - WriteCommentLine (output, TypeToString (method.DeclaringType, includeNamespace: true)); - CSharpDecompiler decompiler = CreateDecompiler (method.Module, options); - if (method.IsConstructor && !method.DeclaringType.IsValueType) { - List<IMemberDefinition> members = CollectFieldsAndCtors (method.DeclaringType, method.IsStatic); - decompiler.AstTransforms.Add (new SelectCtorTransform (decompiler.TypeSystem.Resolve (method))); - WriteCode (output, options, decompiler.Decompile (members), decompiler.TypeSystem); - } else { - WriteCode (output, options, decompiler.Decompile (method), decompiler.TypeSystem); - } - } - - class SelectCtorTransform : IAstTransform - { - readonly IMethod ctor; - readonly HashSet<ISymbol> removedSymbols = new HashSet<ISymbol> (); - - public SelectCtorTransform (IMethod ctor) - { - this.ctor = ctor; - } - - public void Run (AstNode rootNode, TransformContext context) - { - ConstructorDeclaration ctorDecl = null; - foreach (var node in rootNode.Children) { - switch (node) { - case ConstructorDeclaration ctor: - if (ctor.GetSymbol () == this.ctor) { - ctorDecl = ctor; - } else { - // remove other ctors - ctor.Remove (); - removedSymbols.Add (ctor.GetSymbol ()); - } - break; - case FieldDeclaration fd: - // Remove any fields without initializers - if (fd.Variables.All (v => v.Initializer.IsNull)) { - fd.Remove (); - removedSymbols.Add (fd.GetSymbol ()); - } - break; - } - } - if (ctorDecl?.Initializer.ConstructorInitializerType == ConstructorInitializerType.This) { - // remove all fields - foreach (var node in rootNode.Children) { - switch (node) { - case FieldDeclaration fd: - fd.Remove (); - removedSymbols.Add (fd.GetSymbol ()); - break; - } - } - } - foreach (var node in rootNode.Children) { - if (node is Comment && removedSymbols.Contains (node.GetSymbol ())) - node.Remove (); - } - } - } - - public void DecompileProperty (PropertyDefinition property, ITextOutput output, DecompilerSettings options) - { - AddReferenceWarningMessage (property.Module.Assembly, output); - WriteCommentLine (output, TypeToString (property.DeclaringType, includeNamespace: true)); - CSharpDecompiler decompiler = CreateDecompiler (property.Module, options); - WriteCode (output, options, decompiler.Decompile (property), decompiler.TypeSystem); - } - - public void DecompileField (FieldDefinition field, ITextOutput output, DecompilerSettings options) - { - AddReferenceWarningMessage (field.Module.Assembly, output); - WriteCommentLine (output, TypeToString (field.DeclaringType, includeNamespace: true)); - CSharpDecompiler decompiler = CreateDecompiler (field.Module, options); - if (field.IsLiteral) { - WriteCode (output, options, decompiler.Decompile (field), decompiler.TypeSystem); - } else { - List<IMemberDefinition> members = CollectFieldsAndCtors (field.DeclaringType, field.IsStatic); - decompiler.AstTransforms.Add (new SelectFieldTransform (decompiler.TypeSystem.Resolve (field))); - WriteCode (output, options, decompiler.Decompile (members), decompiler.TypeSystem); - } - } - - private static List<IMemberDefinition> CollectFieldsAndCtors (TypeDefinition type, bool isStatic) - { - var members = new List<IMemberDefinition> (); - foreach (var field in type.Fields) { - if (field.IsStatic == isStatic) - members.Add (field); - } - foreach (var ctor in type.Methods) { - if (ctor.IsConstructor && ctor.IsStatic == isStatic) - members.Add (ctor); - } - - return members; - } - - /// <summary> - /// Removes all top-level members except for the specified fields. - /// </summary> - sealed class SelectFieldTransform : IAstTransform - { - readonly IField field; - - public SelectFieldTransform (IField field) - { - this.field = field; - } - - public void Run (AstNode rootNode, TransformContext context) - { - foreach (var node in rootNode.Children) { - switch (node) { - case EntityDeclaration ed: - if (node.GetSymbol () != field) - node.Remove (); - break; - case Comment c: - if (c.GetSymbol () != field) - node.Remove (); - break; - } - } - } - } - - public void DecompileEvent (EventDefinition ev, ITextOutput output, DecompilerSettings options) - { - AddReferenceWarningMessage (ev.Module.Assembly, output); - WriteCommentLine (output, TypeToString (ev.DeclaringType, includeNamespace: true)); - CSharpDecompiler decompiler = CreateDecompiler (ev.Module, options); - WriteCode (output, options, decompiler.Decompile (ev), decompiler.TypeSystem); - } - - public void DecompileType (TypeDefinition type, ITextOutput output, DecompilerSettings options) - { - AddReferenceWarningMessage (type.Module.Assembly, output); - WriteCommentLine (output, TypeToString (type, includeNamespace: true)); - CSharpDecompiler decompiler = CreateDecompiler (type.Module, options); - WriteCode (output, options, decompiler.Decompile (type), decompiler.TypeSystem); - } - - public static string GetPlatformDisplayName (ModuleDefinition module) - { - switch (module.Architecture) { - case TargetArchitecture.I386: - if ((module.Attributes & ModuleAttributes.Preferred32Bit) == ModuleAttributes.Preferred32Bit) - return "AnyCPU (32-bit preferred)"; - else if ((module.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) - return "x86"; - else - return "AnyCPU (64-bit preferred)"; - case TargetArchitecture.AMD64: - return "x64"; - case TargetArchitecture.IA64: - return "Itanium"; - default: - return module.Architecture.ToString (); - } - } - - public static string GetRuntimeDisplayName (ModuleDefinition module) - { - switch (module.Runtime) { - case TargetRuntime.Net_1_0: - return ".NET 1.0"; - case TargetRuntime.Net_1_1: - return ".NET 1.1"; - case TargetRuntime.Net_2_0: - return ".NET 2.0"; - case TargetRuntime.Net_4_0: - return ".NET 4.0"; - } - return null; - } - - void AddReferenceWarningMessage (AssemblyDefinition assembly, ITextOutput output) - { - /*var loadedAssembly = MainWindow.Instance.CurrentAssemblyList.GetAssemblies ().FirstOrDefault (la => la.GetAssemblyDefinitionOrNull () == assembly); - if (loadedAssembly == null || !loadedAssembly.LoadedAssemblyReferencesInfo.HasErrors) - return; - const string line1 = "Warning: Some assembly references could not be loaded. This might lead to incorrect decompilation of some parts,"; - const string line2 = "for ex. property getter/setter access. To get optimal decompilation results, please manually add the references to the list of loaded assemblies."; - if (output is ISmartTextOutput fancyOutput) { - fancyOutput.AddUIElement (() => new StackPanel { - Margin = new Thickness (5), - Orientation = Orientation.Horizontal, - Children = { - new Image { - Width = 32, - Height = 32, - Source = Images.LoadImage(this, "Images/Warning.png") - }, - new TextBlock { - Margin = new Thickness(5, 0, 0, 0), - Text = line1 + Environment.NewLine + line2 - } - } - }); - fancyOutput.WriteLine (); - fancyOutput.AddButton (Images.ViewCode, "Show assembly load log", delegate { - MainWindow.Instance.SelectNode (MainWindow.Instance.FindTreeNode (assembly).Children.OfType<ReferenceFolderTreeNode> ().First ()); - }); - fancyOutput.WriteLine (); - } else { - WriteCommentLine (output, line1); - WriteCommentLine (output, line2); - }*/ - } +//// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +//// +//// Permission is hereby granted, free of charge, to any person obtaining a copy of this +//// software and associated documentation files (the "Software"), to deal in the Software +//// without restriction, including without limitation the rights to use, copy, modify, merge, +//// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +//// to whom the Software is furnished to do so, subject to the following conditions: +//// +//// The above copyright notice and this permission notice shall be included in all copies or +//// substantial portions of the Software. +//// +//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +//// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +//// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +//// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +//// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +//// DEALINGS IN THE SOFTWARE. + +//using System; +//using System.Collections; +//using System.Collections.Generic; +//using System.IO; +//using System.Linq; +//using System.Resources; + +//using ICSharpCode.Decompiler; +//using Mono.Cecil; +//using ICSharpCode.Decompiler.CSharp; +//using ICSharpCode.Decompiler.CSharp.OutputVisitor; +//using ICSharpCode.Decompiler.CSharp.Syntax; +//using ICSharpCode.Decompiler.TypeSystem; +//using ICSharpCode.Decompiler.CSharp.Transforms; + +//namespace ICSharpCode.ILSpy +//{ +// /// <summary> +// /// C# decompiler integration into ILSpy. +// /// Note: if you're interested in using the decompiler without the ILSpy UI, +// /// please directly use the CSharpDecompiler class. +// /// </summary> +// class CSharpLanguage +// { +// public static readonly CSharpLanguage Instance = new CSharpLanguage (); +// string name = "C#"; +// int transformCount = int.MaxValue; + +//#if DEBUG +// internal static IEnumerable<CSharpLanguage> GetDebugLanguages () +// { +// var decompiler = new CSharpDecompiler (ModuleDefinition.CreateModule ("Dummy", ModuleKind.Dll), new DecompilerSettings ()); +// string lastTransformName = "no transforms"; +// int transformCount = 0; +// foreach (var transform in decompiler.AstTransforms) { +// yield return new CSharpLanguage { +// transformCount = transformCount, +// name = "C# - " + lastTransformName, +// }; +// lastTransformName = "after " + transform.GetType ().Name; +// transformCount++; +// } +// yield return new CSharpLanguage { +// name = "C# - " + lastTransformName, +// }; +// } +//#endif + +// public string Name { +// get { return name; } +// } + +// public string FileExtension { +// get { return ".cs"; } +// } + +// public string ProjectFileExtension { +// get { return ".csproj"; } +// } + + +// CSharpDecompiler CreateDecompiler (ModuleDefinition module, DecompilerSettings options) +// { +// CSharpDecompiler decompiler = new CSharpDecompiler (module, options); +// //decompiler.CancellationToken = options.CancellationToken; +// while (decompiler.AstTransforms.Count > transformCount) +// decompiler.AstTransforms.RemoveAt (decompiler.AstTransforms.Count - 1); +// return decompiler; +// } + +// void WriteCode (ITextOutput output, DecompilerSettings settings, SyntaxTree syntaxTree, IDecompilerTypeSystem typeSystem) +// { +// syntaxTree.AcceptVisitor (new InsertParenthesesVisitor { InsertParenthesesForReadability = true }); +// TokenWriter tokenWriter = new TextTokenWriter (output, settings, typeSystem) { FoldBraces = settings.FoldBraces, /*ExpandMemberDefinitions = settings.ExpandMemberDefinitions */}; +// syntaxTree.AcceptVisitor (new CSharpOutputVisitor (tokenWriter, settings.CSharpFormattingOptions)); +// } + +// public void DecompileMethod (MethodDefinition method, ITextOutput output, DecompilerSettings options) +// { +// AddReferenceWarningMessage (method.Module.Assembly, output); +// WriteCommentLine (output, TypeToString (method.DeclaringType, includeNamespace: true)); +// CSharpDecompiler decompiler = CreateDecompiler (method.Module, options); +// if (method.IsConstructor && !method.DeclaringType.IsValueType) { +// List<IMemberDefinition> members = CollectFieldsAndCtors (method.DeclaringType, method.IsStatic); +// decompiler.AstTransforms.Add (new SelectCtorTransform (decompiler.TypeSystem.Resolve (method))); +// WriteCode (output, options, decompiler.Decompile (members), decompiler.TypeSystem); +// } else { +// WriteCode (output, options, decompiler.Decompile (method), decompiler.TypeSystem); +// } +// } + +// class SelectCtorTransform : IAstTransform +// { +// readonly IMethod ctor; +// readonly HashSet<ISymbol> removedSymbols = new HashSet<ISymbol> (); + +// public SelectCtorTransform (IMethod ctor) +// { +// this.ctor = ctor; +// } + +// public void Run (AstNode rootNode, TransformContext context) +// { +// ConstructorDeclaration ctorDecl = null; +// foreach (var node in rootNode.Children) { +// switch (node) { +// case ConstructorDeclaration ctor: +// if (ctor.GetSymbol () == this.ctor) { +// ctorDecl = ctor; +// } else { +// // remove other ctors +// ctor.Remove (); +// removedSymbols.Add (ctor.GetSymbol ()); +// } +// break; +// case FieldDeclaration fd: +// // Remove any fields without initializers +// if (fd.Variables.All (v => v.Initializer.IsNull)) { +// fd.Remove (); +// removedSymbols.Add (fd.GetSymbol ()); +// } +// break; +// } +// } +// if (ctorDecl?.Initializer.ConstructorInitializerType == ConstructorInitializerType.This) { +// // remove all fields +// foreach (var node in rootNode.Children) { +// switch (node) { +// case FieldDeclaration fd: +// fd.Remove (); +// removedSymbols.Add (fd.GetSymbol ()); +// break; +// } +// } +// } +// foreach (var node in rootNode.Children) { +// if (node is Comment && removedSymbols.Contains (node.GetSymbol ())) +// node.Remove (); +// } +// } +// } + +// public void DecompileProperty (PropertyDefinition property, ITextOutput output, DecompilerSettings options) +// { +// AddReferenceWarningMessage (property.Module.Assembly, output); +// WriteCommentLine (output, TypeToString (property.DeclaringType, includeNamespace: true)); +// CSharpDecompiler decompiler = CreateDecompiler (property.Module, options); +// WriteCode (output, options, decompiler.Decompile (property), decompiler.TypeSystem); +// } + +// public void DecompileField (FieldDefinition field, ITextOutput output, DecompilerSettings options) +// { +// AddReferenceWarningMessage (field.Module.Assembly, output); +// WriteCommentLine (output, TypeToString (field.DeclaringType, includeNamespace: true)); +// CSharpDecompiler decompiler = CreateDecompiler (field.Module, options); +// if (field.IsLiteral) { +// WriteCode (output, options, decompiler.Decompile (field), decompiler.TypeSystem); +// } else { +// List<IMemberDefinition> members = CollectFieldsAndCtors (field.DeclaringType, field.IsStatic); +// decompiler.AstTransforms.Add (new SelectFieldTransform (decompiler.TypeSystem.Resolve (field))); +// WriteCode (output, options, decompiler.Decompile (members), decompiler.TypeSystem); +// } +// } + +// private static List<IMemberDefinition> CollectFieldsAndCtors (TypeDefinition type, bool isStatic) +// { +// var members = new List<IMemberDefinition> (); +// foreach (var field in type.Fields) { +// if (field.IsStatic == isStatic) +// members.Add (field); +// } +// foreach (var ctor in type.Methods) { +// if (ctor.IsConstructor && ctor.IsStatic == isStatic) +// members.Add (ctor); +// } + +// return members; +// } + +// /// <summary> +// /// Removes all top-level members except for the specified fields. +// /// </summary> +// sealed class SelectFieldTransform : IAstTransform +// { +// readonly IField field; + +// public SelectFieldTransform (IField field) +// { +// this.field = field; +// } + +// public void Run (AstNode rootNode, TransformContext context) +// { +// foreach (var node in rootNode.Children) { +// switch (node) { +// case EntityDeclaration ed: +// if (node.GetSymbol () != field) +// node.Remove (); +// break; +// case Comment c: +// if (c.GetSymbol () != field) +// node.Remove (); +// break; +// } +// } +// } +// } + +// public void DecompileEvent (EventDefinition ev, ITextOutput output, DecompilerSettings options) +// { +// AddReferenceWarningMessage (ev.Module.Assembly, output); +// WriteCommentLine (output, TypeToString (ev.DeclaringType, includeNamespace: true)); +// CSharpDecompiler decompiler = CreateDecompiler (ev.Module, options); +// WriteCode (output, options, decompiler.Decompile (ev), decompiler.TypeSystem); +// } + +// public void DecompileType (TypeDefinition type, ITextOutput output, DecompilerSettings options) +// { +// AddReferenceWarningMessage (type.Module.Assembly, output); +// WriteCommentLine (output, TypeToString (type, includeNamespace: true)); +// CSharpDecompiler decompiler = CreateDecompiler (type.Module, options); +// WriteCode (output, options, decompiler.Decompile (type), decompiler.TypeSystem); +// } + +// public static string GetPlatformDisplayName (ModuleDefinition module) +// { +// switch (module.Architecture) { +// case TargetArchitecture.I386: +// if ((module.Attributes & ModuleAttributes.Preferred32Bit) == ModuleAttributes.Preferred32Bit) +// return "AnyCPU (32-bit preferred)"; +// else if ((module.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) +// return "x86"; +// else +// return "AnyCPU (64-bit preferred)"; +// case TargetArchitecture.AMD64: +// return "x64"; +// case TargetArchitecture.IA64: +// return "Itanium"; +// default: +// return module.Architecture.ToString (); +// } +// } + +// public static string GetRuntimeDisplayName (ModuleDefinition module) +// { +// switch (module.Runtime) { +// case TargetRuntime.Net_1_0: +// return ".NET 1.0"; +// case TargetRuntime.Net_1_1: +// return ".NET 1.1"; +// case TargetRuntime.Net_2_0: +// return ".NET 2.0"; +// case TargetRuntime.Net_4_0: +// return ".NET 4.0"; +// } +// return null; +// } + +// void AddReferenceWarningMessage (AssemblyDefinition assembly, ITextOutput output) +// { +// /*var loadedAssembly = MainWindow.Instance.CurrentAssemblyList.GetAssemblies ().FirstOrDefault (la => la.GetAssemblyDefinitionOrNull () == assembly); +// if (loadedAssembly == null || !loadedAssembly.LoadedAssemblyReferencesInfo.HasErrors) +// return; +// const string line1 = "Warning: Some assembly references could not be loaded. This might lead to incorrect decompilation of some parts,"; +// const string line2 = "for ex. property getter/setter access. To get optimal decompilation results, please manually add the references to the list of loaded assemblies."; +// if (output is ISmartTextOutput fancyOutput) { +// fancyOutput.AddUIElement (() => new StackPanel { +// Margin = new Thickness (5), +// Orientation = Orientation.Horizontal, +// Children = { +// new Image { +// Width = 32, +// Height = 32, +// Source = Images.LoadImage(this, "Images/Warning.png") +// }, +// new TextBlock { +// Margin = new Thickness(5, 0, 0, 0), +// Text = line1 + Environment.NewLine + line2 +// } +// } +// }); +// fancyOutput.WriteLine (); +// fancyOutput.AddButton (Images.ViewCode, "Show assembly load log", delegate { +// MainWindow.Instance.SelectNode (MainWindow.Instance.FindTreeNode (assembly).Children.OfType<ReferenceFolderTreeNode> ().First ()); +// }); +// fancyOutput.WriteLine (); +// } else { +// WriteCommentLine (output, line1); +// WriteCommentLine (output, line2); +// }*/ +// } - public string TypeToString (TypeReference type, bool includeNamespace, ICustomAttributeProvider typeAttributes = null) - { - ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions; - if (includeNamespace) - options |= ConvertTypeOptions.IncludeNamespace; - - return TypeToString (options, type, typeAttributes); - } - - string TypeToString (ConvertTypeOptions options, TypeReference type, ICustomAttributeProvider typeAttributes = null) - { - AstType astType = CSharpDecompiler.ConvertType (type, typeAttributes, options); - - StringWriter w = new StringWriter (); - if (type.IsByReference) { - ParameterDefinition pd = typeAttributes as ParameterDefinition; - if (pd != null && (!pd.IsIn && pd.IsOut)) - w.Write ("out "); - else - w.Write ("ref "); - - if (astType is ComposedType && ((ComposedType)astType).PointerRank > 0) - ((ComposedType)astType).PointerRank--; - } - - astType.AcceptVisitor (new CSharpOutputVisitor (w, TypeToStringFormattingOptions)); - return w.ToString (); - } - - static readonly CSharpFormattingOptions TypeToStringFormattingOptions = FormattingOptionsFactory.CreateEmpty (); - - public string FormatPropertyName (PropertyDefinition property, bool? isIndexer) - { - if (property == null) - throw new ArgumentNullException (nameof (property)); - - if (!isIndexer.HasValue) { - isIndexer = property.IsIndexer (); - } - if (isIndexer.Value) { - var buffer = new System.Text.StringBuilder (); - var accessor = property.GetMethod ?? property.SetMethod; - if (accessor.HasOverrides) { - var declaringType = accessor.Overrides [0].DeclaringType; - buffer.Append (TypeToString (declaringType, includeNamespace: true)); - buffer.Append (@"."); - } - buffer.Append (@"this["); - bool addSeparator = false; - foreach (var p in property.Parameters) { - if (addSeparator) - buffer.Append (@", "); - else - addSeparator = true; - buffer.Append (TypeToString (p.ParameterType, includeNamespace: true)); - } - buffer.Append (@"]"); - return buffer.ToString (); - } else - return property.Name; - } - - public string FormatMethodName (MethodDefinition method) - { - if (method == null) - throw new ArgumentNullException ("method"); - - return (method.IsConstructor) ? FormatTypeName (method.DeclaringType) : method.Name; - } - - public string FormatTypeName (TypeDefinition type) - { - if (type == null) - throw new ArgumentNullException ("type"); - - return TypeToString (ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions, type); - } - - public void WriteCommentLine (ITextOutput output, string comment) - { - output.WriteLine ("// " + comment); - } - } -} +// public string TypeToString (TypeReference type, bool includeNamespace, ICustomAttributeProvider typeAttributes = null) +// { +// ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions; +// if (includeNamespace) +// options |= ConvertTypeOptions.IncludeNamespace; + +// return TypeToString (options, type, typeAttributes); +// } + +// string TypeToString (ConvertTypeOptions options, TypeReference type, ICustomAttributeProvider typeAttributes = null) +// { +// AstType astType = CSharpDecompiler.ConvertType (type, typeAttributes, options); + +// StringWriter w = new StringWriter (); +// if (type.IsByReference) { +// ParameterDefinition pd = typeAttributes as ParameterDefinition; +// if (pd != null && (!pd.IsIn && pd.IsOut)) +// w.Write ("out "); +// else +// w.Write ("ref "); + +// if (astType is ComposedType && ((ComposedType)astType).PointerRank > 0) +// ((ComposedType)astType).PointerRank--; +// } + +// astType.AcceptVisitor (new CSharpOutputVisitor (w, TypeToStringFormattingOptions)); +// return w.ToString (); +// } + +// static readonly CSharpFormattingOptions TypeToStringFormattingOptions = FormattingOptionsFactory.CreateEmpty (); + +// public string FormatPropertyName (PropertyDefinition property, bool? isIndexer) +// { +// if (property == null) +// throw new ArgumentNullException (nameof (property)); + +// if (!isIndexer.HasValue) { +// isIndexer = property.IsIndexer (); +// } +// if (isIndexer.Value) { +// var buffer = new System.Text.StringBuilder (); +// var accessor = property.GetMethod ?? property.SetMethod; +// if (accessor.HasOverrides) { +// var declaringType = accessor.Overrides [0].DeclaringType; +// buffer.Append (TypeToString (declaringType, includeNamespace: true)); +// buffer.Append (@"."); +// } +// buffer.Append (@"this["); +// bool addSeparator = false; +// foreach (var p in property.Parameters) { +// if (addSeparator) +// buffer.Append (@", "); +// else +// addSeparator = true; +// buffer.Append (TypeToString (p.ParameterType, includeNamespace: true)); +// } +// buffer.Append (@"]"); +// return buffer.ToString (); +// } else +// return property.Name; +// } + +// public string FormatMethodName (MethodDefinition method) +// { +// if (method == null) +// throw new ArgumentNullException ("method"); + +// return (method.IsConstructor) ? FormatTypeName (method.DeclaringType) : method.Name; +// } + +// public string FormatTypeName (TypeDefinition type) +// { +// if (type == null) +// throw new ArgumentNullException ("type"); + +// return TypeToString (ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions, type); +// } + +// public void WriteCommentLine (ITextOutput output, string comment) +// { +// output.WriteLine ("// " + comment); +// } +// } +//} diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/XmlDocIdLib/XmlDocIdGenerator.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/XmlDocIdLib/XmlDocIdGenerator.cs index 2bc932d588..c67eb02862 100644 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/XmlDocIdLib/XmlDocIdGenerator.cs +++ b/main/src/addins/MonoDevelop.AssemblyBrowser/XmlDocIdLib/XmlDocIdGenerator.cs @@ -1,651 +1,651 @@ -using System; -using System.Collections.Generic; -using System.Text; - -using Mono.Cecil; - -namespace XmlDocIdLib -{ - #region XmlDocIdGenerator - class XmlDocIdGenerator - { - #region Constructors - public XmlDocIdGenerator() - { - this.m_compat = CompatibilityType.Net35; - } - #endregion - - #region Public methods - public string GetXmlDocPath( - MemberReference Member) - { - if (Member == null) - throw new ArgumentNullException("Member"); - - StringBuilder stbBuilder = new StringBuilder(); - List<string> Path = new List<string>(); - - // get path - GetXmlDocPathRecursive(Member, Path); - - // generate string - if (Path.Count == 0) - return string.Empty; - - foreach (string strTemp in Path) - stbBuilder.Append(strTemp); - - return stbBuilder.ToString(); - } - - public void SetCompatibilityType( - CompatibilityType Compatibility) - { - if (Compatibility == CompatibilityType.None) - throw new ArgumentException("Invalid parameter value."); - - this.m_compat = Compatibility; - } - - public CompatibilityType GetCompatibilityType() - { - return this.m_compat; - } - #endregion - - #region Private methods - private string GetXmlDocExplicitIfaceImplPath( - MemberReference Member) - { - TypeReference declaringTypeRef = null; - TypeDefinition declaringTypeDef = null; - string strPath = string.Empty; - - if (Member.DeclaringType is GenericInstanceType) - declaringTypeRef = (Member.DeclaringType as GenericInstanceType).ElementType; - else - declaringTypeRef = Member.DeclaringType; - - // lookup TypeDefinition for TypeReference - declaringTypeDef = TryLookUpTypeDefinition(declaringTypeRef); - - if (declaringTypeDef == null || declaringTypeDef.IsInterface) - return string.Empty; - - foreach (InterfaceImplementation tempIface in declaringTypeDef.Interfaces) - { - var tempIfaceRef = tempIface.InterfaceType; - // check whether this member name begins with interface name (plus generic arguments) - if (Member.Name.StartsWith(this.StripInterfaceName(tempIfaceRef.FullName))) - { - // element begins with interface name, this is explicit interface implementation, - // get explicit interface implementation path - - // add member's name to path, at this point - // name contains interface name (with generic arguments) plus member name - strPath = Member.Name; - - // remove text between "<" and ">" and put interface parameters - // (in explicit mode of course) - int LeftBrace = strPath.IndexOf("<"); - int RightBrace = strPath.LastIndexOf(">"); - - if (LeftBrace != -1 && RightBrace != -1) - { - bool firstAppend = true; - GenericInstanceType tempGenericIfaceDef = null; - StringBuilder stbParameters = new StringBuilder(); - - // convert to definition - tempGenericIfaceDef = tempIfaceRef as GenericInstanceType; - - if (tempGenericIfaceDef == null) - break; - - strPath = strPath.Remove(LeftBrace, (RightBrace - LeftBrace) + 1); - stbParameters.Append("{"); - foreach (TypeReference tempParam in tempGenericIfaceDef.GenericArguments) - { - // in "explicit" mode "@" is used as a separator instead of "," - // in "normal" mode - if (!firstAppend) - stbParameters.Append(CanAppendSpecialExplicitChar() ? "@" : ","); - - GetXmlDocParameterPathRecursive(tempParam, true, stbParameters); - firstAppend = false; - } - stbParameters.Append("}"); - - // insert - strPath = strPath.Insert(LeftBrace, stbParameters.ToString()); - } - - // replace "." with "#" - if (CanAppendSpecialExplicitChar()) - strPath = strPath.Replace(".", "#"); - - return strPath; - } - } - - return string.Empty; - } - - private TypeDefinition TryLookUpTypeDefinition( - TypeReference Reference) - { - // try find in the current assembly - foreach (TypeDefinition tempTypeDef in Reference.Module.Types) - if (tempTypeDef.ToString() == Reference.ToString()) - return tempTypeDef; - - return null; - } - - private string StripInterfaceName( - string OrginalName) - { - StringBuilder builderStrippedName = new StringBuilder(); - - // split name - string[] strSlices = OrginalName.Split(new char[] { '`' }); - - // remove numbers at the begining of each string to "<" charter - if (strSlices.Length > 1) - for (int i = 0; i < strSlices.Length; i++) - if (strSlices[i].Contains("<")) - strSlices[i] = strSlices[i].Remove(0, strSlices[i].IndexOf("<")); - - // build string - foreach (string tempString in strSlices) - builderStrippedName.Append(tempString); - - return builderStrippedName.ToString(); - } - - private void GetXmlDocPathRecursive( - MemberReference Member, - List<string> CurrPath) - { - /* - * determine type of the current member, if current path is empty - * we have also to insert to path element type: - * - "N:" - for namespace (not used here) - * - "T:" - for a type (class, structure, delegate) - * - "M:" - for a method (or constructor) - * - "F:" - for a field - * - "P:" - for a property or indexer - * - "E:" - for an event - */ - - StringBuilder stbTempPath = new StringBuilder(); - string strExplicitPath = string.Empty; - - if (Member is TypeReference) - { - TypeReference thisTypeRef = null; - GenericInstanceType thisGenericTypeDef = null; - GenericParameter thisGenericParam = null; - string strTempTypeName = string.Empty; - - if (Member is GenericInstanceType) - { - thisGenericTypeDef = Member as GenericInstanceType; - thisTypeRef = thisGenericTypeDef.ElementType; - } - else if (Member is GenericParameter) - { - thisGenericParam = Member as GenericParameter; - CurrPath.Add("`" + thisGenericParam.Position.ToString()); - - // return immediatelly, because there is nothing to do. - return; - } - else - { - // cast to TypeReference - thisTypeRef = Member as TypeReference; - } - - // if nested, scan enclosing type - if (this.IsNested(thisTypeRef)) - GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); - - // determine namespace - string strNamespace = string.Empty; - if ((thisTypeRef.Namespace != null && thisTypeRef.Namespace.Length > 0) || thisTypeRef.DeclaringType != null) - strNamespace = thisTypeRef.Namespace + "."; - - // remove "`" char or not - string strTempShortTypeName = thisTypeRef.Name; - if (thisTypeRef.Name.Contains("`") && thisGenericTypeDef != null) - strTempShortTypeName = thisTypeRef.Name.Remove(thisTypeRef.Name.IndexOf("`")); - - // class, interface, structure or delegate - if (CurrPath.Count == 0) - strTempTypeName = "T:" + strNamespace + strTempShortTypeName; - else if (CurrPath.Count > 0 && !this.IsNested(thisTypeRef)) - strTempTypeName = strNamespace + strTempShortTypeName; - else - strTempTypeName = "." + strTempShortTypeName; - - CurrPath.Add(strTempTypeName); - - // add generic _arguments_ (not parameters !) - if (thisTypeRef.Name.Contains("`") && thisGenericTypeDef != null) - { - bool firstAppend = true; - - // open bracket - CurrPath.Add("{"); - - foreach (TypeReference tempGenArgument in thisGenericTypeDef.GenericArguments) - { - // add comma - if (!firstAppend) - CurrPath.Add(","); - - // add argument's xmlDocPath - GetXmlDocPathRecursive(tempGenArgument as MemberReference, CurrPath); - - // first append done - firstAppend = false; - } - - // close bracket - CurrPath.Add("}"); - } - } - else if (Member is MethodReference) - { - var thisMethodDef = Member as MethodReference; - - // method, get type's path firstAppend - CurrPath.Add("M:"); - if (Member.DeclaringType != null) - GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); - - // method's path - // check whether this is constructor method, or explicitly implemented method - strExplicitPath = GetXmlDocExplicitIfaceImplPath(Member);
+//using System; +//using System.Collections.Generic; +//using System.Text; + +//using Mono.Cecil; + +//namespace XmlDocIdLib +//{ +// #region XmlDocIdGenerator +// class XmlDocIdGenerator +// { +// #region Constructors +// public XmlDocIdGenerator() +// { +// this.m_compat = CompatibilityType.Net35; +// } +// #endregion + +// #region Public methods +// public string GetXmlDocPath( +// MemberReference Member) +// { +// if (Member == null) +// throw new ArgumentNullException("Member"); + +// StringBuilder stbBuilder = new StringBuilder(); +// List<string> Path = new List<string>(); + +// // get path +// GetXmlDocPathRecursive(Member, Path); + +// // generate string +// if (Path.Count == 0) +// return string.Empty; + +// foreach (string strTemp in Path) +// stbBuilder.Append(strTemp); + +// return stbBuilder.ToString(); +// } + +// public void SetCompatibilityType( +// CompatibilityType Compatibility) +// { +// if (Compatibility == CompatibilityType.None) +// throw new ArgumentException("Invalid parameter value."); + +// this.m_compat = Compatibility; +// } + +// public CompatibilityType GetCompatibilityType() +// { +// return this.m_compat; +// } +// #endregion + +// #region Private methods +// private string GetXmlDocExplicitIfaceImplPath( +// MemberReference Member) +// { +// TypeReference declaringTypeRef = null; +// TypeDefinition declaringTypeDef = null; +// string strPath = string.Empty; + +// if (Member.DeclaringType is GenericInstanceType) +// declaringTypeRef = (Member.DeclaringType as GenericInstanceType).ElementType; +// else +// declaringTypeRef = Member.DeclaringType; + +// // lookup TypeDefinition for TypeReference +// declaringTypeDef = TryLookUpTypeDefinition(declaringTypeRef); + +// if (declaringTypeDef == null || declaringTypeDef.IsInterface) +// return string.Empty; + +// foreach (InterfaceImplementation tempIface in declaringTypeDef.Interfaces) +// { +// var tempIfaceRef = tempIface.InterfaceType; +// // check whether this member name begins with interface name (plus generic arguments) +// if (Member.Name.StartsWith(this.StripInterfaceName(tempIfaceRef.FullName))) +// { +// // element begins with interface name, this is explicit interface implementation, +// // get explicit interface implementation path + +// // add member's name to path, at this point +// // name contains interface name (with generic arguments) plus member name +// strPath = Member.Name; + +// // remove text between "<" and ">" and put interface parameters +// // (in explicit mode of course) +// int LeftBrace = strPath.IndexOf("<"); +// int RightBrace = strPath.LastIndexOf(">"); + +// if (LeftBrace != -1 && RightBrace != -1) +// { +// bool firstAppend = true; +// GenericInstanceType tempGenericIfaceDef = null; +// StringBuilder stbParameters = new StringBuilder(); + +// // convert to definition +// tempGenericIfaceDef = tempIfaceRef as GenericInstanceType; + +// if (tempGenericIfaceDef == null) +// break; + +// strPath = strPath.Remove(LeftBrace, (RightBrace - LeftBrace) + 1); +// stbParameters.Append("{"); +// foreach (TypeReference tempParam in tempGenericIfaceDef.GenericArguments) +// { +// // in "explicit" mode "@" is used as a separator instead of "," +// // in "normal" mode +// if (!firstAppend) +// stbParameters.Append(CanAppendSpecialExplicitChar() ? "@" : ","); + +// GetXmlDocParameterPathRecursive(tempParam, true, stbParameters); +// firstAppend = false; +// } +// stbParameters.Append("}"); + +// // insert +// strPath = strPath.Insert(LeftBrace, stbParameters.ToString()); +// } + +// // replace "." with "#" +// if (CanAppendSpecialExplicitChar()) +// strPath = strPath.Replace(".", "#"); + +// return strPath; +// } +// } + +// return string.Empty; +// } + +// private TypeDefinition TryLookUpTypeDefinition( +// TypeReference Reference) +// { +// // try find in the current assembly +// foreach (TypeDefinition tempTypeDef in Reference.Module.Types) +// if (tempTypeDef.ToString() == Reference.ToString()) +// return tempTypeDef; + +// return null; +// } + +// private string StripInterfaceName( +// string OrginalName) +// { +// StringBuilder builderStrippedName = new StringBuilder(); + +// // split name +// string[] strSlices = OrginalName.Split(new char[] { '`' }); + +// // remove numbers at the begining of each string to "<" charter +// if (strSlices.Length > 1) +// for (int i = 0; i < strSlices.Length; i++) +// if (strSlices[i].Contains("<")) +// strSlices[i] = strSlices[i].Remove(0, strSlices[i].IndexOf("<")); + +// // build string +// foreach (string tempString in strSlices) +// builderStrippedName.Append(tempString); + +// return builderStrippedName.ToString(); +// } + +// private void GetXmlDocPathRecursive( +// MemberReference Member, +// List<string> CurrPath) +// { +// /* +// * determine type of the current member, if current path is empty +// * we have also to insert to path element type: +// * - "N:" - for namespace (not used here) +// * - "T:" - for a type (class, structure, delegate) +// * - "M:" - for a method (or constructor) +// * - "F:" - for a field +// * - "P:" - for a property or indexer +// * - "E:" - for an event +// */ + +// StringBuilder stbTempPath = new StringBuilder(); +// string strExplicitPath = string.Empty; + +// if (Member is TypeReference) +// { +// TypeReference thisTypeRef = null; +// GenericInstanceType thisGenericTypeDef = null; +// GenericParameter thisGenericParam = null; +// string strTempTypeName = string.Empty; + +// if (Member is GenericInstanceType) +// { +// thisGenericTypeDef = Member as GenericInstanceType; +// thisTypeRef = thisGenericTypeDef.ElementType; +// } +// else if (Member is GenericParameter) +// { +// thisGenericParam = Member as GenericParameter; +// CurrPath.Add("`" + thisGenericParam.Position.ToString()); + +// // return immediatelly, because there is nothing to do. +// return; +// } +// else +// { +// // cast to TypeReference +// thisTypeRef = Member as TypeReference; +// } + +// // if nested, scan enclosing type +// if (this.IsNested(thisTypeRef)) +// GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); + +// // determine namespace +// string strNamespace = string.Empty; +// if ((thisTypeRef.Namespace != null && thisTypeRef.Namespace.Length > 0) || thisTypeRef.DeclaringType != null) +// strNamespace = thisTypeRef.Namespace + "."; + +// // remove "`" char or not +// string strTempShortTypeName = thisTypeRef.Name; +// if (thisTypeRef.Name.Contains("`") && thisGenericTypeDef != null) +// strTempShortTypeName = thisTypeRef.Name.Remove(thisTypeRef.Name.IndexOf("`")); + +// // class, interface, structure or delegate +// if (CurrPath.Count == 0) +// strTempTypeName = "T:" + strNamespace + strTempShortTypeName; +// else if (CurrPath.Count > 0 && !this.IsNested(thisTypeRef)) +// strTempTypeName = strNamespace + strTempShortTypeName; +// else +// strTempTypeName = "." + strTempShortTypeName; + +// CurrPath.Add(strTempTypeName); + +// // add generic _arguments_ (not parameters !) +// if (thisTypeRef.Name.Contains("`") && thisGenericTypeDef != null) +// { +// bool firstAppend = true; + +// // open bracket +// CurrPath.Add("{"); + +// foreach (TypeReference tempGenArgument in thisGenericTypeDef.GenericArguments) +// { +// // add comma +// if (!firstAppend) +// CurrPath.Add(","); + +// // add argument's xmlDocPath +// GetXmlDocPathRecursive(tempGenArgument as MemberReference, CurrPath); + +// // first append done +// firstAppend = false; +// } + +// // close bracket +// CurrPath.Add("}"); +// } +// } +// else if (Member is MethodReference) +// { +// var thisMethodDef = Member as MethodReference; + +// // method, get type's path firstAppend +// CurrPath.Add("M:"); +// if (Member.DeclaringType != null) +// GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); + +// // method's path +// // check whether this is constructor method, or explicitly implemented method +// strExplicitPath = GetXmlDocExplicitIfaceImplPath(Member);
- //if (thisMethodDef.IsStatic && thisMethodDef.IsConstructor)
- // stbTempPath.Append(".#cctor");
- //if (!thisMethodDef.IsStatic && thisMethodDef.IsConstructor)
- // stbTempPath.Append(".#ctor");
- stbTempPath.Append ("."); - if (strExplicitPath.Length > 0) - stbTempPath.Append (strExplicitPath); - else - stbTempPath.Append (thisMethodDef.Name); - - // check whether this method is generic - if (thisMethodDef.GenericParameters.Count > 0) - stbTempPath.Append("``").Append (thisMethodDef.GenericParameters.Count); - - if (thisMethodDef.Parameters.Count > 0) - stbTempPath.Append("("); - bool firstAppend = true; - foreach (ParameterDefinition TempParam in thisMethodDef.Parameters) - { - if (!firstAppend) - stbTempPath.Append(","); - - stbTempPath.Append(GetXmlDocParameterPath(TempParam.ParameterType, false)); - firstAppend = false; - } - - if (thisMethodDef.Parameters.Count > 0) - stbTempPath.Append(")"); - - // check whether this is a conversion operator (implicit or explicit) - // if so, we have to read return type and add "~" char. - //if (IsOperator(thisMethodDef)) - //{ - // OperatorType OpType = GetOperatorType(thisMethodDef); - - // if (OpType == OperatorType.op_Implicit || OpType == OperatorType.op_Explicit) - // { - // // add return type parameter path - // stbTempPath.Append("~"); - // stbTempPath.Append(GetXmlDocParameterPath(thisMethodDef.ReturnType, false)); - // } - //} - - // add to path - CurrPath.Add(stbTempPath.ToString()); - } - else if (Member is FieldReference) - { - // field, get type's path name - CurrPath.Add("F:"); - if (Member.DeclaringType != null) - GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); - - // field's path - CurrPath.Add("." + Member.Name); - } - else if (Member is PropertyReference) - { - // property or indexer, get declaring type's path - CurrPath.Add("P:"); - if (Member.DeclaringType != null) - GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); - - // property's path - // check whether this is explicitly implemented property - strExplicitPath = GetXmlDocExplicitIfaceImplPath(Member); - stbTempPath.Append ("."); - if (strExplicitPath.Length > 0) - stbTempPath.Append (strExplicitPath); - else - stbTempPath.Append (Member.Name); - - // is it an indexer ? - bool firstAppend = true; - PropertyDefinition piProperty = Member as PropertyDefinition; - if (piProperty.Parameters.Count > 0) - stbTempPath.Append("("); - - foreach (ParameterDefinition TempParam in piProperty.Parameters) - { - if (!firstAppend) - stbTempPath.Append(","); - - stbTempPath.Append(GetXmlDocParameterPath(TempParam.ParameterType, false)); - firstAppend = false; - } - - if (piProperty.Parameters.Count > 0) - stbTempPath.Append(")"); - - CurrPath.Add(stbTempPath.ToString()); - } - else if (Member is EventReference) - { - // event, get type's path firstAppend - CurrPath.Add("E:"); - if (Member.DeclaringType != null) - GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); - - // event's path - CurrPath.Add("." + Member.Name); - } - } - - private string GetXmlDocParameterPath( - TypeReference Type, - bool ExplicitMode) - { - StringBuilder stbCurrPath = new StringBuilder(); - - GetXmlDocParameterPathRecursive(Type, ExplicitMode, stbCurrPath); - - return stbCurrPath.ToString(); - } - - private void GetXmlDocParameterPathRecursive( - TypeReference tpType, - bool ExplicitMode, - StringBuilder CurrPath) - { - if (tpType == null) - return; - - if (tpType.GenericParameters.Count > 0) - { - CurrPath.Append(tpType.Namespace) - .Append ((CanAppendSpecialExplicitChar () && ExplicitMode) ? "#" : ".") - .Append(StripGenericName(tpType.Name)); - - // list parameters or types - bool firstAppend = true; - CurrPath.Append("{"); - foreach (GenericParameter TempType in tpType.GenericParameters) - { - if (!firstAppend) - CurrPath.Append(","); - - CurrPath.Append(GetXmlDocParameterPath(TempType, ExplicitMode)); - firstAppend = false; - } - CurrPath.Append("}"); - } - else if (tpType is GenericInstanceType) - { - GenericInstanceType thisGenericType = tpType as GenericInstanceType; - - // if nested, scan enclosing type - if (tpType.DeclaringType != null) - CurrPath.Append(GetXmlDocParameterPath(tpType.DeclaringType, ExplicitMode)); - - // determine namespace - string strNamespace = string.Empty; - if ((tpType.Namespace != null && tpType.Namespace.Length > 0) || tpType.DeclaringType != null) - { - strNamespace = tpType.Namespace + - ((CanAppendSpecialExplicitChar() && ExplicitMode) ? "#" : "."); - } - - CurrPath.Append(strNamespace).Append (StripGenericName(thisGenericType.Name)); - - // list parameters or types - bool firstAppend = true; - CurrPath.Append("{"); - foreach (TypeReference tempTypeRef in thisGenericType.GenericArguments) - { - if (!firstAppend) - CurrPath.Append(","); - - CurrPath.Append(GetXmlDocParameterPath(tempTypeRef, ExplicitMode)); - firstAppend = false; - } - CurrPath.Append("}"); - } - else if (tpType is GenericParameter) - { - GenericParameter thisGenParam = tpType as GenericParameter; - - if (ExplicitMode) - { - // in explicit mode we print parameter name - CurrPath.Append(thisGenParam.Name); - } - else - { - // in non-explicit mode we print parameter order - int paramOrder = 0; - - // find - for (int i = 0; i < thisGenParam.Owner.GenericParameters.Count; i++) - { - if (thisGenParam.Owner.GenericParameters[i].Name == tpType.Name) - { - paramOrder = i; - break; - } - } - if (thisGenParam.Owner is MethodReference) - CurrPath.Append("``").Append (paramOrder); - else - CurrPath.Append("`").Append (paramOrder); - } - } - else if (tpType is PointerType) - { - // parameter is pointer type - CurrPath.Append(GetXmlDocParameterPath((tpType as PointerType).ElementType, ExplicitMode)); - CurrPath.Append("*"); - } - else if (tpType is ArrayType) - { - ArrayType thisArrayType = tpType as ArrayType; - if (thisArrayType.ElementType != null) - CurrPath.Append(GetXmlDocParameterPath(thisArrayType.ElementType, ExplicitMode)); - - int iRank = thisArrayType.Rank; - if (iRank == 1) - { - CurrPath.Append("[]"); - } - else - { - bool firstAppend = true; - CurrPath.Append("["); - - for (int i = 0; i < (ExplicitMode ? iRank - 1 : iRank); i++) - { - // in explicit mode for .NET3.5/VS2008, - // there is no separator char "," used for multi-dimensional array, - // so there are three cases when comma shall be added: - // firstAppend = false; ExplicitMode = false; CanAppendSpecialExplicitChar() = true; - // firstAppend = false; ExplicitMode = false; CanAppendSpecialExplicitChar() = false; - // firstAppend = false; ExplicitMode = true; CanAppendSpecialExplicitChar() = false; - // below this is stored in decent manner - if (!firstAppend && (!ExplicitMode || !CanAppendSpecialExplicitChar())) - CurrPath.Append(","); - - CurrPath.Append(((CanAppendSpecialExplicitChar() && ExplicitMode) ? "@" : "0:")); - if (thisArrayType.Dimensions[i].UpperBound > 0) - CurrPath.Append(thisArrayType.Dimensions[i].UpperBound.ToString()); - firstAppend = false; - } - - CurrPath.Append("]"); - } - } -// else if (!tpType.IsValueType) +// //if (thisMethodDef.IsStatic && thisMethodDef.IsConstructor)
+// // stbTempPath.Append(".#cctor");
+// //if (!thisMethodDef.IsStatic && thisMethodDef.IsConstructor)
+// // stbTempPath.Append(".#ctor");
+// stbTempPath.Append ("."); +// if (strExplicitPath.Length > 0) +// stbTempPath.Append (strExplicitPath); +// else +// stbTempPath.Append (thisMethodDef.Name); + +// // check whether this method is generic +// if (thisMethodDef.GenericParameters.Count > 0) +// stbTempPath.Append("``").Append (thisMethodDef.GenericParameters.Count); + +// if (thisMethodDef.Parameters.Count > 0) +// stbTempPath.Append("("); +// bool firstAppend = true; +// foreach (ParameterDefinition TempParam in thisMethodDef.Parameters) +// { +// if (!firstAppend) +// stbTempPath.Append(","); + +// stbTempPath.Append(GetXmlDocParameterPath(TempParam.ParameterType, false)); +// firstAppend = false; +// } + +// if (thisMethodDef.Parameters.Count > 0) +// stbTempPath.Append(")"); + +// // check whether this is a conversion operator (implicit or explicit) +// // if so, we have to read return type and add "~" char. +// //if (IsOperator(thisMethodDef)) +// //{ +// // OperatorType OpType = GetOperatorType(thisMethodDef); + +// // if (OpType == OperatorType.op_Implicit || OpType == OperatorType.op_Explicit) +// // { +// // // add return type parameter path +// // stbTempPath.Append("~"); +// // stbTempPath.Append(GetXmlDocParameterPath(thisMethodDef.ReturnType, false)); +// // } +// //} + +// // add to path +// CurrPath.Add(stbTempPath.ToString()); +// } +// else if (Member is FieldReference) // { -// // parameter is passed by reference -// CurrPath.Append(GetXmlDocParameterPath((tpType as ReferenceType).ElementType, false)); -// CurrPath.Append("@"); +// // field, get type's path name +// CurrPath.Add("F:"); +// if (Member.DeclaringType != null) +// GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); + +// // field's path +// CurrPath.Add("." + Member.Name); // } -// else if (tpType is ModifierOptional) +// else if (Member is PropertyReference) +// { +// // property or indexer, get declaring type's path +// CurrPath.Add("P:"); +// if (Member.DeclaringType != null) +// GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); + +// // property's path +// // check whether this is explicitly implemented property +// strExplicitPath = GetXmlDocExplicitIfaceImplPath(Member); +// stbTempPath.Append ("."); +// if (strExplicitPath.Length > 0) +// stbTempPath.Append (strExplicitPath); +// else +// stbTempPath.Append (Member.Name); + +// // is it an indexer ? +// bool firstAppend = true; +// PropertyDefinition piProperty = Member as PropertyDefinition; +// if (piProperty.Parameters.Count > 0) +// stbTempPath.Append("("); + +// foreach (ParameterDefinition TempParam in piProperty.Parameters) +// { +// if (!firstAppend) +// stbTempPath.Append(","); + +// stbTempPath.Append(GetXmlDocParameterPath(TempParam.ParameterType, false)); +// firstAppend = false; +// } + +// if (piProperty.Parameters.Count > 0) +// stbTempPath.Append(")"); + +// CurrPath.Add(stbTempPath.ToString()); +// } +// else if (Member is EventReference) +// { +// // event, get type's path firstAppend +// CurrPath.Add("E:"); +// if (Member.DeclaringType != null) +// GetXmlDocPathRecursive(Member.DeclaringType, CurrPath); + +// // event's path +// CurrPath.Add("." + Member.Name); +// } +// } + +// private string GetXmlDocParameterPath( +// TypeReference Type, +// bool ExplicitMode) +// { +// StringBuilder stbCurrPath = new StringBuilder(); + +// GetXmlDocParameterPathRecursive(Type, ExplicitMode, stbCurrPath); + +// return stbCurrPath.ToString(); +// } + +// private void GetXmlDocParameterPathRecursive( +// TypeReference tpType, +// bool ExplicitMode, +// StringBuilder CurrPath) +// { +// if (tpType == null) +// return; + +// if (tpType.GenericParameters.Count > 0) +// { +// CurrPath.Append(tpType.Namespace) +// .Append ((CanAppendSpecialExplicitChar () && ExplicitMode) ? "#" : ".") +// .Append(StripGenericName(tpType.Name)); + +// // list parameters or types +// bool firstAppend = true; +// CurrPath.Append("{"); +// foreach (GenericParameter TempType in tpType.GenericParameters) +// { +// if (!firstAppend) +// CurrPath.Append(","); + +// CurrPath.Append(GetXmlDocParameterPath(TempType, ExplicitMode)); +// firstAppend = false; +// } +// CurrPath.Append("}"); +// } +// else if (tpType is GenericInstanceType) +// { +// GenericInstanceType thisGenericType = tpType as GenericInstanceType; + +// // if nested, scan enclosing type +// if (tpType.DeclaringType != null) +// CurrPath.Append(GetXmlDocParameterPath(tpType.DeclaringType, ExplicitMode)); + +// // determine namespace +// string strNamespace = string.Empty; +// if ((tpType.Namespace != null && tpType.Namespace.Length > 0) || tpType.DeclaringType != null) +// { +// strNamespace = tpType.Namespace + +// ((CanAppendSpecialExplicitChar() && ExplicitMode) ? "#" : "."); +// } + +// CurrPath.Append(strNamespace).Append (StripGenericName(thisGenericType.Name)); + +// // list parameters or types +// bool firstAppend = true; +// CurrPath.Append("{"); +// foreach (TypeReference tempTypeRef in thisGenericType.GenericArguments) +// { +// if (!firstAppend) +// CurrPath.Append(","); + +// CurrPath.Append(GetXmlDocParameterPath(tempTypeRef, ExplicitMode)); +// firstAppend = false; +// } +// CurrPath.Append("}"); +// } +// else if (tpType is GenericParameter) +// { +// GenericParameter thisGenParam = tpType as GenericParameter; + +// if (ExplicitMode) +// { +// // in explicit mode we print parameter name +// CurrPath.Append(thisGenParam.Name); +// } +// else +// { +// // in non-explicit mode we print parameter order +// int paramOrder = 0; + +// // find +// for (int i = 0; i < thisGenParam.Owner.GenericParameters.Count; i++) +// { +// if (thisGenParam.Owner.GenericParameters[i].Name == tpType.Name) +// { +// paramOrder = i; +// break; +// } +// } +// if (thisGenParam.Owner is MethodReference) +// CurrPath.Append("``").Append (paramOrder); +// else +// CurrPath.Append("`").Append (paramOrder); +// } +// } +// else if (tpType is PointerType) +// { +// // parameter is pointer type +// CurrPath.Append(GetXmlDocParameterPath((tpType as PointerType).ElementType, ExplicitMode)); +// CurrPath.Append("*"); +// } +// else if (tpType is ArrayType) +// { +// ArrayType thisArrayType = tpType as ArrayType; +// if (thisArrayType.ElementType != null) +// CurrPath.Append(GetXmlDocParameterPath(thisArrayType.ElementType, ExplicitMode)); + +// int iRank = thisArrayType.Rank; +// if (iRank == 1) +// { +// CurrPath.Append("[]"); +// } +// else +// { +// bool firstAppend = true; +// CurrPath.Append("["); + +// for (int i = 0; i < (ExplicitMode ? iRank - 1 : iRank); i++) +// { +// // in explicit mode for .NET3.5/VS2008, +// // there is no separator char "," used for multi-dimensional array, +// // so there are three cases when comma shall be added: +// // firstAppend = false; ExplicitMode = false; CanAppendSpecialExplicitChar() = true; +// // firstAppend = false; ExplicitMode = false; CanAppendSpecialExplicitChar() = false; +// // firstAppend = false; ExplicitMode = true; CanAppendSpecialExplicitChar() = false; +// // below this is stored in decent manner +// if (!firstAppend && (!ExplicitMode || !CanAppendSpecialExplicitChar())) +// CurrPath.Append(","); + +// CurrPath.Append(((CanAppendSpecialExplicitChar() && ExplicitMode) ? "@" : "0:")); +// if (thisArrayType.Dimensions[i].UpperBound > 0) +// CurrPath.Append(thisArrayType.Dimensions[i].UpperBound.ToString()); +// firstAppend = false; +// } + +// CurrPath.Append("]"); +// } +// } +//// else if (!tpType.IsValueType) +//// { +//// // parameter is passed by reference +//// CurrPath.Append(GetXmlDocParameterPath((tpType as ReferenceType).ElementType, false)); +//// CurrPath.Append("@"); +//// } +//// else if (tpType is ModifierOptional) +//// { +//// // parameter has optional modifier +//// ModifierOptional thisModOpt = tpType as ModifierOptional; +//// +//// CurrPath.Append(GetXmlDocParameterPath(thisModOpt.ElementType, ExplicitMode)); +//// CurrPath.Append("!"); +//// CurrPath.Append(GetXmlDocParameterPath(thisModOpt.ModifierType, ExplicitMode)); +//// } +//// else if (tpType is ModifierRequired) +//// { +//// // parameter has required modifier +//// ModifierRequired thisModReq = tpType as ModifierRequired; +//// +//// CurrPath.Append(GetXmlDocParameterPath(thisModReq.ElementType, ExplicitMode)); +//// CurrPath.Append("|"); +//// CurrPath.Append(GetXmlDocParameterPath(thisModReq.ModifierType, ExplicitMode)); +//// } +// else if (tpType is FunctionPointerType) +// { +// // type is function pointer +// FunctionPointerType thisFuncPtr = tpType as FunctionPointerType; +//// string tempString = string.Empty; + +// // return type +// CurrPath.Append("=FUNC:"); +// CurrPath.Append(GetXmlDocParameterPath(thisFuncPtr.ReturnType, ExplicitMode)); + +// // method's parameters +// if (thisFuncPtr.Parameters.Count > 0) +// { +// bool firstAppend = true; +// CurrPath.Append("("); + +// foreach (ParameterDefinition tempParam in thisFuncPtr.Parameters) +// { +// if (!firstAppend) +// CurrPath.Append(","); + +// CurrPath.Append(GetXmlDocParameterPath(tempParam.ParameterType, ExplicitMode)); +// firstAppend = false; +// } + +// CurrPath.Append(")"); +// } +// else +// { +// CurrPath.Append("(System.Void)"); +// } +// } +// else if (tpType is PinnedType) +// { +// // type is pinned type +// CurrPath.Append(GetXmlDocParameterPath((tpType as PinnedType).ElementType, ExplicitMode)); +// CurrPath.Append("^"); +// } +// else if (tpType is TypeReference) +// { +// // if nested, scan enclosing type +// if (tpType.DeclaringType != null) +// CurrPath.Append(GetXmlDocParameterPath(tpType.DeclaringType, ExplicitMode)); + +// // determine namespace +// string strNamespace = string.Empty; +// if ((tpType.Namespace != null && tpType.Namespace.Length > 0) || tpType.DeclaringType != null) +// { +// strNamespace = tpType.Namespace + +// ((CanAppendSpecialExplicitChar() && ExplicitMode) ? "#" : "."); +// } + +// // concrete type +// CurrPath.Append(strNamespace).Append ( +// ((CanAppendSpecialExplicitChar() && ExplicitMode) ? tpType.Name.Replace(".", "#") : tpType.Name)); +// } +// } + +// private OperatorType GetOperatorType(MethodDefinition OperatorMethod) +// { +// try // { -// // parameter has optional modifier -// ModifierOptional thisModOpt = tpType as ModifierOptional; -// -// CurrPath.Append(GetXmlDocParameterPath(thisModOpt.ElementType, ExplicitMode)); -// CurrPath.Append("!"); -// CurrPath.Append(GetXmlDocParameterPath(thisModOpt.ModifierType, ExplicitMode)); +// return (OperatorType)Enum.Parse(typeof(OperatorType), OperatorMethod.Name.Trim()); // } -// else if (tpType is ModifierRequired) +// catch // { -// // parameter has required modifier -// ModifierRequired thisModReq = tpType as ModifierRequired; -// -// CurrPath.Append(GetXmlDocParameterPath(thisModReq.ElementType, ExplicitMode)); -// CurrPath.Append("|"); -// CurrPath.Append(GetXmlDocParameterPath(thisModReq.ModifierType, ExplicitMode)); +// return OperatorType.None; // } - else if (tpType is FunctionPointerType) - { - // type is function pointer - FunctionPointerType thisFuncPtr = tpType as FunctionPointerType; -// string tempString = string.Empty; - - // return type - CurrPath.Append("=FUNC:"); - CurrPath.Append(GetXmlDocParameterPath(thisFuncPtr.ReturnType, ExplicitMode)); - - // method's parameters - if (thisFuncPtr.Parameters.Count > 0) - { - bool firstAppend = true; - CurrPath.Append("("); - - foreach (ParameterDefinition tempParam in thisFuncPtr.Parameters) - { - if (!firstAppend) - CurrPath.Append(","); - - CurrPath.Append(GetXmlDocParameterPath(tempParam.ParameterType, ExplicitMode)); - firstAppend = false; - } - - CurrPath.Append(")"); - } - else - { - CurrPath.Append("(System.Void)"); - } - } - else if (tpType is PinnedType) - { - // type is pinned type - CurrPath.Append(GetXmlDocParameterPath((tpType as PinnedType).ElementType, ExplicitMode)); - CurrPath.Append("^"); - } - else if (tpType is TypeReference) - { - // if nested, scan enclosing type - if (tpType.DeclaringType != null) - CurrPath.Append(GetXmlDocParameterPath(tpType.DeclaringType, ExplicitMode)); - - // determine namespace - string strNamespace = string.Empty; - if ((tpType.Namespace != null && tpType.Namespace.Length > 0) || tpType.DeclaringType != null) - { - strNamespace = tpType.Namespace + - ((CanAppendSpecialExplicitChar() && ExplicitMode) ? "#" : "."); - } - - // concrete type - CurrPath.Append(strNamespace).Append ( - ((CanAppendSpecialExplicitChar() && ExplicitMode) ? tpType.Name.Replace(".", "#") : tpType.Name)); - } - } - - private OperatorType GetOperatorType(MethodDefinition OperatorMethod) - { - try - { - return (OperatorType)Enum.Parse(typeof(OperatorType), OperatorMethod.Name.Trim()); - } - catch - { - return OperatorType.None; - } - } - - public bool IsNested( - TypeReference Type) - { - if (Type.IsNested) - return true; - - return false; - } - - private bool IsOperator(MethodDefinition Method) - { - if (Method.IsSpecialName && Method.Name.StartsWith("op_")) - return true; - - return false; - } - - private bool CanAppendSpecialExplicitChar() - { - if (m_compat == CompatibilityType.Net35) - return true; - - return false; - } - - private string StripGenericName(string OrginalClassName) - { - if (OrginalClassName.IndexOf("`") != -1) - return OrginalClassName.Remove(OrginalClassName.IndexOf("`")); - else - return OrginalClassName; - } - #endregion - - #region Private members - private CompatibilityType m_compat; - #endregion - } - #endregion -} +// } + +// public bool IsNested( +// TypeReference Type) +// { +// if (Type.IsNested) +// return true; + +// return false; +// } + +// private bool IsOperator(MethodDefinition Method) +// { +// if (Method.IsSpecialName && Method.Name.StartsWith("op_")) +// return true; + +// return false; +// } + +// private bool CanAppendSpecialExplicitChar() +// { +// if (m_compat == CompatibilityType.Net35) +// return true; + +// return false; +// } + +// private string StripGenericName(string OrginalClassName) +// { +// if (OrginalClassName.IndexOf("`") != -1) +// return OrginalClassName.Remove(OrginalClassName.IndexOf("`")); +// else +// return OrginalClassName; +// } +// #endregion + +// #region Private members +// private CompatibilityType m_compat; +// #endregion +// } +// #endregion +//} diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/packages.config b/main/src/addins/MonoDevelop.AssemblyBrowser/packages.config deleted file mode 100644 index 66c14c17d2..0000000000 --- a/main/src/addins/MonoDevelop.AssemblyBrowser/packages.config +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<packages> - <package id="Mono.Cecil" version="0.10.0-beta6" targetFramework="net45" /> -</packages>
\ No newline at end of file |