Skip to content

Commit ea89863

Browse files
authored
Merge pull request #158 from Tcode-Motion/code-health-refactor-token-uniqueness-test-8998720381908996873
🧹 Refactor test_token_uniqueness using strum EnumIter
2 parents 2821714 + 57a2a25 commit ea89863

4 files changed

Lines changed: 40 additions & 108 deletions

File tree

‎Cargo.lock‎

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎compiler/syntax/Cargo.toml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ description = "Token definitions, keywords, and operator precedence for TechScri
77
[dependencies]
88
techscript_common = { path = "../common" }
99
serde = { workspace = true }
10+
strum = "0.28.0"
11+
strum_macros = "0.28.0"
1012

1113
[dev-dependencies]
1214
serde_json = { workspace = true }

‎compiler/syntax/src/token_kind.rs‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use serde::{Deserialize, Serialize};
55
use std::fmt;
66

77
/// Classification of literal values in TechScript 2.0.
8-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8+
#[derive(
9+
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, strum_macros::EnumIter,
10+
)]
911
pub enum LiteralKind {
1012
/// Integer literal (e.g., `42`).
1113
Int,
@@ -50,7 +52,9 @@ impl fmt::Display for NumericLiteralKind {
5052
/// - **Canonical 2.0**: The one true spelling — no warnings emitted.
5153
/// - **Deprecated Alias**: Old spelling — still parsed, but emits a `TSW1xxx` warning.
5254
/// - **Reserved**: Recognised by the lexer but not yet active.
53-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
55+
#[derive(
56+
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, strum_macros::EnumIter,
57+
)]
5458
pub enum TokenKind {
5559
// ── Canonical 2.0 Keywords ──────────────────────────────────────────────────────
5660
/// `do` — function/method declaration (replaces `build`, `fun`, `function`)

‎compiler/syntax/tests/syntax_tests.rs‎

Lines changed: 12 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -378,114 +378,20 @@ fn test_serde_roundtrips() {
378378

379379
#[test]
380380
fn test_token_uniqueness() {
381+
use strum::IntoEnumIterator;
381382
// Ensure all TokenKind static_lexemes are unique
382383
let mut lexemes = HashSet::new();
383-
let kinds = [
384-
TokenKind::Do,
385-
TokenKind::Send,
386-
TokenKind::When,
387-
TokenKind::Loop,
388-
TokenKind::Repeat,
389-
TokenKind::For,
390-
TokenKind::In,
391-
TokenKind::Match,
392-
TokenKind::Case,
393-
TokenKind::Default,
394-
TokenKind::Try,
395-
TokenKind::Catch,
396-
TokenKind::Throw,
397-
TokenKind::Use,
398-
TokenKind::Class,
399-
TokenKind::Struct,
400-
TokenKind::Enum,
401-
TokenKind::Trait,
402-
TokenKind::Interface,
403-
TokenKind::Const,
404-
TokenKind::Null,
405-
TokenKind::Say,
406-
TokenKind::Ask,
407-
TokenKind::Break,
408-
TokenKind::Continue,
409-
TokenKind::Else,
410-
TokenKind::Async,
411-
TokenKind::Await,
412-
TokenKind::Parallel,
413-
TokenKind::End,
414-
TokenKind::Export,
415-
TokenKind::New,
416-
TokenKind::SelfKw,
417-
TokenKind::True,
418-
TokenKind::False,
419-
TokenKind::Typeof,
420-
TokenKind::With,
421-
TokenKind::Build,
422-
TokenKind::Make,
423-
TokenKind::Return,
424-
TokenKind::Model,
425-
TokenKind::If,
426-
TokenKind::Elif,
427-
TokenKind::While,
428-
TokenKind::Import,
429-
TokenKind::From,
430-
TokenKind::Let,
431-
TokenKind::Var,
432-
TokenKind::Fun,
433-
TokenKind::Function,
434-
TokenKind::Attempt,
435-
TokenKind::None,
436-
TokenKind::Keep,
437-
TokenKind::Give,
438-
TokenKind::Stop,
439-
TokenKind::Skip,
440-
TokenKind::Each,
441-
TokenKind::Switch,
442-
TokenKind::Be,
443-
TokenKind::Equals,
444-
TokenKind::Then,
445-
TokenKind::Plus,
446-
TokenKind::Minus,
447-
TokenKind::Star,
448-
TokenKind::Slash,
449-
TokenKind::DoubleSlash,
450-
TokenKind::Percent,
451-
TokenKind::DoubleStar,
452-
TokenKind::EqualEqual,
453-
TokenKind::BangEqual,
454-
TokenKind::TripleEqual,
455-
TokenKind::BangEqualEqual,
456-
TokenKind::Less,
457-
TokenKind::Greater,
458-
TokenKind::LessEqual,
459-
TokenKind::GreaterEqual,
460-
TokenKind::Equal,
461-
TokenKind::PlusEqual,
462-
TokenKind::MinusEqual,
463-
TokenKind::StarEqual,
464-
TokenKind::SlashEqual,
465-
TokenKind::PercentEqual,
466-
TokenKind::DotDot,
467-
TokenKind::DotDotEqual,
468-
TokenKind::QuestionDot,
469-
TokenKind::QuestionQuestion,
470-
TokenKind::Arrow,
471-
TokenKind::LeftParen,
472-
TokenKind::RightParen,
473-
TokenKind::LeftBrace,
474-
TokenKind::RightBrace,
475-
TokenKind::LeftBracket,
476-
TokenKind::RightBracket,
477-
TokenKind::Comma,
478-
TokenKind::Dot,
479-
TokenKind::Colon,
480-
TokenKind::Semicolon,
481-
];
482384

483-
for kind in kinds {
484-
let lexeme = kind.static_lexeme().unwrap();
485-
assert!(
486-
lexemes.insert(lexeme),
487-
"Duplicate static lexeme detected for: {:?}",
488-
kind
489-
);
385+
for kind in TokenKind::iter() {
386+
if kind == TokenKind::FStringExprStart || kind == TokenKind::FStringExprEnd {
387+
continue; // Overlaps with LeftBrace/RightBrace logically, but handled contextually
388+
}
389+
if let Some(lexeme) = kind.static_lexeme() {
390+
assert!(
391+
lexemes.insert(lexeme),
392+
"Duplicate static lexeme detected for: {:?}",
393+
kind
394+
);
395+
}
490396
}
491397
}

0 commit comments

Comments
 (0)