felixfbecker/language-server

PHP实现Visual Studio Code语言服务器协议

v5.4.6 2018-11-13 17:33 UTC

README

Version Linux Build Status Windows Build status Coverage semantic-release Minimum PHP Version License Gitter

一个纯PHP实现的开放语言服务器协议。为任何IDE提供PHP静态代码分析。

使用优秀的Tolerant PHP解析器phpDocumentor的DocBlock反射事件循环以支持并发。

目录

特性

完成

Completion search demo

签名帮助

Signature help demo

转到定义

Go To Definition demo

查找引用

Find References demo

悬停

Hover class demo

Hover parameter demo

悬停请求返回声明行(标记为语言php)和docblock的摘要。对于参数,它将返回@param标签。

文档符号

Document Symbols demo

工作区符号

Workspace Symbols demo

查询不区分大小写地与符号的完全限定名进行匹配。
非标准:空查询将返回工作区中找到的所有符号。

通过发布诊断进行错误报告

Error reporting demo

PHP解析错误报告为错误,docblock的解析错误报告为警告。来自vendor目录的错误/警告将被忽略。

PHP内置函数的存根

完成、类型解析等将使用标准PHP库和常见扩展。

什么是定义?

全局可搜索的定义包括

  • 接口
  • 特性
  • 属性
  • 方法
  • 类常量
  • 使用const关键字定义的常量

当需要时即时解析定义

  • 变量赋值
  • 参数
  • 闭包use语句

尚未支持

  • 使用define()定义的常量

由于命名空间仅构成完全限定名的一部分,并且不映射到唯一声明,因此设计上不考虑命名空间为声明。

什么是引用?

定义/引用/悬停当前适用于

  • 类实例化
  • 静态方法调用
  • 类常量访问
  • 静态属性访问
  • 参数类型提示
  • 返回类型提示
  • 方法调用,如果变量在同一作用域中分配给了新对象
  • 属性访问,如果变量在同一作用域中分配给了新对象
  • 变量
  • 参数
  • 导入的闭包变量(use
  • 类、常量和函数的use语句
  • implements/extends之后的类样
  • 函数调用
  • 常量访问
  • instanceof检查
  • 重新分配的变量
  • 返回值、属性、数组访问的嵌套访问/调用

协议扩展

此语言服务器实现了文件协议扩展。如果客户端通过ClientCapabilities.xfilesProviderClientCapabilities.xcontentProvider表达支持,则服务器将通过客户端的请求请求工作区中的文件和文件内容,而不会直接访问文件系统。这允许服务器在容器、远程工作区或任何不同于file://的协议的独立环境中运行。

性能

初始化时,服务器将递归扫描项目目录中的PHP文件,解析它们并将所有定义和引用添加到内存索引中。这需要的时间取决于项目的大小。截至撰写时,此项目包含78个文件和1560个依赖项文件,解析和消耗了76MB,耗时97秒,使用Surface Pro 3。语言服务器在索引期间完全运行,可以响应对已索引定义的请求。后续请求几乎瞬间完成,因为索引保存在内存中。

启用XDebug会严重影响性能,如果max_nesting_level设置太低,甚至可能导致服务器崩溃。

版本

此项目遵循semver进行协议通信和命令行参数,例如,LSP的重大版本增加将导致PHP LS的重大版本增加。新功能(如请求实现)将导致新的小版本。所有其他都将是一个补丁版本。所有类都被视为内部类,不受semver约束。

安装

建议通过Composer进行安装。只需运行

composer require felixfbecker/language-server

即可获得最新稳定版本及其所有依赖项。
运行composer update将更新服务器到最新非破坏性版本。

在安装语言服务器及其依赖项后,您必须解析标准PHP符号的stubs并保存索引以实现快速初始化。

 composer run-script --working-dir=vendor/felixfbecker/language-server parse-stubs

运行

使用以下命令启动语言服务器

php vendor/felixfbecker/language-server/bin/php-language-server.php

命令行参数

--tcp=host:port(可选)

使服务器使用TCP连接与语言客户端通信,而不是使用STDIN/STDOUT。服务器将尝试连接到指定的地址。强烈推荐在Windows上使用,因为STDIO是阻塞的。

示例

php bin/php-language-server.php --tcp=127.0.0.1:12345

--tcp-server=host:port(可选)

使服务器使用TCP连接与语言客户端通信,而不是使用STDIN/STDOUT。服务器将在指定地址上监听连接。如果PCNTL可用,将为每个连接派生一个子进程。如果不可用,则仅接受一个连接,并且连接一旦关闭就无法重新建立,将派生一个新的进程。

示例

php bin/php-language-server.php --tcp-server=127.0.0.1:12345

--memory-limit=integer(可选)

设置语言服务器的内存限制。相当于php.ini指令中的memory-limit。默认为4GB(远远超过所需)。

示例

php bin/php-language-server.php --memory-limit=256M

使用

贡献

您至少需要PHP 7.0和Composer。克隆存储库并运行

composer install

以安装依赖项。

使用以下命令运行测试

composer test

使用以下命令进行代码审查

composer lint

项目解析PHPStorm的PHP stubs以支持PHP内置函数。在Composer处理后,它会根据需要重新解析它们,但在一些代码更改(如涉及索引或解析的更改)之后,您可能需要显式重新解析它们

composer run-script parse-stubs

要使用XDebug进行调试,请确保已将其设置为环境变量

PHPLS_ALLOW_XDEBUG=1

这告诉语言服务器,如果检测到XDebug已启用(XDebug对性能有较大影响),则不要在没有XDebug的情况下重启。