-
Notifications
You must be signed in to change notification settings - Fork 216
/
Copy pathnamespace.rbs
146 lines (122 loc) · 3.48 KB
/
namespace.rbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
module RBS
# Namespace instance represents a _prefix of module names_.
#
# ```
# vvvvvvvvvvvvvv TypeName
# RBS::Namespace
# ^^^^^ Namespace
#
# vvvvvvvvvv TypeName
# RBS::Types
# ^^^^^ Namespace
#
# vvvvvvvvvvvvvvvvv TypeName
# RBS::Types::Union
# ^^^^^^^^^^^^ Namespace
# ```
#
# Note that `Namespace` is an RBS specific concept and there is no corresponding concept in Ruby.
#
# There are _absolute_ and _relative_ namespaces.
#
# ```
# Namespace(::RBS::) # Absolute namespace
# Namespace( RBS::) # Relative namespace
# ```
#
# It also defines two special namespaces.
#
# ```
# :: # _Root_ namespace
# # _Empty_ namespace
# ```
#
class Namespace
attr_reader path: Array[Symbol]
def initialize: (path: Array[Symbol], absolute: boolish) -> void
@absolute: bool
@parent: Namespace?
self.@root: Namespace?
self.@empty: Namespace?
# Returns new _empty_ namespace.
def self.empty: () -> Namespace
# Returns new _root_ namespace.
def self.root: () -> Namespace
# Concat two namespaces.
#
# ```rb
# Namespace("Foo::") + Namespace("Bar::") # => Foo::Bar::
# Namespace("::Foo::") + Namespace("Bar::") # => ::Foo::Bar::
# ```
#
# If `other` is an absolute namespace, it returns `other`.
#
# ```rb
# Namespace("Foo::") + Namespace("::Bar::") # => ::Bar::
# ```
def +: (Namespace other) -> Namespace
# Add one path component to self.
#
# ```rb
# Namespace("Foo::").append(:Bar) # => Namespace("Foo::Bar::")
# ```
def append: (Symbol component) -> Namespace
# Returns parent namespace.
# Raises error there is no parent namespace.
#
# ```rb
# Namespace("::A").parent # => Namespace("::")
# Namespace("::").parent # raises error
# Namespace("A::B").parent # => Namespace("A")
# ```
def parent: () -> Namespace
# Returns true if self is absolute namespace.
def absolute?: () -> bool
# Returns true if self is relative namespace.
def relative?: () -> bool
# Returns absolute namespace.
#
# ```rb
# Namespace("A").absolute! # => Namespace("::A")
# Namespace("::A").absolute! # => Namespace("::A")
# ```
def absolute!: () -> Namespace
# Returns _relative_ namespace.
#
def relative!: () -> Namespace
def empty?: () -> bool
# Equality is defined by its structure.
#
def ==: (untyped other) -> bool
alias eql? ==
# Hash is defined based on its structure.
#
def hash: () -> Integer
# Returns a pair of parent namespace and a symbol of last component.
#
# ```rb
# Namespace("::A::B::C").split # => [Namespace("::A::B::"), :C]
# ```
def split: () -> [Namespace, Symbol]?
def to_s: () -> String
# Construct a type name which points to the same name type.
#
def to_type_name: () -> TypeName
def self.parse: (String string) -> Namespace
# Iterate over Namespace for each element in ascending order.
#
# ```rb
# Namespace.parse("::A::B::C").ascend {|ns| p ns }
# # => ::A::B::C
# # => ::A::B
# # => ::A
# # => ::(root)
# ```
def ascend: () { (Namespace) -> void } -> void
| () -> Enumerator[Namespace, void]
end
end
module Kernel
# Deprecated: Use `RBS::Namespace.parse` instead
%a{steep:deprecated} def Namespace: (String) -> RBS::Namespace
end