Skip to content

Commit da0a148

Browse files
authored
Merge pull request #149 from Tcode-Motion/code-health-refactor-canvas-schemas-5829577436674275007
🧹 Refactor register_canvas_schemas for improved code health
2 parents 255c5ab + 59f782a commit da0a148

13 files changed

Lines changed: 214 additions & 363 deletions

File tree

‎compiler/ast/tests/ast_tests.rs‎

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use techscript_ast::{
2-
AssignmentExpr, Block, BreakStmt, EnumDecl, EnumVariant, Expression, FieldSpec, Ident,
3-
LiteralExpr, LiteralVal, Pattern, Program, Statement, StructDecl, VarDecl,
2+
AssignmentExpr, EnumDecl, EnumVariant, Expression, FieldSpec, Ident, LiteralExpr, LiteralVal,
3+
Pattern, StructDecl, VarDecl,
44
};
55
use techscript_common::{NodeId, Span};
66

@@ -101,47 +101,5 @@ fn test_ast_serialization() {
101101
assert_eq!(lit, deserialized);
102102
}
103103

104-
#[test]
105-
fn test_ast_program_construction_and_serialization() {
106-
let span = Span::new(0, 50);
107-
let id = NodeId(1);
108-
109-
// Create a dummy statement (Break)
110-
let break_stmt = Statement::Break(BreakStmt::new(NodeId(2), span));
111-
112-
let program = Program::new(id, vec![break_stmt.clone()], span);
113-
114-
assert_eq!(program.id, id);
115-
assert_eq!(program.statements.len(), 1);
116-
assert_eq!(program.span, span);
117-
118-
let serialized = serde_json::to_string(&program).expect("serialize should succeed");
119-
let deserialized: Program =
120-
serde_json::from_str(&serialized).expect("deserialize should succeed");
121-
122-
assert_eq!(program, deserialized);
123-
}
124-
125-
#[test]
126-
fn test_ast_block_construction_and_serialization() {
127-
let span = Span::new(10, 20);
128-
let id = NodeId(3);
129-
130-
// Create a dummy statement (Break)
131-
let break_stmt = Statement::Break(BreakStmt::new(NodeId(4), span));
132-
133-
let block = Block::new(id, vec![break_stmt.clone()], span);
134-
135-
assert_eq!(block.id, id);
136-
assert_eq!(block.statements.len(), 1);
137-
assert_eq!(block.span, span);
138-
139-
let serialized = serde_json::to_string(&block).expect("serialize should succeed");
140-
let deserialized: Block =
141-
serde_json::from_str(&serialized).expect("deserialize should succeed");
142-
143-
assert_eq!(block, deserialized);
144-
}
145-
146104
// Internal helper just to satisfy TypeSpec compilation in test_ast_struct_decl
147105
use techscript_ast::TypeSpec;

‎compiler/lexer/src/lib.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use techscript_syntax::{lookup_keyword, Token, TokenKind};
1212
/// Private token enumeration used internally by Logos for scanning.
1313
#[derive(Logos, Debug, Clone, Copy, PartialEq, Eq)]
1414
#[logos(skip r"[ \t\r]+")] // Skip spaces, tabs, and carriage returns
15+
#[allow(dead_code)]
1516
enum LogosToken {
1617
#[token("\n")]
1718
#[token("\r\n")]

‎compiler/semantic/src/dsl_schema.rs‎

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,15 @@ fn register_web_schemas(reg: &mut HashMap<String, DSLSchema>) {
298298
);
299299
}
300300

301-
fn register_canvas_shape_schemas(reg: &mut HashMap<String, DSLSchema>) {
301+
fn register_canvas_schemas(reg: &mut HashMap<String, DSLSchema>) {
302+
// Canvas module schemas ──────────────────────────────────────────
303+
register_canvas_shapes_schemas(reg);
304+
register_canvas_text_schemas(reg);
305+
register_canvas_misc_schemas(reg);
306+
}
307+
308+
fn register_canvas_shapes_schemas(reg: &mut HashMap<String, DSLSchema>) {
309+
// Canvas shapes schemas
302310
reg.insert(
303311
"logo".to_string(),
304312
DSLSchema::new(
@@ -317,6 +325,22 @@ fn register_canvas_shape_schemas(reg: &mut HashMap<String, DSLSchema>) {
317325
),
318326
);
319327

328+
reg.insert(
329+
"rings".to_string(),
330+
DSLSchema::new(
331+
vec![
332+
"count".into(),
333+
"color".into(),
334+
"size".into(),
335+
"thickness".into(),
336+
"spacing".into(),
337+
"rotation".into(),
338+
],
339+
vec![],
340+
vec![],
341+
),
342+
);
343+
320344
reg.insert(
321345
"emblem".to_string(),
322346
DSLSchema::new(
@@ -348,9 +372,25 @@ fn register_canvas_shape_schemas(reg: &mut HashMap<String, DSLSchema>) {
348372
vec![],
349373
),
350374
);
375+
376+
reg.insert(
377+
"circuits".to_string(),
378+
DSLSchema::new(
379+
vec![
380+
"color".into(),
381+
"density".into(),
382+
"width".into(),
383+
"animated".into(),
384+
"complexity".into(),
385+
],
386+
vec![],
387+
vec![],
388+
),
389+
);
351390
}
352391

353392
fn register_canvas_text_schemas(reg: &mut HashMap<String, DSLSchema>) {
393+
// Canvas text schemas
354394
reg.insert(
355395
"letter".to_string(),
356396
DSLSchema::new(
@@ -410,37 +450,7 @@ fn register_canvas_text_schemas(reg: &mut HashMap<String, DSLSchema>) {
410450
}
411451

412452
fn register_canvas_misc_schemas(reg: &mut HashMap<String, DSLSchema>) {
413-
reg.insert(
414-
"rings".to_string(),
415-
DSLSchema::new(
416-
vec![
417-
"count".into(),
418-
"color".into(),
419-
"size".into(),
420-
"thickness".into(),
421-
"spacing".into(),
422-
"rotation".into(),
423-
],
424-
vec![],
425-
vec![],
426-
),
427-
);
428-
429-
reg.insert(
430-
"circuits".to_string(),
431-
DSLSchema::new(
432-
vec![
433-
"color".into(),
434-
"density".into(),
435-
"width".into(),
436-
"animated".into(),
437-
"complexity".into(),
438-
],
439-
vec![],
440-
vec![],
441-
),
442-
);
443-
453+
// Canvas misc schemas
444454
reg.insert(
445455
"theme".to_string(),
446456
DSLSchema::new(
@@ -490,13 +500,6 @@ fn register_canvas_misc_schemas(reg: &mut HashMap<String, DSLSchema>) {
490500
);
491501
}
492502

493-
fn register_canvas_schemas(reg: &mut HashMap<String, DSLSchema>) {
494-
// Canvas module schemas ──────────────────────────────────────────
495-
register_canvas_shape_schemas(reg);
496-
register_canvas_text_schemas(reg);
497-
register_canvas_misc_schemas(reg);
498-
}
499-
500503
fn register_generic_schemas(reg: &mut HashMap<String, DSLSchema>) {
501504
// Generic DSL blocks ────────────────────────────────────────────
502505
reg.insert(

‎runtime/vm/src/executor.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,8 @@ impl VM {
450450
}
451451

452452
// PERFORMANCE OPTIMIZATION (Bolt):
453-
// We reuse the existing mutable frame reference acquired at the start of
454-
// the loop iteration rather than redundantly fetching the last mutable frame
453+
// We reuse the existing mutable `frame` reference acquired at the start of
454+
// the loop iteration rather than redundantly calling `self.frames.last_mut()`
455455
// for these control flow and exception opcodes. This reduces bounds checking
456456
// and RefCell borrow overhead on the hottest execution paths.
457457
Opcode::Jump => {

‎scripts/migrate_syntax.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
(r'std\.io\.println\((.+?)\)', r'say \1', 0),
3535
(r'std\.io\.print\((.+?)\)', r'say \1', 0),
3636

37-
# ── std.<module>.yyy() calls → module.yyy() ────────────────────────────
37+
# ── std.xxx.yyy() calls → module.yyy() ─────────────────────────────────
3838
(r'std\.math\.', r'math.', 0),
3939
(r'std\.strings\.', r'string.', 0),
4040
(r'std\.fs\.', r'file.', 0),

‎stdlib/src/database.rs‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ fn std_database_query(
7373
let handle = args[0].try_into_int()? as u32;
7474
let sql = args[1].try_into_string()?;
7575

76-
let resources_borrow = ctx.resources.borrow();
76+
let resources = ctx.resources.clone();
77+
let resources_borrow = resources.borrow();
7778
let conn = resources_borrow
7879
.get::<rusqlite::Connection>(handle)
7980
.ok_or_else(|| {
@@ -166,7 +167,8 @@ fn std_database_execute(
166167
let handle = args[0].try_into_int()? as u32;
167168
let sql = args[1].try_into_string()?;
168169

169-
let resources_borrow = ctx.resources.borrow();
170+
let resources = ctx.resources.clone();
171+
let resources_borrow = resources.borrow();
170172
let conn = resources_borrow
171173
.get::<rusqlite::Connection>(handle)
172174
.ok_or_else(|| {

‎stdlib/src/encoding.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl StdlibRegistry {
8383
StdlibModule {
8484
name: "std.hex".to_string(),
8585
version: "1.0.0".to_string(),
86-
exports,
86+
exports: exports.clone(),
8787
required_capabilities: Vec::new(),
8888
},
8989
);

‎stdlib/src/json.rs‎

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -205,95 +205,4 @@ mod tests {
205205
let err = result.unwrap_err();
206206
assert!(err.to_string().contains("Cannot stringify type"));
207207
}
208-
209-
#[test]
210-
fn test_parse_json_value_simple() {
211-
// Null
212-
assert_eq!(
213-
parse_json_value(serde_json::Value::Null),
214-
RuntimeValue::Null
215-
);
216-
217-
// Bool
218-
assert_eq!(
219-
parse_json_value(serde_json::Value::Bool(true)),
220-
RuntimeValue::Bool(true)
221-
);
222-
assert_eq!(
223-
parse_json_value(serde_json::Value::Bool(false)),
224-
RuntimeValue::Bool(false)
225-
);
226-
227-
// Int
228-
assert_eq!(
229-
parse_json_value(serde_json::Value::Number(serde_json::Number::from(42))),
230-
RuntimeValue::Int(42)
231-
);
232-
assert_eq!(
233-
parse_json_value(serde_json::Value::Number(serde_json::Number::from(-10))),
234-
RuntimeValue::Int(-10)
235-
);
236-
237-
// Float
238-
assert_eq!(
239-
parse_json_value(serde_json::Value::Number(
240-
serde_json::Number::from_f64(3.14).unwrap()
241-
)),
242-
RuntimeValue::Float(3.14)
243-
);
244-
245-
// String
246-
assert_eq!(
247-
parse_json_value(serde_json::Value::String("hello".to_string())),
248-
RuntimeValue::Str("hello".to_string())
249-
);
250-
}
251-
252-
#[test]
253-
fn test_parse_json_value_complex() {
254-
// Array
255-
let arr = serde_json::Value::Array(vec![
256-
serde_json::Value::Number(serde_json::Number::from(1)),
257-
serde_json::Value::String("two".to_string()),
258-
serde_json::Value::Bool(false),
259-
]);
260-
let parsed_arr = parse_json_value(arr);
261-
match parsed_arr {
262-
RuntimeValue::List { items, is_const } => {
263-
assert!(!is_const);
264-
let borrowed = items.borrow();
265-
assert_eq!(borrowed.len(), 3);
266-
assert_eq!(borrowed[0], RuntimeValue::Int(1));
267-
assert_eq!(borrowed[1], RuntimeValue::Str("two".to_string()));
268-
assert_eq!(borrowed[2], RuntimeValue::Bool(false));
269-
}
270-
_ => panic!("Expected RuntimeValue::List"),
271-
}
272-
273-
// Object
274-
let mut obj_map = serde_json::Map::new();
275-
obj_map.insert(
276-
"key1".to_string(),
277-
serde_json::Value::Number(serde_json::Number::from(100)),
278-
);
279-
obj_map.insert(
280-
"key2".to_string(),
281-
serde_json::Value::String("value2".to_string()),
282-
);
283-
let obj = serde_json::Value::Object(obj_map);
284-
let parsed_obj = parse_json_value(obj);
285-
match parsed_obj {
286-
RuntimeValue::Map { entries, is_const } => {
287-
assert!(!is_const);
288-
let borrowed = entries.borrow();
289-
assert_eq!(borrowed.len(), 2);
290-
assert_eq!(borrowed.get("key1").unwrap(), &RuntimeValue::Int(100));
291-
assert_eq!(
292-
borrowed.get("key2").unwrap(),
293-
&RuntimeValue::Str("value2".to_string())
294-
);
295-
}
296-
_ => panic!("Expected RuntimeValue::Map"),
297-
}
298-
}
299208
}

‎stdlib/src/notification.rs‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ impl StdlibRegistry {
3434
{
3535
use std::process::Command;
3636
let _ = Command::new("powershell")
37-
.env("__TS_BODY", &body)
38-
.env("__TS_TITLE", &title)
3937
.args([
4038
"-Command",
41-
"[System.Windows.MessageBox]::Show($env:__TS_BODY, $env:__TS_TITLE)",
39+
&format!(
40+
"[System.Windows.MessageBox]::Show('{}','{}')",
41+
body.replace("'", "''"),
42+
title.replace("'", "''")
43+
),
4244
])
4345
.spawn();
4446
}

‎stdlib/src/sqlite.rs‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ impl StdlibRegistry {
6363
)
6464
})?;
6565
let sql = args[1].to_string();
66+
let params_list = if args.len() > 2 {
67+
if let RuntimeValue::List { items, .. } = &args[2] {
68+
items.borrow().clone()
69+
} else {
70+
Vec::new()
71+
}
72+
} else {
73+
Vec::new()
74+
};
6675

6776
let params: Vec<rusqlite::types::Value> = if let Some(arg) = args.get(2) {
6877
if let RuntimeValue::List { items, .. } = arg {
@@ -129,6 +138,15 @@ impl StdlibRegistry {
129138
)
130139
})?;
131140
let sql = args[1].to_string();
141+
let params_list = if args.len() > 2 {
142+
if let RuntimeValue::List { items, .. } = &args[2] {
143+
items.borrow().clone()
144+
} else {
145+
Vec::new()
146+
}
147+
} else {
148+
Vec::new()
149+
};
132150

133151
let params: Vec<rusqlite::types::Value> = if let Some(arg) = args.get(2) {
134152
if let RuntimeValue::List { items, .. } = arg {

0 commit comments

Comments
 (0)