Skip to content

Commit 696d998

Browse files
committed
fix(parser): support keyof in conditional generic extends
1 parent 6684148 commit 696d998

2 files changed

Lines changed: 49 additions & 0 deletions

File tree

crates/emmylua_parser/src/grammar/doc/test.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3078,6 +3078,54 @@ Syntax(Chunk)@0..106
30783078
assert_ast_eq!(code, result);
30793079
}
30803080

3081+
#[test]
3082+
fn test_alias_conditional_keyof() {
3083+
let code = r#"---@alias D<T,K> K extends keyof T and K or never"#;
3084+
let result = r#"
3085+
Syntax(Chunk)@0..49
3086+
Syntax(Block)@0..49
3087+
Syntax(Comment)@0..49
3088+
Token(TkDocStart)@0..4 "---@"
3089+
Syntax(DocTagAlias)@4..49
3090+
Token(TkTagAlias)@4..9 "alias"
3091+
Token(TkWhitespace)@9..10 " "
3092+
Token(TkName)@10..11 "D"
3093+
Syntax(DocGenericDeclareList)@11..16
3094+
Token(TkLt)@11..12 "<"
3095+
Syntax(DocGenericParameter)@12..13
3096+
Token(TkName)@12..13 "T"
3097+
Token(TkComma)@13..14 ","
3098+
Syntax(DocGenericParameter)@14..15
3099+
Token(TkName)@14..15 "K"
3100+
Token(TkGt)@15..16 ">"
3101+
Token(TkWhitespace)@16..17 " "
3102+
Syntax(TypeConditional)@17..49
3103+
Syntax(TypeBinary)@17..34
3104+
Syntax(TypeName)@17..18
3105+
Token(TkName)@17..18 "K"
3106+
Token(TkWhitespace)@18..19 " "
3107+
Token(TkDocExtends)@19..26 "extends"
3108+
Token(TkWhitespace)@26..27 " "
3109+
Syntax(TypeUnary)@27..34
3110+
Token(TkDocKeyOf)@27..32 "keyof"
3111+
Token(TkWhitespace)@32..33 " "
3112+
Syntax(TypeName)@33..34
3113+
Token(TkName)@33..34 "T"
3114+
Token(TkWhitespace)@34..35 " "
3115+
Token(TkAnd)@35..38 "and"
3116+
Token(TkWhitespace)@38..39 " "
3117+
Syntax(TypeName)@39..40
3118+
Token(TkName)@39..40 "K"
3119+
Token(TkWhitespace)@40..41 " "
3120+
Token(TkOr)@41..43 "or"
3121+
Token(TkWhitespace)@43..44 " "
3122+
Syntax(TypeName)@44..49
3123+
Token(TkName)@44..49 "never"
3124+
"#;
3125+
3126+
assert_ast_eq!(code, result);
3127+
}
3128+
30813129
#[test]
30823130
fn test_alias_nested_conditional() {
30833131
let code = r#"

crates/emmylua_parser/src/lexer/lua_doc_lexer.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ impl LuaDocLexer<'_> {
690690
"false" => LuaTokenKind::TkFalse,
691691
"nil" => LuaTokenKind::TkNil,
692692
"new" => LuaTokenKind::TkDocNew,
693+
"keyof" => LuaTokenKind::TkDocKeyOf,
693694
_ => LuaTokenKind::TkName,
694695
}
695696
}

0 commit comments

Comments
 (0)