Класс: Parser::Source::TreeRewriter
- Наследует:
- Object
- Object
- Parser::Source::TreeRewriter
- Расширен модулем:
- Deprecation
- Определён в:
- sorbet/rbi/parser@3.3.8.0.rbi
Обзор
TreeRewriter выполняет основную работу по переписыванию исходного кода. Он планирует обновления кода в правильном порядке.
В простых случаях результат будет очевиден.
Далее приведены примеры более сложных случаев. Предположим, что эти примеры выполняются над исходным кодом 'puts(:hello, :world). Методы #wrap, #remove и т. д. принимают Range в качестве первого аргумента; для наглядности в примерах ниже используются английские предложения и строка исходного кода.
Пересекающиеся диапазоны:
Любые два действия по переписыванию, выполняемые над пересекающимися диапазонами, завершатся ошибкой и вызовут ClobberingError, если только оба действия не являются удалениями (рассматриваются далее).
- обернуть ':hello, ' в '(' и ')'
- обернуть ', :world' в '(' и ')' => CloberringError
Пересекающиеся удаления:
- удалить ':hello, '
- удалить ', :world'
Пересекающиеся диапазоны объединяются, и ':hello, :world' будет удалено. Эту политику можно изменить. :crossing_deletions по умолчанию имеет значение :accept, но может быть установлено в :warn или :raise.
Несколько действий с одинаковыми конечными точками:
Результат всегда будет одинаковым независимо от порядка их выполнения. Исключение: действия по переписыванию, выполняемые над одним и тем же диапазоном (рассматриваются далее).
Пример:
- заменить ', ' на ' => '
- обернуть ':hello, :world' в 'and ''
- заменить ':world' на ':everybody'
- обернуть ':world' в '[' и ']'
В результате получится строка 'puts({:hello => [:everybody]})', и этот результат не зависит от порядка, в котором были заданы инструкции.
Обратите внимание: если бы две операции «заменить» были заданы как одна замена ', :world' на ' => :everybody', результатом была бы ClobberingError из-за обрамления квадратными скобками.
Несколько обрамлений одного диапазона:
- обернуть ':hello' в '(' и ')'
- обернуть ':hello' в '[' и ']'
Обрамления объединяются в заданном порядке, и результатом будет 'puts([(:hello)], :world)'.
Несколько замен одного диапазона:
- заменить ':hello' на ':hi', затем
- заменить ':hello' на ':hey'
Замены выполняются в заданном порядке, поэтому последующая замена отменяет предыдущую, и ':hello' будет заменено на ':hey'.
Эту политику можно изменить. :different_replacements по умолчанию имеет значение :accept, но может быть установлено в :warn или :raise.
Поглощённые вставки:
обернуть 'world' в '', '' заменить ':hello, :world' на ':hi'
Замена, содержащая другие действия по переписыванию, поглотит эти действия, а ':hello, :world' будет заменено на ':hi'.
Эту политику для поглощённых вставок можно изменить. :swallowed_insertions по умолчанию имеет значение :accept, но может быть установлено в :warn или :raise
Реализация
Обновления организованы в дерево в соответствии с диапазонами, к которым они применяются (дочерние диапазоны строго входят в родительские), отсюда и название.
source://parser//lib/parser/source/tree_rewriter.rb#91
Определено в пространстве имён
Классы: Action
Краткое описание констант свернуть
- ACTIONS =
source://parser//lib/parser/source/tree_rewriter.rb#391
T.let(T.unsafe(nil), Array)
- DEPRECATION_WARNING =
source://parser//lib/parser/source/tree_rewriter.rb#356
T.let(T.unsafe(nil), String)
- POLICY_TO_LEVEL =
source://parser//lib/parser/source/tree_rewriter.rb#417
T.let(T.unsafe(nil), Hash)
Краткое описание методов экземпляра свернуть
- #as_nested_actions ⇒ Array<(Symbol, Range, String{, String})>
Возвращает представление перезаписчика в виде вложенных вставок (:wrap) и замен.
- #as_replacements ⇒ Array<Range, String>
Возвращает представление перезаписчика в виде упорядоченного списка замен.
- #diagnostics ⇒ Diagnostic::Engine
source://parser//lib/parser/source/tree_rewriter.rb#93.
- #empty? ⇒ Boolean
Возвращает true, если не было записано ни одного (нетривиального) обновления.
- #import!(foreign_rewriter, offset: T.unsafe(nil)) ⇒ Rewriter
Для особых случаев, когда требуется объединить перезаписчик, связанный с другим source_buffer, или сместить его.
- #in_transaction? ⇒ Boolean
source://parser//lib/parser/source/tree_rewriter.rb#329.
- #initialize(source_buffer, crossing_deletions: T.unsafe(nil), different_replacements: T.unsafe(nil), swallowed_insertions: T.unsafe(nil)) ⇒ TreeRewriter конструктор
source://parser//lib/parser/source/tree_rewriter.rb#98.
- #insert_after(range, content) ⇒ Rewriter
Сокращение для
wrap(range, nil, content). - #insert_after_multi(range, text) ⇒ Object устарел закрытый Устарело.
Используйте insert_after или wrap
- #insert_before(range, content) ⇒ Rewriter
Сокращение для
wrap(range, content, nil). - #insert_before_multi(range, text) ⇒ Object устарел закрытый Устарело.
Используйте insert_after или wrap
- #merge(with) ⇒ Rewriter
Возвращает новый перезаписчик, содержащий обновления получателя и переданного аргумента.
- #merge!(with) ⇒ Rewriter
Объединяет обновления аргумента с обновлениями получателя.
- #process ⇒ String
Применяет все запланированные изменения к
source_bufferи возвращает изменённый исходный код в виде новой строки. - #remove(range) ⇒ Rewriter
Сокращение для
replace(range, ''). - #replace(range, content) ⇒ Rewriter
Заменяет код исходного диапазона
rangeнаcontent. - #source_buffer ⇒ Source::Buffer
source://parser//lib/parser/source/tree_rewriter.rb#92.
- #transaction ⇒ Object
Предоставляет защищённый блок, в котором последовательность нескольких действий по переписыванию выполняется атомарно.
- #wrap(range, insert_before, insert_after) ⇒ Rewriter
Вставляет указанные строки перед заданным диапазоном и после него.
Методы, включённые из Deprecation
warn_of_deprecation, warned_of_deprecation=
Подробное описание конструкторов
#initialize(source_buffer, crossing_deletions: T.unsafe(nil), different_replacements: T.unsafe(nil), swallowed_insertions: T.unsafe(nil)) ⇒ TreeRewriter
source://parser//lib/parser/source/tree_rewriter.rb#98
6712 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6712 def initialize(source_buffer, crossing_deletions: T.unsafe(nil), different_replacements: T.unsafe(nil), swallowed_insertions: T.unsafe(nil)); end |
Подробное описание методов экземпляра
#as_nested_actions ⇒ Array<(Symbol, Range, String{, String})>
Возвращает представление переписывателя в виде вложенных вставок (:wrap) и замен.
rewriter.as_actions # =>[ [:wrap, 1...10, '(', ')'],
[:wrap, 2...6, '', '!'], # aka "insert_after"
[:replace, 2...4, 'foo'],
[:replace, 5...6, ''], # aka "removal"
],
В отличие от as_replacements, этого представления достаточно, чтобы в точности воссоздать переписыватель.
source://parser//lib/parser/source/tree_rewriter.rb#299
6729 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6729 def as_nested_actions; end |
#as_replacements ⇒ Array<Range, String>
Возвращает представление переписывателя в виде упорядоченного списка замен.
rewriter.as_replacements # => [ [1...1, '('],
[2...4, 'foo'],
[5...6, ''],
[6...6, '!'],
[10...10, ')'],
]
Этого представления достаточно, чтобы воссоздать результат process, но недостаточно, чтобы полностью воссоздать переписыватель для дальнейшего объединения или выполнения действий. См. as_nested_actions
source://parser//lib/parser/source/tree_rewriter.rb#281
6748 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6748 def as_replacements; end |
#diagnostics ⇒ Diagnostic::Engine
source://parser//lib/parser/source/tree_rewriter.rb#93
6754 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6754 def diagnostics; end |
#empty? ⇒ Boolean
Возвращает true тогда и только тогда, когда не было зарегистрировано никаких (нетривиальных) обновлений
source://parser//lib/parser/source/tree_rewriter.rb#125
6762 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6762 def empty?; end |
#import!(foreign_rewriter, offset: T.unsafe(nil)) ⇒ Rewriter
Для особых случаев, когда необходимо объединить переписыватель, связанный с другим source_buffer, или сместить его. Используются политики принимающего объекта.
source://parser//lib/parser/source/tree_rewriter.rb#168
6774 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6774 def import!(foreign_rewriter, offset: T.unsafe(nil)); end |
#in_transaction? ⇒ Boolean
source://parser//lib/parser/source/tree_rewriter.rb#329
6780 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6780 def in_transaction?; end |
#insert_after(range, content) ⇒ Rewriter
Сокращение для wrap(range, nil, content)
source://parser//lib/parser/source/tree_rewriter.rb#242
6791 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6791 def insert_after(range, content); end |
#insert_after_multi(range, text) ⇒ Object
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Используйте insert_after или wrap
source://parser//lib/parser/source/tree_rewriter.rb#351
6797 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6797 def insert_after_multi(range, text); end |
#insert_before(range, content) ⇒ Rewriter
Сокращение для wrap(range, content, nil)
source://parser//lib/parser/source/tree_rewriter.rb#230
6808 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6808 def insert_before(range, content); end |
#insert_before_multi(range, text) ⇒ Object
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
Используйте insert_after или wrap
source://parser//lib/parser/source/tree_rewriter.rb#342
6814 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6814 def insert_before_multi(range, text); end |
#merge(with) ⇒ Rewriter
Возвращает новый переписыватель, содержащий изменения получателя и переданного аргумента. Используются политики получателя.
source://parser//lib/parser/source/tree_rewriter.rb#155
6830 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6830 def merge(with); end |
#merge!(with) ⇒ Rewriter
Объединяет изменения аргумента с получателем. Используются политики получателя. Это действие атомарно: получатель не изменится, если операция не будет выполнена успешно.
source://parser//lib/parser/source/tree_rewriter.rb#139
6843 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6843 def merge!(with); end |
#process ⇒ String
Применяет все запланированные изменения к source_buffer и возвращает изменённый исходный код в виде новой строки.
source://parser//lib/parser/source/tree_rewriter.rb#252
6852 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6852 def process; end |
#remove(range) ⇒ Rewriter
Сокращённая запись для replace(range, '')
source://parser//lib/parser/source/tree_rewriter.rb#217
6862 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6862 def remove(range); end |
#replace(range, content) ⇒ Rewriter
Заменяет код исходного диапазона range на content.
source://parser//lib/parser/source/tree_rewriter.rb#193
6873 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6873 def replace(range, content); end |
#source_buffer ⇒ Source::Buffer
source://parser//lib/parser/source/tree_rewriter.rb#92
6879 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6879 def source_buffer; end |
#transaction ⇒ Object
Предоставляет защищённый блок, в котором последовательность нескольких операций переписывания выполняется атомарно. Если какая-либо из операций завершается ошибкой из-за перекрытия изменений, все операции откатываются. Транзакции могут быть вложенными.
source://parser//lib/parser/source/tree_rewriter.rb#310
6889 | # File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6889 def transaction; end |
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Parser/Source/TreeRewriter.html