Skip to content

Commit 86cf827

Browse files
committed
Various cleanup for initializers and typechecks
1 parent bf16ade commit 86cf827

File tree

20 files changed

+772
-93
lines changed

20 files changed

+772
-93
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ out.svg
6565
/sig/prism/node.rbs
6666
/sig/prism/visitor.rbs
6767
/sig/prism/_private/dot_visitor.rbs
68+
/rbi/prism/dsl.rb
6869
/rbi/prism/node.rbi
6970
/rbi/prism/visitor.rbi
7071

gemfiles/typecheck/Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
source "https://rubygems.org"
44

5-
gemspec path: "../.."
5+
# gemspec path: "../.."
66

77
gem "minitest"
88
gem "parser"

gemfiles/typecheck/Gemfile.lock

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
PATH
2-
remote: ../..
3-
specs:
4-
prism (0.30.0)
5-
61
GEM
72
remote: https://rubygems.org/
83
specs:
@@ -42,6 +37,7 @@ GEM
4237
ast (~> 2.4.1)
4338
racc
4439
power_assert (2.0.3)
40+
prism (0.30.0)
4541
racc (1.8.0)
4642
rainbow (3.1.1)
4743
rake (13.2.1)
@@ -118,7 +114,6 @@ PLATFORMS
118114
DEPENDENCIES
119115
minitest
120116
parser
121-
prism!
122117
rake
123118
rake-compiler
124119
rbs

lib/prism/parse_result.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,7 @@ class ParseResult < Result
588588
autoload :Newlines, "prism/parse_result/newlines"
589589

590590
private_constant :Comments
591+
private_constant :Errors
591592
private_constant :Newlines
592593

593594
# The syntax tree that was parsed from the source code.

lib/prism/parse_result/errors.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@ def format
3232
io = StringIO.new
3333
source_lines.each.with_index(1) do |line, line_number|
3434
io.puts(line)
35-
35+
3636
(error_lines.delete(line_number) || []).each do |error|
3737
location = error.location
38-
38+
3939
case line_number
4040
when location.start_line
4141
io.print(" " * location.start_column + "^")
42-
42+
4343
if location.start_line == location.end_line
4444
if location.start_column != location.end_column
4545
io.print("~" * (location.end_column - location.start_column - 1))
4646
end
47-
47+
4848
io.puts(" " + error.message)
4949
else
5050
io.puts("~" * (line.bytesize - location.start_column))
@@ -56,7 +56,7 @@ def format
5656
end
5757
end
5858
end
59-
59+
6060
io.puts
6161
io.string
6262
end

prism.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ Gem::Specification.new do |spec|
104104
"prism.gemspec",
105105
"rbi/prism.rbi",
106106
"rbi/prism/compiler.rbi",
107+
"rbi/prism/dsl.rbi",
107108
"rbi/prism/inspect_visitor.rbi",
108109
"rbi/prism/node_ext.rbi",
109110
"rbi/prism/node.rbi",

rbi/prism/dsl.rbi

Lines changed: 524 additions & 0 deletions
Large diffs are not rendered by default.

rust/ruby-prism/build.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ enum NodeFieldType {
4040
#[serde(rename = "uint32")]
4141
UInt32,
4242

43-
#[serde(rename = "flags")]
44-
Flags,
45-
4643
#[serde(rename = "integer")]
4744
Integer,
4845

@@ -85,6 +82,8 @@ struct Flags {
8582
struct Node {
8683
name: String,
8784

85+
flags: Option<String>,
86+
8887
#[serde(default)]
8988
fields: Vec<NodeField>,
9089

@@ -235,6 +234,28 @@ fn write_node(file: &mut File, flags: &[Flags], node: &Node) -> Result<(), Box<d
235234
writeln!(file, " let pointer: *mut pm_location_t = unsafe {{ &mut (*self.pointer).base.location }};")?;
236235
writeln!(file, " Location::new(self.parser, unsafe {{ &(*pointer) }})")?;
237236
writeln!(file, " }}")?;
237+
writeln!(file)?;
238+
writeln!(file, " /// Returns the flags of this node.")?;
239+
writeln!(file, " #[must_use]")?;
240+
writeln!(file, " pub fn flags(&self) -> pm_node_flags_t {{")?;
241+
writeln!(file, " unsafe {{ (*self.pointer).base.flags }}")?;
242+
writeln!(file, " }}")?;
243+
244+
if let Some(kind) = &node.flags {
245+
let our_flags = flags.iter().filter(|f| &f.name == kind).collect::<Vec<_>>();
246+
assert!(our_flags.len() == 1);
247+
248+
for flag in our_flags {
249+
for value in &flag.values {
250+
writeln!(file)?;
251+
writeln!(file, " /// {}", value.comment)?;
252+
writeln!(file, " #[must_use]")?;
253+
writeln!(file, " pub fn {}(&self) -> bool {{", accessor_func_name(&value.name))?;
254+
writeln!(file, " (self.flags() & {}) != 0", enum_const_name(&flag.name, &value.name))?;
255+
writeln!(file, " }}")?;
256+
}
257+
}
258+
}
238259

239260
for field in &node.fields {
240261
writeln!(file)?;
@@ -335,27 +356,6 @@ fn write_node(file: &mut File, flags: &[Flags], node: &Node) -> Result<(), Box<d
335356
writeln!(file, " unsafe {{ (*self.pointer).{} }}", field.name)?;
336357
writeln!(file, " }}")?;
337358
},
338-
NodeFieldType::Flags => {
339-
let Some(NodeFieldKind::Concrete(kind)) = &field.kind else {
340-
panic!("Flag fields must have a concrete kind");
341-
};
342-
let our_flags = flags.iter().filter(|f| &f.name == kind).collect::<Vec<_>>();
343-
assert!(our_flags.len() == 1);
344-
345-
writeln!(file, " fn {}(&self) -> pm_node_flags_t {{", field.name)?;
346-
writeln!(file, " unsafe {{ (*self.pointer).base.flags }}")?;
347-
writeln!(file, " }}")?;
348-
349-
for flag in our_flags {
350-
for value in &flag.values {
351-
writeln!(file, " /// {}", value.comment)?;
352-
writeln!(file, " #[must_use]")?;
353-
writeln!(file, " pub fn {}(&self) -> bool {{", accessor_func_name(&value.name))?;
354-
writeln!(file, " (self.{}() & {}) != 0", field.name, enum_const_name(&flag.name, &value.name))?;
355-
writeln!(file, " }}")?;
356-
}
357-
}
358-
},
359359
NodeFieldType::Integer => {
360360
writeln!(file, " pub fn {}(&self) -> Integer<'pr> {{", field.name)?;
361361
writeln!(file, " Integer::new(unsafe {{ &(*self.pointer).{} }})", field.name)?;

sig/prism/_private/parse_result.rbs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ module Prism
4949
def nearest_targets: (Prism::node, comment) -> (untyped | ::Array[untyped])
5050
end
5151

52+
class Errors
53+
attr_reader parse_result: ParseResult
54+
55+
def initialize: (ParseResult parse_result) -> void
56+
def format: () -> String
57+
end
58+
5259
class Newlines < Visitor
5360
@newline_marked: Array[bool]
5461

sig/prism/parse_result.rbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ module Prism
1717
def character_column: (Integer byte_offset) -> Integer
1818
def code_units_offset: (Integer byte_offset, Encoding encoding) -> Integer
1919
def code_units_column: (Integer byte_offset, Encoding encoding) -> Integer
20+
21+
def self.for: (String source) -> Source
2022
end
2123

2224
class ASCIISource < Source

0 commit comments

Comments
 (0)