浏览代码

LibJS: Use some macro magic to avoid duplicating all the token types

Andreas Kling 5 年之前
父节点
当前提交
a1c718e387
共有 2 个文件被更改,包括 99 次插入265 次删除
  1. 5 176
      Libraries/LibJS/Token.cpp
  2. 94 89
      Libraries/LibJS/Token.h

+ 5 - 176
Libraries/LibJS/Token.cpp

@@ -33,182 +33,11 @@ namespace JS {
 const char* Token::name(TokenType type)
 const char* Token::name(TokenType type)
 {
 {
     switch (type) {
     switch (type) {
-    case TokenType::Ampersand:
-        return "Ampersand";
-    case TokenType::AmpersandEquals:
-        return "AmpersandEquals";
-    case TokenType::Asterisk:
-        return "Asterisk";
-    case TokenType::AsteriskAsteriskEquals:
-        return "AsteriskAsteriskEquals";
-    case TokenType::AsteriskEquals:
-        return "AsteriskEquals";
-    case TokenType::Await:
-        return "Await";
-    case TokenType::BoolLiteral:
-        return "BoolLiteral";
-    case TokenType::BracketOpen:
-        return "BracketOpen";
-    case TokenType::BracketClose:
-        return "BracketClose";
-    case TokenType::Break:
-        return "Break";
-    case TokenType::Caret:
-        return "Caret";
-    case TokenType::Case:
-        return "Case";
-    case TokenType::Catch:
-        return "Catch";
-    case TokenType::Class:
-        return "Class";
-    case TokenType::Colon:
-        return "Colon";
-    case TokenType::Comma:
-        return "Comma";
-    case TokenType::Const:
-        return "Const";
-    case TokenType::CurlyClose:
-        return "CurlyClose";
-    case TokenType::CurlyOpen:
-        return "CurlyOpen";
-    case TokenType::Default:
-        return "Default";
-    case TokenType::Delete:
-        return "Delete";
-    case TokenType::Do:
-        return "Do";
-    case TokenType::DoubleAmpersand:
-        return "DoubleAmpersand";
-    case TokenType::DoubleAsterisk:
-        return "DoubleAsterisk";
-    case TokenType::DoublePipe:
-        return "DoublePipe";
-    case TokenType::DoubleQuestionMark:
-        return "DoubleQuestionMark";
-    case TokenType::Else:
-        return "Else";
-    case TokenType::Eof:
-        return "Eof";
-    case TokenType::Equals:
-        return "Equals";
-    case TokenType::EqualsEquals:
-        return "EqualsEquals";
-    case TokenType::EqualsEqualsEquals:
-        return "EqualsEqualsEquals";
-    case TokenType::ExclamationMark:
-        return "ExclamationMark";
-    case TokenType::ExclamationMarkEquals:
-        return "ExclamationMarkEquals";
-    case TokenType::ExclamationMarkEqualsEquals:
-        return "ExclamationMarkEqualsEquals";
-    case TokenType::Finally:
-        return "Finally";
-    case TokenType::For:
-        return "For";
-    case TokenType::Function:
-        return "Function";
-    case TokenType::GreaterThan:
-        return "GreaterThan";
-    case TokenType::GreaterThanEquals:
-        return "GreaterThanEquals";
-    case TokenType::Identifier:
-        return "Identifier";
-    case TokenType::If:
-        return "If";
-    case TokenType::In:
-        return "In";
-    case TokenType::Instanceof:
-        return "Instanceof";
-    case TokenType::Interface:
-        return "Interface";
-    case TokenType::Invalid:
-        return "Invalid";
-    case TokenType::LessThan:
-        return "LessThan";
-    case TokenType::LessThanEquals:
-        return "LessThanEquals";
-    case TokenType::Let:
-        return "Let";
-    case TokenType::Minus:
-        return "Minus";
-    case TokenType::MinusEquals:
-        return "MinusEquals";
-    case TokenType::MinusMinus:
-        return "MinusMinus";
-    case TokenType::New:
-        return "New";
-    case TokenType::NullLiteral:
-        return "NullLiteral";
-    case TokenType::NumericLiteral:
-        return "NumericLiteral";
-    case TokenType::ParenClose:
-        return "ParenClose";
-    case TokenType::ParenOpen:
-        return "ParenOpen";
-    case TokenType::Percent:
-        return "Percent";
-    case TokenType::PercentEquals:
-        return "PercentEquals";
-    case TokenType::Period:
-        return "Period";
-    case TokenType::Pipe:
-        return "Pipe";
-    case TokenType::PipeEquals:
-        return "PipeEquals";
-    case TokenType::Plus:
-        return "Plus";
-    case TokenType::PlusEquals:
-        return "PlusEquals";
-    case TokenType::PlusPlus:
-        return "PlusPlus";
-    case TokenType::QuestionMark:
-        return "QuestionMark";
-    case TokenType::QuestionMarkPeriod:
-        return "QuestionMarkPeriod";
-    case TokenType::RegexLiteral:
-        return "RegexLiteral";
-    case TokenType::Return:
-        return "Return";
-    case TokenType::Semicolon:
-        return "Semicolon";
-    case TokenType::ShiftLeft:
-        return "ShiftLeft";
-    case TokenType::ShiftLeftEquals:
-        return "ShiftLeftEquals";
-    case TokenType::ShiftRight:
-        return "ShiftRight";
-    case TokenType::ShiftRightEquals:
-        return "ShiftRightEquals";
-    case TokenType::Slash:
-        return "Slash";
-    case TokenType::SlashEquals:
-        return "SlashEquals";
-    case TokenType::StringLiteral:
-        return "StringLiteral";
-    case TokenType::Switch:
-        return "Switch";
-    case TokenType::Tilde:
-        return "Tilde";
-    case TokenType::Try:
-        return "Try";
-    case TokenType::Typeof:
-        return "Typeof";
-    case TokenType::UndefinedLiteral:
-        return "UndefinedLiteral";
-    case TokenType::UnsignedShiftRight:
-        return "UnsignedShiftRight";
-    case TokenType::UnsignedShiftRightEquals:
-        return "UnsignedShiftRightEquals";
-    case TokenType::UnterminatedStringLiteral:
-        return "UnterminatedStringLiteral";
-    case TokenType::Var:
-        return "Var";
-    case TokenType::Void:
-        return "Void";
-    case TokenType::While:
-        return "While";
-    case TokenType::Yield:
-        return "Yield";
+#define __ENUMERATE_JS_TOKEN(x) \
+    case TokenType::x:          \
+        return #x;
+        ENUMERATE_JS_TOKENS
+#undef __ENUMERATE_JS_TOKEN
     default:
     default:
         ASSERT_NOT_REACHED();
         ASSERT_NOT_REACHED();
         return "<Unknown>";
         return "<Unknown>";

+ 94 - 89
Libraries/LibJS/Token.h

@@ -31,96 +31,101 @@
 
 
 namespace JS {
 namespace JS {
 
 
+#define ENUMERATE_JS_TOKENS                           \
+    __ENUMERATE_JS_TOKEN(Ampersand)                   \
+    __ENUMERATE_JS_TOKEN(AmpersandEquals)             \
+    __ENUMERATE_JS_TOKEN(Asterisk)                    \
+    __ENUMERATE_JS_TOKEN(AsteriskAsteriskEquals)      \
+    __ENUMERATE_JS_TOKEN(AsteriskEquals)              \
+    __ENUMERATE_JS_TOKEN(Await)                       \
+    __ENUMERATE_JS_TOKEN(BoolLiteral)                 \
+    __ENUMERATE_JS_TOKEN(BracketClose)                \
+    __ENUMERATE_JS_TOKEN(BracketOpen)                 \
+    __ENUMERATE_JS_TOKEN(Break)                       \
+    __ENUMERATE_JS_TOKEN(Caret)                       \
+    __ENUMERATE_JS_TOKEN(Case)                        \
+    __ENUMERATE_JS_TOKEN(Catch)                       \
+    __ENUMERATE_JS_TOKEN(Class)                       \
+    __ENUMERATE_JS_TOKEN(Colon)                       \
+    __ENUMERATE_JS_TOKEN(Comma)                       \
+    __ENUMERATE_JS_TOKEN(Const)                       \
+    __ENUMERATE_JS_TOKEN(CurlyClose)                  \
+    __ENUMERATE_JS_TOKEN(CurlyOpen)                   \
+    __ENUMERATE_JS_TOKEN(Default)                     \
+    __ENUMERATE_JS_TOKEN(Delete)                      \
+    __ENUMERATE_JS_TOKEN(Do)                          \
+    __ENUMERATE_JS_TOKEN(DoubleAmpersand)             \
+    __ENUMERATE_JS_TOKEN(DoubleAsterisk)              \
+    __ENUMERATE_JS_TOKEN(DoublePipe)                  \
+    __ENUMERATE_JS_TOKEN(DoubleQuestionMark)          \
+    __ENUMERATE_JS_TOKEN(Else)                        \
+    __ENUMERATE_JS_TOKEN(Eof)                         \
+    __ENUMERATE_JS_TOKEN(Equals)                      \
+    __ENUMERATE_JS_TOKEN(EqualsEquals)                \
+    __ENUMERATE_JS_TOKEN(EqualsEqualsEquals)          \
+    __ENUMERATE_JS_TOKEN(ExclamationMark)             \
+    __ENUMERATE_JS_TOKEN(ExclamationMarkEquals)       \
+    __ENUMERATE_JS_TOKEN(ExclamationMarkEqualsEquals) \
+    __ENUMERATE_JS_TOKEN(Finally)                     \
+    __ENUMERATE_JS_TOKEN(For)                         \
+    __ENUMERATE_JS_TOKEN(Function)                    \
+    __ENUMERATE_JS_TOKEN(GreaterThan)                 \
+    __ENUMERATE_JS_TOKEN(GreaterThanEquals)           \
+    __ENUMERATE_JS_TOKEN(Identifier)                  \
+    __ENUMERATE_JS_TOKEN(If)                          \
+    __ENUMERATE_JS_TOKEN(In)                          \
+    __ENUMERATE_JS_TOKEN(Instanceof)                  \
+    __ENUMERATE_JS_TOKEN(Interface)                   \
+    __ENUMERATE_JS_TOKEN(Invalid)                     \
+    __ENUMERATE_JS_TOKEN(LessThan)                    \
+    __ENUMERATE_JS_TOKEN(LessThanEquals)              \
+    __ENUMERATE_JS_TOKEN(Let)                         \
+    __ENUMERATE_JS_TOKEN(Minus)                       \
+    __ENUMERATE_JS_TOKEN(MinusEquals)                 \
+    __ENUMERATE_JS_TOKEN(MinusMinus)                  \
+    __ENUMERATE_JS_TOKEN(New)                         \
+    __ENUMERATE_JS_TOKEN(NullLiteral)                 \
+    __ENUMERATE_JS_TOKEN(NumericLiteral)              \
+    __ENUMERATE_JS_TOKEN(ParenClose)                  \
+    __ENUMERATE_JS_TOKEN(ParenOpen)                   \
+    __ENUMERATE_JS_TOKEN(Percent)                     \
+    __ENUMERATE_JS_TOKEN(PercentEquals)               \
+    __ENUMERATE_JS_TOKEN(Period)                      \
+    __ENUMERATE_JS_TOKEN(Pipe)                        \
+    __ENUMERATE_JS_TOKEN(PipeEquals)                  \
+    __ENUMERATE_JS_TOKEN(Plus)                        \
+    __ENUMERATE_JS_TOKEN(PlusEquals)                  \
+    __ENUMERATE_JS_TOKEN(PlusPlus)                    \
+    __ENUMERATE_JS_TOKEN(QuestionMark)                \
+    __ENUMERATE_JS_TOKEN(QuestionMarkPeriod)          \
+    __ENUMERATE_JS_TOKEN(RegexLiteral)                \
+    __ENUMERATE_JS_TOKEN(Return)                      \
+    __ENUMERATE_JS_TOKEN(Semicolon)                   \
+    __ENUMERATE_JS_TOKEN(ShiftLeft)                   \
+    __ENUMERATE_JS_TOKEN(ShiftLeftEquals)             \
+    __ENUMERATE_JS_TOKEN(ShiftRight)                  \
+    __ENUMERATE_JS_TOKEN(ShiftRightEquals)            \
+    __ENUMERATE_JS_TOKEN(Slash)                       \
+    __ENUMERATE_JS_TOKEN(SlashEquals)                 \
+    __ENUMERATE_JS_TOKEN(StringLiteral)               \
+    __ENUMERATE_JS_TOKEN(Switch)                      \
+    __ENUMERATE_JS_TOKEN(Throw)                       \
+    __ENUMERATE_JS_TOKEN(Tilde)                       \
+    __ENUMERATE_JS_TOKEN(Try)                         \
+    __ENUMERATE_JS_TOKEN(Typeof)                      \
+    __ENUMERATE_JS_TOKEN(UndefinedLiteral)            \
+    __ENUMERATE_JS_TOKEN(UnsignedShiftRight)          \
+    __ENUMERATE_JS_TOKEN(UnsignedShiftRightEquals)    \
+    __ENUMERATE_JS_TOKEN(UnterminatedStringLiteral)   \
+    __ENUMERATE_JS_TOKEN(Var)                         \
+    __ENUMERATE_JS_TOKEN(Void)                        \
+    __ENUMERATE_JS_TOKEN(While)                       \
+    __ENUMERATE_JS_TOKEN(Yield)
+
 enum class TokenType {
 enum class TokenType {
-    Ampersand,
-    AmpersandEquals,
-    Asterisk,
-    AsteriskAsteriskEquals,
-    AsteriskEquals,
-    Await,
-    BoolLiteral,
-    BracketClose,
-    BracketOpen,
-    Break,
-    Caret,
-    Case,
-    Catch,
-    Class,
-    Colon,
-    Comma,
-    Const,
-    CurlyClose,
-    CurlyOpen,
-    Default,
-    Delete,
-    Do,
-    DoubleAmpersand,
-    DoubleAsterisk,
-    DoublePipe,
-    DoubleQuestionMark,
-    Else,
-    Eof,
-    Equals,
-    EqualsEquals,
-    EqualsEqualsEquals,
-    ExclamationMark,
-    ExclamationMarkEquals,
-    ExclamationMarkEqualsEquals,
-    Finally,
-    For,
-    Function,
-    GreaterThan,
-    GreaterThanEquals,
-    Identifier,
-    If,
-    In,
-    Instanceof,
-    Interface,
-    Invalid,
-    LessThan,
-    LessThanEquals,
-    Let,
-    Minus,
-    MinusEquals,
-    MinusMinus,
-    New,
-    NullLiteral,
-    NumericLiteral,
-    ParenClose,
-    ParenOpen,
-    Percent,
-    PercentEquals,
-    Period,
-    Pipe,
-    PipeEquals,
-    Plus,
-    PlusEquals,
-    PlusPlus,
-    QuestionMark,
-    QuestionMarkPeriod,
-    RegexLiteral,
-    Return,
-    Semicolon,
-    ShiftLeft,
-    ShiftLeftEquals,
-    ShiftRight,
-    ShiftRightEquals,
-    Slash,
-    SlashEquals,
-    StringLiteral,
-    Switch,
-    Throw,
-    Tilde,
-    Try,
-    Typeof,
-    UndefinedLiteral,
-    UnsignedShiftRight,
-    UnsignedShiftRightEquals,
-    UnterminatedStringLiteral,
-    Var,
-    Void,
-    While,
-    Yield,
+#define __ENUMERATE_JS_TOKEN(x) x,
+    ENUMERATE_JS_TOKENS
+#undef __ENUMERATE_JS_TOKEN
 };
 };
 
 
 class Token {
 class Token {