载入中...
搜索中...
未找到
LanguageServer.cpp
浏览该文件的文档.
62Poco::JSON::Object::Ptr rpcResponse(const Poco::Dynamic::Var& id, const Poco::Dynamic::Var& result) {
70Poco::JSON::Object::Ptr rpcError(const Poco::Dynamic::Var& id, int code, std::string messageText) {
108 range.start.character = static_cast<size_t>(clampNonNegative(start->optValue<int>("character", 0)));
112 range.end.character = static_cast<size_t>(clampNonNegative(end->optValue<int>("character", 0)));
227 if (path.size() >= 3 && path[0] == '/' && std::isalpha(static_cast<unsigned char>(path[1])) != 0 && path[2] == ':')
250 while (begin > 0 && (std::isalnum(static_cast<unsigned char>(source[begin - 1])) != 0 || source[begin - 1] == '_'))
252 while (end < source.size() && (std::isalnum(static_cast<unsigned char>(source[end])) != 0 || source[end] == '_'))
262 while (qualEnd > 0 && std::isspace(static_cast<unsigned char>(source[qualEnd - 1])) != 0) --qualEnd;
265 (std::isalnum(static_cast<unsigned char>(source[qualBegin - 1])) != 0 || source[qualBegin - 1] == '_'))
320bool identifierStart(char value) { return std::isalpha(static_cast<unsigned char>(value)) != 0 || value == '_'; }
321bool identifierPart(char value) { return std::isalnum(static_cast<unsigned char>(value)) != 0 || value == '_'; }
325 while (begin < value.size() && std::isspace(static_cast<unsigned char>(value[begin])) != 0) ++begin;
333 return type.empty() || type == "dynamic" || type == "void" || type == "null" || type == "int" || type == "float" ||
334 type == "bool" || type == "string" || type.rfind("Array", 0) == 0 || type.rfind("Table", 0) == 0;
476std::string inferAssignedType(std::string_view source, size_t offset, std::string_view name, const SlotClassMap& slots,
485 if ((i > 0 && identifierPart(source[i - 1])) || (after < source.size() && identifierPart(source[after]))) {
490 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
493 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
495 while (typeEnd < offset && (identifierPart(source[typeEnd]) || source[typeEnd] == '?' || source[typeEnd] == '.'))
504 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
517 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
520 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
526 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
528 if (cursor < offset && source[cursor] == '<' && cursor + 1 < offset && source[cursor + 1] == '-') cursor += 2;
531 while (cursor < offset && std::isspace(static_cast<unsigned char>(source[cursor])) != 0) ++cursor;
569 script::ScriptModuleStatus resolve(const script::ScriptModuleRequest& request, std::string& canonicalUri,
576 script::ScriptModuleStatus load(std::string_view canonicalUri, script::ScriptModuleSource& source,
580 const auto path = std::filesystem::weakly_canonical(root_ / std::string(canonicalUri.substr(prefix.size())));
589 source.utf8Source.assign(std::istreambuf_iterator<char>(input), std::istreambuf_iterator<char>());
612 runtime_.scriptModules().registerProvider(std::make_shared<ProjectDirectoryProvider>(std::filesystem::path(root_)),
622 split == std::string::npos ? std::string_view{} : std::string_view(contract).substr(split), namePattern);
684 ident == "game:/config.nut" || (owned.size() >= 11 && owned.compare(owned.size() - 11, 11, "/config.nut") == 0);
686 auto configDiagnostics = script::ScriptCompiler::validateProjectConfig(document->second, ident, knownModules_,
693 std::vector<script::ScriptCompletion> complete(std::string_view uri, lsp::Position position) const {
725 return source ? inferAssignedType(*source, dot, name, slotClass_, runtime_.scriptCompiler().bindings())
738 for (const script::BindingContract& contract : runtime_.scriptCompiler().bindings().snapshot()) {
741 result.push_back({contract.scriptClass, "class", "eve." + contract.scriptClass, contract.scriptClass});
745 for (const script::BindingContract& contract : runtime_.scriptCompiler().bindings().snapshot()) {
754 static constexpr const char* keywords[] = {"import", "export", "persist", "match", "async", "await",
769 std::sort(result.begin(), result.end(), [](const script::ScriptCompletion& a, const script::ScriptCompletion& b) {
804 std::optional<LanguageSignatureHelp> signatureHelp(std::string_view uri, lsp::Position position) const {
815 const script::BindingContract* contract = runtime_.scriptCompiler().bindings().findMethod(callee);
824 help.parameters.push_back({contract->parameters[i].name + ": " + contract->parameters[i].type, {}});
828 help.activeParameter = help.parameters.empty() ? 0 : static_cast<int>(help.parameters.size()) - 1;
870LanguageServer::LanguageServer(std::string projectRoot) : impl_(std::make_unique<Impl>(std::move(projectRoot))) {}
876 std::string generic = std::filesystem::absolute(std::filesystem::path(path)).lexically_normal().generic_string();
893void LanguageServer::openDocument(std::string uri, std::string text) { impl_->update(uri, std::move(text)); }
894void LanguageServer::changeDocument(std::string uri, std::string text) { impl_->update(uri, std::move(text)); }
906std::vector<script::ScriptDiagnostic> LanguageServer::diagnosticsFor(std::string_view uri) const {
910std::vector<script::ScriptCompletion> LanguageServer::complete(std::string_view uri, lsp::Position position) const {
914std::optional<script::ScriptHover> LanguageServer::hover(std::string_view uri, lsp::Position position) const {
918std::optional<lsp::Location> LanguageServer::definition(std::string_view uri, lsp::Position position) const {
922std::vector<lsp::Location> LanguageServer::references(std::string_view uri, lsp::Position position,
927std::optional<std::vector<lsp::TextEdit>> LanguageServer::rename(std::string_view uri, lsp::Position position,
932std::vector<script::ScriptSymbolMetadata> LanguageServer::documentSymbols(std::string_view uri) const {
937std::optional<LanguageSignatureHelp> LanguageServer::signatureHelp(std::string_view uri, lsp::Position position) const {
941std::vector<lsp::TextEdit> LanguageServer::formatDocument(std::string_view uri, lsp::FormatOptions options,
998 if (found != extra.end() && token.type == lsp::SemanticTypes::Variable) token.type = found->second;
1024 return position ? lsp::Position{static_cast<size_t>(clampNonNegative(position->optValue<int>("line", 0))),
1097 } else if (method == "initialized" || method == "textDocument/didSave" || method.rfind("$/", 0) == 0) {
1139 for (const script::ScriptCompletion& completion : complete(documentUri(), requestPosition())) {
1162 writeFrame(output, rpcResponse(id, value ? Poco::Dynamic::Var(locationObject(*value)) : Poco::Dynamic::Var()));
1168 for (const lsp::Location& location : references(documentUri(), requestPosition(), includeDeclaration))
1172 const std::string newName = params ? params->optValue<std::string>("newName", "") : std::string{};
1233 writeFrame(output, rpcResponse(id, Poco::Dynamic::Var(textEditsArray(formatDocument(documentUri(), options)))));
1238 rpcResponse(id, Poco::Dynamic::Var(textEditsArray(formatDocument(documentUri(), options, &range)))));
std::unordered_map< const Graphics *, std::shared_ptr< Lifetime > > tokens
Definition GraphicsLifetime.cpp:13
ScriptId compileSource(std::string source, std::string sourceName="buffer")
Compiles script source without running it.
Definition Runtime.cpp:501
script::ScriptModuleResolver & scriptModules() noexcept
Script module provider registry and dependency resolver for this VM.
Definition Runtime.cpp:482
script::ScriptCompiler & scriptCompiler() noexcept
Unified EveScript compiler, metadata store, and binding contracts.
Definition Runtime.cpp:486
LanguageServer(std::string projectRoot)
Definition LanguageServer.cpp:870
const std::string & projectRoot() const noexcept
Absolute project root used to resolve game:/ URIs.
Definition LanguageServer.cpp:873
std::vector< script::ScriptSymbolMetadata > documentSymbols(std::string_view uri) const
Definition LanguageServer.cpp:932
std::optional< LanguageSignatureHelp > signatureHelp(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:937
void openDocument(std::string uri, std::string text)
Definition LanguageServer.cpp:893
static std::string fileUriFromPath(std::string_view path)
Converts an on-disk path to the file:// URI the server expects.
Definition LanguageServer.cpp:875
std::vector< script::ScriptDiagnostic > diagnosticsFor(std::string_view uri) const
Definition LanguageServer.cpp:906
std::optional< lsp::Location > definition(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:918
std::vector< lsp::FoldingRange > foldingRanges(std::string_view uri) const
Foldable brace, bracket, and block-comment ranges in an open document.
Definition LanguageServer.cpp:965
std::vector< script::ScriptCompletion > complete(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:910
std::optional< script::ScriptHover > hover(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:914
std::optional< std::vector< lsp::TextEdit > > rename(std::string_view uri, lsp::Position position, std::string_view newName) const
Definition LanguageServer.cpp:927
std::vector< lsp::Location > references(std::string_view uri, lsp::Position position, bool includeDeclaration) const
Definition LanguageServer.cpp:922
std::vector< lsp::SemanticToken > semanticTokens(std::string_view uri) const
Semantic highlight tokens for an open document (class / function / variable / …).
Definition LanguageServer.cpp:970
int runStdio(std::istream &input, std::ostream &output)
Stdio LSP host. Returns 0 after a clean shutdown.
Definition LanguageServer.cpp:1279
std::vector< lsp::TextEdit > formatDocument(std::string_view uri, lsp::FormatOptions options={}, const lsp::Range *range=nullptr) const
Formats an open document (brace/bracket indent, trailing whitespace).
Definition LanguageServer.cpp:941
LspDispatch handleMessage(std::string_view jsonBody, std::ostream &output)
Dispatches one LSP JSON-RPC body and appends Content-Length frames.
Definition LanguageServer.cpp:1003
void changeDocument(std::string uri, std::string text)
Replaces the whole document (full sync).
Definition LanguageServer.cpp:894
void closeDocument(std::string uri)
Definition LanguageServer.cpp:904
~LanguageServer()
Cross-file semantic index for EveScript source modules.
Definition LanguageIndex.h:68
void remove(std::string_view canonicalUri)
Removes one source unit from the index.
Definition LanguageIndex.cpp:290
std::optional< Location > definition(std::string_view canonicalUri, Position position) const
Finds the declaration targeted by the identifier at a position.
Definition LanguageIndex.cpp:459
void update(std::string canonicalUri, std::string clientUri, std::string source)
Adds or replaces one canonical source unit.
Definition LanguageIndex.cpp:204
bool hasScriptClass(std::string_view scriptClass) const noexcept
True when generated contracts include this script class.
Definition ScriptCompiler.cpp:403
std::vector< BindingContract > snapshot() const
Returns a stable snapshot sorted by contract key.
Definition ScriptCompiler.cpp:410
const BindingContract * findMethod(std::string_view method) const noexcept
Finds a uniquely named method.
Definition ScriptCompiler.cpp:382
std::vector< ScriptDiagnostic > diagnostics(std::string_view canonicalUri) const
Returns the latest diagnostics for one source unit.
Definition ScriptCompiler.cpp:669
BindingContractRegistry & bindings() noexcept
Native binding contracts used by semantic checks and tools.
Definition ScriptCompiler.cpp:598
eve::OptionalRef< const ScriptMetadata > metadata(std::string_view canonicalUri) const noexcept
Borrows metadata for the most recent successful compilation.
Definition ScriptCompiler.cpp:571
static std::vector< ScriptDiagnostic > validateProjectConfig(std::string_view source, std::string_view canonicalUri, const std::vector< std::string > &knownModules, const std::vector< std::string > &activeModules)
Statically checks literal config module lists without executing config.nut.
Definition ScriptCompiler.cpp:736
std::optional< ScriptHover > hover(std::string_view canonicalUri, std::string_view symbol) const
Returns hover information for a script or native symbol.
Definition ScriptCompiler.cpp:647
std::vector< ScriptCompletion > completions(std::string_view canonicalUri, std::string_view prefix={}) const
Returns completion candidates from script metadata and native contracts.
Definition ScriptCompiler.cpp:607
ProviderId registerProvider(std::shared_ptr< IScriptModuleProvider > provider, int priority=0)
Registers a provider. Higher priorities are tried first.
Definition ScriptModule.cpp:321
static bool canonicalize(const ScriptModuleRequest &request, std::string &output, std::string &error)
Normalizes a logical module URI and rejects root traversal.
Definition ScriptModule.cpp:442
constexpr uint32_t DefaultLibrary
Definition LanguageIndex.h:55
size_t lastLineIndex(std::string_view source) noexcept
Last 0-based line index (empty source is line 0).
Definition LanguageText.cpp:155
std::string sliceLines(std::string_view source, size_t startLine, size_t endLineInclusive)
Source bytes for coveringLines of the same line span.
Definition LanguageText.cpp:176
bool applyIncremental(std::string &source, const Range *range, std::string_view text)
Applies one LSP content change.
Definition LanguageText.cpp:184
std::string formatEveScript(std::string_view source, const FormatOptions &options)
Indents EveScript by braces/brackets and trims trailing whitespace.
Definition LanguageText.cpp:196
Range coveringLines(std::string_view source, size_t startLine, size_t endLineInclusive) noexcept
Half-open LSP range covering startLine through endLine inclusive. Ends at the start of the following ...
Definition LanguageText.cpp:162
Range documentRange(std::string_view source) noexcept
Full-document range covering every character in source.
Definition LanguageText.cpp:151
std::vector< FoldingRange > foldingRanges(std::string_view source)
Brace, bracket, and block-comment folds that span more than one line.
Definition LanguageText.cpp:230
Definition AgentDevelopmentMcp.cpp:12
LspDispatch
Whether the stdio/JSON-RPC host should keep reading after one dispatch.
Definition LanguageServer.hpp:20
@ Continue
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
Result< std::string > stringify(const eve::Value &value)
Serialize the canonical owning Value as deterministic compact JSON.
Definition Json.cpp:563
ScriptModuleStatus
Result of asking a provider to resolve or load a script module.
Definition ScriptModule.h:17
@ NotHandled
const char * module_list_content
EVEngine ECS 集成层:底层实现使用 sunxfancy/ECS.hpp https://github.com/sunxfancy/ECS.hpp
Definition ECS.h:14
Definition Container.h:602
std::unordered_map< std::string, std::string > canonical_
Definition LanguageServer.cpp:863
std::unordered_map< std::string, std::string > slotClass_
Definition LanguageServer.cpp:866
std::filesystem::path pathForCanonical(std::string_view canonical) const
Definition LanguageServer.cpp:832
std::unordered_map< std::string, std::string > documents_
Definition LanguageServer.cpp:862
std::string canonicalUri(const std::string &uri) const
Definition LanguageServer.cpp:629
const std::string * sourceFor(std::string_view uri) const
Definition LanguageServer.cpp:646
std::vector< script::ScriptDiagnostic > diagnostics(std::string_view uri) const
Definition LanguageServer.cpp:678
void update(const std::string &uri, std::string source)
Definition LanguageServer.cpp:651
std::optional< LanguageSignatureHelp > signatureHelp(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:804
std::string identity(std::string_view uri) const
Definition LanguageServer.cpp:640
std::vector< std::string > activeModules_
Definition LanguageServer.cpp:865
std::optional< script::ScriptHover > hover(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:781
std::vector< script::ScriptCompletion > complete(std::string_view uri, lsp::Position position) const
Definition LanguageServer.cpp:693
void close(const std::string &uri)
Definition LanguageServer.cpp:662
std::vector< std::string > knownModules_
Definition LanguageServer.cpp:864
Binding-contract signature shown while typing a call.
Definition LanguageServer.hpp:39
std::vector< LanguageSignatureParameter > parameters
Definition LanguageServer.hpp:42
std::string documentation
Definition LanguageServer.hpp:41
One parameter in an LSP signature-help result.
Definition LanguageServer.hpp:33
One foldable region (0-based inclusive end line).
Definition LanguageText.h:19
Editor formatting preferences from LSP FormattingOptions.
Definition LanguageText.h:13
One identifier classified for editor semantic highlighting.
Definition LanguageIndex.h:59
Complete script-facing contract for a native function or method.
Definition ScriptCompiler.h:130
std::string documentationId
Definition ScriptCompiler.h:140
std::vector< BindingParameterContract > parameters
Definition ScriptCompiler.h:134
std::string std::string scriptClass
Definition ScriptCompiler.h:132
Tool-neutral completion item suitable for LSP, MCP, and editor adapters.
Definition ScriptCompiler.h:102
Stable structured diagnostic shared by Runtime, LSP, MCP, and editor tools.
Definition ScriptCompiler.h:37
Tool-neutral hover result for one script or binding symbol.
Definition ScriptCompiler.h:110
Erased source-level symbol retained for tooling.
Definition ScriptCompiler.h:65