Skip to content

Commit b9755bd

Browse files
committed
cargo fmt and unadded file
1 parent 1198f32 commit b9755bd

File tree

4 files changed

+193
-22
lines changed

4 files changed

+193
-22
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ orbs:
2323
jobs:
2424
unit-tests:
2525
docker:
26-
- image: cimg/rust:1.65.0
26+
- image: cimg/rust:1.72.0
2727
steps:
2828
- checkout
2929
- run:

src/parse/helpers/slot.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use super::*;
2+
3+
fn single_slot_access() -> impl Parser<Token, (), Error = Simple<Token>> {
4+
let pos = one_of([Token::Slot, Token::Offset]).then(num());
5+
pos.delimited_by(just(Token::RoundOpen), just(Token::RoundClose))
6+
.ignored()
7+
}
8+
9+
fn double_slot_access() -> impl Parser<Token, (), Error = Simple<Token>> {
10+
let pos = one_of([Token::Slot, Token::Offset]).then(num());
11+
pos.separated_by(just(Token::Comma))
12+
.exactly(2)
13+
.delimited_by(just(Token::RoundOpen), just(Token::RoundClose))
14+
.ignored()
15+
}
16+
17+
fn array_or_map_access() -> impl Parser<Token, (), Error = Simple<Token>> {
18+
let pos = one_of([Token::Key, Token::Index]).then(named_param());
19+
pos.delimited_by(just(Token::SquareOpen), just(Token::SquareClose))
20+
.ignored()
21+
}
22+
23+
fn named_slot_pattern() -> impl Parser<Token, (), Error = Simple<Token>> {
24+
choice((ident().ignored(), one_of(USABLE_KEYWORDS).ignored()))
25+
}
26+
27+
fn static_slot_pattern() -> impl Parser<Token, (), Error = Simple<Token>> {
28+
choice((
29+
named_slot_pattern(),
30+
single_slot_access(),
31+
double_slot_access(),
32+
))
33+
.separated_by(dot())
34+
.at_least(1)
35+
.ignored()
36+
}
37+
38+
pub fn slot_pattern() -> impl Parser<Token, Span, Error = Simple<Token>> {
39+
let ending = choice((
40+
array_or_map_access(),
41+
dot().then(named_slot_pattern()).ignored(),
42+
dot().then(single_slot_access()).ignored(),
43+
));
44+
45+
let slot_pattern_nested = recursive(|slot_pattern_nested| {
46+
static_slot_pattern()
47+
.then(ending.repeated().at_least(1))
48+
.then(slot_pattern_nested.or_not())
49+
.ignored()
50+
});
51+
52+
slot_pattern_nested
53+
.or(static_slot_pattern())
54+
.map_with_span(|_, span| span)
55+
}
56+
57+
fn dot() -> impl Parser<Token, (), Error = Simple<Token>> {
58+
just(Token::Dot).ignored()
59+
}
60+
61+
const USABLE_KEYWORDS: [Token; 14] = [
62+
Token::Exists,
63+
Token::ForAll,
64+
Token::Using,
65+
Token::As,
66+
Token::Return,
67+
Token::Import,
68+
Token::Use,
69+
Token::Builtin,
70+
Token::Override,
71+
Token::Sig,
72+
Token::Description,
73+
Token::Invariant,
74+
Token::Preserved,
75+
Token::Old,
76+
];

src/parse/tests.rs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,9 @@ fn parsing_params() {
170170
"};
171171

172172
let parsed = parse_exactly_one(src).unwrap();
173-
let Ast::Function { name, params, .. } = parsed.ast else { panic!() };
173+
let Ast::Function { name, params, .. } = parsed.ast else {
174+
panic!()
175+
};
174176
assert_eq!(name, "goodMath");
175177

176178
let expected_params = [
@@ -203,7 +205,9 @@ fn comments_in_element() {
203205
"};
204206

205207
let parsed = parse_exactly_one(src).unwrap();
206-
let Ast::Rule { name, params, .. } = parsed.ast else { panic!() };
208+
let Ast::Rule { name, params, .. } = parsed.ast else {
209+
panic!()
210+
};
207211

208212
assert_eq!(name, "ofLaw");
209213

@@ -392,7 +396,9 @@ fn multiline_slashed_freeform_concatenates_to_a_single_comment() {
392396
let element = &parsed[0];
393397

394398
let expected = "## Verification of ERC1155Burnable\n\n`ERC1155Burnable` extends the `ERC1155` functionality by wrapping the internal\nmethods `_burn` and `_burnBatch` in the public methods `burn` and `burnBatch`,\nadding a requirement that the caller of either method be the account holding\nthe tokens or approved to act on that account's behalf.\n\n### Assumptions and Simplifications\n\n- No changes made using the harness\n\n### Properties";
395-
let Ast::FreeFormComment { text } = &element.ast else { panic!("should have been parsed as documentation"); };
399+
let Ast::FreeFormComment { text } = &element.ast else {
400+
panic!("should have been parsed as documentation");
401+
};
396402
assert_eq!(text, expected);
397403
}
398404

@@ -418,7 +424,9 @@ fn crlf() {
418424

419425
let parsed = Builder::new(&src_with_crlf_encoding).build().unwrap();
420426

421-
let Ast::FreeFormComment { text } = &parsed[0].ast else { panic!() };
427+
let Ast::FreeFormComment { text } = &parsed[0].ast else {
428+
panic!()
429+
};
422430

423431
assert_eq!(
424432
text,
@@ -460,7 +468,9 @@ fn freeform_stars_without_text() {
460468

461469
let parsed = Builder::new(src).build().unwrap();
462470

463-
let Ast::FreeFormComment { text } = &parsed[0].ast else { panic!() };
471+
let Ast::FreeFormComment { text } = &parsed[0].ast else {
472+
panic!()
473+
};
464474
assert!(text.is_empty());
465475
}
466476

@@ -553,7 +563,9 @@ fn blocks_where_brackets_are_not_separated_by_whitespace() {
553563
"};
554564

555565
let element = parse_exactly_one(src).unwrap();
556-
let Ast::Rule { filters, .. } = &element.ast else { panic!() };
566+
let Ast::Rule { filters, .. } = &element.ast else {
567+
panic!()
568+
};
557569

558570
assert_eq!(filters.as_ref().unwrap(), "{f -> !f.isView}");
559571
}
@@ -576,10 +588,14 @@ fn variable_char_lengths() {
576588
let parsed = Builder::new(src).build().unwrap();
577589
assert_eq!(parsed.len(), 3);
578590

579-
let Ast::FreeFormComment { text } = &parsed[0].ast else { panic!(); };
591+
let Ast::FreeFormComment { text } = &parsed[0].ast else {
592+
panic!();
593+
};
580594
assert_eq!(text, "🔥🔥🔥💯 frfr");
581595

582-
let Ast::FreeFormComment { text } = &parsed[2].ast else { panic!(); };
596+
let Ast::FreeFormComment { text } = &parsed[2].ast else {
597+
panic!();
598+
};
583599
assert_eq!(text, "Text");
584600

585601
assert_eq!(parsed[0].raw(), "/***\n🔥🔥🔥💯 frfr\n*/");

src/parse/tests/cvl2.rs

Lines changed: 92 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ fn invariant_requires_semicolon() {
3131

3232
let with_semicolon = "invariant validityOfTokens() true;";
3333
let parsed = parse_exactly_one(with_semicolon).unwrap();
34-
let Ast::Invariant { name, invariant, .. } = parsed.ast else { panic!() };
34+
let Ast::Invariant {
35+
name, invariant, ..
36+
} = parsed.ast
37+
else {
38+
panic!()
39+
};
3540
assert_eq!(name, "validityOfTokens");
3641
assert_eq!(invariant, "true");
3742
}
@@ -43,7 +48,9 @@ fn rule_keyword_is_mandatory() {
4348

4449
let with_kw = "rule onlyOwnerCanDecrease() { }";
4550
let parsed = parse_exactly_one(with_kw).unwrap();
46-
let Ast::Rule { name, .. } = parsed.ast else { panic!() };
51+
let Ast::Rule { name, .. } = parsed.ast else {
52+
panic!()
53+
};
4754
assert_eq!(name, "onlyOwnerCanDecrease")
4855
}
4956

@@ -52,7 +59,9 @@ fn rule_keyword_is_mandatory() {
5259
fn underscores_and_dots_in_function_names() {
5360
let func = "function _.hello.world_(int fizz, int buzz) {\nreturn\n}";
5461
let parsed = parse_exactly_one(func).unwrap();
55-
let Ast::Function { name, .. } = parsed.ast else { panic!() };
62+
let Ast::Function { name, .. } = parsed.ast else {
63+
panic!()
64+
};
5665

5766
assert_eq!(name, "_.hello.world_");
5867
}
@@ -157,7 +166,14 @@ fn hook_sload1() {
157166
}
158167
"};
159168
let parsed = parse_exactly_one(src).unwrap();
160-
let Ast::HookSload { loaded, slot_pattern, block } = parsed.ast else { panic!() };
169+
let Ast::HookSload {
170+
loaded,
171+
slot_pattern,
172+
block,
173+
} = parsed.ast
174+
else {
175+
panic!()
176+
};
161177

162178
assert_eq!(loaded.name, "value");
163179
assert_eq!(loaded.ty, "uint256");
@@ -169,7 +185,14 @@ fn hook_sload1() {
169185
fn hook_sload2() {
170186
let src = "hook Sload uint256 imp (slot 50801780122331352337026042894847907698553222651959119521779622085092237899971/*0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3*/) STORAGE {}";
171187
let parsed = parse_exactly_one(src).unwrap();
172-
let Ast::HookSload { loaded, slot_pattern, .. } = parsed.ast else { panic!() };
188+
let Ast::HookSload {
189+
loaded,
190+
slot_pattern,
191+
..
192+
} = parsed.ast
193+
else {
194+
panic!()
195+
};
173196

174197
assert_eq!(loaded.name, "imp");
175198
assert_eq!(loaded.ty, "uint256");
@@ -184,7 +207,14 @@ fn hook_sload3() {
184207
}
185208
"};
186209
let parsed = parse_exactly_one(src).unwrap();
187-
let Ast::HookSload { loaded, slot_pattern, .. } = parsed.ast else { panic!() };
210+
let Ast::HookSload {
211+
loaded,
212+
slot_pattern,
213+
..
214+
} = parsed.ast
215+
else {
216+
panic!()
217+
};
188218

189219
assert_eq!(loaded.name, "value");
190220
assert_eq!(loaded.ty, "uint");
@@ -199,7 +229,14 @@ fn hook_sload4() {
199229
}
200230
"};
201231
let parsed = parse_exactly_one(src).unwrap();
202-
let Ast::HookSload { loaded, slot_pattern, block } = parsed.ast else { panic!() };
232+
let Ast::HookSload {
233+
loaded,
234+
slot_pattern,
235+
block,
236+
} = parsed.ast
237+
else {
238+
panic!()
239+
};
203240

204241
assert_eq!(loaded.name, "owner");
205242
assert_eq!(loaded.ty, "uint");
@@ -216,7 +253,15 @@ fn hook_sstore1() {
216253
hook Sstore _list .(offset 0)[INDEX uint256 index] bytes32 newValue (bytes32 oldValue) STORAGE { }
217254
"};
218255
let parsed = parse_exactly_one(src).unwrap();
219-
let Ast::HookSstore { stored, old, slot_pattern, .. } = parsed.ast else { panic!() };
256+
let Ast::HookSstore {
257+
stored,
258+
old,
259+
slot_pattern,
260+
..
261+
} = parsed.ast
262+
else {
263+
panic!()
264+
};
220265

221266
assert_eq!(stored.name, "newValue");
222267
let old = old.unwrap();
@@ -233,7 +278,15 @@ fn hook_sstore2() {
233278
}
234279
"};
235280
let parsed = parse_exactly_one(src).unwrap();
236-
let Ast::HookSstore { stored, old, slot_pattern, block } = parsed.ast else { panic!() };
281+
let Ast::HookSstore {
282+
stored,
283+
old,
284+
slot_pattern,
285+
block,
286+
} = parsed.ast
287+
else {
288+
panic!()
289+
};
237290

238291
assert_eq!(stored.name, "value");
239292
assert!(old.is_none());
@@ -250,7 +303,15 @@ fn hook_sstore3() {
250303
}
251304
"};
252305
let parsed = parse_exactly_one(src).unwrap();
253-
let Ast::HookSstore { stored, old, slot_pattern, block } = parsed.ast else { panic!() };
306+
let Ast::HookSstore {
307+
stored,
308+
old,
309+
slot_pattern,
310+
block,
311+
} = parsed.ast
312+
else {
313+
panic!()
314+
};
254315

255316
assert_eq!(stored.name, "v");
256317
assert!(old.is_none());
@@ -268,7 +329,9 @@ fn hook_create() {
268329
hook Create (address createdAddress) { }
269330
"};
270331
let parsed = parse_exactly_one(src).unwrap();
271-
let Ast::HookCreate { created, block } = parsed.ast else { panic!() };
332+
let Ast::HookCreate { created, block } = parsed.ast else {
333+
panic!()
334+
};
272335

273336
assert_eq!(created.name, "createdAddress");
274337
assert_eq!(created.ty, "address");
@@ -283,7 +346,15 @@ fn hook_opcode1() {
283346
};
284347
"};
285348
let parsed = parse_exactly_one(src).unwrap();
286-
let Ast::HookOpcode { opcode, params, returns, block } = parsed.ast else { panic!() };
349+
let Ast::HookOpcode {
350+
opcode,
351+
params,
352+
returns,
353+
block,
354+
} = parsed.ast
355+
else {
356+
panic!()
357+
};
287358

288359
assert_eq!(opcode, "EXTCODESIZE");
289360
let param = params.into_iter().exactly_one().unwrap();
@@ -303,7 +374,15 @@ fn hook_opcode2() {
303374
}
304375
"};
305376
let parsed = parse_exactly_one(src).unwrap();
306-
let Ast::HookOpcode { opcode, params, returns, block } = parsed.ast else { panic!() };
377+
let Ast::HookOpcode {
378+
opcode,
379+
params,
380+
returns,
381+
block,
382+
} = parsed.ast
383+
else {
384+
panic!()
385+
};
307386

308387
assert_eq!(opcode, "GASPRICE");
309388
assert!(params.is_empty());

0 commit comments

Comments
 (0)