Skip to content

Commit 6606b51

Browse files
committed
quote_style option, resolve #17
1 parent 0e21e3c commit 6606b51

28 files changed

+319
-49
lines changed

CodeFormatServer/src/Protocol/ProtocolParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ std::string ProtocolParser::SerializeProtocol(std::shared_ptr<vscode::Serializab
5454

5555
json["result"] = result->Serialize();
5656
json["jsonrpc"] = "2.0";
57-
auto dumpResult = json.dump();
57+
auto dumpResult = json.dump(-1,' ', true, nlohmann::detail::error_handler_t::ignore);
5858
std::string message = format("Content-Length:{}\r\n\r\n", dumpResult.size());
5959

6060
message.append(dumpResult);

CodeService/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ target_sources(CodeService
4747
${CodeService_SOURCE_DIR}/src/FormatElement/MaxSpaceElement.cpp
4848
${CodeService_SOURCE_DIR}/src/FormatElement/AlignmentElement.cpp
4949
${CodeService_SOURCE_DIR}/src/FormatElement/ExpressionElement.cpp
50+
${CodeService_SOURCE_DIR}/src/FormatElement/StringLiteralElement.cpp
5051
${CodeService_SOURCE_DIR}/src/FormatElement/FormatContext.cpp
5152
${CodeService_SOURCE_DIR}/src/FormatElement/SerializeContext.cpp
5253
${CodeService_SOURCE_DIR}/src/FormatElement/AlignmentLayoutElement.cpp

CodeService/src/FormatElement/RangeFormatContext.cpp

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "CodeService/FormatElement/RangeFormatContext.h"
2-
#include "CodeService/FormatElement/TextElement.h"
3-
#include <string_view>
2+
43

54
RangeFormatContext::RangeFormatContext(std::shared_ptr<LuaParser> parser, LuaCodeStyleOptions& options,
65
LuaFormatRange validRange)
@@ -12,15 +11,15 @@ RangeFormatContext::RangeFormatContext(std::shared_ptr<LuaParser> parser, LuaCod
1211
{
1312
}
1413

15-
void RangeFormatContext::Print(TextElement& textElement)
14+
void RangeFormatContext::Print(std::string_view text, TextRange range)
1615
{
17-
int startOffset = textElement.GetTextRange().StartOffset;
16+
int startOffset = range.StartOffset;
1817
int startLine = _parser->GetLine(startOffset);
19-
int endLine = _parser->GetLine(textElement.GetTextRange().EndOffset);
18+
int endLine = _parser->GetLine(range.EndOffset);
2019
if (startLine > _validRange.EndLine || endLine < _validRange.StartLine)
2120
{
2221
_inValidRange = false;
23-
_characterCount += textElement.GetText().size();
22+
_characterCount += text.size();
2423
return;
2524
}
2625

@@ -49,8 +48,8 @@ void RangeFormatContext::Print(TextElement& textElement)
4948
}
5049
}
5150
}
52-
_buffer.append(textElement.GetText());
53-
_characterCount += textElement.GetText().size();
51+
_buffer.append(text);
52+
_characterCount += text.size();
5453

5554
if (startLine < _formattedRange.StartLine)
5655
{
@@ -64,6 +63,57 @@ void RangeFormatContext::Print(TextElement& textElement)
6463
}
6564
}
6665

66+
void RangeFormatContext::Print(char ch, int offset)
67+
{
68+
int startLine = _parser->GetLine(offset);
69+
int endLine = _parser->GetLine(offset);
70+
if (startLine > _validRange.EndLine || endLine < _validRange.StartLine)
71+
{
72+
_inValidRange = false;
73+
_characterCount += 1;
74+
return;
75+
}
76+
77+
_inValidRange = true;
78+
if (!_indentStack.empty())
79+
{
80+
auto& indentState = _indentStack.back();
81+
if (indentState.Style == IndentStyle::Space)
82+
{
83+
if (_characterCount < indentState.SpaceIndent)
84+
{
85+
PrintIndent(indentState.SpaceIndent - _characterCount, indentState.Style);
86+
}
87+
}
88+
else
89+
{
90+
if (_characterCount == 0)
91+
{
92+
PrintIndent(indentState.TabIndent, indentState.Style);
93+
PrintIndent(indentState.SpaceIndent, IndentStyle::Space);
94+
}
95+
else if (_characterCount >= indentState.TabIndent && (indentState.SpaceIndent + indentState.TabIndent >
96+
_characterCount))
97+
{
98+
PrintIndent(indentState.SpaceIndent - (_characterCount - indentState.TabIndent), IndentStyle::Space);
99+
}
100+
}
101+
}
102+
_buffer.push_back(ch);
103+
_characterCount++;
104+
105+
if (startLine < _formattedRange.StartLine)
106+
{
107+
_formattedRange.StartLine = startLine;
108+
_formattedRange.StartCharacter = _parser->GetColumn(offset);
109+
}
110+
111+
if (endLine > _formattedRange.EndLine)
112+
{
113+
_formattedRange.EndLine = endLine;
114+
}
115+
}
116+
67117
void RangeFormatContext::PrintBlank(int blank)
68118
{
69119
for (int i = 0; i < blank; i++)

CodeService/src/FormatElement/SerializeContext.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
#include "CodeService/FormatElement/SerializeContext.h"
2-
#include "CodeService/FormatElement/TextElement.h"
32

43
SerializeContext::SerializeContext(std::shared_ptr<LuaParser> parser, LuaCodeStyleOptions& options)
54
: FormatContext(parser, options)
65
{
76
}
87

9-
void SerializeContext::Print(TextElement& textElement)
8+
void SerializeContext::Print(std::string_view text, TextRange range)
109
{
1110
if (!_indentStack.empty())
1211
{
@@ -32,8 +31,38 @@ void SerializeContext::Print(TextElement& textElement)
3231
}
3332
}
3433
}
35-
_buffer.append(textElement.GetText());
36-
_characterCount += textElement.GetText().size();
34+
_buffer.append(text);
35+
_characterCount += text.size();
36+
}
37+
38+
void SerializeContext::Print(char ch, int Offset)
39+
{
40+
if (!_indentStack.empty())
41+
{
42+
auto& indentState = _indentStack.back();
43+
if (indentState.Style == IndentStyle::Space)
44+
{
45+
if (_characterCount < indentState.SpaceIndent)
46+
{
47+
PrintIndent(indentState.SpaceIndent - _characterCount, indentState.Style);
48+
}
49+
}
50+
else
51+
{
52+
if (_characterCount == 0)
53+
{
54+
PrintIndent(indentState.TabIndent, indentState.Style);
55+
PrintIndent(indentState.SpaceIndent, IndentStyle::Space);
56+
}
57+
else if (_characterCount >= indentState.TabIndent && (indentState.SpaceIndent + indentState.TabIndent >
58+
_characterCount))
59+
{
60+
PrintIndent(indentState.SpaceIndent - (_characterCount - indentState.TabIndent), IndentStyle::Space);
61+
}
62+
}
63+
}
64+
_buffer.push_back(ch);
65+
_characterCount++;
3766
}
3867

3968
void SerializeContext::PrintLine(int line)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "CodeService/FormatElement/StringLiteralElement.h"
2+
3+
StringLiteralElement::StringLiteralElement(std::shared_ptr<LuaAstNode> node)
4+
: FormatElement(node->GetTextRange()),
5+
_text(node->GetText())
6+
{
7+
}
8+
9+
FormatElementType StringLiteralElement::GetType()
10+
{
11+
return FormatElementType::StringLiteralElement;
12+
}
13+
14+
void StringLiteralElement::Serialize(SerializeContext& ctx, ChildIterator, FormatElement& parent)
15+
{
16+
auto quoteStyle = ctx.GetOptions().quote_style;
17+
18+
if (quoteStyle != QuoteStyle::None
19+
&& !_text.empty()
20+
&& (_text[0] == '\'' || _text[0] == '\"'))
21+
{
22+
char del = quoteStyle == QuoteStyle::Double ? '\"' : '\'';
23+
24+
if (_text.size() >= 2 && !ExistDel(del))
25+
{
26+
std::string_view text = _text.substr(1, _text.size() - 2);
27+
auto range = GetTextRange();
28+
29+
ctx.Print(del, range.StartOffset);
30+
31+
ctx.Print(text, TextRange(range.StartOffset + 1, range.EndOffset - 1));
32+
33+
ctx.Print(del, range.EndOffset);
34+
return;
35+
}
36+
}
37+
38+
return ctx.Print(_text, GetTextRange());
39+
}
40+
41+
void StringLiteralElement::Diagnosis(DiagnosisContext& ctx, ChildIterator, FormatElement& parent)
42+
{
43+
//if necessary , add diagnosis
44+
}
45+
46+
std::string_view StringLiteralElement::GetText() const
47+
{
48+
return _text;
49+
}
50+
51+
bool StringLiteralElement::ExistDel(char del)
52+
{
53+
auto text = _text.substr(1, _text.size() - 2);
54+
char ch = '\0';
55+
for (std::size_t i = 0; i < text.size(); ++i)
56+
{
57+
ch = text[i];
58+
if(ch == del)
59+
{
60+
return true;
61+
}
62+
else if(ch == '\\')
63+
{
64+
++i;
65+
}
66+
}
67+
68+
return false;
69+
}

CodeService/src/FormatElement/TextElement.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
#include "CodeService/FormatElement/TextElement.h"
22
#include "Util/format.h"
33

4-
TextElement::TextElement(std::string_view text, TextDefineType textDefineType, TextRange range)
4+
TextElement::TextElement(std::string_view text, TextRange range)
55
: FormatElement(range),
6-
_text(text),
7-
_textDefineType(textDefineType)
6+
_text(text)
87
{
98
}
109

11-
TextElement::TextElement(std::shared_ptr<LuaAstNode> node, TextDefineType textDefineType)
12-
: TextElement(node->GetText(), textDefineType, node->GetTextRange())
10+
TextElement::TextElement(std::shared_ptr<LuaAstNode> node)
11+
: TextElement(node->GetText(), node->GetTextRange())
1312
{
1413
}
1514

@@ -20,7 +19,7 @@ FormatElementType TextElement::GetType()
2019

2120
void TextElement::Serialize(SerializeContext& ctx, ChildIterator selfIt, FormatElement& parent)
2221
{
23-
ctx.Print(*this);
22+
ctx.Print(_text, GetTextRange());
2423
}
2524

2625
void TextElement::Diagnosis(DiagnosisContext& ctx, ChildIterator selfIt, FormatElement& parent)
@@ -39,8 +38,3 @@ std::string_view TextElement::GetText() const
3938
{
4039
return _text;
4140
}
42-
43-
void TextElement::SetTextDefineType(TextDefineType textDefineType)
44-
{
45-
_textDefineType = textDefineType;
46-
}

CodeService/src/LuaEditorConfig.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,17 @@ void LuaEditorConfig::ParseFromSection(std::shared_ptr<LuaCodeStyleOptions> opti
198198
options->tab_width = std::stoi(configMap.at("tab_width"));
199199
}
200200

201+
if (configMap.count("quote_style"))
202+
{
203+
if (configMap.at("quote_style") == "single") {
204+
options->quote_style = QuoteStyle::Single;
205+
}
206+
else if(configMap.at("quote_style") == "double")
207+
{
208+
options->quote_style = QuoteStyle::Double;
209+
}
210+
}
211+
201212
if (configMap.count("continuation_indent_size")
202213
&& isNumber(configMap.at("continuation_indent_size")))
203214
{
@@ -296,6 +307,7 @@ void LuaEditorConfig::ParseFromSection(std::shared_ptr<LuaCodeStyleOptions> opti
296307
configMap.at("long_chain_expression_allow_one_space_after_colon") == "true";
297308
}
298309

310+
299311
if (configMap.count("end_of_line"))
300312
{
301313
auto lineSeparatorSymbol = configMap.at("end_of_line");

CodeService/src/LuaFormatter.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "CodeService/FormatElement/PlaceholderElement.h"
2121
#include "CodeService/FormatElement/AlignIfLayoutElement.h"
2222
#include "CodeService/FormatElement/MaxSpaceElement.h"
23+
#include "CodeService/FormatElement/StringLiteralElement.h"
2324
#include "Util/StringUtil.h"
2425

2526
bool nextMatch(LuaAstNode::ChildIterator it, LuaAstNodeType type, const LuaAstNode::ChildrenContainer& container)
@@ -249,10 +250,14 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatNode(std::shared_ptr<LuaAstNo
249250
{
250251
return FormatFunctionBody(node);
251252
}
253+
case LuaAstNodeType::StringLiteralExpression:
254+
{
255+
return FormatStringLiteralExpression(node);
256+
}
252257
case LuaAstNodeType::LiteralExpression:
253258
default:
254259
{
255-
return std::make_shared<TextElement>(node->GetText(), TextDefineType::Normal, node->GetTextRange());
260+
return std::make_shared<TextElement>(node->GetText(), node->GetTextRange());
256261
}
257262
}
258263
}
@@ -1379,7 +1384,7 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatLocalFunctionStatement(
13791384
}
13801385
case LuaAstNodeType::Identify:
13811386
{
1382-
env->Add<TextElement>(child, TextDefineType::FunctionNameDefine);
1387+
env->Add<TextElement>(child);
13831388
break;
13841389
}
13851390
case LuaAstNodeType::FunctionBody:
@@ -1508,7 +1513,7 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatTableField(std::shared_ptr<Lu
15081513
}
15091514
case LuaAstNodeType::Identify:
15101515
{
1511-
env->Add<TextElement>(child, TextDefineType::TableFieldNameDefine);
1516+
env->Add<TextElement>(child);
15121517
break;
15131518
}
15141519
case LuaAstNodeType::Comment:
@@ -1556,6 +1561,12 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatTableField(std::shared_ptr<Lu
15561561
return env;
15571562
}
15581563

1564+
std::shared_ptr<FormatElement> LuaFormatter::FormatStringLiteralExpression(
1565+
std::shared_ptr<LuaAstNode> stringLiteralExpression)
1566+
{
1567+
return std::make_shared<StringLiteralElement>(stringLiteralExpression);
1568+
}
1569+
15591570
void LuaFormatter::DefaultHandle(std::shared_ptr<LuaAstNode> node, std::shared_ptr<FormatElement> envElement)
15601571
{
15611572
auto childEnv = FormatNode(node);

CodeService/src/NameStyle/NameStyleRuleMatcher.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ bool NameStyleRuleMatcher::Same(DiagnosisContext& ctx, std::shared_ptr<CheckElem
356356
return true;
357357
}
358358

359-
auto firstParamNode = checkElement->ExtraInfoNode->FindFirstOf(LuaAstNodeType::LiteralExpression);
359+
auto firstParamNode = checkElement->ExtraInfoNode->FindFirstOf(LuaAstNodeType::StringLiteralExpression);
360360

361361
if (!firstParamNode)
362362
{
@@ -370,7 +370,7 @@ bool NameStyleRuleMatcher::Same(DiagnosisContext& ctx, std::shared_ptr<CheckElem
370370
{
371371
return true;
372372
}
373-
firstParamNode = expressionNode->FindFirstOf(LuaAstNodeType::LiteralExpression);
373+
firstParamNode = expressionNode->FindFirstOf(LuaAstNodeType::StringLiteralExpression);
374374
if (!firstParamNode)
375375
{
376376
return true;

0 commit comments

Comments
 (0)