홈으로 돌아가기

IntelliJ용 PSA 플러그인: 사용자 지정 자동 완성

PSA 플러그인은 프로젝트 PSI 컨텍스트를 기반으로 IntelliJ에서 사용자 지정 자동 완성 및 탐색을 구현합니다. 스크립트가 JSON 트리를 분석하고 completions/links를 반환합니다. 즉시 사용할 수 있는 플러그인이 없는 프레임워크에 적합합니다.

IntelliJ IDEA용 사용자 지정 자동 완성 PSA
Advertisement 728x90

PSA: IntelliJ에서 PSI 컨텍스트로 맞춤형 자동완성과 탐색 구현하기

PSA 플러그인은 개발자가 IntelliJ IDEA 내부에서 프로젝트별 자동완성, 탐색 및 코드 템플릿을 직접 구현할 수 있도록 지원합니다. 어떤 언어로 작성된 스크립트든 현재의 PSI 트리를 분석하고 제안 사항을 반환합니다. 이는 별도의 플러그인 설치 없이도 사용자 정의 프레임워크를 지원하는 어려움을 해결합니다.

PSI 컨텍스트 작동 방식

설정에서 실행 파일 경로를 지정하면 플러그인이 활성화됩니다. 자동완성(Alt+Space) 또는 '찾기' 기능이 실행될 때, 포커스된 요소의 단순화된 PSI 트리인 PSA 컨텍스트가 생성됩니다. 명령줄 인자 길이 제한으로 인해 이 트리는 임시 파일에 JSON 형식으로 인코딩되어 PSA_CONTEXT 환경 변수를 통해 스크립트에 전달됩니다.

PHP 예시:

Google AdInline article slot
<?php

function myFunc() {
    $l = '';
//        ^   커서 위치
}

생성된 JSON은 요소의 계층적 구조를 포함합니다:

{
  "elementType": "오른쪽 따옴표",
  "elementName": null,
  "elementFqn": null,
  "text": "'",
  "parent": {
    "elementType": "문자열",
    "text": "''",
    // ... 파일 레벨까지 중첩 구조 포함
  }
}

각 PSI 노드에는 elementType, elementName, elementFqn, text, textRange(시작 오프셋/종료 오프셋), parent/prev/next, 그리고 옵션들이 포함됩니다.

스크립트용 환경 변수

스크립트는 다음 변수를 받습니다:

Google AdInline article slot
  • PSA_CONTEXT: PSI 트리가 포함된 JSON 파일의 경로.
  • PSA_TYPE: Completion 또는 GoTo 중 하나.
  • PSA_LANGUAGE: 프로그래밍 언어 (PHP, JS 등).
  • PSA_DEBUG: 디버깅이 활성화되면 1로 설정.
  • PSA_OFFSET: 요소 내 커서 위치.

스크립트는 트리를 파싱하고, 컨텍스트(요소 + 부모들)를 분석하여 제안 사항을 결정합니다. Completion일 경우 옵션 배열을 반환하며, GoTo일 경우 link 필드를 포함한 하나의 항목을 반환합니다.

스크립트 응답 형식

JSON 응답 형식:

{
  "completions": [
    {
      "text": "삽입 텍스트",
      "link": "FileName.php:42:5", // GoTo 전용
      "bold": true,
      "priority": 10
    }
  ],
  "notifications": ["디버그 메시지"],
  "gotoElementTypes": ["FUNCTION", "CLASS"] // 성능 필터
}

priority는 결과를 정렬하며, bold는 항목 강조 표시에 사용됩니다. gotoElementTypes는 GoTo 범위를 제한해 성능을 향상시킵니다.

Google AdInline article slot

문서화 및 Swagger

플러그인은 API 모델로부터 자동으로 Swagger UI를 생성하여 명확성을 높입니다. 메서드는 '가짜'지만 호출 구조를 설명합니다. OpenAPI Generator를 사용해 스크립트용 DTO 클래스를 생성하세요.

PSI 요소 구조:

  • elementType: 타입 (STRING, FUNCTION).
  • elementName/Fqn: 이름 또는 FQCN.
  • options: 매개변수 사전.
  • text: 원본 소스 텍스트.
  • textRange: 오프셋.
  • 관계: parent/prev/next.

설정 및 성능 최적화

플러그인을 활성화하고 스크립트 경로를 지정하세요. 문제 발생 시 PSA_DEBUG를 켜세요. gotoElementTypes 필터를 활용해 GoTo 오버헤드를 줄이세요.

프레임워크 전용 플러그인보다 장점:

  • 글로벌이 아닌 프로젝트 수준 의존성.
  • 사용자 정의 API와 템플릿 지원.
  • 언어에 구애받지 않는 스크립트 지원.

예제 스크립트 (가상 코드):

#!/bin/bash
context=$(cat $PSA_CONTEXT | jq .)
if [[ $PSA_TYPE == "Completion" ]]; then
  # 분석 로직
  echo '{"completions": [{"text": "customFunc()"}]}'
fi

핵심 포인트

  • PSA는 정확한 컨텍스트 분석을 위해 전체 PSI 트리를 전달합니다.
  • 스크립트는 prioritybold를 통해 맞춤형 순서를 제공합니다.
  • GoTo는 file:line:pos 링크와 elementType 필터링을 지원합니다.
  • Swagger 문서는 DTO 개발 속도를 높입니다.
  • PHP, JS/TS 등 모든 프로젝트 언어와 호환됩니다.

— Editorial Team

Advertisement 728x90

다음 읽기