Skip to content

Commit d5d0f24

Browse files
committed
support lua5.5 grammar format
1 parent 8735890 commit d5d0f24

File tree

5 files changed

+114
-1
lines changed

5 files changed

+114
-1
lines changed

CodeFormatCore/src/Format/Analyzer/SpaceAnalyzer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ void SpaceAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
145145
case TK_FOR:
146146
case TK_ELSE:
147147
case TK_FUNCTION:
148-
case TK_END: {
148+
case TK_END:
149+
case TK_GLOBAL: {
149150
SpaceRight(syntaxNode, t);
150151
break;
151152
}
@@ -194,6 +195,12 @@ void SpaceAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
194195
SpaceRight(syntaxNode, t, 1);
195196
break;
196197
}
198+
case TK_DOTS: {
199+
auto rightToken = syntaxNode.GetNextToken(t);
200+
if (rightToken.GetTokenKind(t) == TK_NAME) {
201+
SpaceRight(syntaxNode, t, 0);
202+
}
203+
}
197204
default: {
198205
break;
199206
}
@@ -317,6 +324,15 @@ void SpaceAnalyzer::ComplexAnalyze(FormatState &f, const LuaSyntaxTree &t) {
317324
}
318325
break;
319326
}
327+
case LuaSyntaxNodeKind::GlobalStatement: {
328+
auto childrens = syntaxNode.GetChildren(t);
329+
if (childrens.size() >= 2) {
330+
auto maybeAttrib = childrens[1];
331+
if (maybeAttrib.GetSyntaxKind(t) == LuaSyntaxNodeKind::Attribute) {
332+
SpaceRight(maybeAttrib, t, 1);
333+
}
334+
}
335+
}
320336
case LuaSyntaxNodeKind::FunctionBody: {
321337
auto leftBrace = syntaxNode.GetChildToken('(', t);
322338
if (syntaxNode.GetParent(t).GetSyntaxKind(t) == LuaSyntaxNodeKind::ClosureExpression) {

LuaParser/include/LuaParser/Ast/LuaSyntaxNodeKind.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ enum class LuaSyntaxNodeKind {
3838

3939
AssignStatement,
4040

41+
GlobalStatement,
42+
4143
SuffixedExpression,
4244

4345
ParExpression,

LuaParser/include/LuaParser/Lexer/LuaTokenTypeDetail.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ enum LuaTokenTypeDetail : int {
2828
TK_TRUE,
2929
TK_UNTIL,
3030
TK_WHILE,
31+
TK_GLOBAL, // global lua5.5
3132
/* other terminal symbols */
3233
TK_IDIV,
3334
TK_CONCAT,

LuaParser/include/LuaParser/Parse/LuaParser.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,14 @@ class LuaParser {
3333
private:
3434
void Next();
3535

36+
void NextAs(LuaTokenKind kind);
37+
3638
LuaTokenKind LookAhead();
3739

3840
LuaTokenKind Current();
3941

42+
std::string_view CurrentText();
43+
4044
void SkipComment();
4145

4246
bool BlockFollow(bool rightbrace = false);
@@ -71,6 +75,10 @@ class LuaParser {
7175

7276
void ExpressionStatement();
7377

78+
bool TryGlobalStatement();
79+
80+
void GlobalNameList();
81+
7482
void ForNumber();
7583

7684
void ForList();

LuaParser/src/Parse/LuaParser.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ void LuaParser::Next() {
6363
_invalid = true;
6464
}
6565

66+
void LuaParser::NextAs(LuaTokenKind kind) {
67+
auto me = MarkEvent(MarkEventType::EatToken);
68+
me.U.Token.Kind = kind;
69+
me.U.Token.Index = _tokenIndex;
70+
_events.push_back(me);
71+
_tokenIndex++;
72+
_invalid = true;
73+
}
74+
6675
LuaTokenKind LuaParser::LookAhead() {
6776
std::size_t nextIndex = _tokenIndex + 1;
6877

@@ -103,6 +112,14 @@ LuaTokenKind LuaParser::Current() {
103112
return _current;
104113
}
105114

115+
std::string_view LuaParser::CurrentText() {
116+
if (_tokenIndex < _tokens.size()) {
117+
auto range = _tokens[_tokenIndex].Range;
118+
return _file->GetSource().substr(range.StartOffset, range.GetEndOffset() - range.StartOffset + 1);
119+
}
120+
return "";
121+
}
122+
106123
void LuaParser::SkipComment() {
107124
for (; _tokenIndex < _tokens.size(); _tokenIndex++) {
108125
switch (_tokens[_tokenIndex].TokenType) {
@@ -453,6 +470,12 @@ void LuaParser::GotoStatement() {
453470
// exprStat -> call | assignment
454471
// assignment -> varList '=' exprList
455472
void LuaParser::ExpressionStatement() {
473+
if (Current() == TK_NAME && CurrentText() == "global") {
474+
if (TryGlobalStatement()) {
475+
return;
476+
}
477+
}
478+
456479
auto m = Mark();
457480
SuffixedExpression();
458481
if (Current() == '=' || Current() == ',') {
@@ -475,6 +498,66 @@ void LuaParser::ExpressionStatement() {
475498
}
476499
}
477500

501+
bool LuaParser::TryGlobalStatement() {
502+
auto m = Mark();
503+
switch (LookAhead()) {
504+
case '*':
505+
Next();// Global
506+
Next();
507+
508+
TestAndNext(';');
509+
m.Complete(*this, LuaSyntaxNodeKind::GlobalStatement);
510+
return true;
511+
case '<':
512+
Next();// Global
513+
LocalAttribute();
514+
515+
switch (Current()) {
516+
case TK_NAME:
517+
GlobalNameList();
518+
break;
519+
case '*':
520+
Next();
521+
break;
522+
default:
523+
break;
524+
}
525+
TestAndNext(';');
526+
m.Complete(*this, LuaSyntaxNodeKind::GlobalStatement);
527+
return true;
528+
case TK_FUNCTION:
529+
Next();// Global
530+
Next();// Function
531+
CheckName();
532+
FunctionBody();
533+
TestAndNext(';');
534+
m.Complete(*this, LuaSyntaxNodeKind::FunctionStatement);
535+
break;
536+
case TK_NAME:
537+
Next();// Global
538+
GlobalNameList();
539+
TestAndNext(';');
540+
m.Complete(*this, LuaSyntaxNodeKind::GlobalStatement);
541+
return true;
542+
default:
543+
break;
544+
}
545+
546+
m.Undo(*this);
547+
return false;
548+
}
549+
550+
void LuaParser::GlobalNameList() {
551+
do {
552+
CheckName();
553+
LocalAttribute();
554+
} while (TestAndNext(','));
555+
556+
if (TestAndNext('=')) {
557+
ExpressionList();
558+
}
559+
}
560+
478561
void LuaParser::Condition() {
479562
Expression();
480563
}
@@ -692,6 +775,9 @@ void LuaParser::ParamList() {
692775
case TK_DOTS: {
693776
isVararg = true;
694777
Next();
778+
if (Current() == TK_NAME) {
779+
Next();
780+
}
695781
break;
696782
}
697783
case ')': {

0 commit comments

Comments
 (0)