diff options
| -rw-r--r-- | source/compiler-core/slang-json-rpc-connection.cpp | 18 | ||||
| -rw-r--r-- | source/compiler-core/slang-json-rpc-connection.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-language-server.cpp | 4 |
3 files changed, 22 insertions, 2 deletions
diff --git a/source/compiler-core/slang-json-rpc-connection.cpp b/source/compiler-core/slang-json-rpc-connection.cpp index c4413d306..af9dd9e48 100644 --- a/source/compiler-core/slang-json-rpc-connection.cpp +++ b/source/compiler-core/slang-json-rpc-connection.cpp @@ -136,6 +136,24 @@ SlangResult JSONRPCConnection::sendError(JSONRPC::ErrorCode errorCode, const Uno return sendRPC(&errorResponse); } +SlangResult JSONRPCConnection::checkArrayObjectWrap( const JSONValue& srcArgs, const RttiInfo* dstArgsRttiInfo, void* dstArgs, const JSONValue& id ) +{ + if ( dstArgsRttiInfo->m_kind == RttiInfo::Kind::Struct && + srcArgs.getKind() == JSONValue::Kind::Array ) + { + auto array = m_container.getArray( srcArgs ); + if ( array.getCount() == 1 ) + { + return toNativeOrSendError( array[0], dstArgsRttiInfo, dstArgs, id ); + } + return SLANG_OK; + } + else + { + return toNativeOrSendError( srcArgs, dstArgsRttiInfo, dstArgs, id ); + } +} + SlangResult JSONRPCConnection::toNativeArgsOrSendError(const JSONValue& srcArgs, const RttiInfo* dstArgsRttiInfo, void* dstArgs, const JSONValue& id) { if (dstArgsRttiInfo->m_kind == RttiInfo::Kind::Struct && diff --git a/source/compiler-core/slang-json-rpc-connection.h b/source/compiler-core/slang-json-rpc-connection.h index 7246fb780..f5525d033 100644 --- a/source/compiler-core/slang-json-rpc-connection.h +++ b/source/compiler-core/slang-json-rpc-connection.h @@ -48,6 +48,8 @@ public: /// Disconnect. May block while server shuts down void disconnect(); + SlangResult checkArrayObjectWrap( const JSONValue& srcArgs, const RttiInfo* dstArgsRttiInfo, void* dstArgs, const JSONValue& id ); + /// Convert value to dst. Will write response on fails SlangResult toNativeOrSendError(const JSONValue& value, const RttiInfo* info, void* dst, const JSONValue& id); diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp index 12151441c..2c24ba6e5 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -1974,7 +1974,7 @@ SlangResult LanguageServer::queueJSONCall(JSONRPCCall call) else if (call.method == SemanticTokensParams::methodName) { SemanticTokensParams args; - SLANG_RETURN_ON_FAIL(m_connection->toNativeArgsOrSendError(call.params, &args, call.id)); + SLANG_RETURN_ON_FAIL(m_connection->checkArrayObjectWrap( call.params, GetRttiInfo<SemanticTokensParams>::get(), &args, call.id )); cmd.semanticTokenArgs = args; } else if (call.method == SignatureHelpParams::methodName) @@ -1995,7 +1995,7 @@ SlangResult LanguageServer::queueJSONCall(JSONRPCCall call) else if (call.method == DocumentSymbolParams::methodName) { DocumentSymbolParams args; - SLANG_RETURN_ON_FAIL(m_connection->toNativeArgsOrSendError(call.params, &args, call.id)); + SLANG_RETURN_ON_FAIL(m_connection->checkArrayObjectWrap( call.params, GetRttiInfo<DocumentSymbolParams>::get(), &args, call.id )); cmd.documentSymbolArgs = args; } else if (call.method == DocumentFormattingParams::methodName) |
