Skip to content

Commit 12ff61a

Browse files
committed
支持---@Format disable/disable-next
1 parent e2eb58e commit 12ff61a

File tree

20 files changed

+530
-98
lines changed

20 files changed

+530
-98
lines changed

CodeFormatServer/src/LanguageService.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnTypeFormatting(
339339
formattedRange, parser, options);
340340

341341
auto totalLine = parser->GetTotalLine();
342-
if(totalLine == position.line)
342+
if(totalLine == position.line && !options->insert_final_newline)
343343
{
344344
formatResult.push_back('\n');
345345
}

CodeService/src/AstUtil.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,3 +317,16 @@ bool ast_util::IsNodeAfterMoreIndentionStatement(std::shared_ptr<LuaAstNode> nod
317317

318318
return false;
319319
}
320+
321+
bool ast_util::IsTagFormat(std::shared_ptr<LuaAstNode> comment)
322+
{
323+
auto shortComment = comment->FindFirstOf(LuaAstNodeType::ShortComment);
324+
if (shortComment)
325+
{
326+
return shortComment->FindFirstOf(LuaAstNodeType::DocTagFormat) != nullptr;
327+
}
328+
return false;
329+
}
330+
331+
332+

CodeService/src/FormatElement/IndentElement.cpp

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
#include "CodeService/FormatElement/IndentElement.h"
22
#include "Util/format.h"
33
#include "CodeService/FormatElement/FormatElement.h"
4+
#include "CodeService/FormatElement/StatementElement.h"
5+
#include "CodeService/FormatElement/TextElement.h"
46

57
IndentElement::IndentElement()
68
: FormatElement(),
79
_specialIndent(0),
810
_style(IndentStyle::Space),
9-
_defaultIndent(true)
11+
_defaultIndent(true),
12+
_formatControl(DisableFormat::None)
1013
{
1114
}
1215

@@ -23,6 +26,53 @@ FormatElementType IndentElement::GetType()
2326
return FormatElementType::IndentElement;
2427
}
2528

29+
void IndentElement::EnableDisableNext()
30+
{
31+
if (_formatControl == DisableFormat::None) {
32+
_formatControl = DisableFormat::DisableNext;
33+
}
34+
}
35+
36+
void IndentElement::EnableDisableFormat()
37+
{
38+
_formatControl = DisableFormat::Disable;
39+
}
40+
41+
bool IndentElement::IsDisableEnv()
42+
{
43+
return _formatControl != DisableFormat::None;
44+
}
45+
46+
void IndentElement::AddChild(std::shared_ptr<FormatElement> child)
47+
{
48+
switch (_formatControl)
49+
{
50+
case DisableFormat::None:
51+
{
52+
return FormatElement::AddChild(child);
53+
}
54+
case DisableFormat::DisableNext:
55+
{
56+
if (child->Is(FormatElementType::StatementElement))
57+
{
58+
auto statement = std::dynamic_pointer_cast<StatementElement>(child);
59+
statement->SetDisableFormat();
60+
_formatControl = DisableFormat::None;
61+
}
62+
return FormatElement::AddChild(child);
63+
}
64+
case DisableFormat::Disable:
65+
{
66+
if (child->Is(FormatElementType::StatementElement))
67+
{
68+
auto statement = std::dynamic_pointer_cast<StatementElement>(child);
69+
statement->SetDisableFormat();
70+
}
71+
return FormatElement::AddChild(child);
72+
}
73+
}
74+
}
75+
2676
void IndentElement::Serialize(SerializeContext& ctx, ChildIterator selfIt, FormatElement& parent)
2777
{
2878
if (_defaultIndent)
Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,46 @@
11
#include "CodeService/FormatElement/StatementElement.h"
22

3+
#include "CodeService/FormatElement/TextElement.h"
4+
5+
6+
StatementElement::StatementElement()
7+
: _disableFormat(false)
8+
{
9+
}
10+
311
FormatElementType StatementElement::GetType()
412
{
513
return FormatElementType::StatementElement;
614
}
715

16+
void StatementElement::SetDisableFormat()
17+
{
18+
_disableFormat = true;
19+
}
20+
21+
822
void StatementElement::Serialize(SerializeContext& ctx, ChildIterator selfIt, FormatElement& parent)
923
{
10-
FormatElement::Serialize(ctx, selfIt, parent);
24+
if (!_disableFormat) {
25+
FormatElement::Serialize(ctx, selfIt, parent);
26+
}
27+
else
28+
{
29+
auto textRange = _textRange;
30+
std::string_view source = ctx.GetParser()->GetSource();
31+
std::string_view text = source.substr(textRange.StartOffset, textRange.EndOffset - textRange.StartOffset + 1);
32+
33+
auto textElement = std::make_shared<TextElement>(text, textRange);
34+
textElement->Serialize(ctx, selfIt, parent);
35+
}
1136

1237
ctx.PrintLine(1);
1338
}
1439

1540
void StatementElement::Diagnosis(DiagnosisContext& ctx, ChildIterator selfIt, FormatElement& parent)
1641
{
17-
FormatElement::Diagnosis(ctx, selfIt, parent);
42+
if (!_disableFormat) {
43+
FormatElement::Diagnosis(ctx, selfIt, parent);
44+
}
1845
ctx.SetCharacterCount(0);
1946
}

CodeService/src/LuaFormatter.cpp

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,10 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatBlock(std::shared_ptr<LuaAstN
267267
case LuaAstNodeType::AssignStatement:
268268
case LuaAstNodeType::LocalStatement:
269269
{
270-
if (NextMatch(it, LuaAstNodeType::AssignStatement, statements)
271-
|| NextMatch(it, LuaAstNodeType::LocalStatement, statements)
272-
|| NextMatch(it, LuaAstNodeType::Comment, statements))
270+
if (!indentEnv->IsDisableEnv()
271+
&& (NextMatch(it, LuaAstNodeType::AssignStatement, statements)
272+
|| NextMatch(it, LuaAstNodeType::LocalStatement, statements)
273+
|| NextMatch(it, LuaAstNodeType::Comment, statements)))
273274
{
274275
indentEnv->AddChild(FormatAlignStatement(it, statements));
275276
}
@@ -331,6 +332,28 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatBlock(std::shared_ptr<LuaAstN
331332
commentStatement->AddChild(comment);
332333
indentEnv->AddChild(commentStatement);
333334
indentEnv->Add<KeepLineElement>();
335+
336+
// emmylua doc ---@format
337+
auto shortComment = statement->FindFirstOf(LuaAstNodeType::ShortComment);
338+
if (shortComment)
339+
{
340+
auto docTagFormat = shortComment->FindFirstOf(LuaAstNodeType::DocTagFormat);
341+
if (docTagFormat)
342+
{
343+
auto disableKeyWorld = docTagFormat->FindFirstOf(LuaAstNodeType::KeyWord);
344+
if (disableKeyWorld)
345+
{
346+
if (disableKeyWorld->GetTokenType() == TK_DOC_DISABLE)
347+
{
348+
indentEnv->EnableDisableFormat();
349+
}
350+
else if (disableKeyWorld->GetTokenType() == TK_DOC_DISABLE_NEXT)
351+
{
352+
indentEnv->EnableDisableNext();
353+
}
354+
}
355+
}
356+
}
334357
}
335358
break;
336359
}
@@ -1261,7 +1284,7 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatCallArgList(std::shared_ptr<L
12611284
if (!expression->GetChildren().empty())
12621285
{
12631286
auto first = expression->GetChildren().front();
1264-
if (first->GetType() == LuaAstNodeType::ClosureExpression
1287+
if (first->GetType() == LuaAstNodeType::ClosureExpression
12651288
|| first->GetType() == LuaAstNodeType::TableExpression
12661289
|| _options.align_call_args == AlignCallArgs::OnlyNotExistCrossExpression)
12671290
{
@@ -1273,10 +1296,10 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatCallArgList(std::shared_ptr<L
12731296
}
12741297
}
12751298

1276-
if(canAligned
1299+
if (canAligned
12771300
&& _options.align_call_args == AlignCallArgs::OnlyAfterMoreIndentionStatement
12781301
&& (!ast_util::IsNodeAfterMoreIndentionStatement(child))
1279-
)
1302+
)
12801303
{
12811304
canAligned = false;
12821305
}
@@ -1786,6 +1809,11 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatAlignStatement(LuaAstNode::Ch
17861809
break;
17871810
}
17881811

1812+
if (nextChild->GetType() == LuaAstNodeType::Comment && ast_util::IsTagFormat(nextChild))
1813+
{
1814+
break;
1815+
}
1816+
17891817
// 检查是否会是内联注释 比如 local t = 123 -- inline comment
17901818
if ((currentChild->GetType() == LuaAstNodeType::LocalStatement || currentChild->GetType() ==
17911819
LuaAstNodeType::AssignStatement) && nextChild->GetType() == LuaAstNodeType::Comment

LuaParser/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ target_sources(LuaParser PUBLIC
3232
${LuaParser_SOURCE_DIR}/src/LuaFile.cpp
3333
${LuaParser_SOURCE_DIR}/src/LuaIdentify.cpp
3434
${LuaParser_SOURCE_DIR}/src/LuaCustomParser.cpp
35-
${LuaParser_SOURCE_DIR}/src/LuaDocParser.cpp
35+
${LuaParser_SOURCE_DIR}/src/LuaDocTokenParser.cpp
3636
)
3737

3838
target_link_libraries(LuaParser Util)

LuaParser/src/LuaDocParser.cpp

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)