88using Roslyn . Scripting . CSharp ;
99
1010using ScriptCs . Contracts ;
11+ using System . Text . RegularExpressions ;
1112
1213namespace ScriptCs . Engine . Roslyn
1314{
@@ -116,7 +117,7 @@ public ScriptResult Execute(string code, string[] scriptArgs, AssemblyReferences
116117 sessionState . References . Assemblies . Add ( assembly ) ;
117118 }
118119
119- var newNamespaces = namespaces . Except ( sessionState . Namespaces ) ;
120+ var newNamespaces = namespaces . Except ( sessionState . Namespaces ) ;
120121
121122 foreach ( var @namespace in newNamespaces )
122123 {
@@ -129,6 +130,22 @@ public ScriptResult Execute(string code, string[] scriptArgs, AssemblyReferences
129130 Logger . Debug ( "Starting execution" ) ;
130131
131132 var result = Execute ( code , sessionState . Session ) ;
133+
134+ if ( result . InvalidNamespaces != null && result . InvalidNamespaces . Any ( ) )
135+ {
136+ var pendingNamespacesField = sessionState . Session . GetType ( ) . GetField ( "pendingNamespaces" , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . NonPublic ) ;
137+ var pendingNamespacesValue = ( ReadOnlyArray < string > ) pendingNamespacesField . GetValue ( sessionState . Session ) ;
138+ var fixedNamespaces = pendingNamespacesValue . ToList ( ) ;
139+
140+ foreach ( var @namespace in result . InvalidNamespaces )
141+ {
142+ sessionState . Namespaces . Remove ( @namespace ) ;
143+ fixedNamespaces . Remove ( @namespace ) ;
144+ }
145+
146+ pendingNamespacesField . SetValue ( sessionState . Session , ReadOnlyArray < string > . CreateFrom < string > ( fixedNamespaces ) ) ;
147+ }
148+
132149 Logger . Debug ( "Finished execution" ) ;
133150 return result ;
134151 }
@@ -161,6 +178,12 @@ protected virtual ScriptResult Execute(string code, Session session)
161178 }
162179 catch ( Exception ex )
163180 {
181+ if ( ex . Message . StartsWith ( "error CS0246" ) )
182+ {
183+ var offendingNamespace = Regex . Match ( ex . Message , @"\'([^']*)\'" ) . Groups [ 1 ] . Value ;
184+ return new ScriptResult ( compilationException : ex , invalidNamespaces : new string [ 1 ] { offendingNamespace } ) ;
185+ }
186+
164187 return new ScriptResult ( compilationException : ex ) ;
165188 }
166189 }
0 commit comments