Skip to content

Commit 0e35e33

Browse files
authored
Merge pull request #7553 from smores56/new-hosted-header
Upgrade hosted header in the style module header
2 parents 1f26ce0 + 631e59c commit 0e35e33

22 files changed

+256
-185
lines changed

Diff for: crates/cli/tests/benchmarks/platform/Host.roc

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
hosted Host
2-
exposes [put_line!, put_int!, get_int!]
3-
imports []
1+
hosted [put_line!, put_int!, get_int!]
42

53
put_line! : Str => {}
64

Diff for: crates/cli/tests/test-projects/false-interpreter/platform/Host.roc

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
hosted Host
2-
exposes [open_file!, close_file!, get_file_line!, get_file_bytes!, put_line!, put_raw!, get_line!, get_char!]
3-
imports []
1+
hosted [open_file!, close_file!, get_file_line!, get_file_bytes!, put_line!, put_raw!, get_line!, get_char!]
42

53
open_file! : Str => U64
64

Diff for: crates/cli/tests/test-projects/test-platform-effects-zig/Effect.roc

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
hosted Effect
2-
exposes [put_line!, get_line!]
3-
imports []
1+
hosted [put_line!, get_line!]
42

53
put_line! : Str => {}
64

Diff for: crates/compiler/fmt/src/header.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,10 @@ pub fn fmt_module_header<'a>(buf: &mut Buf, header: &'a ModuleHeader<'a>) {
199199
pub fn fmt_hosted_header<'a>(buf: &mut Buf, header: &'a HostedHeader<'a>) {
200200
buf.indent(0);
201201
buf.push_str("hosted");
202-
let indent = INDENT;
203-
fmt_default_spaces(buf, header.before_name, indent);
204202

205-
buf.push_str(header.name.value.as_str());
203+
let indent = fmt_spaces_with_outdent(buf, header.before_exposes, 0);
206204

207-
header.exposes.keyword.format(buf, indent);
208-
fmt_exposes(buf, header.exposes.item, indent);
209-
header.imports.keyword.format(buf, indent);
210-
fmt_imports(buf, header.imports.item, indent);
205+
fmt_exposes(buf, header.exposes, indent);
211206
}
212207

213208
pub fn fmt_app_header<'a>(buf: &mut Buf, header: &'a AppHeader<'a>) {

Diff for: crates/compiler/load_internal/src/file.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -3952,17 +3952,25 @@ fn parse_header<'a>(
39523952
},
39533953
parse_state,
39543954
)) => {
3955+
let module_name = match opt_expected_module_name {
3956+
Some(pq_name) => arena.alloc_str(pq_name.as_inner().as_str()),
3957+
None => {
3958+
// [modules-revamp] [privacy-changes] TODO: Support test/check on nested modules
3959+
arena.alloc_str(filename.file_stem().unwrap().to_str().unwrap())
3960+
}
3961+
};
3962+
39553963
let info = HeaderInfo {
39563964
filename,
39573965
is_root_module,
39583966
opt_shorthand,
39593967
packages: &[],
39603968
header_type: HeaderType::Hosted {
3961-
name: header.name.value,
3962-
exposes: unspace(arena, header.exposes.item.items),
3969+
name: roc_parse::header::ModuleName::new(module_name),
3970+
exposes: unspace(arena, header.exposes.items),
39633971
},
39643972
module_comments: comments,
3965-
header_imports: Some(header.imports),
3973+
header_imports: header.old_imports,
39663974
};
39673975

39683976
let (module_id, _, header) =

Diff for: crates/compiler/parse/src/ast.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,14 @@ impl<'a> Header<'a> {
172172
}),
173173
Self::header_imports_to_defs(arena, header.old_imports),
174174
),
175-
Header::Package(_) | Header::Platform(_) | Header::Hosted(_) => (self, Defs::default()),
175+
Header::Hosted(header) => (
176+
Header::Hosted(HostedHeader {
177+
old_imports: None,
178+
..header
179+
}),
180+
Self::header_imports_to_defs(arena, header.old_imports),
181+
),
182+
Header::Package(_) | Header::Platform(_) => (self, Defs::default()),
176183
};
177184

178185
(header, defs)

Diff for: crates/compiler/parse/src/header.rs

+39-7
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ pub fn header<'a>() -> impl Parser<'a, SpacesBefore<'a, Header<'a>>, EHeader<'a>
103103
map(
104104
skip_first(
105105
keyword("hosted", EHeader::Start),
106-
increment_min_indent(hosted_header())
106+
increment_min_indent(one_of![hosted_header(), old_hosted_header()])
107107
),
108108
Header::Hosted
109109
),
@@ -184,15 +184,38 @@ fn imports_none_if_empty(value: ImportsKeywordItem<'_>) -> Option<ImportsKeyword
184184

185185
#[inline(always)]
186186
fn hosted_header<'a>() -> impl Parser<'a, HostedHeader<'a>, EHeader<'a>> {
187-
record!(HostedHeader {
188-
before_name: space0_e(EHeader::IndentStart),
189-
name: loc(module_name_help(EHeader::ModuleName)),
190-
exposes: specialize_err(EHeader::Exposes, exposes_values_kw()),
191-
imports: specialize_err(EHeader::Imports, imports()),
192-
})
187+
map(
188+
and(
189+
backtrackable(space0_e(EHeader::IndentStart)),
190+
specialize_err(EHeader::Exposes, exposes_list()),
191+
),
192+
|(before_exposes, exposes)| HostedHeader {
193+
before_exposes,
194+
exposes,
195+
old_imports: None,
196+
},
197+
)
193198
.trace("hosted_header")
194199
}
195200

201+
#[inline(always)]
202+
fn old_hosted_header<'a>() -> impl Parser<'a, HostedHeader<'a>, EHeader<'a>> {
203+
map(
204+
record!(OldHostedHeader {
205+
before_name: space0_e(EHeader::IndentStart),
206+
name: loc(module_name_help(EHeader::ModuleName)),
207+
exposes: specialize_err(EHeader::Exposes, exposes_values_kw()),
208+
imports: specialize_err(EHeader::Imports, imports()),
209+
}),
210+
|old_hosted| HostedHeader {
211+
before_exposes: old_hosted.before_name,
212+
exposes: old_hosted.exposes.item,
213+
old_imports: Some(old_hosted.imports),
214+
},
215+
)
216+
.trace("old_hosted_header")
217+
}
218+
196219
fn chomp_module_name(buffer: &[u8]) -> Result<&str, Progress> {
197220
use encode_unicode::CharExt;
198221

@@ -1196,6 +1219,15 @@ pub type ImportsCollection<'a> = Collection<'a, Loc<Spaced<'a, ImportsEntry<'a>>
11961219

11971220
#[derive(Clone, Debug, PartialEq)]
11981221
pub struct HostedHeader<'a> {
1222+
pub before_exposes: &'a [CommentOrNewline<'a>],
1223+
pub exposes: Collection<'a, Loc<Spaced<'a, ExposedName<'a>>>>,
1224+
1225+
// Keeping this so we can format old interface header into module headers
1226+
pub old_imports: Option<KeywordItem<'a, ImportsKeyword, ImportsCollection<'a>>>,
1227+
}
1228+
1229+
#[derive(Clone, Debug, PartialEq)]
1230+
pub struct OldHostedHeader<'a> {
11991231
pub before_name: &'a [CommentOrNewline<'a>],
12001232
pub name: Loc<ModuleName<'a>>,
12011233
pub exposes: KeywordItem<'a, ExposesKeyword, Collection<'a, Loc<Spaced<'a, ExposedName<'a>>>>>,

Diff for: crates/compiler/parse/src/normalize.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,9 @@ impl<'a> Normalize<'a> for Header<'a> {
172172
provides: header.provides.normalize(arena),
173173
}),
174174
Header::Hosted(header) => Header::Hosted(HostedHeader {
175-
before_name: &[],
176-
name: header.name.normalize(arena),
175+
before_exposes: &[],
177176
exposes: header.exposes.normalize(arena),
178-
imports: header.imports.normalize(arena),
177+
old_imports: None,
179178
}),
180179
}
181180
}

Diff for: crates/compiler/test_syntax/tests/snapshots/pass/empty_hosted_header.header.result-ast

+3-20
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,9 @@ SpacesBefore {
22
before: [],
33
item: Hosted(
44
HostedHeader {
5-
before_name: [],
6-
name: @7-10 ModuleName(
7-
"Foo",
8-
),
9-
exposes: KeywordItem {
10-
keyword: Spaces {
11-
before: [],
12-
item: ExposesKeyword,
13-
after: [],
14-
},
15-
item: [],
16-
},
17-
imports: KeywordItem {
18-
keyword: Spaces {
19-
before: [],
20-
item: ImportsKeyword,
21-
after: [],
22-
},
23-
item: [],
24-
},
5+
before_exposes: [],
6+
exposes: [],
7+
old_imports: None,
258
},
269
),
2710
}
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
hosted Foo exposes [] imports []
1+
hosted []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hosted []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
SpacesBefore {
2+
before: [],
3+
item: Hosted(
4+
HostedHeader {
5+
before_exposes: [],
6+
exposes: [],
7+
old_imports: Some(
8+
KeywordItem {
9+
keyword: Spaces {
10+
before: [],
11+
item: ImportsKeyword,
12+
after: [],
13+
},
14+
item: [],
15+
},
16+
),
17+
},
18+
),
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hosted Foo exposes [] imports []
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
1-
hosted Foo
2-
exposes
3-
[
4-
Stuff,
5-
Things,
6-
somethingElse,
7-
]
8-
imports
9-
[
10-
Blah,
11-
Baz.{ stuff, things },
12-
]
1+
hosted [
2+
Stuff,
3+
Things,
4+
somethingElse,
5+
]

Diff for: crates/compiler/test_syntax/tests/snapshots/pass/nonempty_hosted_header.header.result-ast

+21-91
Original file line numberDiff line numberDiff line change
@@ -2,99 +2,29 @@ SpacesBefore {
22
before: [],
33
item: Hosted(
44
HostedHeader {
5-
before_name: [],
6-
name: @7-10 ModuleName(
7-
"Foo",
8-
),
9-
exposes: KeywordItem {
10-
keyword: Spaces {
11-
before: [
12-
Newline,
13-
],
14-
item: ExposesKeyword,
15-
after: [
16-
Newline,
17-
],
18-
},
19-
item: Collection {
20-
items: [
21-
@45-50 SpaceBefore(
22-
ExposedName(
23-
"Stuff",
24-
),
25-
[
26-
Newline,
27-
],
5+
before_exposes: [],
6+
exposes: Collection {
7+
items: [
8+
@8-13 ExposedName(
9+
"Stuff",
10+
),
11+
@15-21 ExposedName(
12+
"Things",
13+
),
14+
@27-40 SpaceBefore(
15+
ExposedName(
16+
"somethingElse",
2817
),
29-
@64-70 SpaceBefore(
30-
ExposedName(
31-
"Things",
32-
),
33-
[
34-
Newline,
35-
],
36-
),
37-
@84-97 SpaceBefore(
38-
ExposedName(
39-
"somethingElse",
40-
),
41-
[
42-
Newline,
43-
],
44-
),
45-
],
46-
final_comments: [
47-
Newline,
48-
],
49-
},
50-
},
51-
imports: KeywordItem {
52-
keyword: Spaces {
53-
before: [
54-
Newline,
55-
],
56-
item: ImportsKeyword,
57-
after: [
58-
Newline,
59-
],
60-
},
61-
item: Collection {
62-
items: [
63-
@143-147 SpaceBefore(
64-
Module(
65-
ModuleName(
66-
"Blah",
67-
),
68-
[],
69-
),
70-
[
71-
Newline,
72-
],
73-
),
74-
@161-182 SpaceBefore(
75-
Module(
76-
ModuleName(
77-
"Baz",
78-
),
79-
[
80-
@167-172 ExposedName(
81-
"stuff",
82-
),
83-
@174-180 ExposedName(
84-
"things",
85-
),
86-
],
87-
),
88-
[
89-
Newline,
90-
],
91-
),
92-
],
93-
final_comments: [
94-
Newline,
95-
],
96-
},
18+
[
19+
Newline,
20+
],
21+
),
22+
],
23+
final_comments: [
24+
Newline,
25+
],
9726
},
27+
old_imports: None,
9828
},
9929
),
10030
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
hosted Foo
2-
exposes
3-
[
4-
Stuff,
5-
Things,
6-
somethingElse,
7-
]
8-
imports
9-
[
10-
Blah,
11-
Baz.{ stuff, things },
12-
]
1+
hosted [Stuff, Things,
2+
somethingElse,
3+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
hosted [
2+
Stuff,
3+
Things,
4+
somethingElse,
5+
]

0 commit comments

Comments
 (0)