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

Canonical source: https://maguyva.ai/ko/languages/pascal

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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

## 지원 현황 요약

- 등급: AST 및 심볼 지원
- 프로그래밍
- 확장자: .pas, .pp
- 구문 인식 검색과 구조적 컨텍스트를 위한 실제 AST 파싱을 제공합니다.
- 이름이 지정된 심볼은 시맨틱 조회와 상호 참조에 활용됩니다. 관계 추출이 활성화된 경우 그래프 내비게이션을 사용할 수 있습니다.
- 이 언어는 그래프 인식 검색에 심볼과 관계를 제공합니다. 지원되는 에지 유형은 언어 고유의 구문 구조에 따라 다릅니다.
- AST 파싱과 심볼 추출을 모두 지원합니다.

## 가장 적합한 경우

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

## 에이전트 워크플로

- 공유 유닛을 바꾸기 전에 `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`를 사용하세요.

## 다음 단계

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

## 엔진 세부 정보

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

## 유용한 MCP 진입점

- `find_symbol`: 정의와 참조가 필요할 때 클래스, 폼, 프로시저 이름으로 쓰세요.
- `dependency_search`: 공유 유닛이나 베이스 클래스에 incoming 탐색을 써서 어떤 유닛과 하위 클래스가 의존하는지 확인하세요.
- `get_task_context`: “버튼 핸들러에서 데이터베이스 유닛까지 송장이 어떻게 전기되는지 설명해 줘” 같은 프롬프트에 쓰세요.
