Compare commits
6 Commits
0.4.0
...
06a0ec28eb
| Author | SHA1 | Date | |
|---|---|---|---|
|
06a0ec28eb
|
|||
| 73e08b9896 | |||
|
e83ff67af8
|
|||
| cacff4ff55 | |||
|
7295b14f6a
|
|||
|
93873dfa93
|
@@ -4,6 +4,7 @@ name: CI/CD Pipeline
|
||||
on:
|
||||
push:
|
||||
branches: ["master"]
|
||||
tags: ["*.*.*"]
|
||||
pull_request:
|
||||
branches: ["master"]
|
||||
|
||||
@@ -57,6 +58,10 @@ jobs:
|
||||
slang-builder \
|
||||
./build.sh
|
||||
|
||||
- name: Zip Workshop Folder
|
||||
run: |
|
||||
zip -r release/workshop.zip release/workshop/
|
||||
|
||||
# 3. Fix Permissions
|
||||
# Docker writes files as root. We need to own them to upload them.
|
||||
- name: Fix Permissions
|
||||
@@ -65,7 +70,36 @@ jobs:
|
||||
|
||||
# 4. Upload to GitHub
|
||||
- name: Upload Release Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: StationeersSlang-Release
|
||||
path: release/
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: self-hosted
|
||||
# ONLY run this job if we pushed a tag (e.g., v1.0.1)
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# We download the artifact from the previous 'build' job
|
||||
- name: Download Build Artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: StationeersSlang-Release
|
||||
path: ./release-files
|
||||
|
||||
- name: Create Gitea Release
|
||||
uses: https://gitea.com/actions/gitea-release-action@v1
|
||||
with:
|
||||
files: |
|
||||
./release-files/workshop.zip
|
||||
./release-files/slang
|
||||
./release-files/slang.exe
|
||||
name: ${{ github.ref_name }}
|
||||
tag_name: ${{ github.ref_name }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
11
Changelog.md
11
Changelog.md
@@ -1,5 +1,16 @@
|
||||
# Changelog
|
||||
|
||||
[0.4.1]
|
||||
|
||||
- Update syscalls for `loadSlot` and `setSlot` to support expressions instead of
|
||||
just variables for the slot index
|
||||
- Moved the main repository from GitHub to a self-hosted Gitea
|
||||
- Restructured workflow files to support this change
|
||||
- GitHub will still remain as a mirrored repository of the new
|
||||
Gitea instance.
|
||||
- This is in response to the new upcoming changes to the pricing model
|
||||
for self-hosted GitHub action runners.
|
||||
|
||||
[0.4.0]
|
||||
|
||||
- First pass getting compiled IC10 to output along side the Slang source code
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<ModMetadata xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<Name>Slang</Name>
|
||||
<Author>JoeDiertay</Author>
|
||||
<Version>0.4.0</Version>
|
||||
<Version>0.4.1</Version>
|
||||
<Description>
|
||||
[h1]Slang: High-Level Programming for Stationeers[/h1]
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ using UnityEngine;
|
||||
|
||||
public class SlangFormatter : ICodeFormatter
|
||||
{
|
||||
protected static Editor? Ic10Editor = null;
|
||||
|
||||
private CancellationTokenSource? _lspCancellationToken;
|
||||
private object _tokenLock = new();
|
||||
|
||||
@@ -78,34 +80,6 @@ public class SlangFormatter : ICodeFormatter
|
||||
return this.Lines.RawText;
|
||||
}
|
||||
|
||||
public override void DrawLine(int lineIndex, TextRange selection, bool drawLineNumber = true)
|
||||
{
|
||||
Vector2 cursorPos = ImGui.GetCursorScreenPos();
|
||||
Vector2 space = ImGui.GetContentRegionAvail();
|
||||
base.DrawLine(lineIndex, selection, drawLineNumber);
|
||||
|
||||
var charWidth = Settings.CharWidth;
|
||||
|
||||
var width = Mathf.Max(Lines.Width + 10.0f + LineNumberOffset * charWidth, space.x / 2);
|
||||
|
||||
ImGui
|
||||
.GetWindowDrawList()
|
||||
.AddLine(
|
||||
new Vector2(cursorPos.x + width + 4.5f * charWidth, cursorPos.y),
|
||||
new Vector2(
|
||||
cursorPos.x + width + 4.5f * charWidth,
|
||||
cursorPos.y + space.y + Settings.LineHeight
|
||||
),
|
||||
ColorLineNumber,
|
||||
1.0f
|
||||
);
|
||||
|
||||
cursorPos.x += width;
|
||||
ImGui.SetCursorScreenPos(cursorPos);
|
||||
if (lineIndex < iC10CodeFormatter.Lines.Count)
|
||||
iC10CodeFormatter.DrawLine(lineIndex, new TextRange(), true);
|
||||
}
|
||||
|
||||
public override StyledLine ParseLine(string line)
|
||||
{
|
||||
// We create the line first
|
||||
@@ -186,8 +160,16 @@ public class SlangFormatter : ICodeFormatter
|
||||
{
|
||||
ic10CompilationResult = compiled;
|
||||
ic10SourceMap = sourceMap;
|
||||
try
|
||||
{
|
||||
UpdateIc10Formatter();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
L.Error(ex.Message);
|
||||
L.Error(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException) { }
|
||||
catch (Exception ex)
|
||||
@@ -198,7 +180,16 @@ public class SlangFormatter : ICodeFormatter
|
||||
|
||||
private void UpdateIc10Formatter()
|
||||
{
|
||||
iC10CodeFormatter.Editor = Editor;
|
||||
if (Ic10Editor is null)
|
||||
{
|
||||
var tab = Editor.ParentTab;
|
||||
iC10CodeFormatter = new IC10CodeFormatter();
|
||||
Ic10Editor = new Editor(Editor.KeyHandler);
|
||||
Ic10Editor.IsReadOnly = true;
|
||||
iC10CodeFormatter.Editor = Ic10Editor;
|
||||
tab.AddEditor(Ic10Editor);
|
||||
}
|
||||
|
||||
var caretPos = Editor.CaretPos.Line;
|
||||
|
||||
// get the slang sourceMap at the current editor line
|
||||
@@ -210,7 +201,7 @@ public class SlangFormatter : ICodeFormatter
|
||||
// should be directly next to the compiled IC10 source line, and we should highlight the
|
||||
// IC10 code that directly represents the Slang source
|
||||
|
||||
iC10CodeFormatter.ResetCode(ic10CompilationResult);
|
||||
Ic10Editor.ResetCode(ic10CompilationResult);
|
||||
|
||||
if (lines.Count() < 1)
|
||||
{
|
||||
@@ -223,7 +214,7 @@ public class SlangFormatter : ICodeFormatter
|
||||
// highlight all the IC10 lines that are within the specified range
|
||||
foreach (var index in Enumerable.Range((int)min, (int)(max - min) + 1))
|
||||
{
|
||||
var lineText = iC10CodeFormatter.Lines[index].Text;
|
||||
var lineText = Ic10Editor.Lines[index].Text;
|
||||
|
||||
var newLine = new StyledLine(
|
||||
lineText,
|
||||
@@ -239,7 +230,7 @@ public class SlangFormatter : ICodeFormatter
|
||||
]
|
||||
);
|
||||
|
||||
iC10CodeFormatter.Lines[index] = newLine;
|
||||
Ic10Editor.Lines[index] = newLine;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace Slang
|
||||
{
|
||||
public const string PluginGuid = "com.biddydev.slang";
|
||||
public const string PluginName = "Slang";
|
||||
public const string PluginVersion = "0.4.0";
|
||||
public const string PluginVersion = "0.4.1";
|
||||
|
||||
public static Mod MOD = new Mod(PluginName, PluginVersion);
|
||||
|
||||
|
||||
2
rust_compiler/Cargo.lock
generated
2
rust_compiler/Cargo.lock
generated
@@ -930,7 +930,7 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
|
||||
|
||||
[[package]]
|
||||
name = "slang"
|
||||
version = "0.4.0"
|
||||
version = "0.4.1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "slang"
|
||||
version = "0.4.0"
|
||||
version = "0.4.1"
|
||||
edition = "2021"
|
||||
|
||||
[workspace]
|
||||
|
||||
@@ -2233,10 +2233,7 @@ impl<'a> Compiler<'a> {
|
||||
System::LoadSlot(dev_name, slot_index, logic_type) => {
|
||||
let (dev_hash, hash_cleanup) =
|
||||
self.compile_literal_or_variable(dev_name.node, scope)?;
|
||||
let (slot_index, slot_cleanup) = self.compile_literal_or_variable(
|
||||
LiteralOrVariable::Literal(slot_index.node),
|
||||
scope,
|
||||
)?;
|
||||
let (slot_index, slot_cleanup) = self.compile_operand(*slot_index, scope)?;
|
||||
let (logic_type, logic_cleanup) = self.compile_literal_or_variable(
|
||||
LiteralOrVariable::Literal(logic_type.node),
|
||||
scope,
|
||||
@@ -2261,10 +2258,7 @@ impl<'a> Compiler<'a> {
|
||||
System::SetSlot(dev_name, slot_index, logic_type, var) => {
|
||||
let (dev_name, name_cleanup) =
|
||||
self.compile_literal_or_variable(dev_name.node, scope)?;
|
||||
let (slot_index, index_cleanup) = self.compile_literal_or_variable(
|
||||
LiteralOrVariable::Literal(slot_index.node),
|
||||
scope,
|
||||
)?;
|
||||
let (slot_index, index_cleanup) = self.compile_operand(*slot_index, scope)?;
|
||||
let (logic_type, type_cleanup) = self.compile_literal_or_variable(
|
||||
LiteralOrVariable::Literal(logic_type.node),
|
||||
scope,
|
||||
|
||||
@@ -1834,20 +1834,8 @@ impl<'a> Parser<'a> {
|
||||
let mut args = args!(3);
|
||||
let next = args.next();
|
||||
let dev_name = literal_or_variable!(next);
|
||||
let next = args.next();
|
||||
let slot_index = get_arg!(Literal, literal_or_variable!(next));
|
||||
if !matches!(
|
||||
slot_index,
|
||||
Spanned {
|
||||
node: Literal::Number(_),
|
||||
..
|
||||
},
|
||||
) {
|
||||
return Err(Error::InvalidSyntax(
|
||||
slot_index.span,
|
||||
"Expected a number".to_string(),
|
||||
));
|
||||
}
|
||||
let slot_index = args.next().ok_or(Error::UnexpectedEOF)?;
|
||||
|
||||
let next = args.next();
|
||||
let slot_logic = get_arg!(Literal, literal_or_variable!(next));
|
||||
if !matches!(
|
||||
@@ -1864,27 +1852,17 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
|
||||
Ok(SysCall::System(System::LoadSlot(
|
||||
dev_name, slot_index, slot_logic,
|
||||
dev_name,
|
||||
boxed!(slot_index),
|
||||
slot_logic,
|
||||
)))
|
||||
}
|
||||
"setSlot" | "ss" => {
|
||||
let mut args = args!(4);
|
||||
let next = args.next();
|
||||
let dev_name = literal_or_variable!(next);
|
||||
let next = args.next();
|
||||
let slot_index = get_arg!(Literal, literal_or_variable!(next));
|
||||
if !matches!(
|
||||
slot_index,
|
||||
Spanned {
|
||||
node: Literal::Number(_),
|
||||
..
|
||||
}
|
||||
) {
|
||||
return Err(Error::InvalidSyntax(
|
||||
slot_index.span,
|
||||
"Expected a number".into(),
|
||||
));
|
||||
}
|
||||
let slot_index = args.next().ok_or(Error::UnexpectedEOF)?;
|
||||
|
||||
let next = args.next();
|
||||
let slot_logic = get_arg!(Literal, literal_or_variable!(next));
|
||||
if !matches!(
|
||||
@@ -1904,9 +1882,9 @@ impl<'a> Parser<'a> {
|
||||
|
||||
Ok(SysCall::System(System::SetSlot(
|
||||
dev_name,
|
||||
slot_index,
|
||||
boxed!(slot_index),
|
||||
slot_logic,
|
||||
Box::new(expr),
|
||||
boxed!(expr),
|
||||
)))
|
||||
}
|
||||
"loadReagent" | "lr" => {
|
||||
|
||||
@@ -223,7 +223,7 @@ documented! {
|
||||
/// `let isOccupied = ls(deviceHash, 2, "Occupied");`
|
||||
LoadSlot(
|
||||
Spanned<LiteralOrVariable<'a>>,
|
||||
Spanned<Literal<'a>>,
|
||||
Box<Spanned<Expression<'a>>>,
|
||||
Spanned<Literal<'a>>
|
||||
),
|
||||
/// Stores a value of LogicType on a device by the index value
|
||||
@@ -234,7 +234,7 @@ documented! {
|
||||
/// `ss(deviceHash, 0, "Open", true);`
|
||||
SetSlot(
|
||||
Spanned<LiteralOrVariable<'a>>,
|
||||
Spanned<Literal<'a>>,
|
||||
Box<Spanned<Expression<'a>>>,
|
||||
Spanned<Literal<'a>>,
|
||||
Box<Spanned<Expression<'a>>>
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user