ETC

IntelliJ IDEA 플러그인 개발을 위한 핵심 용어와 개념 정리

curiousKidd 2024. 12. 28. 23:25
반응형

IntelliJ IDEA는 플러그인 개발을 위한 강력한 SDK를 제공합니다.
플러그인을 개발하려면 IntelliJ 플랫폼에서 사용하는 주요 클래스와 인터페이스, 그리고 그 사용 방법을 이해해야 합니다.
이 글에서는 IntelliJ 플러그인 개발에서 사용되는 주요 용어와 개념을 정리하고, 예제 코드와 함께 설명하겠습니다.


1. DataKey

DataKey는 IntelliJ 플랫폼에서 데이터 전달에 사용되는 키입니다. 플러그인이나 액션(Action)에서는 이 키를 사용해 컨텍스트에서 특정 데이터를 가져오거나 설정합니다.

예제 코드

public static final DataKey<PsiElement> PSI_ELEMENT = DataKey.create("psi.Element");

public void actionPerformed(@NotNull AnActionEvent event) {
    PsiElement psiElement = event.getData(PSI_ELEMENT);
    if (psiElement != null) {
        System.out.println("Selected element: " + psiElement.getText());
    }
}
  • PSI_ELEMENT: 선택된 PSI 요소를 가져오는 키입니다.
  • getData(): 액션 이벤트에서 데이터를 가져옵니다.

2. PSI (Program Structure Interface)

PSI는 IntelliJ 플랫폼에서 코드 구조를 표현하는 API입니다. 파일, 클래스, 메서드, 변수 등 다양한 코드 요소를 객체로 다룰 수 있습니다.

주요 클래스

  • PsiElement: 모든 PSI 요소의 기본 클래스.
  • PsiFile: 파일을 표현하는 클래스.
  • PsiClass: 클래스 정의를 표현하는 클래스.
  • PsiMethod: 메서드 정의를 표현하는 클래스.

예제 코드: 커서 위치에서 클래스 이름 가져오기

public void actionPerformed(@NotNull AnActionEvent event) {
    PsiElement psiElement = event.getData(CommonDataKeys.PSI_ELEMENT);
    if (psiElement instanceof PsiClass) {
        PsiClass psiClass = (PsiClass) psiElement;
        System.out.println("Class name: " + psiClass.getName());
    }
}
  • CommonDataKeys.PSI_ELEMENT: 현재 선택된 PSI 요소를 가져옵니다.
  • instanceof: PSI 요소가 클래스인지 확인합니다.

3. AnAction 및 AnActionEvent

AnAction은 IntelliJ에서 사용자가 실행할 수 있는 동작(Action)을 정의합니다. AnActionEvent는 액션 실행 시 전달되는 컨텍스트 데이터를 포함합니다.

예제 코드: 간단한 액션 구현

public class MyAction extends AnAction {
    @Override
    public void actionPerformed(@NotNull AnActionEvent event) {
        Project project = event.getProject();
        if (project != null) {
            System.out.println("Project name: " + project.getName());
        }
    }
}
  • actionPerformed: 액션 실행 시 호출됩니다.
  • event.getProject(): 현재 프로젝트를 가져옵니다.

4. JBPopupFactory

JBPopupFactory는 팝업 메뉴나 대화 상자를 생성하는 데 사용됩니다.

예제 코드: 팝업 메뉴 생성

JBPopupFactory.getInstance().createMessage("Hello, IntelliJ Plugin!")
        .showInFocusCenter();
  • createMessage: 간단한 메시지 팝업을 생성합니다.
  • showInFocusCenter: 팝업을 화면 중앙에 표시합니다.

예제 코드: 액션 팝업 생성

ActionGroup actionGroup = new ActionGroup() {
    @Override
    public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) {
        return new AnAction[] { new MyAction() };
    }
};
JBPopupFactory.getInstance().createActionGroupPopup("Choose Action", actionGroup, event.getDataContext(),
        JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false).showInBestPositionFor(event.getDataContext());
  • ActionGroup: 여러 액션을 포함하는 그룹을 정의합니다.
  • createActionGroupPopup: 사용자가 선택할 수 있는 팝업 메뉴를 생성합니다.

5. PsiTreeUtil

PsiTreeUtil은 PSI 트리를 탐색하는 유틸리티 클래스입니다.

예제 코드: 특정 PSI 요소 찾기

PsiMethod psiMethod = PsiTreeUtil.findElementOfClassAtOffset(psiFile, caret.getOffset(), PsiMethod.class, false);
if (psiMethod != null) {
    System.out.println("Method name: " + psiMethod.getName());
}
  • findElementOfClassAtOffset: 특정 오프셋 위치에서 지정된 타입의 PSI 요소를 찾습니다.
  • PsiMethod: 메서드 요소를 나타냅니다.

6. Service 사용 예시 (사용자 정의 서비스 예시)

IntelliJ에서 프로젝트와 연관된 서비스를 정의하고 사용하는 방법입니다.

서비스 정의

public class CustomService {
    public void showDetails(PsiElement element) {
        System.out.println("Showing details for: " + element.getText());
    }
}

서비스 사용

CustomService service = project.getService(CustomService.class);
service.showDetails(psiElement);
  • project.getService: 프로젝트와 연관된 서비스를 가져옵니다.

플러그인 개발에 추가적으로 알아야 할 사항

1. **플러그인 매니페스트 (plugin.xml)

모든 플러그인은 META-INF/plugin.xml 파일에서 메타데이터를 정의합니다. 예:

<actions>
    <action id="MyAction" class="com.example.MyAction" text="Run My Action"/>
</actions>

2. PSI 구조 시각화

  • IntelliJ의 PSI Viewer 플러그인을 사용하여 PSI 구조를 탐색할 수 있습니다.

3. 디버깅과 테스트

  • 플러그인 개발 시 LightPlatformTestCase와 같은 JetBrains 제공 테스트 클래스를 사용하여 플러그인 동작을 검증할 수 있습니다.

반응형