diff --git a/csharp_mod/Extensions.cs b/csharp_mod/Extensions.cs index 648062b..71499a6 100644 --- a/csharp_mod/Extensions.cs +++ b/csharp_mod/Extensions.cs @@ -118,18 +118,31 @@ public static unsafe class SlangExtensions { switch (kind) { - case 1: - return SlangFormatter.ColorString; // String - case 2: - return SlangFormatter.ColorString; // Number - case 3: - return SlangFormatter.ColorInstruction; // Boolean - case 4: - return SlangFormatter.ColorSelection; // Keyword - case 5: - return SlangFormatter.ColorLineNumber; // Identifier - case 6: - return SlangFormatter.ColorDefault; // Symbol + case 1: // Strings + return SlangFormatter.ColorString; + case 2: // Numbers + return SlangFormatter.ColorNumber; + case 3: // Booleans + return SlangFormatter.ColorBoolean; + + case 4: // (if, else, loop) + return SlangFormatter.ColorControl; + case 5: // (let, const, device) + return SlangFormatter.ColorDeclaration; + + case 6: // (variables) + return SlangFormatter.ColorIdentifier; + case 7: // (punctuation) + return SlangFormatter.ColorDefault; + + case 10: // (syscalls) + return SlangFormatter.ColorFunction; + + case 11: // Comparisons + case 12: // Math + case 13: // Logic + return SlangFormatter.ColorOperator; + default: return SlangFormatter.ColorDefault; } diff --git a/csharp_mod/Formatter.cs b/csharp_mod/Formatter.cs index cdb09c7..13eaf16 100644 --- a/csharp_mod/Formatter.cs +++ b/csharp_mod/Formatter.cs @@ -13,8 +13,19 @@ public class SlangFormatter : ICodeFormatter private CancellationTokenSource? _lspCancellationToken; private object _tokenLock = new(); - public static readonly uint ColorInstruction = ColorFromHTML("#ffff00"); - public static readonly uint ColorString = ColorFromHTML("#ce9178"); + // VS Code Dark Theme Palette + public static readonly uint ColorControl = ColorFromHTML("#C586C0"); // Pink (if, return, loop) + public static readonly uint ColorDeclaration = ColorFromHTML("#569CD6"); // Blue (let, device, fn) + public static readonly uint ColorFunction = ColorFromHTML("#DCDCAA"); // Yellow (syscalls) + public static readonly uint ColorString = ColorFromHTML("#CE9178"); // Orange + public static new readonly uint ColorNumber = ColorFromHTML("#B5CEA8"); // Light Green + public static readonly uint ColorBoolean = ColorFromHTML("#569CD6"); // Blue (true/false) + public static readonly uint ColorIdentifier = ColorFromHTML("#9CDCFE"); // Light Blue (variables) + public static new readonly uint ColorDefault = ColorFromHTML("#D4D4D4"); // White (punctuation ; { } ) + + // Operators are often the same color as default text in VS Code Dark, + // but having a separate definition lets you tweak it (e.g. make them slightly darker or distinct) + public static readonly uint ColorOperator = ColorFromHTML("#D4D4D4"); private HashSet _linesWithErrors = new(); diff --git a/rust_compiler/libs/helpers/src/lib.rs b/rust_compiler/libs/helpers/src/lib.rs index 18359cf..40b9b5a 100644 --- a/rust_compiler/libs/helpers/src/lib.rs +++ b/rust_compiler/libs/helpers/src/lib.rs @@ -1,4 +1,5 @@ mod macros; +mod syscall; /// This trait will allow the LSP to emit documentation for various tokens and expressions. /// You can easily create documentation for large enums with the `documented!` macro. @@ -10,5 +11,5 @@ pub trait Documentation { } pub mod prelude { - pub use super::{Documentation, documented}; + pub use super::{Documentation, documented, with_syscalls}; } diff --git a/rust_compiler/libs/helpers/src/syscall.rs b/rust_compiler/libs/helpers/src/syscall.rs new file mode 100644 index 0000000..37daaa9 --- /dev/null +++ b/rust_compiler/libs/helpers/src/syscall.rs @@ -0,0 +1,32 @@ +#[macro_export] +macro_rules! with_syscalls { + ($matcher:ident) => { + $matcher!( + "yield", + "sleep", + "hash", + "loadFromDevice", + "loadBatchNamed", + "loadBatch", + "setOnDevice", + "setOnDeviceBatched", + "setOnDeviceBatchedNamed", + "acos", + "asin", + "atan", + "atan2", + "abs", + "ceil", + "cos", + "floor", + "log", + "max", + "min", + "rand", + "sin", + "sqrt", + "tan", + "trunc" + ); + }; +} diff --git a/rust_compiler/libs/parser/src/sys_call.rs b/rust_compiler/libs/parser/src/sys_call.rs index 96f5a26..6a4aa88 100644 --- a/rust_compiler/libs/parser/src/sys_call.rs +++ b/rust_compiler/libs/parser/src/sys_call.rs @@ -256,31 +256,6 @@ impl std::fmt::Display for SysCall { impl SysCall { pub fn is_syscall(identifier: &str) -> bool { - matches!( - identifier, - "yield" - | "sleep" - | "hash" - | "loadFromDevice" - | "setOnDevice" - | "setOnDeviceBatched" - | "setOnDeviceBatchedNamed" - | "acos" - | "asin" - | "atan" - | "atan2" - | "abs" - | "ceil" - | "cos" - | "floor" - | "log" - | "max" - | "min" - | "rand" - | "sin" - | "sqrt" - | "tan" - | "trunc" - ) + tokenizer::token::is_syscall(identifier) } } diff --git a/rust_compiler/libs/tokenizer/src/token.rs b/rust_compiler/libs/tokenizer/src/token.rs index 13af954..3befb9f 100644 --- a/rust_compiler/libs/tokenizer/src/token.rs +++ b/rust_compiler/libs/tokenizer/src/token.rs @@ -1,6 +1,15 @@ use helpers::prelude::*; use rust_decimal::Decimal; +// Define a local macro to consume the list +macro_rules! generate_check { + ($($name:literal),*) => { + pub fn is_syscall(s: &str) -> bool { + matches!(s, $($name)|*) + } + } +} + #[derive(Debug, PartialEq, Eq, Clone)] pub struct Token { /// The type of the token @@ -101,17 +110,43 @@ impl Documentation for TokenType { } } +helpers::with_syscalls!(generate_check); + impl From for u32 { fn from(value: TokenType) -> Self { - use TokenType::*; match value { - String(_) => 1, - Number(_) => 2, - Boolean(_) => 3, - Keyword(_) => 4, - Identifier(_) => 5, - Symbol(_) => 6, - EOF => 0, + TokenType::String(_) => 1, + TokenType::Number(_) => 2, + TokenType::Boolean(_) => 3, + TokenType::Keyword(k) => match k { + Keyword::If + | Keyword::Else + | Keyword::Loop + | Keyword::While + | Keyword::Break + | Keyword::Continue + | Keyword::Return => 4, + _ => 5, + }, + TokenType::Identifier(s) => { + if is_syscall(&s) { + 10 + } else { + 6 + } + } + TokenType::Symbol(s) => { + if s.is_comparison() { + 11 + } else if s.is_operator() { + 12 + } else if s.is_logical() { + 13 + } else { + 7 + } + } + TokenType::EOF => 0, } } }