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의 새로운 기능