Add linting
This commit is contained in:
parent
b917b99a2c
commit
e1cc716606
|
@ -1,4 +1,6 @@
|
||||||
using Microsoft.CodeAnalysis.CSharp.Scripting;
|
using System.Collections.Immutable;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.CodeAnalysis.CSharp.Scripting;
|
||||||
using Microsoft.CodeAnalysis.Scripting;
|
using Microsoft.CodeAnalysis.Scripting;
|
||||||
|
|
||||||
namespace Cauldron.Core;
|
namespace Cauldron.Core;
|
||||||
|
@ -13,8 +15,7 @@ public class RoslynHost
|
||||||
/// <param name="globals">Values that will be made available to the script</param>
|
/// <param name="globals">Values that will be made available to the script</param>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
public static async Task RunScript(string code, string[] imports,
|
public static async Task RunScript(string code, string[] imports,
|
||||||
RoslynHostGlobals globals,
|
RoslynHostGlobals globals, CancellationToken cancellationToken = default)
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
{
|
||||||
ScriptOptions options = ScriptOptions.Default
|
ScriptOptions options = ScriptOptions.Default
|
||||||
.AddImports(imports);
|
.AddImports(imports);
|
||||||
|
@ -22,6 +23,16 @@ public class RoslynHost
|
||||||
await CSharpScript.RunAsync(code, options, globals,
|
await CSharpScript.RunAsync(code, options, globals,
|
||||||
cancellationToken: cancellationToken);
|
cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ImmutableArray<Diagnostic> BuildScript(string code, string[] imports,
|
||||||
|
RoslynHostGlobals globals)
|
||||||
|
{
|
||||||
|
ScriptOptions options = ScriptOptions.Default
|
||||||
|
.AddImports(imports);
|
||||||
|
|
||||||
|
Script<object> script = CSharpScript.Create(code, options, globals.GetType());
|
||||||
|
return script.GetCompilation().GetDiagnostics();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RoslynHostGlobals
|
public class RoslynHostGlobals
|
||||||
|
|
|
@ -413,7 +413,7 @@
|
||||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||||
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-23" y="-243"/>
|
<point key="canvasLocation" x="-23" y="-256"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Window Controller-->
|
<!--Window Controller-->
|
||||||
<scene sceneID="ktg-sd-7li">
|
<scene sceneID="ktg-sd-7li">
|
||||||
|
@ -421,11 +421,11 @@
|
||||||
<windowController id="JKR-xj-8kh" customClass="MainWindow" sceneMemberID="viewController">
|
<windowController id="JKR-xj-8kh" customClass="MainWindow" sceneMemberID="viewController">
|
||||||
<window key="window" title="Cauldron" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="" animationBehavior="default" tabbingMode="preferred" id="d7K-Gm-g9N">
|
<window key="window" title="Cauldron" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="" animationBehavior="default" tabbingMode="preferred" id="d7K-Gm-g9N">
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
|
||||||
<rect key="contentRect" x="211" y="264" width="620" height="406"/>
|
<rect key="contentRect" x="211" y="264" width="749" height="445"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="1512" height="944"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="1512" height="944"/>
|
||||||
<value key="minSize" type="size" width="480" height="270"/>
|
<value key="minSize" type="size" width="480" height="270"/>
|
||||||
<view key="contentView" id="3If-Oy-0LB">
|
<view key="contentView" id="3If-Oy-0LB">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="620" height="406"/>
|
<rect key="frame" x="0.0" y="0.0" width="749" height="445"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</view>
|
</view>
|
||||||
<toolbar key="toolbar" implicitIdentifier="09D11707-F4A3-4FD5-970E-AC5832E91C2B" showsBaselineSeparator="NO" displayMode="iconOnly" sizeMode="regular" id="c7l-9K-zGH">
|
<toolbar key="toolbar" implicitIdentifier="09D11707-F4A3-4FD5-970E-AC5832E91C2B" showsBaselineSeparator="NO" displayMode="iconOnly" sizeMode="regular" id="c7l-9K-zGH">
|
||||||
|
@ -463,7 +463,7 @@
|
||||||
</windowController>
|
</windowController>
|
||||||
<customObject id="Dyo-ea-3jV" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
<customObject id="Dyo-ea-3jV" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-24" y="70"/>
|
<point key="canvasLocation" x="-23" y="73"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Split View Controller-->
|
<!--Split View Controller-->
|
||||||
<scene sceneID="BCF-ui-EPb">
|
<scene sceneID="BCF-ui-EPb">
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using System.Timers;
|
||||||
using AppKit;
|
using AppKit;
|
||||||
using Cauldron.Macos.SourceWriter;
|
using Cauldron.Macos.SourceWriter;
|
||||||
using Cauldron.Macos.SourceWriter.LanguageFormats;
|
using Cauldron.Macos.SourceWriter.LanguageFormats;
|
||||||
|
using Foundation;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
|
||||||
namespace Cauldron.Macos;
|
namespace Cauldron.Macos;
|
||||||
|
|
||||||
|
@ -61,6 +66,7 @@ public partial class MainWindow : NSWindowController
|
||||||
this.RunScriptToolbarButton.Activated += RunScript;
|
this.RunScriptToolbarButton.Activated += RunScript;
|
||||||
|
|
||||||
SourceTextView scriptTextBox = this.ScriptEditorTextBox;
|
SourceTextView scriptTextBox = this.ScriptEditorTextBox;
|
||||||
|
scriptTextBox.OnFinishedTyping += this.BuildScript;
|
||||||
scriptTextBox.Font = NSFont.MonospacedSystemFont(new nfloat(14), NSFontWeight.Regular);
|
scriptTextBox.Font = NSFont.MonospacedSystemFont(new nfloat(14), NSFontWeight.Regular);
|
||||||
scriptTextBox.AutomaticQuoteSubstitutionEnabled = false;
|
scriptTextBox.AutomaticQuoteSubstitutionEnabled = false;
|
||||||
scriptTextBox.AutomaticDashSubstitutionEnabled = false;
|
scriptTextBox.AutomaticDashSubstitutionEnabled = false;
|
||||||
|
@ -74,6 +80,11 @@ public partial class MainWindow : NSWindowController
|
||||||
scriptTextBox.Formatter.Reformat();
|
scriptTextBox.Formatter.Reformat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void BuildScript(object sender, ElapsedEventArgs args)
|
||||||
|
{
|
||||||
|
ScriptRunner.BuildScript(this);
|
||||||
|
}
|
||||||
|
|
||||||
public void RunScript(object sender, EventArgs e)
|
public void RunScript(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ScriptRunner.RunScript(this);
|
ScriptRunner.RunScript(this);
|
||||||
|
@ -94,6 +105,46 @@ public partial class MainWindow : NSWindowController
|
||||||
this.CreateNewTab();
|
this.CreateNewTab();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateScriptDiagnostics(ImmutableArray<Diagnostic> diagnostics)
|
||||||
|
{
|
||||||
|
Console.WriteLine(diagnostics.Select(d => $"{d.Severity}: {d.GetMessage()}").Join("\n"));
|
||||||
|
|
||||||
|
foreach (Diagnostic diagnostic in diagnostics)
|
||||||
|
{
|
||||||
|
int start = diagnostic.Location.SourceSpan.Start;
|
||||||
|
int end = diagnostic.Location.SourceSpan.End;
|
||||||
|
|
||||||
|
if (start == end && end < this.ScriptText.Length)
|
||||||
|
end += 1;
|
||||||
|
else if (start == end)
|
||||||
|
start -= 1;
|
||||||
|
|
||||||
|
NSRange range = new(start,end);
|
||||||
|
|
||||||
|
this.ScriptEditorTextBox.LayoutManager
|
||||||
|
.AddTemporaryAttribute(NSStringAttributeKey.UnderlineStyle,
|
||||||
|
new NSNumber((int)(NSUnderlineStyle.Thick | NSUnderlineStyle.PatternDot)),
|
||||||
|
range);
|
||||||
|
this.ScriptEditorTextBox.LayoutManager
|
||||||
|
.AddTemporaryAttribute(NSStringAttributeKey.ToolTip,
|
||||||
|
new NSString($"{diagnostic.Id} {diagnostic.GetMessage()}"),
|
||||||
|
range);
|
||||||
|
|
||||||
|
if (diagnostic.Severity == DiagnosticSeverity.Error)
|
||||||
|
this.ScriptEditorTextBox.LayoutManager
|
||||||
|
.AddTemporaryAttribute(NSStringAttributeKey.UnderlineColor, NSColor.SystemRed,
|
||||||
|
range);
|
||||||
|
else if (diagnostic.Severity == DiagnosticSeverity.Warning)
|
||||||
|
this.ScriptEditorTextBox.LayoutManager
|
||||||
|
.AddTemporaryAttribute(NSStringAttributeKey.UnderlineColor, NSColor.SystemGreen,
|
||||||
|
range);
|
||||||
|
else if (diagnostic.Severity == DiagnosticSeverity.Info)
|
||||||
|
this.ScriptEditorTextBox.LayoutManager
|
||||||
|
.AddTemporaryAttribute(NSStringAttributeKey.UnderlineColor, NSColor.SystemBlue,
|
||||||
|
range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetScriptRunState(bool scriptIsRunning)
|
public void SetScriptRunState(bool scriptIsRunning)
|
||||||
{
|
{
|
||||||
if (scriptIsRunning)
|
if (scriptIsRunning)
|
||||||
|
|
|
@ -7,40 +7,39 @@ using Cauldron.Core;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Collections;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace Cauldron.Macos;
|
namespace Cauldron.Macos;
|
||||||
|
|
||||||
public static class ScriptRunner
|
public static class ScriptRunner
|
||||||
{
|
{
|
||||||
|
public static void BuildScript(MainWindow window)
|
||||||
|
{
|
||||||
|
string script = "";
|
||||||
|
window.BeginInvokeOnMainThread(() => script = window.ScriptText);
|
||||||
|
|
||||||
|
TagBuilder body = new("body");
|
||||||
|
|
||||||
|
RoslynHostGlobals globals = new(null);
|
||||||
|
window.BeginInvokeOnMainThread(() => globals = new RoslynHostGlobals(CreateCauldronWriter(window, body)));
|
||||||
|
|
||||||
|
Task task = Task
|
||||||
|
.Run(() => RoslynHost.BuildScript(script, Array.Empty<string>(), globals))
|
||||||
|
.ContinueWith(t => window.BeginInvokeOnMainThread(
|
||||||
|
() => window.UpdateScriptDiagnostics(t.Result)));
|
||||||
|
}
|
||||||
|
|
||||||
public static void RunScript(MainWindow window)
|
public static void RunScript(MainWindow window)
|
||||||
{
|
{
|
||||||
window.SetScriptRunState(true);
|
window.SetScriptRunState(true);
|
||||||
|
|
||||||
TagBuilder body = new("body");
|
TagBuilder body = new("body");
|
||||||
|
string script = window.ScriptText;
|
||||||
window.ScriptOutputWebView.SetOutputPanelContent(body);
|
window.ScriptCancellationTokenSource = new CancellationTokenSource();
|
||||||
TaskScheduler uiThread = TaskScheduler.FromCurrentSynchronizationContext();
|
TaskScheduler uiThread = TaskScheduler.FromCurrentSynchronizationContext();
|
||||||
|
|
||||||
CauldronWriter writer = new(obj =>
|
// Clear the output for the new run
|
||||||
{
|
|
||||||
window.BeginInvokeOnMainThread(() =>
|
|
||||||
{
|
|
||||||
TagBuilder outputSection = new("section");
|
|
||||||
outputSection.AddCssClass("output-section");
|
|
||||||
outputSection.InnerHtml.AppendHtml(GenerateValueOutput(obj));
|
|
||||||
body.InnerHtml.AppendHtml(outputSection);
|
|
||||||
|
|
||||||
window.ScriptOutputWebView.SetOutputPanelContent(body);
|
window.ScriptOutputWebView.SetOutputPanelContent(body);
|
||||||
});
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
});
|
|
||||||
|
|
||||||
window.ScriptCancellationTokenSource = new CancellationTokenSource();
|
|
||||||
|
|
||||||
string script = window.ScriptText;
|
|
||||||
|
|
||||||
Task task = Task
|
Task task = Task
|
||||||
.Run(async () =>
|
.Run(async () =>
|
||||||
|
@ -48,7 +47,7 @@ public static class ScriptRunner
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await RoslynHost.RunScript(script, Array.Empty<string>(),
|
await RoslynHost.RunScript(script, Array.Empty<string>(),
|
||||||
new RoslynHostGlobals(writer),
|
new RoslynHostGlobals(CreateCauldronWriter(window, body)),
|
||||||
window.ScriptCancellationTokenSource.Token);
|
window.ScriptCancellationTokenSource.Token);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -66,6 +65,24 @@ public static class ScriptRunner
|
||||||
.ContinueWith((t) => window.SetScriptRunState(false), uiThread);
|
.ContinueWith((t) => window.SetScriptRunState(false), uiThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static CauldronWriter CreateCauldronWriter(MainWindow window, TagBuilder body)
|
||||||
|
{
|
||||||
|
return new CauldronWriter (obj =>
|
||||||
|
{
|
||||||
|
window.BeginInvokeOnMainThread(() =>
|
||||||
|
{
|
||||||
|
TagBuilder outputSection = new("section");
|
||||||
|
outputSection.AddCssClass("output-section");
|
||||||
|
outputSection.InnerHtml.AppendHtml(GenerateValueOutput(obj));
|
||||||
|
body.InnerHtml.AppendHtml(outputSection);
|
||||||
|
|
||||||
|
window.ScriptOutputWebView.SetOutputPanelContent(body);
|
||||||
|
});
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private static TagBuilder GenerateValueOutput(object value)
|
private static TagBuilder GenerateValueOutput(object value)
|
||||||
{
|
{
|
||||||
if (value is null)
|
if (value is null)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Timers;
|
||||||
using AppKit;
|
using AppKit;
|
||||||
using CoreGraphics;
|
using CoreGraphics;
|
||||||
using Foundation;
|
using Foundation;
|
||||||
|
@ -435,6 +436,17 @@ public class SourceTextView : NSTextView
|
||||||
|
|
||||||
#region Override Methods
|
#region Override Methods
|
||||||
|
|
||||||
|
private Timer InputTimoutTimer { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// The amount of time with no user input after which <see cref="OnFinishedTyping"/> will be run
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan InputTimeoutInterval { get; set; } = new TimeSpan(0, 0, 1);
|
||||||
|
/// <summary>
|
||||||
|
/// An event triggered when the user has stopped typing for a period of time defined by
|
||||||
|
/// <see cref="InputTimeoutInterval"/>
|
||||||
|
/// </summary>
|
||||||
|
public event ElapsedEventHandler OnFinishedTyping;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Look for special keys being pressed and does specific processing based on the key.
|
/// Look for special keys being pressed and does specific processing based on the key.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -570,7 +582,12 @@ public class SourceTextView : NSTextView
|
||||||
|
|
||||||
this.Formatter.Reformat();
|
this.Formatter.Reformat();
|
||||||
|
|
||||||
//Console.WriteLine ("Key: {0}", (int)theEvent.Characters[0]);
|
this.InputTimoutTimer?.Stop();
|
||||||
|
this.InputTimoutTimer?.Close();
|
||||||
|
this.InputTimoutTimer = new Timer(this.InputTimeoutInterval);
|
||||||
|
this.InputTimoutTimer.AutoReset = false;
|
||||||
|
this.InputTimoutTimer.Elapsed += this.OnFinishedTyping;
|
||||||
|
this.InputTimoutTimer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
Loading…
Reference in a new issue