Spec-Zone.ru › Homebrew

Модуль: RuboCop::Cop::HelperFunctions Приватный

Включает:
RangeHelp
Включён в:
Cask::HomepageUrlStyling, Cask::UninstallMethodsOrder, DescHelper, FormulaCop, RuboCop::Cop::Homebrew::ExecShellMetacharacters, RuboCop::Cop::Homebrew::ShellCommands, HomepageHelper, NoAutobumpHelper, OnSystemConditionalsHelper, UrlHelper
Определён в:
rubocops/shared/helper_functions.rb,
rubocops/shared/helper_functions.rbi

Этот модуль является частью приватного API. Этот модуль можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого модуля, поскольку он может быть удалён или изменён без предупреждения.

Краткое описание методов экземпляра свернуть

  • #block_method_called_in_block?(node, method_name) ⇒ Boolean приватный

    Проверяет, вызывается ли метод блока внутри блока.

  • #check_precedence(first_nodes, next_nodes) ⇒ Array<(RuboCop::AST::Node, RuboCop::AST::Node)>? приватный

    Проверяет приоритет; возвращает первую пару узлов, нарушающих порядок приоритета.

  • #class_name(node) ⇒ String? приватный

    Возвращает имя узла класса или nil, если узел не является узлом класса.

  • #component_precedes?(first_node, next_node) ⇒ Boolean приватный

    Если first_node не предшествует next_node, задаёт соответствующие переменные экземпляра для отчёта.

  • #end_column(node) ⇒ Integer приватный

    Возвращает конечную позицию узла в исходном коде.

  • #expression_negated?(node) ⇒ Boolean приватный

    Проверяет, присутствует ли отрицание в заданном узле.

  • #find_all_blocks(node, block_name, &_block) ⇒ Array<RuboCop::AST::BlockNode> приватный

    Возвращает массив узлов блоков любой глубины ниже node в AST.

  • #find_block(node, block_name) ⇒ RuboCop::AST::BlockNode? приватный

    Возвращает блок с именем block_name внутри node.

  • #find_blocks(node, block_name) ⇒ Array<RuboCop::AST::BlockNode> приватный

    Возвращает массив узлов блоков с именем block_name внутри node.

  • #find_const(node, const_name, &_block) ⇒ T.anything приватный

    Находит константы в исходном коде.

  • #find_every_func_call_by_name(node, func_name = nil) ⇒ Array<RuboCop::AST::BlockNode, RuboCop::AST::SendNode> приватный

    Возвращает массив узлов вызовов функций с именем func_name среди всех потомков node.

  • #find_every_method_call_by_name(node, method_name = nil) ⇒ Array<RuboCop::AST::SendNode> приватный

    Возвращает массив узлов вызовов методов с именем method_name среди всех потомков node.

  • #find_instance_call(node, name, &_block) ⇒ T.anything приватный

    Сопоставляет часть метода, являющуюся получателем вызова.

  • #find_instance_method_call(node, instance, method_name, &_block) ⇒ T.anything приватный

    Сопоставляет метод с получателем.

  • #find_method_calls_by_name(node, method_name) ⇒ Array<RuboCop::AST::SendNode> приватный

    Возвращает массив узлов вызовов методов с именем method_name внутри node в порядке обхода в глубину (дочерние узлы).

  • #find_method_def(node, method_name = nil) ⇒ RuboCop::AST::Node? приватный

    Возвращает узел определения метода с именем method_name.

  • #find_method_with_args(node, method_name, *args, &_block) ⇒ Array<RuboCop::AST::SendNode> приватный

    Принимает имя метода и аргументы и передаёт блоку совпавший метод в качестве параметра.

  • #find_node_method_by_name(node, method_name) ⇒ RuboCop::AST::Node? приватный

    Возвращает узел метода method_node, соответствующий method_name.

  • #find_strings(node) ⇒ Array<RuboCop::AST::Node> закрытый

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

  • #format_component(component_node) ⇒ Symbol? закрытый

    Возвращает печатное имя компонента.

  • #line_number(node) ⇒ Integer закрытый

    Возвращает номер строки узла.

  • #line_start_column(node) ⇒ Integer закрытый

    Возвращает начальную позицию строки узла в исходном коде.

  • #method_called?(node, method_name) ⇒ Boolean закрытый

    Проверяет, вызывается ли method_name среди непосредственных дочерних узлов заданного узла.

  • #method_called_ever?(node, method_name) ⇒ Boolean закрытый

    Проверяет, вызывается ли method_name среди всех узлов-потомков заданного узла.

  • #method_name(node) ⇒ Symbol? закрытый

    Возвращает имя метода для узла def.

  • #node_equals?(node, var) ⇒ Boolean закрытый

    Сравнивает узел с соответствующей переменной Ruby.

  • #offending_node(node = nil) ⇒ RuboCop::AST::Node? закрытый

    Получает/задает указанный узел как узел, вызвавший нарушение, если это требуется в пользовательских cop.

  • #parameters(method_node) ⇒ Array<RuboCop::AST::Node> закрытый

    Возвращает массив аргументов узла method_node.

  • #parameters_passed?(method_node, params) ⇒ Boolean закрытый

    Возвращает true, если указанные параметры присутствуют в вызове метода, и задает вызов метода как узел, вызвавший нарушение.

  • #problem(msg, &block) ⇒ void закрытый
  • #regex_match_group(node, pattern) ⇒ MatchData? закрытый

    Проверяет соответствие pattern регулярному выражению в узле и задает соответствующие переменные экземпляра для фиксации совпадения.

  • #source_buffer(node) ⇒ Parser::Source::Buffer закрытый

    Буфер исходного кода необходим как аргумент для сообщения о нарушениях стиля.

  • #start_column(node) ⇒ Integer закрытый

    Возвращает начальную позицию узла в исходном коде.

  • #string_content(node, strip_dynamic: false) ⇒ String закрытый

    Возвращает строковое представление, если узел имеет тип str (обычная строка), dstr (строка с интерполяцией) или const.

Подробное описание методов экземпляра

#block_method_called_in_block?(node, method_name) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Проверяет, вызывается ли метод блока внутри блока.

Параметры:

  • node (RuboCop::AST::BlockNode)
  • method_name (Symbol)

Возвращает:

  • (Boolean)


378
379
380
381
382
383
384
385
386
387
# File 'rubocops/shared/helper_functions.rb', line 378

def block_method_called_in_block?(node, method_name)
  node.body.each_child_node do |call_node|
    next if !call_node.block_type? && !call_node.send_type?
    next if call_node.method_name != method_name

    @offensive_node = call_node
    return true
  end
  false
end

#check_precedence(first_nodes, next_nodes) ⇒ Array<(RuboCop::AST::Node, RuboCop::AST::Node)>?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Проверяет приоритет; возвращает первую пару узлов, нарушающих правила приоритета.

Параметры:

  • first_nodes (Array<RuboCop::AST::Node>)
  • next_nodes (Array<RuboCop::AST::Node>)

Возвращает:

  • (Array<(RuboCop::AST::Node, RuboCop::AST::Node)>, nil)


423
424
425
426
427
428
429
430
# File 'rubocops/shared/helper_functions.rb', line 423

def check_precedence(first_nodes, next_nodes)
  next_nodes.each do |each_next_node|
    first_nodes.each do |each_first_node|
      return [each_first_node, each_next_node] if component_precedes?(each_first_node, each_next_node)
    end
  end
  nil
end

#class_name(node) ⇒ String?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает имя узла класса или nil, если узел не является узлом класса.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (String, nil)


486
487
488
489
# File 'rubocops/shared/helper_functions.rb', line 486

def class_name(node)
  @offensive_node = node
  node.const_name
end

#component_precedes?(first_node, next_node) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Если первый узел не предшествует next_node, задаёт соответствующие переменные экземпляра для формирования отчёта.

Параметры:

  • first_node (RuboCop::AST::Node)
  • next_node (RuboCop::AST::Node)

Возвращает:

  • (Boolean)


434
435
436
437
438
439
# File 'rubocops/shared/helper_functions.rb', line 434

def component_precedes?(first_node, next_node)
  return false if line_number(first_node) < line_number(next_node)

  @offensive_node = first_node
  true
end

#end_column(node) ⇒ Integer

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает конечную позицию узла в исходном коде.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Integer)


480
481
482
# File 'rubocops/shared/helper_functions.rb', line 480

def end_column(node)
  node.source_range.end_pos
end

#expression_negated?(node) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Проверяет, присутствует ли отрицание в указанном узле.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Boolean)


443
444
445
446
447
448
# File 'rubocops/shared/helper_functions.rb', line 443

def expression_negated?(node)
  return false unless node.parent&.send_type?
  return false unless node.parent.method_name.equal?(:!)

  !!offending_node(node.parent)
end

#find_all_blocks(node, block_name, &_block) ⇒ Array<RuboCop::AST::BlockNode>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает массив узлов-блоков любой глубины, расположенных ниже node в AST. Если передан блок, то подходящий узел-блок передаётся ему!

Параметры:

  • node (RuboCop::AST::Node, nil)
  • block_name (Symbol)
  • _block (T.proc.params(block: RuboCop::AST::BlockNode).void, nil)

Возвращает:

  • (Array<RuboCop::AST::BlockNode>)


341
342
343
344
345
346
347
348
349
350
351
# File 'rubocops/shared/helper_functions.rb', line 341

def find_all_blocks(node, block_name, &_block)
  return [] if node.nil?

  blocks = node.each_descendant(:block).select { |block_node| block_name == block_node.method_name }
  return blocks unless block_given?

  blocks.each do |block_node|
    offending_node(block_node)
    yield block_node
  end
end

#find_block(node, block_name) ⇒ RuboCop::AST::BlockNode?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает блок с именем block_name внутри node.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • block_name (Symbol)

Возвращает:

  • (RuboCop::AST::BlockNode, nil)


308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'rubocops/shared/helper_functions.rb', line 308

def find_block(node, block_name)
  return if node.nil?

  node.each_child_node(:block) do |block_node|
    next if block_node.method_name != block_name

    @offensive_node = block_node
    return block_node
  end
  # If not found then, parent node becomes the offensive node
  @offensive_node = node.parent
  nil
end

#find_blocks(node, block_name) ⇒ Array<RuboCop::AST::BlockNode>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает массив узлов-блоков с именем block_name внутри node.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • block_name (Symbol)

Возвращает:

  • (Array<RuboCop::AST::BlockNode>)


326
327
328
329
330
# File 'rubocops/shared/helper_functions.rb', line 326

def find_blocks(node, block_name)
  return [] if node.nil?

  node.each_child_node(:block).select { |block_node| block_name == block_node.method_name }
end

#find_const(node, const_name, &_block) ⇒ T.anything

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Находит константы в исходном коде. Если передан блок, передаёт ему соответствующие узлы.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • const_name (String)
  • _block (T.proc.params(const: RuboCop::AST::Node).void, nil)

Возвращает:

  • (T.anything)


285
286
287
288
289
290
291
292
293
294
295
296
# File 'rubocops/shared/helper_functions.rb', line 285

def find_const(node, const_name, &_block)
  return if node.nil?

  node.each_descendant(:const) do |const_node|
    next if const_node.const_name != const_name

    @offensive_node = const_node
    yield const_node if block_given?
    return true
  end
  nil
end

#find_every_func_call_by_name(node, func_name = nil) ⇒ Array<RuboCop::AST::BlockNode, RuboCop::AST::SendNode>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает массив узлов вызовов функций, соответствующих func_name, среди всех потомков node.

  • соответствует вызову функции: foo(*args, **kwargs)
  • не соответствует вызовам методов: foo.bar(*args, **kwargs)
  • возвращает все вызовы функций, если func_name не передан

Параметры:

  • node (RuboCop::AST::Node, nil)
  • func_name (Symbol, nil) (по умолчанию: nil)

Возвращает:

  • (Array<RuboCop::AST::BlockNode, RuboCop::AST::SendNode>)


182
183
184
185
186
187
188
# File 'rubocops/shared/helper_functions.rb', line 182

def find_every_func_call_by_name(node, func_name = nil)
  return [] if node.nil?

  node.each_descendant(:send).select do |func_node|
    func_node.receiver.nil? && (func_name.nil? || func_name == func_node.method_name)
  end
end

#find_every_method_call_by_name(node, method_name = nil) ⇒ Array<RuboCop::AST::SendNode>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает массив узлов вызовов методов, соответствующих method_name, среди всех потомков node. Если method_name не передан, возвращает все вызовы методов.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • method_name (Symbol, nil) (по умолчанию: nil)

Возвращает:

  • (Array<RuboCop::AST::SendNode>)


164
165
166
167
168
169
170
171
# File 'rubocops/shared/helper_functions.rb', line 164

def find_every_method_call_by_name(node, method_name = nil)
  return [] if node.nil?

  node.each_descendant(:send).select do |method_node|
    method_name.nil? ||
      method_name == method_node.method_name
  end
end

#find_instance_call(node, name, &_block) ⇒ T.anything

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Находит часть метода, являющуюся получателем. Передаёт блоку родительский узел получателя.

Пример

Соответствует ARGV.<whatever>().

find_instance_call(node, "ARGV")

Параметры:

  • node (RuboCop::AST::Node)
  • name (String)
  • _block (T.proc.params(method: RuboCop::AST::Node).void, nil)

Возвращает:

  • (T.anything)


263
264
265
266
267
268
269
270
271
272
273
274
# File 'rubocops/shared/helper_functions.rb', line 263

def find_instance_call(node, name, &_block)
  node.each_descendant(:send) do |method_node|
    next if method_node.receiver.nil?
    next if method_node.receiver.const_name != name &&
            !(method_node.receiver.send_type? && method_node.receiver.method_name == name)

    @offensive_node = method_node.receiver
    return true unless block_given?

    yield method_node
  end
end

#find_instance_method_call(node, instance, method_name, &_block) ⇒ T.anything

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Находит вызов метода с получателем. Передаёт в блок узел найденного метода.

Примеры

Найти Formula.factory(name).

find_instance_method_call(node, "Formula", :factory)

Найти build.head?.

find_instance_method_call(node, :build, :head?)

Параметры:

  • node (RuboCop::AST::Node, nil)
  • instance (String, Symbol)
  • method_name (Symbol, nil)
  • _block (T.proc.params(method: RuboCop::AST::SendNode).void, nil)

Возвращает:

  • (T.anything)


233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'rubocops/shared/helper_functions.rb', line 233

def find_instance_method_call(node, instance, method_name, &_block)
  methods = find_every_method_call_by_name(node, method_name)
  methods.each do |method|
    next if method.receiver.nil?
    next if method.receiver.const_name != instance &&
            !(method.receiver.send_type? && method.receiver.method_name == instance)

    @offensive_node = method
    return true unless block_given?

    yield method
  end
end

#find_method_calls_by_name(node, method_name) ⇒ Array<RuboCop::AST::SendNode>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает массив узлов вызовов методов с именем method_name внутри node в порядке обхода в глубину (дочерние узлы).

Параметры:

  • node (RuboCop::AST::Node, nil)
  • method_name (Symbol)

Возвращает:

  • (Array<RuboCop::AST::SendNode>)


147
148
149
150
151
152
153
154
155
156
# File 'rubocops/shared/helper_functions.rb', line 147

def find_method_calls_by_name(node, method_name)
  return [] if node.nil?

  nodes = node.each_child_node(:send).select { |method_node| method_name == method_node.method_name }

  # The top level node can be a method
  nodes << node if node.is_a?(RuboCop::AST::SendNode) && node.method_name == method_name

  nodes
end

#find_method_def(node, method_name = nil) ⇒ RuboCop::AST::Node?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает узел определения метода с именем method_name. Если method_name равен nil, возвращает первое определение метода.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • method_name (Symbol, nil) (по умолчанию: nil)

Возвращает:

  • (RuboCop::AST::Node, nil)


359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# File 'rubocops/shared/helper_functions.rb', line 359

def find_method_def(node, method_name = nil)
  return if node.nil?

  node.each_child_node(:def) do |def_node|
    def_method_name = method_name(def_node)
    next if method_name != def_method_name && method_name.present?

    @offensive_node = def_node
    return def_node
  end
  return if node.parent.nil?

  # If not found then, parent node becomes the offensive node
  @offensive_node = node.parent
  nil
end

#find_method_with_args(node, method_name, *args, &_block) ⇒ Array<RuboCop::AST::SendNode>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Получив method_name и аргументы, передаёт в блок найденный метод в качестве параметра.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • method_name (Symbol)
  • args (Object)
  • _block (T.proc.params(method: RuboCop::AST::Node).void, nil)

Возвращает:

  • (Array<RuboCop::AST::SendNode>)


200
201
202
203
204
205
206
207
208
# File 'rubocops/shared/helper_functions.rb', line 200

def find_method_with_args(node, method_name, *args, &_block)
  methods = find_every_method_call_by_name(node, method_name)
  methods.each do |method|
    next unless parameters_passed?(method, args)
    return [] unless block_given?

    yield method
  end
end

#find_node_method_by_name(node, method_name) ⇒ RuboCop::AST::Node?

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает method_node, соответствующий method_name.

Параметры:

  • node (RuboCop::AST::Node)
  • method_name (Symbol)

Возвращает:

  • (RuboCop::AST::Node, nil)


121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'rubocops/shared/helper_functions.rb', line 121

def find_node_method_by_name(node, method_name)
  return if node.nil?

  node.each_child_node(:send) do |method_node|
    next if method_node.method_name != method_name

    @offensive_node = method_node
    return method_node
  end
  # If not found then, parent node becomes the offensive node
  @offensive_node = node.parent
  nil
end

#find_strings(node) ⇒ Array<RuboCop::AST::Node>

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

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

Параметры:

  • node (RuboCop::AST::Node, nil)

Возвращает:

  • (Array<RuboCop::AST::Node>)


112
113
114
115
116
117
# File 'rubocops/shared/helper_functions.rb', line 112

def find_strings(node)
  return [] if node.nil?
  return [node] if node.str_type?

  node.each_descendant(:str).to_a
end

#format_component(component_node) ⇒ Symbol?

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает отображаемое имя компонента.

Параметры:

  • component_node (RuboCop::AST::Node)

Возвращает:

  • (Symbol, nil)


499
500
501
502
503
504
505
# File 'rubocops/shared/helper_functions.rb', line 499

def format_component(component_node)
  if component_node.is_a?(RuboCop::AST::SendNode) || component_node.is_a?(RuboCop::AST::BlockNode)
    component_node.method_name
  elsif component_node.def_type?
    method_name(component_node)
  end
end

#line_number(node) ⇒ Integer

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает номер строки узла.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Integer)


60
61
62
# File 'rubocops/shared/helper_functions.rb', line 60

def line_number(node)
  node.loc.line
end

#line_start_column(node) ⇒ Integer

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает начальную позицию строки узла в исходном коде.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Integer)


48
49
50
# File 'rubocops/shared/helper_functions.rb', line 48

def line_start_column(node)
  node.source_range.source_buffer.line_range(node.loc.line).begin_pos
end

#method_called?(node, method_name) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Проверяет, вызывается ли method_name среди непосредственных дочерних узлов заданного узла. Проверяет, является ли сам узел этим методом.

Параметры:

  • node (RuboCop::AST::Node)
  • method_name (Symbol)

Возвращает:

  • (Boolean)


392
393
394
395
396
397
398
399
400
401
402
403
404
# File 'rubocops/shared/helper_functions.rb', line 392

def method_called?(node, method_name)
  if node.is_a?(RuboCop::AST::SendNode) && node.method_name == method_name
    offending_node(node)
    return true
  end
  node.each_child_node(:send) do |call_node|
    next if call_node.method_name != method_name

    offending_node(call_node)
    return true
  end
  false
end

#method_called_ever?(node, method_name) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

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

Параметры:

  • node (RuboCop::AST::Node)
  • method_name (Symbol)

Возвращает:

  • (Boolean)


408
409
410
411
412
413
414
415
416
# File 'rubocops/shared/helper_functions.rb', line 408

def method_called_ever?(node, method_name)
  node.each_descendant(:send) do |call_node|
    next if call_node.method_name != method_name

    @offensive_node = call_node
    return true
  end
  false
end

#method_name(node) ⇒ Symbol?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Возвращает имя метода для узла def.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Symbol, nil)


493
494
495
# File 'rubocops/shared/helper_functions.rb', line 493

def method_name(node)
  node.children[0] if node.def_type?
end

#node_equals?(node, var) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Сравнивает узел с соответствующей переменной Ruby.

Параметры:

  • node (RuboCop::AST::Node, nil)
  • var (Object)

Возвращает:

  • (Boolean)


300
301
302
# File 'rubocops/shared/helper_functions.rb', line 300

def node_equals?(node, var)
  node == Parser::CurrentRuby.parse(var.inspect)
end

#offending_node(node = nil) ⇒ RuboCop::AST::Node?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

При необходимости задаёт или возвращает указанный узел как узел, вызвавший нарушение, в пользовательских cop.

Параметры:

  • node (RuboCop::AST::Node, nil) (по умолчанию: nil)

Возвращает:

  • (RuboCop::AST::Node, nil)


137
138
139
140
141
# File 'rubocops/shared/helper_functions.rb', line 137

def offending_node(node = nil)
  return @offensive_node if node.nil?

  @offensive_node = node
end

#parameters(method_node) ⇒ Array<RuboCop::AST::Node>

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Возвращает массив аргументов method_node.

Параметры:

  • method_node (RuboCop::AST::Node)

Возвращает:

  • (Array<RuboCop::AST::Node>)


452
453
454
455
456
457
458
# File 'rubocops/shared/helper_functions.rb', line 452

def parameters(method_node)
  if method_node.is_a?(RuboCop::AST::SendNode) || method_node.is_a?(RuboCop::AST::BlockNode)
    method_node.arguments
  else
    []
  end
end

#parameters_passed?(method_node, params) ⇒ Boolean

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Возвращает true, если указанные параметры присутствуют в вызове метода, и задаёт вызов метода как узел с нарушением. Параметры могут быть строкой, символом, массивом, хешем или регулярным выражением для сопоставления.

Параметры:

  • method_node (RuboCop::AST::Node)
  • params (Array<Object>)

Возвращает:

  • (Boolean)


464
465
466
467
468
469
470
471
472
473
474
475
476
# File 'rubocops/shared/helper_functions.rb', line 464

def parameters_passed?(method_node, params)
  method_params = parameters(method_node)
  @offensive_node = method_node
  params.all? do |given_param|
    method_params.any? do |method_param|
      if given_param.instance_of?(Regexp)
        regex_match_group(method_param, given_param)
      else
        node_equals?(method_param, given_param)
      end
    end
  end
end

#problem(msg, &block) ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Параметры:

  • msg (String)
  • block (T.proc.params(corrector: RuboCop::Cop::Corrector).void, nil)


106
107
108
# File 'rubocops/shared/helper_functions.rb', line 106

def problem(msg, &block)
  add_offense(@offensive_node, message: msg, &block)
end

#regex_match_group(node, pattern) ⇒ MatchData?

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Проверяет, соответствует ли узел шаблону регулярного выражения, и задаёт соответствующие переменные экземпляра для сообщения о совпадении.

Параметры:

  • node (RuboCop::AST::Node)
  • pattern (Regexp, String)

Возвращает:

  • (MatchData, nil)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'rubocops/shared/helper_functions.rb', line 20

def regex_match_group(node, pattern)
  string_repr = string_content(node).encode("UTF-8", invalid: :replace)
  match_object = string_repr.match(pattern)
  return unless match_object

  node_begin_pos = start_column(node)
  line_begin_pos = line_start_column(node)
  @column = T.let(
    if node_begin_pos == line_begin_pos
      node_begin_pos + match_object.begin(0) - line_begin_pos
    else
      node_begin_pos + match_object.begin(0) - line_begin_pos + 1
    end,
    T.nilable(Integer),
  )
  @length = T.let(match_object.to_s.length, T.nilable(Integer))
  @line_no = T.let(line_number(node), T.nilable(Integer))
  @source_buf = T.let(source_buffer(node), T.nilable(Parser::Source::Buffer))
  @offensive_node = T.let(node, T.nilable(RuboCop::AST::Node))
  @offensive_source_range = T.let(
    source_range(@source_buf, @line_no, @column, @length),
    T.nilable(Parser::Source::Range),
  )
  match_object
end

#source_buffer(node) ⇒ Parser::Source::Buffer

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Буфер исходного кода требуется передать в качестве аргумента для сообщения о нарушениях стиля.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Parser::Source::Buffer)


66
67
68
# File 'rubocops/shared/helper_functions.rb', line 66

def source_buffer(node)
  node.source_range.source_buffer
end

#start_column(node) ⇒ Integer

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Третьим сторонам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает начальную позицию узла в исходном коде.

Параметры:

  • node (RuboCop::AST::Node)

Возвращает:

  • (Integer)


54
55
56
# File 'rubocops/shared/helper_functions.rb', line 54

def start_column(node)
  node.source_range.begin_pos
end

#string_content(node, strip_dynamic: false) ⇒ String

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Третьим сторонам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает строковое представление, если узел имеет тип str (обычная строка), dstr (интерполируемая строка) или const.

Параметры:

  • node (RuboCop::AST::Node)
  • strip_dynamic (Boolean) (по умолчанию: false)

Возвращает:

  • (String)


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'rubocops/shared/helper_functions.rb', line 72

def string_content(node, strip_dynamic: false)
  case node.type
  when :str
    node.str_content
  when :dstr
    content = ""
    node.each_child_node(:str, :begin) do |child|
      content += if child.begin_type?
        strip_dynamic ? "" : child.source
      else
        child.str_content
      end
    end
    content
  when :send
    send_node = T.cast(node, RuboCop::AST::SendNode)
    if send_node.method?(:+) && (send_node.receiver.str_type? || send_node.receiver.dstr_type?)
      content = string_content(node.receiver)
      arg = send_node.arguments.first
      content += string_content(arg) if arg
      content
    else
      ""
    end
  when :const
    node.const_name
  when :sym
    node.children.first.to_s
  else
    ""
  end
end

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/RuboCop/Cop/HelperFunctions.html

Spec-Zone.ru

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