Skip to content

Conversation

@balthild
Copy link

No description provided.

@balthild balthild marked this pull request as draft January 12, 2026 13:58
@balthild balthild marked this pull request as ready for review January 12, 2026 14:05
@dantleech
Copy link
Contributor

thanks - can you explain what this fixes and why?

@balthild
Copy link
Author

I tried using the handler and get a error Argument 1 passed to formatting() must be an instance of TextDocumentIdentifier, array given, .... I looked at the document and the source code of LanguageServerProtocolParamsResolver and then found that the RPC params are not decoded because TextDocumentIdentifier doesn't met the resolver's condition (https://github.com/phpactor/language-server/blob/master/lib/Core/Dispatcher/ArgumentResolver/LanguageSeverProtocolParamsResolver.php#L57).

@dantleech
Copy link
Contributor

dantleech commented Jan 12, 2026

in what way does it not work? the document formatting functionality works for me in Phactor.

Which client are you using?

@dantleech
Copy link
Contributor

basically the way it works here is that it deconstructs the *Params object into uniqu parameters that are passed to the handler method. So FoobarParams{one: 1, two: 2) gets mapped to function foobar($one, $two) {

@balthild
Copy link
Author

balthild commented Jan 12, 2026

But I got this error:

[error] Error when handling "Phpactor\LanguageServer\Core\Rpc\RequestMessage" ({"jsonrpc":"2.0","id":1,"method":"textDocument\/formatting","params":{"textDocument":{"uri":"file:\/\/\/Users\/balthild\/Projects\/PHP\/laravel-flame\/.php-cs-fixer.dist.php"},"options":{"tabSize":4,"insertSpaces":true,"trimTrailingWhitespace":true,"trimFinalNewlines":true,"insertFinalNewline":true}}}): Exception [TypeError] Phpactor\LanguageServer\Handler\TextDocument\FormattingHandler::formatting(): Argument #1 ($textDocument) must be of type Phpactor\LanguageServerProtocol\TextDocumentIdentifier, array given, called in /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Handler/HandlerMethodRunner.php on line 86
[Error - 2:10:28 PM] Request textDocument/formatting failed.
  Message: Exception [TypeError] Phpactor\LanguageServer\Handler\TextDocument\FormattingHandler::formatting(): Argument #1 ($textDocument) must be of type Phpactor\LanguageServerProtocol\TextDocumentIdentifier, array given, called in /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Handler/HandlerMethodRunner.php on line 86 at /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Handler/TextDocument/FormattingHandler.php#36
  Code: -32603 
#0 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Handler/HandlerMethodRunner.php(86): Phpactor\LanguageServer\Handler\TextDocument\FormattingHandler->formatting(Array, Array, Object(Amp\CancellationToken@anonymous))
#1 [internal function]: Phpactor\LanguageServer\Core\Handler\HandlerMethodRunner->Phpactor\LanguageServer\Core\Handler\{closure}()
#2 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Coroutine.php(67): Generator->current()
#3 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/functions.php(96): Amp\Coroutine->__construct(Object(Generator))
#4 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Handler/HandlerMethodRunner.php(72): Amp\call(Object(Closure))
#5 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Middleware/HandlerMiddleware.php(38): Phpactor\LanguageServer\Core\Handler\HandlerMethodRunner->dispatch(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#6 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Middleware/RequestHandler.php(37): Phpactor\LanguageServer\Middleware\HandlerMiddleware->process(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage), Object(Phpactor\LanguageServer\Core\Middleware\RequestHandler))
#7 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Middleware/CancellationMiddleware.php(49): Phpactor\LanguageServer\Core\Middleware\RequestHandler->handle(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#8 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Middleware/RequestHandler.php(37): Phpactor\LanguageServer\Middleware\CancellationMiddleware->process(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage), Object(Phpactor\LanguageServer\Core\Middleware\RequestHandler))
#9 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Middleware/ShutdownMiddleware.php(68): Phpactor\LanguageServer\Core\Middleware\RequestHandler->handle(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#10 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Middleware/RequestHandler.php(37): Phpactor\LanguageServer\Middleware\ShutdownMiddleware->process(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage), Object(Phpactor\LanguageServer\Core\Middleware\RequestHandler))
#11 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Middleware/InitializeMiddleware.php(56): Phpactor\LanguageServer\Core\Middleware\RequestHandler->handle(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#12 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Middleware/RequestHandler.php(37): Phpactor\LanguageServer\Middleware\InitializeMiddleware->process(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage), Object(Phpactor\LanguageServer\Core\Middleware\RequestHandler))
#13 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Middleware/ErrorHandlingMiddleware.php(34): Phpactor\LanguageServer\Core\Middleware\RequestHandler->handle(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#14 [internal function]: Phpactor\LanguageServer\Middleware\ErrorHandlingMiddleware->Phpactor\LanguageServer\Middleware\{closure}()
#15 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Coroutine.php(67): Generator->current()
#16 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/functions.php(96): Amp\Coroutine->__construct(Object(Generator))
#17 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Middleware/ErrorHandlingMiddleware.php(32): Amp\call(Object(Closure))
#18 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Middleware/RequestHandler.php(37): Phpactor\LanguageServer\Middleware\ErrorHandlingMiddleware->process(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage), Object(Phpactor\LanguageServer\Core\Middleware\RequestHandler))
#19 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Dispatcher/Dispatcher/MiddlewareDispatcher.php(29): Phpactor\LanguageServer\Core\Middleware\RequestHandler->handle(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#20 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Server/LanguageServer.php(226): Phpactor\LanguageServer\Core\Dispatcher\Dispatcher\MiddlewareDispatcher->dispatch(Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#21 [internal function]: Phpactor\LanguageServer\Core\Server\LanguageServer->Phpactor\LanguageServer\Core\Server\{closure}()
#22 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Coroutine.php(67): Generator->current()
#23 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/functions.php(96): Amp\Coroutine->__construct(Object(Generator))
#24 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/functions.php(121): Amp\call(Object(Closure))
#25 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Server/LanguageServer.php(224): Amp\asyncCall(Object(Closure))
#26 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Server/LanguageServer.php(217): Phpactor\LanguageServer\Core\Server\LanguageServer->dispatchRequest(Object(Phpactor\LanguageServer\Core\Server\Transmitter\ConnectionMessageTransmitter), Object(Phpactor\LanguageServer\Core\Dispatcher\Dispatcher\MiddlewareDispatcher), Object(Phpactor\LanguageServer\Core\Server\StreamProvider\Connection), Object(Phpactor\LanguageServer\Core\Rpc\RequestMessage))
#27 [internal function]: Phpactor\LanguageServer\Core\Server\LanguageServer->Phpactor\LanguageServer\Core\Server\{closure}()
#28 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Coroutine.php(118): Generator->send(Object(Phpactor\LanguageServer\Core\Rpc\RawMessage))
#29 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Internal/Placeholder.php(149): Amp\Coroutine->Amp\{closure}(NULL, Object(Phpactor\LanguageServer\Core\Rpc\RawMessage))
#30 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Coroutine.php(123): Amp\Coroutine->resolve(Object(Phpactor\LanguageServer\Core\Rpc\RawMessage))
#31 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Internal/Placeholder.php(149): Amp\Coroutine->Amp\{closure}(NULL, '{"jsonrpc":"2.0...')
#32 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Deferred.php(53): Amp\Promise@anonymous->resolve('{"jsonrpc":"2.0...')
#33 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/byte-stream/lib/ResourceInputStream.php(109): Amp\Deferred->resolve('{"jsonrpc":"2.0...')
#34 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Loop/Driver.php(119): Amp\ByteStream\ResourceInputStream::Amp\ByteStream\{closure}('bw', '{"jsonrpc":"2.0...')
#35 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Loop/Driver.php(72): Amp\Loop\Driver->tick()
#36 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/amphp/amp/lib/Loop.php(95): Amp\Loop\Driver->run()
#37 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Server/LanguageServer.php(114): Amp\Loop::run(Object(Closure))
#38 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/src/Command/ServerCommand.php(26): Phpactor\LanguageServer\Core\Server\LanguageServer->run()
#39 [internal function]: Balthild\PhpCsFixerLsp\Command\ServerCommand->__invoke(Object(Balthild\PhpCsFixerLsp\Model\ServerOptions), Object(Symfony\Component\Console\Output\StreamOutput))
#40 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/symfony/console/Command/InvokableCommand.php(61): ReflectionFunction->invoke(Object(Balthild\PhpCsFixerLsp\Model\ServerOptions), Object(Symfony\Component\Console\Output\StreamOutput))
#41 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/symfony/console/Command/Command.php(338): Symfony\Component\Console\Command\InvokableCommand->__invoke(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\StreamOutput))
#42 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/symfony/console/Application.php(1079): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\StreamOutput))
#43 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/symfony/console/Application.php(356): Symfony\Component\Console\Application->doRunCommand(Object(Balthild\PhpCsFixerLsp\Command\ServerCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\StreamOutput))
#44 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/symfony/console/Application.php(195): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\StreamOutput))
#45 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/src/Application.php(32): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\StreamOutput))
#46 /Users/balthild/Projects/PHP/php-cs-fixer-lsp/bin/php-cs-fixer-lsp(16): Balthild\PhpCsFixerLsp\Application->run()
#47 {main}
[formatting] Exception [TypeError] Phpactor\LanguageServer\Handler\TextDocument\FormattingHandler::formatting(): Argument #1 ($textDocument) must be of type Phpactor\LanguageServerProtocol\TextDocumentIdentifier, array given, called in /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Handler/HandlerMethodRunner.php on line 86 at /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Handler/TextDocument/FormattingHandler.php#36
Error: Exception [TypeError] Phpactor\LanguageServer\Handler\TextDocument\FormattingHandler::formatting(): Argument #1 ($textDocument) must be of type Phpactor\LanguageServerProtocol\TextDocumentIdentifier, array given, called in /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Core/Handler/HandlerMethodRunner.php on line 86 at /Users/balthild/Projects/PHP/php-cs-fixer-lsp/vendor/phpactor/language-server/lib/Handler/TextDocument/FormattingHandler.php#36
    at handleResponse (/Users/balthild/Projects/ES/php-cs-fixer-lsp-vscode/node_modules/vscode-jsonrpc/lib/common/connection.js:565:48)
    at handleMessage (/Users/balthild/Projects/ES/php-cs-fixer-lsp-vscode/node_modules/vscode-jsonrpc/lib/common/connection.js:345:13)
    at processMessageQueue (/Users/balthild/Projects/ES/php-cs-fixer-lsp-vscode/node_modules/vscode-jsonrpc/lib/common/connection.js:362:17)
    at Immediate.<anonymous> (/Users/balthild/Projects/ES/php-cs-fixer-lsp-vscode/node_modules/vscode-jsonrpc/lib/common/connection.js:334:13)
    at processImmediate (node:internal/timers:485:21)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)

In my codebase, only after aligning the handler's method signature with what the documentation says (the first should be a *Param, and the last must be a CancellationToken) could it worked fine.

The client is vscode-languageclient/node.

@balthild
Copy link
Author

balthild commented Jan 12, 2026

The formatter in phpactor's php-cs-fixer extension (FormatCommand) implements Command, not Handler. The dispatching logic is different. CommandDispatcher deconstructs the array but LanguageSeverProtocolParamsResolver does not. The FormattingHandler (modified in this PR) is dispatched by LanguageSeverProtocolParamsResolver, not CommandDispatcher.

@dantleech
Copy link
Contributor

This has worked for the past 6 years and I've just tested it with php-cs-fixer on VS code and it's fine:
image

so I'm wondering why it's failing for you.

@balthild
Copy link
Author

Alright, I'll write an integration test to reproduce it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants