Spec-Zone.ru › Homebrew

Класс: 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

Параметры:

  • source_buffer (Source::Buffer)


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

Возвращает:

  • (Array<(Symbol, Range, String{, String})>)


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

Возвращает:

  • (Array<Range, String>) —

    упорядоченный список пар «диапазон и замена»



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

Возвращает:

  • (Diagnostic::Engine)


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

Возвращает:

  • (Boolean)


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

Параметры:

  • rewriter (TreeRewriter) —

    из другого source_buffer

  • offset (Integer) (по умолчанию: T.unsafe(nil))

Возвращает:

  • (Rewriter) —

    self

Вызывает исключение:

  • (IndexError) —

    если диапазоны действий (после применения смещения) не помещаются в текущий буфер



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

Возвращает:

  • (Boolean)


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

Параметры:

  • range (Range)
  • content (String)

Возвращает:

  • (Rewriter) —

    self

Вызывает исключение:

  • (ClobberingError) —

    при обнаружении конфликта изменений



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

Параметры:

  • range (Range)
  • content (String)

Возвращает:

  • (Rewriter) —

    self

Вызывает исключение:

  • (ClobberingError) —

    при обнаружении конфликта изменений



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

Параметры:

  • with (Rewriter)

Возвращает:

  • (Rewriter) —

    объединение получателя и аргумента

Вызывает исключение:

  • (ClobberingError) —

    при обнаружении конфликта изменений



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

Параметры:

  • with (Rewriter)

Возвращает:

  • (Rewriter) —

    self

Вызывает исключение:

  • (ClobberingError) —

    при обнаружении конфликта изменений



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

Возвращает:

  • (String)


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

Параметры:

  • range (Range)

Возвращает:

  • (Rewriter) —

    self

Вызывает исключения:

  • (ClobberingError) —

    если обнаружено перекрытие изменений



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

Параметры:

  • range (Range)
  • content (String)

Возвращает:

  • (Rewriter) —

    self

Вызывает исключения:

  • (ClobberingError) —

    если обнаружено перекрытие изменений



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

Возвращает:

  • (Source::Buffer)


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

Вызывает исключения:

  • (RuntimeError) —

    если блок не передан



6889
# File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6889

def transaction; end

#wrap(range, insert_before, insert_after) ⇒ Rewriter

Вставляет заданные строки перед указанным диапазоном и после него.

source://parser//lib/parser/source/tree_rewriter.rb#206

Параметры:

  • range (Range)
  • insert_before (String, nil)
  • insert_after (String, nil)

Возвращает:

  • (Rewriter) —

    self

Вызывает исключения:

  • (ClobberingError) —

    если обнаружено перекрытие изменений



6901
# File 'sorbet/rbi/parser@3.3.8.0.rbi', line 6901

def wrap(range, insert_before, insert_after); end

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Parser/Source/TreeRewriter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API