본문으로 건너뛰기
cd /languages
  • 장수하는 데스크톱
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 Pascal·Delphi 지원: 유닛과 클래스 그래프

Maguyva는 AST, 심볼, 그래프로 Pascal과 Delphi 유닛을 지원하여, AI 에이전트가 변경 전에 uses 절, 클래스, 프로시저를 매핑할 수 있게 합니다.

Pascal 코드베이스에 먼저 지도가 필요한 이유

Delphi와 Free Pascal 애플리케이션은 다른 모든 코드가 쓰는 몇 개의 큰 유닛을 중심으로 자라는 경우가 많습니다. 폼은 베이스 폼을, 컴포넌트는 베이스 컴포넌트를 상속하고, 비즈니스 규칙은 십여 개 화면이 호출하는 프로시저 안에 있습니다. 파일 단위로는 잘 읽히지만, 변경이 잘못되는 곳은 바로 의존성입니다.

Maguyva는 먼저 에이전트에게 유닛과 클래스 구조를 건네므로, 무엇이든 쓰기 전에 변경이 어디에 닿는지 말할 수 있습니다.

Maguyva가 Pascal에서 추출하는 것

Maguyva는 .pas와 .pp 소스 유닛을 지원합니다. 프로시저와 함수 정의는 호출 가능한 심볼로 추출되며, 정의 이름에서 procedure, function, var, const 키워드는 제거됩니다. 클래스와 인터페이스는 구조적 검색에서 타입 정의로 선택할 수 있습니다.

임포트는 uses 절에서 만들어지며, 키워드를 떼어 내고 유닛 이름을 그래프에 저장합니다. 호출은 멤버 접두사, 인자, 감싸는 괄호를 제거해 정규화되므로, Self.Save(x)로 쓰인 호출은 Save로 저장됩니다.

그래프는 호출, 상속, 인터페이스 구현, 오버라이드, 인스턴스화, 타입 참조, 읽기와 쓰기, 예외 발생과 핸들러 엣지를 기록합니다. 약 107개의 런타임 라이브러리 루틴(WriteLn, ReadLn, Inc, Dec, Ord 등)은 관계에서 제외됩니다.

에이전트 프롬프트 예시

  • “DataModuleMain을 사용하는 유닛은 무엇이고, 거기서 무엇을 호출하나요?” (dependency_search incoming)
  • “TBaseEditForm을 상속하는 폼은 무엇이고, 어떤 메서드를 오버라이드하나요?” (find_symbol, 그다음 dependency_search)
  • “버튼 핸들러에서 데이터베이스 유닛까지 송장이 어떻게 전기되는지 설명해 줘.” (get_task_context)

알려진 한계

  • Pascal로 매핑되는 것은 .pas와 .pp뿐입니다. .dpr와 .dfm 같은 Delphi 프로젝트 파일과 폼 파일은 확장자 목록에 없으므로, 폼 레이아웃과 프로젝트 구성은 그래프 밖에 있습니다.
  • 메서드는 일반 프로시저와 같은 문법을 쓰므로, structural_search의 methods 프리셋은 아무것도 선택하지 않습니다. functions 프리셋을 사용하세요.
  • 필터링된 런타임 라이브러리 루틴 호출은 그래프 엣지로 나타나지 않습니다. 이런 호출에는 text_pattern_search를 사용하세요.

다음 단계

빠른 시작으로 저장소를 연결한 다음, 호환성 페이지에서 지원 매트릭스를 확인하세요. 애플리케이션이 C 라이브러리를 링크한다면 C 가이드도 읽어 보세요.

가장 적합한 경우

  • > 원래 작성자가 이미 떠난 Delphi 또는 Lazarus/Free Pascal 애플리케이션을 유지보수하는 팀.
  • > 깊은 클래스 계층, 인터페이스, 큰 공유 유닛을 가진 Object Pascal 코드베이스.
  • > 첫 산출물이 유닛과 그 의존성의 지도인 현대화 또는 포팅 작업.

에이전트 워크플로

  • > 공유 유닛을 바꾸기 전에 `uses` 절에서 그 유닛을 지정한 모든 유닛을 나열합니다.
  • > 베이스 폼이나 베이스 컴포넌트를 상속하는 클래스와 그들이 오버라이드하는 메서드를 찾습니다.
  • > 루틴의 매개변수를 바꾸기 전에 그것을 호출하는 프로시저를 추적합니다.

엔진 세부 정보

  • > Pascal 지원은 `.pas`와 `.pp` 유닛을 포함합니다. `.dpr`, `.dfm` 같은 Delphi 프로젝트 파일과 폼 파일은 확장자 목록에 없습니다.
  • > `uses` 절은 임포트 관계가 되고, 호출은 멤버 접두사, 인자, 감싸는 괄호를 제거해 정규화됩니다.
  • > `WriteLn`, `Inc`, `Ord` 같은 약 107개의 런타임 라이브러리 루틴은 관계에서 걸러지므로 애플리케이션 코드가 더 잘 드러납니다.

유용한 MCP 진입점

  • find_symbol

    정의와 참조가 필요할 때 클래스, 폼, 프로시저 이름으로 쓰세요.

  • dependency_search

    공유 유닛이나 베이스 클래스에 incoming 탐색을 써서 어떤 유닛과 하위 클래스가 의존하는지 확인하세요.

  • get_task_context

    “버튼 핸들러에서 데이터베이스 유닛까지 송장이 어떻게 전기되는지 설명해 줘” 같은 프롬프트에 쓰세요.