Skip to content

Commit 2d8bbfe

Browse files
committed
pass invalid namespaces up to executor as it keeps it's own list
catch ex CS0246 and extract namespace
1 parent f8bd1cc commit 2d8bbfe

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

src/ScriptCs.Contracts/ScriptResult.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Runtime.ExceptionServices;
34

45
namespace ScriptCs.Contracts
@@ -18,7 +19,8 @@ public ScriptResult()
1819
public ScriptResult(
1920
object returnValue = null,
2021
Exception executionException = null,
21-
Exception compilationException = null)
22+
Exception compilationException = null,
23+
IEnumerable<string> invalidNamespaces = null)
2224
{
2325
if (returnValue != null)
2426
{
@@ -35,6 +37,11 @@ public ScriptResult(
3537
CompileExceptionInfo = ExceptionDispatchInfo.Capture(compilationException);
3638
}
3739

40+
if (invalidNamespaces != null)
41+
{
42+
InvalidNamespaces = new HashSet<string>(invalidNamespaces);
43+
}
44+
3845
IsCompleteSubmission = true;
3946
}
4047

@@ -44,6 +51,8 @@ public ScriptResult(
4451

4552
public ExceptionDispatchInfo CompileExceptionInfo { get; private set; }
4653

54+
public HashSet<string> InvalidNamespaces { get; private set; }
55+
4756
public bool IsCompleteSubmission { get; private set; }
4857
}
4958
}

src/ScriptCs.Core/Repl.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ public override ScriptResult Execute(string script, params string[] scriptArgs)
124124
Console.WriteLine(result.ExecuteExceptionInfo.SourceException.Message);
125125
}
126126

127+
if (result.InvalidNamespaces != null && result.InvalidNamespaces.Any())
128+
{
129+
RemoveNamespaces(result.InvalidNamespaces.ToArray());
130+
}
131+
127132
if (!result.IsCompleteSubmission)
128133
{
129134
return result;

src/ScriptCs.Engine.Roslyn/RoslynScriptEngine.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Roslyn.Scripting.CSharp;
99

1010
using ScriptCs.Contracts;
11+
using System.Text.RegularExpressions;
1112

1213
namespace 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

Comments
 (0)