ParserDefinition クラスで非プラットフォームの要素型を参照している TokenSet フィールド宣言を報告します。

すべての言語の ParserDefinition はアプリケーションの起動時に作成されます。 非プラットフォーム言語の要素型を参照している TokenSet を定義すると、プロジェクトにこの言語のファイルが含まれていない場合でも、参照される型のホルダークラスでその言語のすべての要素型が作成および登録される可能性があります。

例:


// 要素型ホルダー
public interface MyLangTokenTypes {
  IElementType COMMENT = new MyLangTokenType("COMMENT");
  IElementType TYPE1 = new MyLangTokenType("TYPE1");
  IElementType TYPE2 = new MyLangTokenType("TYPE2");
  // その他の型...
}


// 不適切:

public class MyLangParserDefinition implements ParserDefinition {
  // このフィールドによって MyLangTokenTypes のすべての型が初期化および登録されます。
  private static final TokenSet COMMENTS = TokenSet.create(MyLangTokenTypes.COMMENT);

  @NotNull
  @Override
  public TokenSet getCommentTokens() {
    return COMMENTS;
  }
  ...
}


// 適切:

public final class MyLangTokenSets {
  public static final TokenSet COMMENTS = TokenSet.create(MyLangTokenTypes.COMMENT);
}

public class MyLangParserDefinition implements ParserDefinition {
  @NotNull
  @Override
  public TokenSet getCommentTokens() {
    // このメソッドが呼び出される場合にのみ、型が参照および登録されます。
    return MyLangTokenSets.COMMENTS;
  }
  ...
}

// 適切 (Kotlin):

// トップレベルの宣言は getCommentTokens() メソッドが呼び出されるまでロードされません。
private val COMMENTS = TokenSet.create(MyLangTokenTypes.COMMENT);

class MyLangParserDefinition : ParserDefinition {
  override getCommentTokens(): TokenSet {
    return COMMENTS;
  }
  ...
}

// 適切:

public class MyLangParserDefinition implements ParserDefinition {
  // プラットフォーム TokenSet が許可されます:
  private static final TokenSet COMMENTS1 = TokenSet.EMPTY;
  // プラットフォーム TokenType が許可されます:
  private static final TokenSet COMMENTS2 = TokenSet.create(TokenType.WHITE_SPACE);

  @NotNull
  @Override
  public TokenSet getCommentTokens() {
    ...
  }
  ...
}

2023.2 の新機能です