Go Blog는 편집기에서 사용자 입력을 받아 여러 단계로 진행하는 대화형 리팩터링을 gopls에 도입했다고 밝혔다. 이 기능은 Go 전용이 아니라 언어 서버와 편집기 사이의 공통 표준으로 제안됐으며, gopls v0.24.0과 공식 Go 확장 프로그램 vscode-go v0.56.0에서 지원한다.
언어 서버 프로토콜(LSP)은 편집기와 언어 서버가 자동 완성, 진단, 코드 액션 등을 주고받도록 하는 개방형 표준이다. 기존에는 대부분의 코드 변환이 사용자 입력 없이 실행돼 서버가 문맥만으로 의도를 추측해야 했다. 새 방식은 서버가 편집기에 입력이나 선택 대화상자를 띄워 정보를 받은 뒤 코드를 수정할 수 있게 한다. 편집기별로 별도 대화상자 기능을 구현하지 않아도 여러 LSP 클라이언트에서 언어 서버의 개선 사항을 활용하는 것이 목표다.
예를 들어 구조체 태그를 추가할 때 json,yaml,db처럼 태그 종류와 camelCase, snake_case, PascalCase 같은 이름 규칙을 선택할 수 있다. 태그를 삭제할 때도 db 태그만 지우고 json 태그는 남기는 식으로 키를 지정할 수 있다. 인터페이스 구현 기능은 작업 공간이나 표준 라이브러리에서 인터페이스 이름을 검색하고, 타입 매개변수가 있다면 구체 타입 인수를 입력받아 메서드 스텁을 생성한다.
선언을 다른 파일이나 패키지로 옮기는 기능은 미리 보기 구현으로 소개됐다. 사용자가 대상 Go 파일을 고르면 gopls가 선언과 그 선언에 필요한 종속 선언을 함께 옮기고, 작업 공간의 참조와 양쪽 파일의 임포트를 갱신한다. 이 기능은 향후 gopls 릴리스에 포함될 예정이다.
gopls v0.24.0에는 패키지 수준 변수 이름이 dragonSlayer일 때 실행할 수 있는 다단계 대화형 코드 액션인 “Slay the dragon”도 포함됐다. 향후 계획으로는 함수 매개변수를 추가·삭제·재배치하는 시그니처 변경, 이름 충돌 해결을 위한 사용자 입력, 프로파일링 옵션을 설정하는 테스트·벤치마크 실행 같은 코드 편집 외 작업이 제시됐다. 이 가운데 시그니처 변경 등은 현재 제공 기능이 아니라 향후 방향이다.
기능은 gopls v0.24.0과 vscode-go v0.56.0에서 이용할 수 있다. Neovim과 Emacs 연동은 개념 검증 단계로 소개됐다. 설계는 LSP 대화형 코드 액션 제안과 LSP 커뮤니티 논의에서 확인할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요