Skip to content

Commit 65a1110

Browse files
committed
fix: null reference exception when code includes comments
1 parent 15fe3ea commit 65a1110

2 files changed

Lines changed: 50 additions & 30 deletions

File tree

RoslynSyntaxTool/Manager/CompilationUtilitys.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ public static MemoryStream CompileClientProxy(IEnumerable<SyntaxTree> trees)
2424
MetadataReference.CreateFromFile(typeof(SyntaxFactory).GetTypeInfo().Assembly.Location)
2525
};
2626
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
27-
var allReferences = assemblies.Where(c => !c.IsDynamic).Select(x => {
28-
var f = MetadataReference.CreateFromFile(x.Location);
29-
return f;
27+
var allReferences = assemblies.Where(c => !c.IsDynamic).Select(x =>
28+
{
29+
var f = MetadataReference.CreateFromFile(x.Location);
30+
return f;
3031
}).Concat(references);
3132
return Compile(AssemblyInfo.Create("RoslynSyntaxTool.Proxy.ConvertToCSharpProxy"), trees, allReferences);
3233
}
@@ -44,11 +45,8 @@ public static MemoryStream Compile(string assemblyName, AssemblyInfo assemblyInf
4445
var result = compilation.Emit(stream);
4546
if (!result.Success)
4647
{
47-
foreach (var message in result.Diagnostics.Select(i => i.ToString()))
48-
{
49-
System.Console.WriteLine(message);
50-
}
51-
return null;
48+
var msgs = result.Diagnostics.Select(i => i.ToString());
49+
throw new Exception("语法树动态编译出错\r\n===Start===\r\n"+ string.Join("\r\n", msgs)+"\r\n===End===\r\n请将源码和报错信息反馈至开发者,谢谢\r\n\r\n");
5250
}
5351
stream.Seek(0, SeekOrigin.Begin);
5452
return stream;

RoslynSyntaxTool/ViewModel/ConvertToCSharpPageViewModel.cs

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Windows;
1111
using CommunityToolkit.Mvvm.ComponentModel;
1212
using CommunityToolkit.Mvvm.Input;
13+
using ControlzEx.Standard;
1314
using ICSharpCode.AvalonEdit.Document;
1415
using ICSharpCode.AvalonEdit.Highlighting;
1516
using Microsoft.CodeAnalysis;
@@ -88,6 +89,20 @@ private void ContinueAction()
8889
.WithUsings(
8990
SyntaxFactory.List<UsingDirectiveSyntax>(
9091
new UsingDirectiveSyntax[]{
92+
SyntaxFactory.UsingDirective(
93+
SyntaxFactory.IdentifierName("System"))
94+
.WithUsingKeyword(
95+
SyntaxFactory.Token(
96+
SyntaxFactory.TriviaList(),
97+
SyntaxKind.UsingKeyword,
98+
SyntaxFactory.TriviaList(
99+
SyntaxFactory.Space)))
100+
.WithSemicolonToken(
101+
SyntaxFactory.Token(
102+
SyntaxFactory.TriviaList(),
103+
SyntaxKind.SemicolonToken,
104+
SyntaxFactory.TriviaList(
105+
SyntaxFactory.CarriageReturnLineFeed))),
91106
SyntaxFactory.UsingDirective(
92107
SyntaxFactory.QualifiedName(
93108
SyntaxFactory.IdentifierName("Microsoft"),
@@ -264,39 +279,46 @@ private void ContinueAction()
264279

265280

266281
var stream = CompilationUtilitys.CompileClientProxy(new List<SyntaxTree>() { treeFrame });
267-
268-
using (stream)
282+
if (stream!=null)
269283
{
270-
var assembly = Assembly.Load(stream.ToArray());
271-
_generatedServiceProxyAssembly = assembly;
284+
using (stream)
285+
{
286+
var assembly = Assembly.Load(stream.ToArray());
287+
_generatedServiceProxyAssembly = assembly;
272288

273-
}
274-
var serviceProxyTypes = _generatedServiceProxyAssembly.GetExportedTypes();
289+
}
290+
var serviceProxyTypes = _generatedServiceProxyAssembly.GetExportedTypes();
275291

276-
object serviceProxyObject = null;
277-
Type serviceProxyObjectType = null;
292+
object serviceProxyObject = null;
293+
Type serviceProxyObjectType = null;
278294

279-
foreach (var serviceProxyType in serviceProxyTypes)
280-
{
281-
var typeInfo = serviceProxyType.GetTypeInfo();
282-
if (typeInfo.FullName=="RoslynSyntaxTool.Process.ProxyTreeGen")
295+
foreach (var serviceProxyType in serviceProxyTypes)
283296
{
284-
serviceProxyObjectType=serviceProxyType;
285-
var instance = serviceProxyType.GetTypeInfo().GetConstructors().First().Invoke(null);
286-
serviceProxyObject=instance;
287-
}
297+
var typeInfo = serviceProxyType.GetTypeInfo();
298+
if (typeInfo.FullName=="RoslynSyntaxTool.Process.ProxyTreeGen")
299+
{
300+
serviceProxyObjectType=serviceProxyType;
301+
var instance = serviceProxyType.GetTypeInfo().GetConstructors().First().Invoke(null);
302+
serviceProxyObject=instance;
303+
}
288304

289305

290306

307+
}
308+
var result = "没有结果,请检查输入代码";
309+
var processor = serviceProxyObjectType.GetMethod("Process");
310+
if (processor!=null)
311+
{
312+
result = processor.Invoke(serviceProxyObject, null).ToString();
313+
}
314+
315+
responseText =result;
291316
}
292-
var result = "没有结果,请检查输入代码";
293-
var processor = serviceProxyObjectType.GetMethod("Process");
294-
if (processor!=null)
317+
else
295318
{
296-
result = processor.Invoke(serviceProxyObject, null).ToString();
297-
}
319+
responseText ="语法树动态编译出错,检查 EmitResult.Diagnostics 属性。请将源码和报错信息反馈至开发者,谢谢";
298320

299-
responseText =result;
321+
}
300322
}
301323
catch (Exception ex)
302324
{

0 commit comments

Comments
 (0)