Deprecation 경고를 추출하기 위해서는 먼저 경고가 발생하는 방식을 이해해야 합니다. Rails 7.0까지는 ActiveSupport::Deprecation.warn
메서드가 사용되었고, Rails 7.1부터는 ActiveSupport.deprecator.warn
과 같이 Class.deprecator.warn
형태가 사용됩니다. 추출 과정의 첫 번째 단계는 .warn
메서드 호출을 식별하되, 호출의 수신자가 Deprecation
또는 deprecator
인지 확인하여 logger.warn
과 같은 오탐을 방지하는 것입니다. 이 과정에서 tree-sitter
라이브러리와 Ruby tree-sitter
바인딩을 사용하여 Ruby 코드를 파싱하고 AST를 생성합니다. 이를 통해 각 노드의 타입과 필드 이름을 활용하여 .warn
호출 지점을 정확하게 찾아낼 수 있습니다.
경고 메시지는 다양한 형태로 정의될 수 있으므로, 모든 경우를 처리할 수 있는 추출 로직이 필요합니다. 주요 메시지 정의 방식은 다음과 같습니다:
- Heredoc:
<<~MSG
와 같은 heredoc 구문을 사용하는 경우, AST에서:heredoc_body
노드를 찾아:heredoc_content
노드에서 실제 메시지를 추출하고 불필요한 공백과 줄바꿈을 제거합니다. - 문자열: 리터럴 문자열, 이진 문자열(예:
"part() is deprecated" << "Please pass a block"
), 연결된 문자열(예:"preload_associations is deprecated." \ "Use ActiveRecord::Associations::Preloader.new"
) 등 직접 문자열로 전달되는 경우, AST의:string
,:binary
,:chained_string
노드를 통해 내용을 추출합니다. - 변수 할당: 메시지가 변수에 할당된 후 해당 변수가
.warn
메서드에 인수로 전달되는 경우, AST에서:assignment
노드를 찾아 변수에 할당된 문자열을 추출합니다.
이러한 다양한 메시지 정의 방식을 처리하기 위해 CustomParser
클래스를 구현합니다. 이 클래스는 tree-sitter
파서를 초기화하고, extract_deprecation_warnings
메서드를 통해 AST를 파싱하여 루트 노드부터 재귀적으로 탐색합니다. is_warn_call?
메서드는 특정 노드가 올바른 .warn
호출인지 확인하며, extract_warning_messages
메서드는 식별된 호출 노드로부터 위에서 설명한 방식에 따라 실제 경고 메시지를 추출합니다. 이 모든 구성 요소를 통합함으로써 Rails 소스 코드 전체에서 Deprecation 경고를 효과적으로 추출할 수 있는 견고한 솔루션을 완성합니다.