Skip to content

Commit

Permalink
[WGSL] i32, u32, f32 and bool should not be keywords
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=260609
rdar://114320714

Reviewed by Dan Glastonbury.

The first of a series of patches to simplify things as the AST should not be aware
of what is or isn't a type. This starts by simply removing the keywords for the
primitive types, which were barely used to begin with: the lexer transformed the
identifier into a keyword, but the parser turned it back into an identifier.

* Source/WebGPU/WGSL/Lexer.cpp:
(WGSL::Lexer<T>::lex):
* Source/WebGPU/WGSL/Parser.cpp:
(WGSL::Parser<Lexer>::parseTypeName):
(WGSL::Parser<Lexer>::parsePrimaryExpression):
* Source/WebGPU/WGSL/Token.cpp:
(WGSL::toString):
* Source/WebGPU/WGSL/Token.h:

Canonical link: https://commits.webkit.org/267346@main
  • Loading branch information
tadeuzagallo committed Aug 28, 2023
1 parent 37bc742 commit 25fd3e2
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 58 deletions.
5 changes: 0 additions & 5 deletions Source/WebGPU/WGSL/Lexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -333,23 +333,19 @@ Token Lexer<T>::lex()
{ "array", TokenType::KeywordArray },
{ "asm", TokenType::ReservedWord },
{ "bf16", TokenType::ReservedWord },
{ "bool", TokenType::KeywordBool },
{ "break", TokenType::KeywordBreak },
{ "const", TokenType::KeywordConst },
{ "continue", TokenType::KeywordContinue },
{ "do", TokenType::ReservedWord },
{ "else", TokenType::KeywordElse },
{ "enum", TokenType::ReservedWord },
{ "f16", TokenType::ReservedWord },
{ "f32", TokenType::KeywordF32 },
{ "f64", TokenType::ReservedWord },
{ "false", TokenType::LiteralFalse },
{ "fn", TokenType::KeywordFn },
{ "for", TokenType::KeywordFor },
{ "function", TokenType::KeywordFunction },
{ "handle", TokenType::ReservedWord },
{ "i16", TokenType::ReservedWord },
{ "i32", TokenType::KeywordI32 },
{ "i64", TokenType::ReservedWord },
{ "i8", TokenType::ReservedWord },
{ "if", TokenType::KeywordIf },
Expand All @@ -367,7 +363,6 @@ Token Lexer<T>::lex()
{ "true", TokenType::LiteralTrue },
{ "typedef", TokenType::ReservedWord },
{ "u16", TokenType::ReservedWord },
{ "u32", TokenType::KeywordU32 },
{ "u64", TokenType::ReservedWord },
{ "u8", TokenType::ReservedWord },
{ "uniform", TokenType::KeywordUniform },
Expand Down
24 changes: 0 additions & 24 deletions Source/WebGPU/WGSL/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -558,22 +558,6 @@ Result<AST::TypeName::Ref> Parser<Lexer>::parseTypeName()

if (current().type == TokenType::KeywordArray)
return parseArrayType();
if (current().type == TokenType::KeywordI32) {
consume();
RETURN_ARENA_NODE(NamedTypeName, AST::Identifier::makeWithSpan(CURRENT_SOURCE_SPAN(), StringView { "i32"_s }));
}
if (current().type == TokenType::KeywordF32) {
consume();
RETURN_ARENA_NODE(NamedTypeName, AST::Identifier::makeWithSpan(CURRENT_SOURCE_SPAN(), StringView { "f32"_s }));
}
if (current().type == TokenType::KeywordU32) {
consume();
RETURN_ARENA_NODE(NamedTypeName, AST::Identifier::makeWithSpan(CURRENT_SOURCE_SPAN(), StringView { "u32"_s }));
}
if (current().type == TokenType::KeywordBool) {
consume();
RETURN_ARENA_NODE(NamedTypeName, AST::Identifier::makeWithSpan(CURRENT_SOURCE_SPAN(), StringView { "bool"_s }));
}
if (current().type == TokenType::Identifier) {
PARSE(name, Identifier);
return parseTypeNameAfterIdentifier(WTFMove(name), _startOfElementPosition);
Expand Down Expand Up @@ -1281,14 +1265,6 @@ Result<AST::Expression::Ref> Parser<Lexer>::parsePrimaryExpression()
}
RETURN_ARENA_NODE(IdentifierExpression, WTFMove(ident));
}
case TokenType::KeywordI32:
case TokenType::KeywordU32:
case TokenType::KeywordF32:
case TokenType::KeywordBool: {
PARSE(type, TypeName);
PARSE(arguments, ArgumentExpressionList);
RETURN_ARENA_NODE(CallExpression, WTFMove(type), WTFMove(arguments));
}
case TokenType::KeywordArray: {
PARSE(arrayType, ArrayType);
PARSE(arguments, ArgumentExpressionList);
Expand Down
8 changes: 0 additions & 8 deletions Source/WebGPU/WGSL/Token.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,6 @@ String toString(TokenType type)
return "workgroup"_s;
case TokenType::KeywordWrite:
return "write"_s;
case TokenType::KeywordI32:
return "i32"_s;
case TokenType::KeywordU32:
return "u32"_s;
case TokenType::KeywordF32:
return "f32"_s;
case TokenType::KeywordBool:
return "bool"_s;
case TokenType::KeywordBreak:
return "break"_s;
case TokenType::KeywordContinue:
Expand Down
4 changes: 0 additions & 4 deletions Source/WebGPU/WGSL/Token.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,6 @@ enum class TokenType: uint32_t {
KeywordVar,
KeywordWorkgroup,
KeywordWrite,
KeywordI32,
KeywordU32,
KeywordF32,
KeywordBool,
LiteralTrue,
LiteralFalse,
// FIXME: add all the other keywords: see #keyword-summary in the WGSL spec
Expand Down
30 changes: 13 additions & 17 deletions Tools/TestWebKitAPI/Tests/WGSL/LexerTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,11 @@ TEST(WGSLLexerTests, KeywordTokens)
using WGSL::TokenType;

checkSingleToken("array"_s, TokenType::KeywordArray);
checkSingleToken("bool"_s, TokenType::KeywordBool);
checkSingleToken("const"_s, TokenType::KeywordConst);
checkSingleToken("else"_s, TokenType::KeywordElse);
checkSingleToken("f32"_s, TokenType::KeywordF32);
checkSingleToken("fn"_s, TokenType::KeywordFn);
checkSingleToken("for"_s, TokenType::KeywordFor);
checkSingleToken("function"_s, TokenType::KeywordFunction);
checkSingleToken("i32"_s, TokenType::KeywordI32);
checkSingleToken("if"_s, TokenType::KeywordIf);
checkSingleToken("let"_s, TokenType::KeywordLet);
checkSingleToken("override"_s, TokenType::KeywordOverride);
Expand All @@ -138,7 +135,6 @@ TEST(WGSLLexerTests, KeywordTokens)
checkSingleToken("return"_s, TokenType::KeywordReturn);
checkSingleToken("storage"_s, TokenType::KeywordStorage);
checkSingleToken("struct"_s, TokenType::KeywordStruct);
checkSingleToken("u32"_s, TokenType::KeywordU32);
checkSingleToken("uniform"_s, TokenType::KeywordUniform);
checkSingleToken("var"_s, TokenType::KeywordVar);
checkSingleToken("workgroup"_s, TokenType::KeywordWorkgroup);
Expand Down Expand Up @@ -224,7 +220,7 @@ TEST(WGSLLexerTests, ComputeShader)
++lineNumber;
checkNextTokenIsIdentifier(lexer, "a"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Colon, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordI32, lineNumber);
checkNextTokenIsIdentifier(lexer, "i32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Comma, lineNumber);

// }
Expand Down Expand Up @@ -318,7 +314,7 @@ TEST(WGSLLexerTests, GraphicsShader)
checkNextTokenIs(lexer, WGSL::TokenType::Colon, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec4"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenRight, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Arrow, lineNumber);
Expand All @@ -329,7 +325,7 @@ TEST(WGSLLexerTests, GraphicsShader)
checkNextTokenIs(lexer, WGSL::TokenType::ParenRight, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec4"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::BraceLeft, lineNumber);

Expand Down Expand Up @@ -362,7 +358,7 @@ TEST(WGSLLexerTests, GraphicsShader)
checkNextTokenIs(lexer, WGSL::TokenType::ParenRight, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec4"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::BraceLeft, lineNumber);

Expand All @@ -371,7 +367,7 @@ TEST(WGSLLexerTests, GraphicsShader)
checkNextTokenIs(lexer, WGSL::TokenType::KeywordReturn, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec4"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenLeft, lineNumber);
checkNextTokenIsLiteral(lexer, WGSL::TokenType::AbstractFloatLiteral, 0.4, lineNumber);
Expand Down Expand Up @@ -422,7 +418,7 @@ TEST(WGSLLexerTests, TriangleVert)
checkNextTokensAreBuiltinAttr(lexer, "vertex_index"_s, lineNumber);
checkNextTokenIsIdentifier(lexer, "VertexIndex"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Colon, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordU32, lineNumber);
checkNextTokenIsIdentifier(lexer, "u32"_s, lineNumber);

++lineNumber;
// ) -> @builtin(position) vec4<f32> {
Expand All @@ -431,7 +427,7 @@ TEST(WGSLLexerTests, TriangleVert)
checkNextTokensAreBuiltinAttr(lexer, "position"_s, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec4"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::BraceLeft, lineNumber);

Expand All @@ -444,7 +440,7 @@ TEST(WGSLLexerTests, TriangleVert)
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec2"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Comma, lineNumber);
checkNextTokenIsLiteral(lexer, WGSL::TokenType::IntegerLiteral, 3, lineNumber);
Expand All @@ -455,7 +451,7 @@ TEST(WGSLLexerTests, TriangleVert)
// vec2<f32>(0.0, 0.5),
checkNextTokenIsIdentifier(lexer, "vec2"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenLeft, lineNumber);
checkNextTokenIsLiteral(lexer, WGSL::TokenType::AbstractFloatLiteral, 0.0, lineNumber);
Expand All @@ -468,7 +464,7 @@ TEST(WGSLLexerTests, TriangleVert)
// vec2<f32>(-0.5, -0.5),
checkNextTokenIsIdentifier(lexer, "vec2"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenLeft, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Minus, lineNumber);
Expand All @@ -483,7 +479,7 @@ TEST(WGSLLexerTests, TriangleVert)
// vec2<f32>(0.5, -0.5)
checkNextTokenIsIdentifier(lexer, "vec2"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenLeft, lineNumber);
checkNextTokenIsLiteral(lexer, WGSL::TokenType::AbstractFloatLiteral, 0.5, lineNumber);
Expand All @@ -502,7 +498,7 @@ TEST(WGSLLexerTests, TriangleVert)
checkNextTokenIs(lexer, WGSL::TokenType::KeywordReturn, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec4"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenLeft, lineNumber);
checkNextTokenIsIdentifier(lexer, "pos"_s, lineNumber);
Expand All @@ -512,7 +508,7 @@ TEST(WGSLLexerTests, TriangleVert)
checkNextTokenIs(lexer, WGSL::TokenType::Plus, lineNumber);
checkNextTokenIsIdentifier(lexer, "vec2"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Lt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::KeywordF32, lineNumber);
checkNextTokenIsIdentifier(lexer, "f32"_s, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::Gt, lineNumber);
checkNextTokenIs(lexer, WGSL::TokenType::ParenLeft, lineNumber);
checkNextTokenIsLiteral(lexer, WGSL::TokenType::AbstractFloatLiteral, 0.5, lineNumber);
Expand Down

0 comments on commit 25fd3e2

Please sign in to comment.