summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-language-server.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-06-17 21:36:10 -0700
committerGitHub <noreply@github.com>2025-06-17 21:36:10 -0700
commit4d517794eaac7dfe6196e9a36d709d66c5720492 (patch)
treea7e65d8307b4e25f2a7bafcc9a2de1666c8b689e /source/slang/slang-language-server.cpp
parentb9799e6137fb1d173cefd823521bb70b09ac435a (diff)
LanguageServer: Enhance auto completion for override. (#7465)
* Add additional completion keywords. * LanguageServer: Enhance auto completion for `override`.
Diffstat (limited to 'source/slang/slang-language-server.cpp')
-rw-r--r--source/slang/slang-language-server.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp
index cd9818f65..6daeb75ad 100644
--- a/source/slang/slang-language-server.cpp
+++ b/source/slang/slang-language-server.cpp
@@ -1157,15 +1157,17 @@ LanguageServerResult<CompletionResult> LanguageServerCore::completion(
}
// Ajust cursor position to the beginning of the current/last identifier.
+ Index firstTokenCharOffset = cursorOffset;
cursorOffset--;
while (cursorOffset > 0 && _isIdentifierChar(doc->getText()[cursorOffset]))
{
+ firstTokenCharOffset = cursorOffset;
cursorOffset--;
}
// Never show suggestions when the user is typing a number.
- if (cursorOffset + 1 >= 0 && cursorOffset + 1 < doc->getText().getLength() &&
- CharUtil::isDigit(doc->getText()[cursorOffset + 1]))
+ if (firstTokenCharOffset >= 0 && firstTokenCharOffset < doc->getText().getLength() &&
+ CharUtil::isDigit(doc->getText()[firstTokenCharOffset]))
{
return std::nullopt;
}
@@ -1180,12 +1182,32 @@ LanguageServerResult<CompletionResult> LanguageServerCore::completion(
version->linkage->contentAssistInfo.cursorCol = utf8Col;
Slang::CompletionContext context;
context.server = this;
- context.cursorOffset = cursorOffset;
+ context.cursorOffset = firstTokenCharOffset;
context.version = version;
context.doc = doc.Ptr();
context.canonicalPath = canonicalPath.getUnownedSlice();
context.line = utf8Line;
context.col = utf8Col;
+ Int firstNonWhiteSpace = 0;
+ auto lineContent = doc->getLine(utf8Line);
+ while (firstNonWhiteSpace < lineContent.getLength() &&
+ CharUtil::isWhitespace(lineContent[firstNonWhiteSpace]))
+ firstNonWhiteSpace++;
+ context.indent = doc->getLine(utf8Line).head(firstNonWhiteSpace);
+ doc->offsetToLineCol(firstTokenCharOffset, utf8Line, utf8Col);
+ doc->oneBasedUTF8LocToZeroBasedUTF16Loc(
+ utf8Line,
+ utf8Col,
+ context.requestRange.start.line,
+ context.requestRange.start.character);
+
+ auto utf8TokenLen = doc->getTokenLength(firstTokenCharOffset);
+ doc->oneBasedUTF8LocToZeroBasedUTF16Loc(
+ utf8Line,
+ utf8Col + utf8TokenLen,
+ context.requestRange.end.line,
+ context.requestRange.end.character);
+
context.commitCharacterBehavior = m_commitCharacterBehavior;
if (args.context.triggerKind == kCompletionTriggerKindTriggerCharacter &&
(args.context.triggerCharacter == " " || args.context.triggerCharacter == "[" ||