rbs 3.9.5 → 3.10.0.pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/workflows/c-check.yml +54 -0
  5. data/.github/workflows/comments.yml +3 -3
  6. data/.github/workflows/ruby.yml +34 -19
  7. data/.github/workflows/typecheck.yml +1 -1
  8. data/.github/workflows/windows.yml +1 -1
  9. data/.gitignore +4 -0
  10. data/README.md +38 -1
  11. data/Rakefile +152 -23
  12. data/config.yml +190 -62
  13. data/core/array.rbs +44 -43
  14. data/core/dir.rbs +2 -2
  15. data/core/encoding.rbs +3 -2
  16. data/core/enumerable.rbs +89 -2
  17. data/core/errno.rbs +8 -0
  18. data/core/errors.rbs +28 -1
  19. data/core/exception.rbs +2 -2
  20. data/core/fiber.rbs +3 -3
  21. data/core/file.rbs +26 -11
  22. data/core/float.rbs +1 -1
  23. data/core/gc.rbs +422 -281
  24. data/core/hash.rbs +1024 -727
  25. data/core/io/wait.rbs +11 -33
  26. data/core/io.rbs +6 -4
  27. data/core/kernel.rbs +49 -43
  28. data/core/marshal.rbs +1 -1
  29. data/core/match_data.rbs +1 -1
  30. data/core/math.rbs +42 -3
  31. data/core/method.rbs +14 -6
  32. data/core/module.rbs +71 -11
  33. data/core/nil_class.rbs +3 -3
  34. data/core/numeric.rbs +8 -8
  35. data/core/object.rbs +3 -3
  36. data/core/object_space.rbs +13 -0
  37. data/{stdlib/pathname/0 → core}/pathname.rbs +253 -352
  38. data/core/proc.rbs +15 -8
  39. data/core/process.rbs +2 -2
  40. data/core/ractor.rbs +278 -437
  41. data/core/range.rbs +6 -7
  42. data/core/rbs/unnamed/argf.rbs +1 -1
  43. data/core/rbs/unnamed/env_class.rbs +1 -1
  44. data/core/rbs/unnamed/random.rbs +4 -2
  45. data/core/regexp.rbs +22 -17
  46. data/core/ruby_vm.rbs +6 -4
  47. data/core/rubygems/errors.rbs +3 -70
  48. data/core/rubygems/rubygems.rbs +11 -79
  49. data/core/set.rbs +439 -332
  50. data/core/string.rbs +2897 -1117
  51. data/core/struct.rbs +1 -1
  52. data/core/symbol.rbs +4 -4
  53. data/core/thread.rbs +83 -20
  54. data/core/time.rbs +35 -9
  55. data/core/unbound_method.rbs +14 -6
  56. data/docs/aliases.md +79 -0
  57. data/docs/collection.md +2 -2
  58. data/docs/gem.md +0 -1
  59. data/docs/sigs.md +3 -3
  60. data/ext/rbs_extension/ast_translation.c +1016 -0
  61. data/ext/rbs_extension/ast_translation.h +37 -0
  62. data/ext/rbs_extension/class_constants.c +157 -0
  63. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +7 -1
  64. data/ext/rbs_extension/compat.h +10 -0
  65. data/ext/rbs_extension/extconf.rb +25 -1
  66. data/ext/rbs_extension/legacy_location.c +317 -0
  67. data/ext/rbs_extension/legacy_location.h +45 -0
  68. data/ext/rbs_extension/main.c +365 -14
  69. data/ext/rbs_extension/rbs_extension.h +6 -21
  70. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  71. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  72. data/include/rbs/ast.h +687 -0
  73. data/include/rbs/defines.h +86 -0
  74. data/include/rbs/lexer.h +199 -0
  75. data/include/rbs/location.h +59 -0
  76. data/include/rbs/parser.h +135 -0
  77. data/include/rbs/string.h +49 -0
  78. data/include/rbs/util/rbs_allocator.h +59 -0
  79. data/include/rbs/util/rbs_assert.h +20 -0
  80. data/include/rbs/util/rbs_buffer.h +83 -0
  81. data/include/rbs/util/rbs_constant_pool.h +6 -67
  82. data/include/rbs/util/rbs_encoding.h +282 -0
  83. data/include/rbs/util/rbs_unescape.h +23 -0
  84. data/include/rbs.h +1 -2
  85. data/lib/rbs/annotate/formatter.rb +3 -13
  86. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  87. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  88. data/lib/rbs/cli/validate.rb +2 -2
  89. data/lib/rbs/cli.rb +1 -1
  90. data/lib/rbs/collection/config/lockfile_generator.rb +1 -0
  91. data/lib/rbs/definition_builder/ancestor_builder.rb +5 -5
  92. data/lib/rbs/environment.rb +64 -59
  93. data/lib/rbs/environment_loader.rb +1 -1
  94. data/lib/rbs/errors.rb +1 -1
  95. data/lib/rbs/parser_aux.rb +5 -0
  96. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  97. data/lib/rbs/resolver/type_name_resolver.rb +124 -38
  98. data/lib/rbs/test/type_check.rb +13 -0
  99. data/lib/rbs/types.rb +3 -1
  100. data/lib/rbs/version.rb +1 -1
  101. data/lib/rbs.rb +1 -1
  102. data/lib/rdoc/discover.rb +1 -1
  103. data/lib/rdoc_plugin/parser.rb +3 -3
  104. data/sig/annotate/formatter.rbs +2 -2
  105. data/sig/annotate/rdoc_annotater.rbs +1 -1
  106. data/sig/environment.rbs +57 -6
  107. data/sig/manifest.yaml +0 -1
  108. data/sig/parser.rbs +20 -0
  109. data/sig/resolver/type_name_resolver.rbs +38 -7
  110. data/sig/types.rbs +4 -1
  111. data/src/ast.c +1256 -0
  112. data/src/lexer.c +2956 -0
  113. data/src/lexer.re +147 -0
  114. data/src/lexstate.c +205 -0
  115. data/src/location.c +71 -0
  116. data/src/parser.c +3495 -0
  117. data/src/string.c +90 -0
  118. data/src/util/rbs_allocator.c +152 -0
  119. data/src/util/rbs_assert.c +21 -0
  120. data/src/util/rbs_buffer.c +54 -0
  121. data/src/util/rbs_constant_pool.c +16 -86
  122. data/src/util/rbs_encoding.c +21308 -0
  123. data/src/util/rbs_unescape.c +131 -0
  124. data/stdlib/cgi/0/core.rbs +2 -396
  125. data/stdlib/cgi/0/manifest.yaml +1 -0
  126. data/stdlib/cgi-escape/0/escape.rbs +153 -0
  127. data/stdlib/coverage/0/coverage.rbs +3 -1
  128. data/stdlib/delegate/0/delegator.rbs +10 -7
  129. data/stdlib/erb/0/erb.rbs +737 -347
  130. data/stdlib/fileutils/0/fileutils.rbs +18 -13
  131. data/stdlib/forwardable/0/forwardable.rbs +3 -0
  132. data/stdlib/json/0/json.rbs +67 -48
  133. data/stdlib/net-http/0/net-http.rbs +3 -0
  134. data/stdlib/objspace/0/objspace.rbs +8 -3
  135. data/stdlib/open-uri/0/open-uri.rbs +40 -0
  136. data/stdlib/openssl/0/openssl.rbs +182 -149
  137. data/stdlib/optparse/0/optparse.rbs +3 -3
  138. data/stdlib/rdoc/0/code_object.rbs +2 -2
  139. data/stdlib/rdoc/0/comment.rbs +2 -0
  140. data/stdlib/rdoc/0/options.rbs +76 -0
  141. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  142. data/stdlib/rdoc/0/store.rbs +1 -1
  143. data/stdlib/resolv/0/resolv.rbs +25 -68
  144. data/stdlib/ripper/0/ripper.rbs +5 -2
  145. data/stdlib/singleton/0/singleton.rbs +3 -0
  146. data/stdlib/socket/0/socket.rbs +13 -1
  147. data/stdlib/socket/0/tcp_socket.rbs +10 -2
  148. data/stdlib/stringio/0/stringio.rbs +412 -80
  149. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  150. data/stdlib/tempfile/0/tempfile.rbs +1 -1
  151. data/stdlib/tsort/0/cyclic.rbs +3 -0
  152. data/stdlib/uri/0/common.rbs +11 -2
  153. data/stdlib/uri/0/file.rbs +1 -1
  154. data/stdlib/uri/0/generic.rbs +16 -15
  155. data/stdlib/uri/0/rfc2396_parser.rbs +6 -7
  156. data/stdlib/zlib/0/zstream.rbs +1 -0
  157. metadata +41 -18
  158. data/ext/rbs_extension/lexer.c +0 -2728
  159. data/ext/rbs_extension/lexer.h +0 -179
  160. data/ext/rbs_extension/lexer.re +0 -147
  161. data/ext/rbs_extension/lexstate.c +0 -175
  162. data/ext/rbs_extension/location.c +0 -325
  163. data/ext/rbs_extension/location.h +0 -85
  164. data/ext/rbs_extension/parser.c +0 -2982
  165. data/ext/rbs_extension/parser.h +0 -18
  166. data/ext/rbs_extension/parserstate.c +0 -411
  167. data/ext/rbs_extension/parserstate.h +0 -163
  168. data/ext/rbs_extension/unescape.c +0 -32
  169. data/include/rbs/ruby_objs.h +0 -72
  170. data/src/constants.c +0 -153
  171. data/src/ruby_objs.c +0 -799
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d490d8913cfa35f6554fce9b6d23e441b2b5dc41da82ff94551d86cc4a95bfd
4
- data.tar.gz: a352b325e582ccc60629f968dd29fba39ff2e0ffcbe0b2208711433dbfc4e4a5
3
+ metadata.gz: 7b19eff56496de03c74195186b75b24f8f43140ebba2198c5e32ab5fe539d04b
4
+ data.tar.gz: 63e7ebea19be4ce1caa1a9feed6147204f1f82c1349d6b0be13672de70354c96
5
5
  SHA512:
6
- metadata.gz: e12fd282d0c28d5eaa981694a51b32b021033f2acae8ca63e84872f6f4737ccf2846df04f5d057225f8a06b260486bf6fabd6558ccdd502c84e3a622efb235e5
7
- data.tar.gz: c043af2b405b3942450a18d92140bafddbca5449b8ab36c02c3fad5d25556d7408f71e2b304ae67e5610856a0ddd9e13ea79d3034087c0c3af3f9ca2dfa80b01
6
+ metadata.gz: 0d77ffeb469a4dab695d55341a7b2def82c5501c5ddd0d91264cd4d8fbe265f53c46a0d0f18d5fbfad8155cebaa361b0b35472cfc1f00ac14c5076c7b99c2e2c
7
+ data.tar.gz: 9f53bd43380fec3f6df8f94e7b8e890f746d5b3df1bc61d4d443132871363176340cad548ca10fbc54ac1c5070e260ca3d576e679304b31b937ce697f921884e
data/.clang-format ADDED
@@ -0,0 +1,74 @@
1
+ ---
2
+ Language: Cpp
3
+
4
+ # Indentation
5
+ UseTab: Never
6
+ IndentWidth: 4
7
+ BreakBeforeBraces: Attach
8
+ IndentCaseLabels: false
9
+ NamespaceIndentation: None
10
+ ContinuationIndentWidth: 4
11
+ IndentPPDirectives: None
12
+ IndentWrappedFunctionNames: false
13
+ AccessModifierOffset: -2
14
+
15
+ # Alignment
16
+ AlignAfterOpenBracket: BlockIndent
17
+ AlignConsecutiveAssignments: false
18
+ AlignConsecutiveDeclarations: false
19
+ AlignConsecutiveMacros: false
20
+ AlignEscapedNewlines: Left
21
+ AlignOperands: false
22
+ AlignTrailingComments: true
23
+ DerivePointerAlignment: false
24
+ PointerAlignment: Right
25
+
26
+ # Function calls formatting
27
+ BinPackArguments: false
28
+ BinPackParameters: false
29
+ AllowAllArgumentsOnNextLine: false
30
+ ExperimentalAutoDetectBinPacking: false
31
+ PenaltyBreakBeforeFirstCallParameter: 1
32
+ AlwaysBreakAfterDefinitionReturnType: None
33
+
34
+ # Wrapping and Breaking
35
+ ColumnLimit: 0
36
+ AllowShortBlocksOnASingleLine: Never
37
+ AllowShortCaseLabelsOnASingleLine: false
38
+ AllowShortFunctionsOnASingleLine: All
39
+ AllowShortIfStatementsOnASingleLine: Always
40
+ AllowShortLoopsOnASingleLine: false
41
+ AlwaysBreakAfterReturnType: None
42
+ AlwaysBreakBeforeMultilineStrings: false
43
+ AlwaysBreakTemplateDeclarations: No
44
+ BreakBeforeBinaryOperators: None
45
+ BreakBeforeTernaryOperators: false
46
+ BreakConstructorInitializers: BeforeColon
47
+ BreakInheritanceList: BeforeColon
48
+ BreakStringLiterals: false
49
+ CompactNamespaces: false
50
+ ConstructorInitializerAllOnOneLineOrOnePerLine: false
51
+ Cpp11BracedListStyle: false
52
+ ReflowComments: false
53
+ SortIncludes: Never
54
+
55
+ # Spaces
56
+ SpaceAfterCStyleCast: true
57
+ SpaceAfterLogicalNot: false
58
+ SpaceAfterTemplateKeyword: true
59
+ SpaceBeforeAssignmentOperators: true
60
+ SpaceBeforeCpp11BracedList: true
61
+ SpaceBeforeCtorInitializerColon: true
62
+ SpaceBeforeInheritanceColon: true
63
+ SpaceBeforeParens: ControlStatements
64
+ SpaceBeforeRangeBasedForLoopColon: true
65
+ SpaceBeforeSquareBrackets: false
66
+ SpaceInEmptyBlock: false
67
+ SpaceInEmptyParentheses: false
68
+ SpacesBeforeTrailingComments: 1
69
+ SpacesInAngles: false
70
+ SpacesInCStyleCastParentheses: false
71
+ SpacesInConditionalStatement: false
72
+ SpacesInContainerLiterals: true
73
+ SpacesInParentheses: false
74
+ SpacesInSquareBrackets: false
data/.clangd ADDED
@@ -0,0 +1,2 @@
1
+ CompileFlags:
2
+ CompilationDatabase: ext/rbs_extension
@@ -0,0 +1,54 @@
1
+ name: C Code Generation and Formatting Check
2
+
3
+ on:
4
+ push:
5
+ pull_request: {}
6
+ merge_group: {}
7
+
8
+ jobs:
9
+ format-check:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: "4.0.0-preview2"
16
+ bundler-cache: none
17
+ - name: Set working directory as safe
18
+ run: git config --global --add safe.directory $(pwd)
19
+ - name: Install dependencies
20
+ run: |
21
+ sudo apt-get update
22
+ sudo apt-get install -y libdb-dev curl autoconf automake m4 libtool
23
+ - name: Install clang-format from LLVM
24
+ run: |
25
+ wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
26
+ sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-20 main"
27
+ sudo apt-get update
28
+ sudo apt-get install -y clang-format-20
29
+ sudo ln -sf /usr/bin/clang-format-20 /usr/local/bin/clang-format
30
+ clang-format --version
31
+ - name: Count processors
32
+ run: nproc
33
+ - name: Install Re2c
34
+ run: |
35
+ cd /tmp
36
+ curl -L https://github.com/skvadrik/re2c/archive/refs/tags/4.3.tar.gz > re2c-4.3.tar.gz
37
+ tar xf re2c-4.3.tar.gz
38
+ cd re2c-4.3
39
+ autoreconf -i -W all
40
+ ./configure
41
+ make -j"$(nproc)" -l"$(nproc)"
42
+ sudo make install
43
+ - name: Update rubygems & bundler
44
+ run: |
45
+ ruby -v
46
+ gem update --system
47
+ - name: bin/setup
48
+ run: |
49
+ bin/setup
50
+ - name: Check C code generation and formatting
51
+ run: |
52
+ clang-format --version
53
+ bundle exec rake lexer templates compile confirm_lexer confirm_templates
54
+ bundle exec rake format:c_check
@@ -10,13 +10,13 @@ on:
10
10
  jobs:
11
11
  comments:
12
12
  runs-on: "ubuntu-latest"
13
- # env:
14
- # RUBY_COMMIT: 1b0c46daed9186b82ab4fef1a4ab225afe582ee6
13
+ env:
14
+ RUBY_COMMIT: v4.0.0-preview2
15
15
  steps:
16
16
  - uses: actions/checkout@v4
17
17
  - uses: ruby/setup-ruby@v1
18
18
  with:
19
- ruby-version: "3.4.1"
19
+ ruby-version: "4.0.0-preview2"
20
20
  bundler: none
21
21
  - name: Install dependencies
22
22
  run: |
@@ -13,26 +13,24 @@ jobs:
13
13
  strategy:
14
14
  fail-fast: false
15
15
  matrix:
16
- ruby: ['3.1', '3.2', '3.3', '3.4', head]
16
+ ruby: ['3.2', '3.3', '3.4', '4.0.0-preview2', head]
17
17
  rubyopt: [""]
18
18
  job:
19
19
  - test
20
20
  include:
21
21
  - ruby: head
22
22
  job: stdlib_test rubocop
23
- - ruby: "3.4"
23
+ - ruby: "4.0.0-preview2"
24
24
  job: stdlib_test
25
- - ruby: "3.4"
25
+ - ruby: "4.0.0-preview2"
26
26
  job: test
27
27
  rubyopt: "--enable-frozen-string-literal"
28
- - ruby: "3.4"
28
+ - ruby: "4.0.0-preview2"
29
29
  job: stdlib_test
30
30
  rubyopt: "--enable-frozen-string-literal"
31
- - ruby: "3.4"
32
- job: lexer templates compile confirm_lexer confirm_templates
33
- - ruby: "3.4"
31
+ - ruby: "4.0.0-preview2"
34
32
  job: rubocop validate test_doc build test_generate_stdlib raap
35
- - ruby: "3.4"
33
+ - ruby: "4.0.0-preview2"
36
34
  job: typecheck_test
37
35
  env:
38
36
  RANDOMIZE_STDLIB_TEST_ORDER: "true"
@@ -48,17 +46,6 @@ jobs:
48
46
  run: |
49
47
  sudo apt-get update
50
48
  sudo apt-get install -y libdb-dev curl autoconf automake m4 libtool python3
51
- - name: Install Re2c
52
- if: ${{ contains(matrix.job, 'lexer') }}
53
- run: |
54
- cd /tmp
55
- curl -L https://github.com/skvadrik/re2c/archive/refs/tags/3.1.tar.gz > re2c-3.1.tar.gz
56
- tar xf re2c-3.1.tar.gz
57
- cd re2c-3.1
58
- autoreconf -i -W all
59
- ./configure
60
- make
61
- sudo make install
62
49
  - name: Update rubygems & bundler
63
50
  run: |
64
51
  ruby -v
@@ -102,3 +89,31 @@ jobs:
102
89
  - run: bundle exec rake test:valgrind
103
90
  env:
104
91
  RUBY_FREE_AT_EXIT: 1
92
+ C99_compile:
93
+ runs-on: macos-latest
94
+ strategy:
95
+ fail-fast: false
96
+ matrix:
97
+ ruby: ['4.0.0-preview2', head]
98
+ steps:
99
+ - uses: actions/checkout@v4
100
+ - name: Install dependencies
101
+ run: |
102
+ brew install ruby-build
103
+ - uses: ruby/setup-ruby@v1
104
+ with:
105
+ ruby-version: ${{ matrix.ruby }}
106
+ bundler: none
107
+ - name: Set working directory as safe
108
+ run: git config --global --add safe.directory $(pwd)
109
+ - name: Update rubygems & bundler
110
+ run: |
111
+ ruby -v
112
+ gem update --system
113
+ - name: clang version
114
+ run: clang --version
115
+ - name: bin/setup
116
+ run: |
117
+ bin/setup
118
+ - run: bundle exec rake clean compile_c99
119
+
@@ -16,7 +16,7 @@ jobs:
16
16
  - uses: actions/checkout@v4
17
17
  - uses: ruby/setup-ruby@v1
18
18
  with:
19
- ruby-version: "3.3"
19
+ ruby-version: "3.4"
20
20
  bundler: none
21
21
  - name: Set working directory as safe
22
22
  run: git config --global --add safe.directory $(pwd)
@@ -13,7 +13,7 @@ jobs:
13
13
  strategy:
14
14
  fail-fast: false
15
15
  matrix:
16
- ruby: ['3.2', '3.3', ucrt, mswin]
16
+ ruby: ['3.4', ucrt, mswin]
17
17
  steps:
18
18
  - uses: actions/checkout@v4
19
19
  - name: load ruby
data/.gitignore CHANGED
@@ -21,3 +21,7 @@ lib/**/*.dll
21
21
  doc/
22
22
 
23
23
  **/*.gem
24
+
25
+ # For clangd's editor integration
26
+ ext/rbs_extension/compile_commands.json
27
+ ext/rbs_extension/.cache
data/README.md CHANGED
@@ -141,7 +141,7 @@ require "rbs"
141
141
  loader = RBS::EnvironmentLoader.new()
142
142
 
143
143
  # loader.add(path: Pathname("sig")) # Load .rbs files from `sig` directory
144
- # loader.add(library: "pathname") # Load pathname library
144
+ # loader.add(library: "logger") # Load logger library
145
145
 
146
146
  environment = RBS::Environment.from_loader(loader).resolve_type_names
147
147
 
@@ -198,6 +198,43 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
198
198
 
199
199
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
200
200
 
201
+ ### C Code Formatting
202
+
203
+ This project uses `clang-format` to enforce consistent formatting of C code with a `.clang-format` configuration in the root directory.
204
+
205
+ #### Setup
206
+
207
+ First, install clang-format:
208
+
209
+ ```bash
210
+ # macOS
211
+ brew install clang-format
212
+
213
+ # Ubuntu/Debian
214
+ sudo apt-get install clang-format
215
+
216
+ # Windows
217
+ choco install llvm
218
+ ```
219
+
220
+ #### Usage
221
+
222
+ Format all C source files:
223
+
224
+ ```bash
225
+ rake format:c
226
+ ```
227
+
228
+ Check formatting without making changes:
229
+
230
+ ```bash
231
+ rake format:c_check
232
+ ```
233
+
234
+ #### Editor Integration
235
+
236
+ For VS Code users, install the "clangd" extension which will automatically use the project's `.clang-format` file.
237
+
201
238
  ## Contributing
202
239
 
203
240
  Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/rbs.
data/Rakefile CHANGED
@@ -11,12 +11,26 @@ bin = File.join(__dir__, "bin")
11
11
 
12
12
  Rake::ExtensionTask.new("rbs_extension")
13
13
 
14
+ compile_task = Rake::Task[:compile]
15
+
16
+ task :setup_extconf_compile_commands_json do
17
+ ENV["COMPILE_COMMANDS_JSON"] = "1"
18
+ end
19
+
20
+ compile_task.prerequisites.unshift(:setup_extconf_compile_commands_json)
21
+
14
22
  test_config = lambda do |t|
15
23
  t.libs << "test"
16
24
  t.libs << "lib"
17
25
  t.test_files = FileList["test/**/*_test.rb"].reject do |path|
18
26
  path =~ %r{test/stdlib/}
19
27
  end
28
+ if defined?(RubyMemcheck)
29
+ if t.is_a?(RubyMemcheck::TestTask)
30
+ t.verbose = true
31
+ t.options = '-v'
32
+ end
33
+ end
20
34
  end
21
35
 
22
36
  Rake::TestTask.new(test: :compile, &test_config)
@@ -36,12 +50,13 @@ end
36
50
  multitask :default => [:test, :stdlib_test, :typecheck_test, :rubocop, :validate, :test_doc]
37
51
 
38
52
  task :lexer do
39
- sh "re2c -W --no-generation-date -o ext/rbs_extension/lexer.c ext/rbs_extension/lexer.re"
53
+ sh "re2c -W --no-generation-date -o src/lexer.c src/lexer.re"
54
+ sh "clang-format -i -style=file src/lexer.c"
40
55
  end
41
56
 
42
57
  task :confirm_lexer => :lexer do
43
58
  puts "Testing if lexer.c is updated with respect to lexer.re"
44
- sh "git diff --exit-code ext/rbs_extension/lexer.c"
59
+ sh "git diff --exit-code src/lexer.c"
45
60
  end
46
61
 
47
62
  task :confirm_templates => :templates do
@@ -49,6 +64,84 @@ task :confirm_templates => :templates do
49
64
  sh "git diff --exit-code -- include src"
50
65
  end
51
66
 
67
+ # Task to format C code using clang-format
68
+ namespace :format do
69
+ dirs = ["src", "ext", "include"]
70
+
71
+ # Find all C source and header files
72
+ files = `find #{dirs.join(" ")} -type f \\( -name "*.c" -o -name "*.h" \\)`.split("\n")
73
+
74
+ desc "Format C source files using clang-format"
75
+ task :c do
76
+ puts "Formatting C files..."
77
+
78
+ # Check if clang-format is installed
79
+ unless system("which clang-format > /dev/null 2>&1")
80
+ abort "Error: clang-format not found. Please install clang-format first."
81
+ end
82
+
83
+ if files.empty?
84
+ puts "No C files found to format"
85
+ next
86
+ end
87
+
88
+ puts "Found #{files.length} files to format (excluding generated files)"
89
+
90
+ exit_status = 0
91
+ files.each do |file|
92
+ puts "Formatting #{file}"
93
+ unless system("clang-format -i -style=file #{file}")
94
+ puts "❌ Error formatting #{file}"
95
+ exit_status = 1
96
+ end
97
+ end
98
+
99
+ exit exit_status unless exit_status == 0
100
+ puts "✅ All files formatted successfully"
101
+ end
102
+
103
+ desc "Check if C source files are properly formatted"
104
+ task :c_check do
105
+ puts "Checking C file formatting..."
106
+
107
+ # Check if clang-format is installed
108
+ unless system("which clang-format > /dev/null 2>&1")
109
+ abort "Error: clang-format not found. Please install clang-format first."
110
+ end
111
+
112
+ if files.empty?
113
+ puts "No C files found to check"
114
+ next
115
+ end
116
+
117
+ puts "Found #{files.length} files to check (excluding generated files)"
118
+
119
+ needs_format = false
120
+ files.each do |file|
121
+ formatted = `clang-format -style=file #{file}`
122
+ original = File.read(file)
123
+
124
+ if formatted != original
125
+ puts "❌ #{file} needs formatting"
126
+ puts "Diff:"
127
+ # Save formatted version to temp file and run diff
128
+ temp_file = "#{file}.formatted"
129
+ File.write(temp_file, formatted)
130
+ system("diff -u #{file} #{temp_file}")
131
+ File.unlink(temp_file)
132
+ needs_format = true
133
+ end
134
+ end
135
+
136
+ if needs_format
137
+ warn "Some files need formatting. Run 'rake format:c' to format them."
138
+ exit 1
139
+ else
140
+ puts "✅ All files are properly formatted"
141
+ end
142
+ end
143
+ end
144
+
52
145
  rule ".c" => ".re" do |t|
53
146
  puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake lexer` ⚠️⚠️⚠️"
54
147
  end
@@ -70,17 +163,22 @@ task :confirm_annotation do
70
163
  end
71
164
 
72
165
  task :templates do
73
- sh "#{ruby} templates/template.rb include/rbs/constants.h"
74
- sh "#{ruby} templates/template.rb include/rbs/ruby_objs.h"
75
- sh "#{ruby} templates/template.rb src/constants.c"
76
- sh "#{ruby} templates/template.rb src/ruby_objs.c"
166
+ sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.h"
167
+ sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.c"
168
+
169
+ sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.h"
170
+ sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.c"
171
+
172
+ sh "#{ruby} templates/template.rb include/rbs/ast.h"
173
+ sh "#{ruby} templates/template.rb src/ast.c"
174
+
175
+ # Format the generated files
176
+ Rake::Task["format:c"].invoke
77
177
  end
78
178
 
79
- task :compile => "ext/rbs_extension/lexer.c"
80
- task :compile => "include/rbs/constants.h"
81
- task :compile => "include/rbs/ruby_objs.h"
82
- task :compile => "src/constants.c"
83
- task :compile => "src/ruby_objs.c"
179
+ task :compile => "ext/rbs_extension/class_constants.h"
180
+ task :compile => "ext/rbs_extension/class_constants.c"
181
+ task :compile => "src/lexer.c"
84
182
 
85
183
  task :test_doc do
86
184
  files = Dir.chdir(File.expand_path('..', __FILE__)) do
@@ -114,7 +212,14 @@ task :validate => :compile do
114
212
  end
115
213
 
116
214
  libs.each do |lib|
117
- sh "#{ruby} #{rbs} -r #{lib} validate --exit-error-on-syntax-error"
215
+ args = ["-r", lib]
216
+
217
+ if lib == "rbs"
218
+ args << "-r"
219
+ args << "prism"
220
+ end
221
+
222
+ sh "#{ruby} #{rbs} #{args.join(' ')} validate --exit-error-on-syntax-error"
118
223
  end
119
224
  end
120
225
 
@@ -126,7 +231,7 @@ end
126
231
 
127
232
  task :stdlib_test => :compile do
128
233
  test_files = FileList["test/stdlib/**/*_test.rb"].reject do |path|
129
- path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI_test}
234
+ path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI-escape_test}
130
235
  end
131
236
 
132
237
  if ENV["RANDOMIZE_STDLIB_TEST_ORDER"] == "true"
@@ -135,19 +240,21 @@ task :stdlib_test => :compile do
135
240
 
136
241
  sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test_files.join(' ')}"
137
242
  # TODO: Ractor tests need to be run in a separate process
138
- sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI_test.rb"
243
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI-escape_test.rb"
139
244
  sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Ractor_test.rb"
140
245
  sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Encoding_test.rb"
141
246
  end
142
247
 
143
248
  task :typecheck_test => :compile do
144
- FileList["test/typecheck/*"].each do |test|
145
- Dir.chdir(test) do
146
- expectations = File.join(test, "steep_expectations.yml")
147
- if File.exist?(expectations)
148
- sh "steep check --with_expectations"
149
- else
150
- sh "steep check"
249
+ Bundler.with_unbundled_env do
250
+ FileList["test/typecheck/*"].each do |test|
251
+ Dir.chdir(test) do
252
+ expectations = File.join(test, "steep_expectations.yml")
253
+ if File.exist?(expectations)
254
+ sh "#{__dir__}/bin/steep check --with_expectations"
255
+ else
256
+ sh "#{__dir__}/bin/steep check"
257
+ end
151
258
  end
152
259
  end
153
260
  end
@@ -228,7 +335,7 @@ namespace :generate do
228
335
  class <%= target %>SingletonTest < Test::Unit::TestCase
229
336
  include TestHelper
230
337
 
231
- # library "pathname", "securerandom" # Declare library signatures to load
338
+ # library "logger", "securerandom" # Declare library signatures to load
232
339
  testing "singleton(::<%= target %>)"
233
340
 
234
341
  <%- class_methods.each do |method_name, definition| -%>
@@ -247,7 +354,7 @@ namespace :generate do
247
354
  class <%= target %>Test < Test::Unit::TestCase
248
355
  include TestHelper
249
356
 
250
- # library "pathname", "securerandom" # Declare library signatures to load
357
+ # library "logger", "securerandom" # Declare library signatures to load
251
358
  testing "::<%= target %>"
252
359
 
253
360
  <%- instance_methods.each do |method_name, definition| -%>
@@ -430,3 +537,25 @@ task :changelog do
430
537
  puts " (🤑 There is no *unreleased* pull request associated to the milestone.)"
431
538
  end
432
539
  end
540
+
541
+ desc "Compile extension without C23 extensions"
542
+ task :compile_c99 do
543
+ ENV["TEST_NO_C23"] = "true"
544
+ Rake::Task[:"compile"].invoke
545
+ ensure
546
+ ENV.delete("TEST_NO_C23")
547
+ end
548
+
549
+ task :prepare_bench do
550
+ ENV.delete("DEBUG")
551
+ Rake::Task[:"clobber"].invoke
552
+ Rake::Task[:"templates"].invoke
553
+ Rake::Task[:"compile"].invoke
554
+ end
555
+
556
+ task :prepare_profiling do
557
+ ENV["DEBUG"] = "1"
558
+ Rake::Task[:"clobber"].invoke
559
+ Rake::Task[:"templates"].invoke
560
+ Rake::Task[:"compile"].invoke
561
+ end