fix(no-issue-refs): per-line учёт строк ломает скан docstring'ов — пропуски и ложные срабатывания #6
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
scripts/check_no_issue_refs_in_comments.pyизвлекает комментарий черезextract_comment(), который отслеживает состояние строкового литерала (in_string) по одной строке и не знает про многострочные строки (docstring'и). Из-за этого#NNNвнутри docstring'ов обрабатывается некорректно — причём в обе стороны.В отличие от него,
check_no_session_marks_in_code.pyсканирует COMMENT/STRING-токены черезtokenizeи работает корректно. Issue-refs-хук стоит привести к той же модели.Репро
Две дефектные ветки:
#235на строке-открытии docstring'а пропущен: после"""in_stringстановится True (нечётное число кавычек на строке), и#235считается «внутри строки». Реальный кейс: вsenokosov/batonissue-ref'ы в докстрингах массово прятались именно на"""-строках и проходили хук молча (всплыло на baton#1007).#999на строке-продолжении docstring'а без кавычек флагается как комментарий:extract_commentстартует каждую строку сin_string=False, видит#вне строки и считает остаток комментарием. То есть результат зависит от того, есть ли на конкретной строке docstring'а кавычка — непредсказуемо.Строка 5 (настоящий
#-комментарий) ловится верно — регрессий по основному кейсу быть не должно.Предлагаемое решение
Сканировать
.pyчерезtokenize, как вcheck_no_session_marks_in_code.py:senokosov/batonдействует правило «не цитировать issue-ref'ы и в докстрингах кода тоже», так что покрыть STRING-токены логично — тогда хук станет симметричен session-marks-хуку. Если оставлять только комментарии — хотя бы убрать недетерминированный per-line парсер (false positive на строке 3).TODO(#NNN)-исключение переиспользовать как есть.Acceptance
#NNNв docstring'ах детектируется детерминированно (или сознательно исключён — но без зависимости от наличия кавычки на строке).#NNNв обычных#-комментариях по-прежнему ловится;TODO(#N)разрешён.fixtures/issue_refs/дополнены docstring-кейсами (открытие + продолжение);bash fixtures/run_smoke.shзелёный.Заметки
waiting; верификация локально черезfixtures/run_smoke.sh.senokosov/baton#1007(volody: «раз хук их не ловит — это баг, заведи задачу»)..ts/.tsx) — другой пробел, но обе задачи про общий парсер комментариев; стоит делать согласованно.Закрываю: сделано в #12 (в
mainсv0.12.0).Разбор
.pyвcheck_no_issue_refs_in_comments.pyидёт черезtokenize— COMMENT-токены плюс docstring'и модуля/класса/функции (классификация черезast), общим слоемscripts/comment_scan.pyсno-broken-repo-paths. Обе описанные ветки закрыты по построению:#235на строке-открытии docstring'а больше не прячется за нечётной кавычкой, а#999на строке-продолжении не считается#-комментарием — состояние держится пофайлово, а не пересобирается на каждой строке.По пунктам приёмки: docstring-фикстуры —
fixtures/issue_refs/docstring_ref.py,docstring_class.py,docstring_async.py,bom_docstring.py,todo_in_docstring.py;TODO(#N)остался исключением (и сузился до строгого формата вместе сtodo-needs-issue); неразбираемый и не-UTF-8 файл не роняет хук стектрейсом.Родственное #4 закрыто лишь наполовину и остаётся открытым:
no-issue-refs-in-commentsфронт уже видит (жёсткийtypes: [python]снят, C-подобный режим с пофайловой машиной состояний есть вcomment_scan), аno-session-marks-in-codeв не-.pyфайлах по-прежнему сканирует строку целиком, то есть на.ts/.tsxпройдётся и по коду. Остаток по разметочным расширениям (.vue/.html/.svelte,.css) ведётся в #11.