Module: Steep::Services::CompletionProvider::TypeName::Prefix

Defined in:
lib/steep/services/completion_provider/type_name.rb

Constant Summary collapse

RawIdentPrefix =
_ = Struct.new(:ident) do
  # @implements RawIdentPrefix

  def const_name?
    ident.start_with?(/[A-Z]/)
  end

  def size
    ident.length
  end
end
NamespacedIdentPrefix =
_ = Struct.new(:namespace, :ident, :size) do
  # @implements NamespacedIdentPrefix

  def const_name?
    ident.start_with?(/[A-Z]/)
  end
end
NamespacePrefix =
_ = Struct.new(:namespace, :size)

Class Method Summary collapse

Class Method Details

.parse(buffer, line:, column:) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/steep/services/completion_provider/type_name.rb', line 28

def self.parse(buffer, line:, column:)
  pos = buffer.loc_to_pos([line, column])
  prefix = buffer.content[0...pos] or raise
  prefix.reverse!

  case prefix
  when /\A((::\w+[A-Z])+(::)?)/
    namespace = $1 or raise
    NamespacePrefix.new(::RBS::Namespace.parse(namespace.reverse), namespace.size)
  when /\A::/
    NamespacePrefix.new(::RBS::Namespace.root, 2)
  when /\A(\w*[A-Za-z_])((::\w+[A-Z])+(::)?)/
    namespace = $1 or raise
    identifier = $2 or raise
    NamespacedIdentPrefix.new(::RBS::Namespace.parse(identifier.reverse), namespace.reverse, namespace.size + identifier.size)
  when /\A(\w*[A-Za-z_])::/
    namespace = $1 or raise
    NamespacedIdentPrefix.new(::RBS::Namespace.root, namespace.reverse, namespace.size + 2)
  when /\A(\w*[A-Za-z_])/
    identifier = $1 or raise
    RawIdentPrefix.new(identifier.reverse)
  end
end