PhpStorm 2025.2 Help

常规用法

插件的使用简单直接,但非常灵活。 您可以将提供的一组注解添加到您的项目中并开始使用它们,配置插件以使用自定义注解集,或者简单地使用 UI 配置让 PhpStorm 学习,例如, Pattern.compile() 的 String 参数应被视为正则表达式。

使用注解

IntelliLang 使用了三个基本注解: @Language@Pattern@Subst

  • @Language 负责语言注入功能。

  • @Pattern 用于根据某个正则表达式模式验证字符串。

  • @Subst 用于将非编译时常量表达式替换为固定值。 这使您可以验证模式并构建注入语言的前缀/后缀(见下文),即使是运行时已知包含某些类型值的非常量表达式。

IntelliLang 提供的注解位于文件 annotations.jar 中,可以在 %product_home%/plugins/IntelliLang/lib 中找到。

@Language

@Language 注解可用于注解字符串字段、本地变量、方法参数以及返回字符串的方法。 这将导致分配给字段/变量的字符串字面量、作为参数传递的字符串或用作方法返回值的字符串被解释为指定的语言。

此外,还有 语言不匹配 检查功能,用于检查字段/变量被分配或从方法返回值时, 预期语言实际语言之间的冲突。

插件支持 直接间接注解。 换句话说,您可以直接像这样使用注解:

@Language("JavaScript") String code = "var x = 1 + 2";

或者像这样注解另一个注解类:

@Language("XPath") public @interface XPath { }

然后可以简单地将其用于注解元素为 @XPath

获取必须作为注解值属性提供的 language-id 非常简单:IntelliLang 通过常规代码补全操作提供可用语言列表。 只需从 ctrl-space 弹出窗口中选择适当的语言:

lang-completion.png

@Pattern

@Pattern 注解负责标记必须符合某个正则表达式的字符串,并且可以与 @Language 注解以相同方式使用。 这意味着,可以创建派生注解,例如一个要求字符串由一个或多个数字组成的 @Number 注解:

@Pattern("\\d+") public @interface Number { }

实际上,预定义注解已经包含了两个这样的派生注解:第一个, @PrintFormat ,匹配 java.util.Formatter 使用的类似 printf 的模式,另一个, @Identifier ,描述了一个有效的 Java 标识符。 这些可以直接使用,无需指定任何额外的模式。

@Subst

@Subst 注解用于替换非编译时常量的引用,这使得插件能够基于假设替换值与运行时预期的值兼容来执行 模式验证。 如果值与预期模式不匹配,插件将会提示。

它还帮助构建语言注入功能的有效前缀/后缀上下文(见下一节)。 请看这个示例:

@Subst("Tahoma") final String font = new JLabel().getFont().getName(); @Language("HTML") String message = "<html><span style='font: " + font + "; font-size:smaller'>" + ... + "</span></html>";

如果不将变量 font 的值替换为 Tahoma 的值(实际上这里可能只是一个字符),注入的片段将语法不正确,导致在 "font: " 指令后显示错误 需要一个术语

提供上下文:前缀和后缀

在注解元素时,可以提供一个前缀和后缀,当解析语言片段时应分别添加到前面和后面。 这可以用来提供上下文信息,例如,如果 JavaScript 注入的前缀是 "var someContextVariable;",PhpStorm 将知道变量 someContextVariable 已声明,并且在使用时不会警告其未声明。

除了手动提供前缀和后缀的能力外,IntelliLang 会根据字符串字面量的使用上下文动态确定这些值:

@Language(value =JavaScript, prefix = "function doSomethingElse(a){ }") String code = "function doSomething() {\n" + " var x = 1;\n" + " doSomethingElse(x);\n" + "}";

在此示例中,JavaScript 语言将被注入到三个字符串字面量中的每一个中,并且每个字符串的前缀和后缀将从前后的表达式中计算,以便解析的文本是有效的 JavaScript 语法:

  • 不会显示 "缺少 '}'" 错误:右括号是第一个字面量后缀的一部分。

  • doSomethingElse(a); 中使用的变量 x 将被声明:其声明是第二个字面量前缀的一部分。

  • 函数 doSomethingElse() 也将被识别:它在静态提供的前缀中定义。

重要说明

  • PhpStorm 语言注入 API 存在一些问题,这些问题对注入语言片段的前缀/后缀施加了某些限制。 例如,不允许语言的标记跨越元素的前缀/后缀。 这可能会发生,例如,如果前缀以空白字符结尾,而片段以空白字符开头。

    插件通过修剪前缀/后缀并插入一个空格字符作为分隔符来处理这种特殊情况。 然而,如果空格字符不是标记分隔符(例如适用于 JavaScript 字符串字面量),这种方法将不起作用。

    这种情况无法自动处理,PhpStorm 核心将产生一个断言。

  • 即使动态前缀/后缀计算为语言片段提供了适当的上下文,有些事情可能仍然无法按预期工作。 最显著的是重构(重命名)和导航功能。

最后修改日期: 2025年 9月 26日