Rails에서 Deprecation 경고는 버전별로 상이한 방식으로 처리됩니다. Rails 7.0까지는 ActiveSupport::Deprecation.warn
메서드를 사용하며, Rails 7.1부터는 ActiveSupport.deprecator.warn
또는 ActiveJob.deprecator.warn
와 같이 Class.deprecator.warn
를 통해 경고가 발생합니다. 경고 메시지는 heredoc, 단일 문자열, 이진 문자열, 연결된 문자열, 또는 변수에 할당된 형태 등 매우 다양하게 정의될 수 있습니다. 이러한 복잡성을 효과적으로 다루기 위해, 본 문서에서는 정규 표현식의 한계를 지적하고 추상 구문 트리(AST)와 tree-sitter
라이브러리를 활용하는 방안을 제안합니다.
경고 추출 과정은 ruby_tree_sitter
젬 설치와 tree-sitter-ruby
저장소 클론 및 문법 빌드로부터 시작됩니다. 이후 CustomParser
클래스를 구현하여 TreeSitter
파서를 초기화하고, 분석 대상 소스 코드의 AST를 생성합니다. 핵심 단계는 AST를 탐색하여 .warn
메서드 호출을 정확히 식별하는 것입니다. 이는 노드의 타입이 :call
이고, method
필드 이름의 자식 노드가 “warn”인 경우를 확인하는 방식으로 이루어집니다. 더 나아가, 호출의 receiver
가 Deprecation
(Rails 7.0 이하) 또는 deprecator
(Rails 7.1 이상)인지 검사하여 불필요한 호출을 필터링합니다. Node
객체는 직접 텍스트를 제공하지 않으므로, 바이트 범위를 활용하여 원본 소스 코드에서 텍스트를 추출하는 기법이 적용됩니다.
경고 메시지 추출 로직은 식별된 .warn
호출 노드를 기반으로 다양한 메시지 정의 방식을 처리합니다:
- Heredoc:
:call
노드의 부모가:heredoc_body
타입의 자식을 가지는지 확인하고,:heredoc_content
노드에서 내용을 추출한 후 불필요한 공백과 줄바꿈을 정리합니다. - 직접 전달된 문자열:
:call
노드가arguments
필드 이름을 가진 자식을 가지는지 확인하며, 이arg_node
의 자식 노드 타입이:string
,:binary
,:chained_string
인지에 따라 처리합니다.:string
타입은 직접 텍스트를 추출하고,:binary
또는:chained_string
은 여러:string
자식 노드의 내용을 연결하여 추출합니다. 이 과정에서 따옴표와 불필요한 공백을 제거하는 처리가 포함됩니다. - 변수에 할당된 메시지:
:call
노드의 부모가:assignment
타입의 자식을 가지는지 확인하고, 할당된 변수의 내용을 추출하는 방식으로 처리합니다.
이러한 개별 로직들은 traverse_ast
메서드에 통합되어 AST 전체를 재귀적으로 순회하며 모든 Deprecation 경고 메시지를 효율적으로 수집합니다.