@@ -92,16 +92,15 @@ public void Execute(TextViewContext context)
9292 }
9393 }
9494
95- static string GetFullPath ( SharpTreeNode node )
95+ static string GetPackageFolderPath ( SharpTreeNode node )
9696 {
97- if ( node is PackageFolderTreeNode )
97+ string name = "" ;
98+ while ( node is PackageFolderTreeNode )
9899 {
99- string name = node . Text + "\\ " ;
100- if ( GetFullPath ( node . Parent ) is string parent )
101- return parent + "\\ " + name ;
102- return name ;
100+ name = Path . Combine ( node . Text . ToString ( ) , name ) ;
101+ node = node . Parent ;
103102 }
104- return null ;
103+ return name ;
105104 }
106105
107106 internal static void Save ( DockWorkspace dockWorkspace , IEnumerable < SharpTreeNode > nodes , string path , bool isFile )
@@ -113,12 +112,12 @@ internal static void Save(DockWorkspace dockWorkspace, IEnumerable<SharpTreeNode
113112 {
114113 if ( node is AssemblyTreeNode { PackageEntry : { } assembly } )
115114 {
116- string fileName = isFile ? path : Path . Combine ( path , GetFullPath ( node . Parent ) + WholeProjectDecompiler . SanitizeFileName ( assembly . Name ) ) ;
115+ string fileName = isFile ? path : Path . Combine ( path , GetPackageFolderPath ( node . Parent ) , assembly . Name ) ;
117116 SaveEntry ( output , assembly , fileName ) ;
118117 }
119118 else if ( node is ResourceTreeNode { Resource : PackageEntry { } resource } )
120119 {
121- string fileName = isFile ? path : Path . Combine ( path , GetFullPath ( node . Parent ) + WholeProjectDecompiler . SanitizeFileName ( resource . Name ) ) ;
120+ string fileName = isFile ? path : Path . Combine ( path , GetPackageFolderPath ( node . Parent ) , resource . Name ) ;
122121 SaveEntry ( output , resource , fileName ) ;
123122 }
124123 else if ( node is PackageFolderTreeNode )
@@ -128,17 +127,17 @@ internal static void Save(DockWorkspace dockWorkspace, IEnumerable<SharpTreeNode
128127 {
129128 if ( item is AssemblyTreeNode { PackageEntry : { } asm } )
130129 {
131- string fileName = Path . Combine ( path , GetFullPath ( item . Parent ) + WholeProjectDecompiler . SanitizeFileName ( asm . Name ) ) ;
130+ string fileName = Path . Combine ( path , GetPackageFolderPath ( item . Parent ) , asm . Name ) ;
132131 SaveEntry ( output , asm , fileName ) ;
133132 }
134133 else if ( item is ResourceTreeNode { Resource : PackageEntry { } entry } )
135134 {
136- string fileName = Path . Combine ( path , GetFullPath ( item . Parent ) + WholeProjectDecompiler . SanitizeFileName ( entry . Name ) ) ;
135+ string fileName = Path . Combine ( path , GetPackageFolderPath ( item . Parent ) , entry . Name ) ;
137136 SaveEntry ( output , entry , fileName ) ;
138137 }
139138 else if ( item is PackageFolderTreeNode )
140139 {
141- Directory . CreateDirectory ( Path . Combine ( path , GetFullPath ( item ) ) ) ;
140+ Directory . CreateDirectory ( Path . Combine ( path , GetPackageFolderPath ( item ) ) ) ;
142141 }
143142 }
144143 }
@@ -155,6 +154,7 @@ internal static void Save(DockWorkspace dockWorkspace, IEnumerable<SharpTreeNode
155154 static void SaveEntry ( ITextOutput output , PackageEntry entry , string targetFileName )
156155 {
157156 output . Write ( entry . Name + ": " ) ;
157+ targetFileName = WholeProjectDecompiler . SanitizeFileName ( targetFileName ) ;
158158 using Stream stream = entry . TryOpenStream ( ) ;
159159 if ( stream == null )
160160 {
@@ -214,16 +214,12 @@ public void Execute(TextViewContext context)
214214
215215 public bool IsVisible ( TextViewContext context )
216216 {
217- if ( context . SelectedTreeNodes is [ AssemblyTreeNode { PackageEntry : null } asm ] )
217+ if ( context . SelectedTreeNodes is [ AssemblyTreeNode { LoadedAssembly . IsLoaded : true , LoadedAssembly . HasLoadError : false , PackageEntry : null } asm ] )
218218 {
219- try
220- {
221- if ( asm . LoadedAssembly . GetLoadResultAsync ( ) . GetAwaiter ( ) . GetResult ( ) . Package is { Kind : PackageKind . Bundle } )
222- return true ;
223- }
224- catch
225- {
226- }
219+ // Using .GetAwaiter().GetResult() is no problem here, since we already checked IsLoaded and HasLoadError.
220+ var loadResult = asm . LoadedAssembly . GetLoadResultAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
221+ if ( loadResult . Package is { Kind : PackageKind . Bundle } )
222+ return true ;
227223 }
228224 return false ;
229225 }
0 commit comments