Skip to content

Commit a84b487

Browse files
committed
上传一部分代码
1 parent 7bd04b3 commit a84b487

File tree

8 files changed

+232
-69
lines changed

8 files changed

+232
-69
lines changed

CodeFormatLib/src/CodeFormatLib.cpp

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -238,53 +238,55 @@ int type_format(lua_State* L)
238238
else
239239
{
240240
lua_pushboolean(L, true);
241-
auto result = typeFormat.GetResult();
242-
243-
// 结果
244-
lua_newtable(L);
245-
246-
//message
247-
{
248-
lua_pushstring(L, "newText");
249-
lua_pushlstring(L, result.Text.c_str(), result.Text.size());
250-
lua_rawset(L, -3);
251-
}
252-
253-
// range
241+
auto& results = typeFormat.GetResult();
242+
if (!results.empty())
254243
{
255-
lua_pushstring(L, "range");
256-
//range table
244+
auto& result = results.front();
245+
// 结果
257246
lua_newtable(L);
258247

259-
lua_pushstring(L, "start");
260-
// start table
261-
lua_newtable(L);
262-
lua_pushstring(L, "line");
263-
lua_pushinteger(L, result.Range.StartLine);
264-
lua_rawset(L, -3);
248+
//message
249+
{
250+
lua_pushstring(L, "newText");
251+
lua_pushlstring(L, result.Text.c_str(), result.Text.size());
252+
lua_rawset(L, -3);
253+
}
265254

266-
lua_pushstring(L, "character");
267-
lua_pushinteger(L, result.Range.StartCharacter);
268-
lua_rawset(L, -3);
255+
// range
256+
{
257+
lua_pushstring(L, "range");
258+
//range table
259+
lua_newtable(L);
269260

270-
lua_rawset(L, -3); // set start = {}
261+
lua_pushstring(L, "start");
262+
// start table
263+
lua_newtable(L);
264+
lua_pushstring(L, "line");
265+
lua_pushinteger(L, result.Range.StartLine);
266+
lua_rawset(L, -3);
271267

272-
lua_pushstring(L, "end");
273-
// end table
274-
lua_newtable(L);
275-
lua_pushstring(L, "line");
276-
lua_pushinteger(L, result.Range.EndLine);
277-
lua_rawset(L, -3);
268+
lua_pushstring(L, "character");
269+
lua_pushinteger(L, result.Range.StartCharacter);
270+
lua_rawset(L, -3);
278271

279-
lua_pushstring(L, "character");
280-
lua_pushinteger(L, result.Range.EndCharacter);
281-
lua_rawset(L, -3);
272+
lua_rawset(L, -3); // set start = {}
282273

283-
lua_rawset(L, -3); // set end = {}
274+
lua_pushstring(L, "end");
275+
// end table
276+
lua_newtable(L);
277+
lua_pushstring(L, "line");
278+
lua_pushinteger(L, result.Range.EndLine);
279+
lua_rawset(L, -3);
284280

285-
lua_rawset(L, -3); // set range = {}
286-
}
281+
lua_pushstring(L, "character");
282+
lua_pushinteger(L, result.Range.EndCharacter);
283+
lua_rawset(L, -3);
284+
285+
lua_rawset(L, -3); // set end = {}
287286

287+
lua_rawset(L, -3); // set range = {}
288+
}
289+
}
288290
return 2;
289291
}
290292
}

CodeFormatServer/src/LanguageService.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -330,15 +330,16 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnTypeFormatting(
330330
return result;
331331
}
332332

333-
auto& formatResult = typeFormat.GetResult();
334-
auto& formatRange = formatResult.Range;
335-
336-
auto& edit = result->edits.emplace_back();
337-
edit.newText = std::move(formatResult.Text);
338-
edit.range = vscode::Range(
339-
vscode::Position(formatRange.StartLine, formatRange.StartCharacter),
340-
vscode::Position(formatRange.EndLine, formatRange.EndCharacter)
341-
);
333+
for (auto& formatResult : typeFormat.GetResult()) {
334+
auto& formatRange = formatResult.Range;
335+
336+
auto& edit = result->edits.emplace_back();
337+
edit.newText = std::move(formatResult.Text);
338+
edit.range = vscode::Range(
339+
vscode::Position(formatRange.StartLine, formatRange.StartCharacter),
340+
vscode::Position(formatRange.EndLine, formatRange.EndCharacter)
341+
);
342+
}
342343
return result;
343344
}
344345

CodeService/src/TypeFormat/LuaTypeFormat.cpp

Lines changed: 168 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,83 @@ int FindTokenIndexBeforePosition(std::vector<LuaToken>& tokens, int offset)
2727
return static_cast<int>(pos - tokens.begin()) - 1;
2828
}
2929

30+
int FindTokenIndexAfterPosition(std::vector<LuaToken>& tokens, int offset)
31+
{
32+
if (tokens.empty())
33+
{
34+
return -1;
35+
}
36+
37+
auto tempToken = LuaToken(0, "", TextRange(offset, offset));
38+
// 二分法的思想快速定位
39+
auto pos = std::lower_bound(
40+
tokens.begin(), tokens.end(), tempToken,
41+
[](const LuaToken& x, const LuaToken& y)
42+
{
43+
return x.Range.EndOffset < y.Range.StartOffset;
44+
});
45+
if (pos == tokens.end())
46+
{
47+
return -1;
48+
}
49+
50+
return static_cast<int>(pos - tokens.begin());
51+
}
52+
53+
std::shared_ptr<LuaAstNode> FindAstNodeBeforePosition(std::shared_ptr<LuaAstNode> root, int offset)
54+
{
55+
if (root->GetChildren().empty())
56+
{
57+
return root;
58+
}
59+
60+
enum class FindState
61+
{
62+
None,
63+
Before,
64+
Contain
65+
} state = FindState::None;
66+
67+
auto it = root->GetChildren().begin();
68+
for (; it != root->GetChildren().end(); it++)
69+
{
70+
auto& child = *it;
71+
auto textRange = child->GetTextRange();
72+
if (textRange.StartOffset > offset)
73+
{
74+
state = FindState::Before;
75+
break;
76+
}
77+
else if (offset <= textRange.EndOffset)
78+
{
79+
state = FindState::Contain;
80+
break;
81+
}
82+
}
83+
84+
switch (state)
85+
{
86+
case FindState::Before:
87+
{
88+
if (it == root->GetChildren().begin())
89+
{
90+
return root;
91+
}
92+
return *(it - 1);
93+
}
94+
case FindState::Contain:
95+
{
96+
return FindAstNodeBeforePosition(*it, offset);
97+
}
98+
case FindState::None:
99+
{
100+
return root->GetChildren().back();
101+
}
102+
}
103+
return nullptr;
104+
}
105+
106+
30107
LuaTypeFormat::LuaTypeFormat(std::shared_ptr<LuaParser> luaParser, LuaCodeStyleOptions& options,
31108
LuaTypeFormatOptions& typeOptions)
32109
: _parser(luaParser),
@@ -49,9 +126,9 @@ bool LuaTypeFormat::HasFormatResult()
49126
return _hasResult;
50127
}
51128

52-
LuaTypeFormat::Result& LuaTypeFormat::GetResult()
129+
std::vector<LuaTypeFormat::Result>& LuaTypeFormat::GetResult()
53130
{
54-
return _result;
131+
return _results;
55132
}
56133

57134
void LuaTypeFormat::AnalysisReturn(int line, int character)
@@ -85,6 +162,10 @@ void LuaTypeFormat::AnalysisReturn(int line, int character)
85162
{
86163
FormatLine(line);
87164
}
165+
166+
if (_typeOptions.fix_indent) {
167+
FixIndent(line, character);
168+
}
88169
}
89170

90171
void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaError)
@@ -93,6 +174,7 @@ void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaErro
93174
{
94175
return;
95176
}
177+
auto& result = _results.emplace_back();
96178

97179
LuaCodeStyleOptions temp = _options;
98180
temp.insert_final_newline = true;
@@ -167,11 +249,11 @@ void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaErro
167249
ctx.PrintLine(1);
168250
ctx.Print(indentString);
169251
ctx.Print("end");
170-
_result.Text = ctx.GetText();
171-
_result.Range.StartLine = line;
172-
_result.Range.StartCharacter = character;
173-
_result.Range.EndLine = line;
174-
_result.Range.EndCharacter = character;
252+
result.Text = ctx.GetText();
253+
result.Range.StartLine = line;
254+
result.Range.StartCharacter = character;
255+
result.Range.EndLine = line;
256+
result.Range.EndCharacter = character;
175257
}
176258
else
177259
{
@@ -183,11 +265,11 @@ void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaErro
183265
ctx.Print(indentString);
184266
ctx.Print("end");
185267
ctx.PrintLine(1);
186-
_result.Text = ctx.GetText();
187-
_result.Range.StartLine = line + 1;
188-
_result.Range.StartCharacter = 0;
189-
_result.Range.EndLine = line + 1;
190-
_result.Range.EndCharacter = 0;
268+
result.Text = ctx.GetText();
269+
result.Range.StartLine = line + 1;
270+
result.Range.StartCharacter = 0;
271+
result.Range.EndLine = line + 1;
272+
result.Range.EndCharacter = 0;
191273
}
192274
break;
193275
}
@@ -215,11 +297,12 @@ void LuaTypeFormat::FormatLine(int line)
215297
LuaFormatter formatter(_parser, temp);
216298
formatter.BuildFormattedElement();
217299

218-
_result.Range.StartLine = line - 1;
219-
_result.Range.StartCharacter = 0;
220-
_result.Range.EndLine = line - 1;
221-
_result.Range.EndCharacter = 0;
222-
auto formatText = formatter.GetRangeFormattedText(_result.Range);
300+
auto& result = _results.emplace_back();
301+
result.Range.StartLine = line - 1;
302+
result.Range.StartCharacter = 0;
303+
result.Range.EndLine = line - 1;
304+
result.Range.EndCharacter = 0;
305+
auto formatText = formatter.GetRangeFormattedText(result.Range);
223306
while (!formatText.empty())
224307
{
225308
char ch = formatText.back();
@@ -236,7 +319,73 @@ void LuaTypeFormat::FormatLine(int line)
236319
{
237320
formatText.push_back('\n');
238321
}
239-
_result.Text = formatText;
240-
_result.Range.EndLine++;
322+
result.Text = formatText;
323+
result.Range.EndLine++;
241324
_hasResult = true;
242325
}
326+
327+
void LuaTypeFormat::FixIndent(int line, int character)
328+
{
329+
// FixEndIndent(line, character);
330+
331+
// auto root = _parser->GetAst();
332+
// auto astNode = FindAstNodeBeforePosition(root, offset);
333+
// if (!astNode)
334+
// {
335+
// return;
336+
// }
337+
338+
// auto block = astNode->GetParent();
339+
// if (block && block->GetType() == LuaAstNodeType::Block)
340+
// {
341+
// auto statement = block->GetParent();
342+
// if(statement->is)
343+
//
344+
//
345+
// }
346+
347+
348+
}
349+
350+
void LuaTypeFormat::FixEndIndent(int line, int character)
351+
{
352+
auto luaFile = _parser->GetLuaFile();
353+
auto offset = luaFile->GetOffsetFromPosition(line, character);
354+
355+
auto& tokens = _parser->GetTokenParser()->GetTokens();
356+
auto tokenIndex = FindTokenIndexAfterPosition(tokens, offset);
357+
if (tokenIndex == -1)
358+
{
359+
return;
360+
}
361+
362+
auto token = tokens[tokenIndex];
363+
if (token.TokenType == TK_END && luaFile->GetLine(token.Range.StartOffset) == line)
364+
{
365+
_hasResult = true;
366+
auto indentString = luaFile->GetIndentString(token.Range.StartOffset);
367+
{
368+
auto& result = _results.emplace_back();
369+
SerializeContext ctx1(_parser, _options);
370+
ctx1.Print(indentString);
371+
ctx1.PrintIndent(4, _options.indent_style);
372+
result.Text = ctx1.GetText();
373+
result.Range.StartLine = line;
374+
result.Range.StartCharacter = character;
375+
result.Range.EndLine = line;
376+
result.Range.EndCharacter = character;
377+
}
378+
{
379+
SerializeContext ctx2(_parser, _options);
380+
auto& result = _results.emplace_back();
381+
ctx2.PrintLine(1);
382+
ctx2.Print(indentString);
383+
ctx2.Print("e");
384+
result.Text = ctx2.GetText();
385+
result.Range.StartLine = luaFile->GetLine(token.Range.StartOffset);
386+
result.Range.StartCharacter = luaFile->GetColumn(token.Range.StartOffset);
387+
result.Range.EndLine = result.Range.StartLine;
388+
result.Range.EndCharacter = result.Range.StartCharacter + 1;
389+
}
390+
}
391+
}

LuaParser/src/TextRange.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ bool TextRange::Contain(TextRange& range) const
2323
return this->StartOffset <= range.StartOffset && this->EndOffset >= range.EndOffset;
2424
}
2525

26+
bool TextRange::ContainOffset(int offset) const
27+
{
28+
return this->StartOffset <= offset && offset <= this->EndOffset;
29+
}
30+
2631
bool TextRange::Between(TextRange& leftRange, TextRange& rightRange) const
2732
{
2833
return this->StartOffset > leftRange.EndOffset && this->EndOffset < rightRange.StartOffset;

include/CodeService/FormatElement/SerializeContext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ class SerializeContext : public FormatContext
2020
virtual void PrintIndentOnly(int line = -1);
2121

2222
void SetReadySize(std::size_t size);
23-
protected:
24-
static void InnerPrintEndOfLine(std::string& buffer, EndOfLine endOfLine);
2523

2624
void PrintIndent(std::size_t indent, IndentStyle style);
25+
protected:
26+
static void InnerPrintEndOfLine(std::string& buffer, EndOfLine endOfLine);
2727
void InnerPrintText(std::string_view text, TextRange range);
2828
void PrintEndOfLine();
2929

0 commit comments

Comments
 (0)