Introduce record! combinator

... and refactor header parser to fully use combinators, in support of future combinator-based superpowers
This commit is contained in:
Joshua Warner 2022-11-26 09:48:34 -08:00
parent ec6db293f5
commit 2b91af02df
No known key found for this signature in database
GPG key ID: 89AD497003F93FDD
26 changed files with 1709 additions and 1486 deletions

View file

@ -1,24 +1,48 @@
App {
header: AppHeader {
name: @4-14 PlainLine(
"test-app",
),
packages: [],
imports: [],
provides: [],
provides_types: None,
to: @53-57 ExistingPackage(
"blah",
),
before_header: [],
after_app_keyword: [],
before_packages: [],
after_packages: [],
before_imports: [],
after_imports: [],
before_provides: [],
after_provides: [],
before_to: [],
after_to: [],
},
Module {
comments: [],
header: App(
AppHeader {
before_name: [],
name: @4-14 PlainLine(
"test-app",
),
packages: Some(
KeywordItem {
keyword: Spaces {
before: [],
item: PackagesKeyword,
after: [],
},
item: [],
},
),
imports: Some(
KeywordItem {
keyword: Spaces {
before: [],
item: ImportsKeyword,
after: [],
},
item: [],
},
),
provides: ProvidesTo {
provides_keyword: Spaces {
before: [],
item: ProvidesKeyword,
after: [],
},
entries: [],
types: None,
to_keyword: Spaces {
before: [],
item: ToKeyword,
after: [],
},
to: @53-57 ExistingPackage(
"blah",
),
},
},
),
}

View file

@ -1,23 +1,45 @@
Hosted {
header: HostedHeader {
name: @7-10 ModuleName(
"Foo",
),
exposes: [],
imports: [],
generates: UppercaseIdent(
"Bar",
),
generates_with: [],
before_header: [],
after_hosted_keyword: [],
before_exposes: [],
after_exposes: [],
before_imports: [],
after_imports: [],
before_generates: [],
after_generates: [],
before_with: [],
after_with: [],
},
Module {
comments: [],
header: Hosted(
HostedHeader {
before_name: [],
name: @7-10 ModuleName(
"Foo",
),
exposes: KeywordItem {
keyword: Spaces {
before: [],
item: ExposesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [],
item: ImportsKeyword,
after: [],
},
item: [],
},
generates: KeywordItem {
keyword: Spaces {
before: [],
item: GeneratesKeyword,
after: [],
},
item: UppercaseIdent(
"Bar",
),
},
generates_with: KeywordItem {
keyword: Spaces {
before: [],
item: WithKeyword,
after: [],
},
item: [],
},
},
),
}

View file

@ -1,15 +1,27 @@
Interface {
header: InterfaceHeader {
name: @10-13 ModuleName(
"Foo",
),
exposes: [],
imports: [],
before_header: [],
after_interface_keyword: [],
before_exposes: [],
after_exposes: [],
before_imports: [],
after_imports: [],
},
Module {
comments: [],
header: Interface(
InterfaceHeader {
before_name: [],
name: @10-13 ModuleName(
"Foo",
),
exposes: KeywordItem {
keyword: Spaces {
before: [],
item: ExposesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [],
item: ImportsKeyword,
after: [],
},
item: [],
},
},
),
}

View file

@ -1,34 +1,61 @@
Platform {
header: PlatformHeader {
name: @9-25 PackageName(
"rtfeldman/blah",
),
requires: PlatformRequires {
rigids: [],
signature: @40-49 TypedIdent {
ident: @40-44 "main",
spaces_before_colon: [],
ann: @47-49 Record {
fields: [],
ext: None,
Module {
comments: [],
header: Platform(
PlatformHeader {
before_name: [],
name: @9-25 PackageName(
"rtfeldman/blah",
),
requires: KeywordItem {
keyword: Spaces {
before: [],
item: RequiresKeyword,
after: [],
},
item: PlatformRequires {
rigids: [],
signature: @40-49 TypedIdent {
ident: @40-44 "main",
spaces_before_colon: [],
ann: @47-49 Record {
fields: [],
ext: None,
},
},
},
},
exposes: KeywordItem {
keyword: Spaces {
before: [],
item: ExposesKeyword,
after: [],
},
item: [],
},
packages: KeywordItem {
keyword: Spaces {
before: [],
item: PackagesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [],
item: ImportsKeyword,
after: [],
},
item: [],
},
provides: KeywordItem {
keyword: Spaces {
before: [],
item: ProvidesKeyword,
after: [],
},
item: [],
},
},
exposes: [],
packages: [],
imports: [],
provides: [],
before_header: [],
after_platform_keyword: [],
before_requires: [],
after_requires: [],
before_exposes: [],
after_exposes: [],
before_packages: [],
after_packages: [],
before_imports: [],
after_imports: [],
before_provides: [],
after_provides: [],
},
),
}

View file

@ -1,50 +1,74 @@
App {
header: AppHeader {
name: @4-15 PlainLine(
"quicksort",
),
packages: [
@31-47 PackageEntry {
shorthand: "pf",
spaces_after_shorthand: [],
package_name: @35-47 PackageName(
"./platform",
),
},
],
imports: [
@64-75 Package(
"foo",
ModuleName(
"Bar.Baz",
),
[],
),
],
provides: [
@93-102 ExposedName(
Module {
comments: [],
header: App(
AppHeader {
before_name: [],
name: @4-15 PlainLine(
"quicksort",
),
],
provides_types: None,
to: @108-110 ExistingPackage(
"pf",
),
before_header: [],
after_app_keyword: [],
before_packages: [
Newline,
],
after_packages: [],
before_imports: [
Newline,
],
after_imports: [],
before_provides: [
Newline,
],
after_provides: [],
before_to: [],
after_to: [],
},
packages: Some(
KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: PackagesKeyword,
after: [],
},
item: [
@31-47 PackageEntry {
shorthand: "pf",
spaces_after_shorthand: [],
package_name: @35-47 PackageName(
"./platform",
),
},
],
},
),
imports: Some(
KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [],
},
item: [
@64-75 Package(
"foo",
ModuleName(
"Bar.Baz",
),
[],
),
],
},
),
provides: ProvidesTo {
provides_keyword: Spaces {
before: [
Newline,
],
item: ProvidesKeyword,
after: [],
},
entries: [
@93-102 ExposedName(
"quicksort",
),
],
types: None,
to_keyword: Spaces {
before: [],
item: ToKeyword,
after: [],
},
to: @108-110 ExistingPackage(
"pf",
),
},
},
),
}

View file

@ -1,75 +1,99 @@
App {
header: AppHeader {
name: @4-15 PlainLine(
"quicksort",
),
packages: [
@31-47 PackageEntry {
shorthand: "pf",
spaces_after_shorthand: [],
package_name: @35-47 PackageName(
"./platform",
),
},
],
imports: [
@65-141 Package(
"foo",
ModuleName(
"Bar",
),
Collection {
items: [
@83-86 SpaceBefore(
ExposedName(
"Baz",
Module {
comments: [],
header: App(
AppHeader {
before_name: [],
name: @4-15 PlainLine(
"quicksort",
),
packages: Some(
KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: PackagesKeyword,
after: [],
},
item: [
@31-47 PackageEntry {
shorthand: "pf",
spaces_after_shorthand: [],
package_name: @35-47 PackageName(
"./platform",
),
[
Newline,
],
),
@96-104 SpaceBefore(
ExposedName(
"FortyTwo",
),
[
Newline,
],
),
},
],
final_comments: [
Newline,
LineComment(
" I'm a happy comment",
},
),
imports: Some(
KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [],
},
item: [
@65-141 Package(
"foo",
ModuleName(
"Bar",
),
Collection {
items: [
@83-86 SpaceBefore(
ExposedName(
"Baz",
),
[
Newline,
],
),
@96-104 SpaceBefore(
ExposedName(
"FortyTwo",
),
[
Newline,
],
),
],
final_comments: [
Newline,
LineComment(
" I'm a happy comment",
),
],
},
),
],
},
),
],
provides: [
@159-168 ExposedName(
"quicksort",
),
],
provides_types: None,
to: @175-177 ExistingPackage(
"pf",
),
before_header: [],
after_app_keyword: [],
before_packages: [
Newline,
],
after_packages: [],
before_imports: [
Newline,
],
after_imports: [],
before_provides: [
Newline,
],
after_provides: [],
before_to: [],
after_to: [],
},
provides: ProvidesTo {
provides_keyword: Spaces {
before: [
Newline,
],
item: ProvidesKeyword,
after: [],
},
entries: [
@159-168 ExposedName(
"quicksort",
),
],
types: None,
to_keyword: Spaces {
before: [],
item: ToKeyword,
after: [],
},
to: @175-177 ExistingPackage(
"pf",
),
},
},
),
}

View file

@ -1,71 +1,98 @@
Platform {
header: PlatformHeader {
name: @9-14 PackageName(
"cli",
),
requires: PlatformRequires {
rigids: [],
signature: @32-49 TypedIdent {
ident: @32-36 "main",
spaces_before_colon: [],
ann: @39-49 Apply(
"",
"Task",
[
@44-46 Record {
fields: [],
ext: None,
},
@47-49 TagUnion {
ext: None,
tags: [],
},
Module {
comments: [],
header: Platform(
PlatformHeader {
before_name: [],
name: @9-14 PackageName(
"cli",
),
requires: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
),
item: RequiresKeyword,
after: [],
},
item: PlatformRequires {
rigids: [],
signature: @32-49 TypedIdent {
ident: @32-36 "main",
spaces_before_colon: [],
ann: @39-49 Apply(
"",
"Task",
[
@44-46 Record {
fields: [],
ext: None,
},
@47-49 TagUnion {
ext: None,
tags: [],
},
],
),
},
},
},
},
exposes: [],
packages: [],
imports: [
@110-123 Module(
ModuleName(
"Task",
),
[
@117-121 ExposedName(
"Task",
exposes: KeywordItem {
keyword: Spaces {
before: [
LineComment(
" TODO FIXME",
),
],
item: ExposesKeyword,
after: [],
},
item: [],
},
packages: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: PackagesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [],
},
item: [
@110-123 Module(
ModuleName(
"Task",
),
[
@117-121 ExposedName(
"Task",
),
],
),
],
),
],
provides: [
@141-152 ExposedName(
"mainForHost",
),
],
before_header: [],
after_platform_keyword: [],
before_requires: [
Newline,
],
after_requires: [],
before_exposes: [
LineComment(
" TODO FIXME",
),
],
after_exposes: [],
before_packages: [
Newline,
],
after_packages: [],
before_imports: [
Newline,
],
after_imports: [],
before_provides: [
Newline,
],
after_provides: [],
},
},
provides: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ProvidesKeyword,
after: [],
},
item: [
@141-152 ExposedName(
"mainForHost",
),
],
},
},
),
}

View file

@ -1,15 +1,27 @@
Interface {
header: InterfaceHeader {
name: @10-11 ModuleName(
"T",
),
exposes: [],
imports: [],
before_header: [],
after_interface_keyword: [],
before_exposes: [],
after_exposes: [],
before_imports: [],
after_imports: [],
},
Module {
comments: [],
header: Interface(
InterfaceHeader {
before_name: [],
name: @10-11 ModuleName(
"T",
),
exposes: KeywordItem {
keyword: Spaces {
before: [],
item: ExposesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [],
item: ImportsKeyword,
after: [],
},
item: [],
},
},
),
}

View file

@ -1,26 +1,32 @@
App {
header: AppHeader {
name: @4-14 PlainLine(
"test-app",
),
packages: [],
imports: [],
provides: [],
provides_types: None,
to: @30-38 NewPackage(
PackageName(
"./blah",
Module {
comments: [],
header: App(
AppHeader {
before_name: [],
name: @4-14 PlainLine(
"test-app",
),
),
before_header: [],
after_app_keyword: [],
before_packages: [],
after_packages: [],
before_imports: [],
after_imports: [],
before_provides: [],
after_provides: [],
before_to: [],
after_to: [],
},
packages: None,
imports: None,
provides: ProvidesTo {
provides_keyword: Spaces {
before: [],
item: ProvidesKeyword,
after: [],
},
entries: [],
types: None,
to_keyword: Spaces {
before: [],
item: ToKeyword,
after: [],
},
to: @30-38 NewPackage(
PackageName(
"./blah",
),
),
},
},
),
}

View file

@ -1,15 +1,27 @@
Interface {
header: InterfaceHeader {
name: @10-21 ModuleName(
"Foo.Bar.Baz",
),
exposes: [],
imports: [],
before_header: [],
after_interface_keyword: [],
before_exposes: [],
after_exposes: [],
before_imports: [],
after_imports: [],
},
Module {
comments: [],
header: Interface(
InterfaceHeader {
before_name: [],
name: @10-21 ModuleName(
"Foo.Bar.Baz",
),
exposes: KeywordItem {
keyword: Spaces {
before: [],
item: ExposesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [],
item: ImportsKeyword,
after: [],
},
item: [],
},
},
),
}

View file

@ -1,130 +1,152 @@
Hosted {
header: HostedHeader {
name: @7-10 ModuleName(
"Foo",
),
exposes: Collection {
items: [
@45-50 SpaceBefore(
ExposedName(
"Stuff",
),
[
Module {
comments: [],
header: Hosted(
HostedHeader {
before_name: [],
name: @7-10 ModuleName(
"Foo",
),
exposes: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
),
@64-70 SpaceBefore(
ExposedName(
"Things",
),
[
item: ExposesKeyword,
after: [
Newline,
],
),
@84-97 SpaceBefore(
ExposedName(
"somethingElse",
),
[
Newline,
],
),
],
final_comments: [
Newline,
],
},
imports: Collection {
items: [
@143-147 SpaceBefore(
Module(
ModuleName(
"Blah",
),
[],
),
[
Newline,
],
),
@161-182 SpaceBefore(
Module(
ModuleName(
"Baz",
),
[
@167-172 ExposedName(
"stuff",
},
item: Collection {
items: [
@45-50 SpaceBefore(
ExposedName(
"Stuff",
),
@174-180 ExposedName(
"things",
[
Newline,
],
),
@64-70 SpaceBefore(
ExposedName(
"Things",
),
],
),
[
[
Newline,
],
),
@84-97 SpaceBefore(
ExposedName(
"somethingElse",
),
[
Newline,
],
),
],
final_comments: [
Newline,
],
},
},
imports: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [
Newline,
],
},
item: Collection {
items: [
@143-147 SpaceBefore(
Module(
ModuleName(
"Blah",
),
[],
),
[
Newline,
],
),
@161-182 SpaceBefore(
Module(
ModuleName(
"Baz",
),
[
@167-172 ExposedName(
"stuff",
),
@174-180 ExposedName(
"things",
),
],
),
[
Newline,
],
),
],
final_comments: [
Newline,
],
},
},
generates: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: GeneratesKeyword,
after: [],
},
item: UppercaseIdent(
"Bar",
),
],
final_comments: [
Newline,
],
},
generates_with: KeywordItem {
keyword: Spaces {
before: [],
item: WithKeyword,
after: [
Newline,
],
},
item: Collection {
items: [
@239-242 SpaceBefore(
ExposedName(
"map",
),
[
Newline,
],
),
@256-261 SpaceBefore(
ExposedName(
"after",
),
[
Newline,
],
),
@275-279 SpaceBefore(
ExposedName(
"loop",
),
[
Newline,
],
),
],
final_comments: [
Newline,
],
},
},
},
generates: UppercaseIdent(
"Bar",
),
generates_with: Collection {
items: [
@239-242 SpaceBefore(
ExposedName(
"map",
),
[
Newline,
],
),
@256-261 SpaceBefore(
ExposedName(
"after",
),
[
Newline,
],
),
@275-279 SpaceBefore(
ExposedName(
"loop",
),
[
Newline,
],
),
],
final_comments: [
Newline,
],
},
before_header: [],
after_hosted_keyword: [],
before_exposes: [
Newline,
],
after_exposes: [
Newline,
],
before_imports: [
Newline,
],
after_imports: [
Newline,
],
before_generates: [
Newline,
],
after_generates: [],
before_with: [],
after_with: [
Newline,
],
},
),
}

View file

@ -1,60 +1,87 @@
Platform {
header: PlatformHeader {
name: @9-21 PackageName(
"foo/barbaz",
),
requires: PlatformRequires {
rigids: [
@36-41 UppercaseIdent(
"Model",
),
],
signature: @45-54 TypedIdent {
ident: @45-49 "main",
spaces_before_colon: [],
ann: @52-54 Record {
fields: [],
ext: None,
Module {
comments: [],
header: Platform(
PlatformHeader {
before_name: [],
name: @9-21 PackageName(
"foo/barbaz",
),
requires: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: RequiresKeyword,
after: [],
},
item: PlatformRequires {
rigids: [
@36-41 UppercaseIdent(
"Model",
),
],
signature: @45-54 TypedIdent {
ident: @45-49 "main",
spaces_before_colon: [],
ann: @52-54 Record {
fields: [],
ext: None,
},
},
},
},
},
exposes: [],
packages: [
@87-99 PackageEntry {
shorthand: "foo",
spaces_after_shorthand: [],
package_name: @92-99 PackageName(
"./foo",
),
exposes: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ExposesKeyword,
after: [],
},
item: [],
},
],
imports: [],
provides: [
@132-143 ExposedName(
"mainForHost",
),
],
before_header: [],
after_platform_keyword: [],
before_requires: [
Newline,
],
after_requires: [],
before_exposes: [
Newline,
],
after_exposes: [],
before_packages: [
Newline,
],
after_packages: [],
before_imports: [
Newline,
],
after_imports: [],
before_provides: [
Newline,
],
after_provides: [],
},
packages: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: PackagesKeyword,
after: [],
},
item: [
@87-99 PackageEntry {
shorthand: "foo",
spaces_after_shorthand: [],
package_name: @92-99 PackageName(
"./foo",
),
},
],
},
imports: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [],
},
item: [],
},
provides: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ProvidesKeyword,
after: [],
},
item: [
@132-143 ExposedName(
"mainForHost",
),
],
},
},
),
}

View file

@ -1,59 +1,83 @@
App {
header: AppHeader {
name: @4-10 PlainLine(
"test",
),
packages: [
@26-42 PackageEntry {
shorthand: "pf",
spaces_after_shorthand: [],
package_name: @30-42 PackageName(
"./platform",
Module {
comments: [],
header: App(
AppHeader {
before_name: [],
name: @4-10 PlainLine(
"test",
),
packages: Some(
KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: PackagesKeyword,
after: [],
},
item: [
@26-42 PackageEntry {
shorthand: "pf",
spaces_after_shorthand: [],
package_name: @30-42 PackageName(
"./platform",
),
},
],
},
),
imports: Some(
KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [],
},
item: [
@59-70 Package(
"foo",
ModuleName(
"Bar.Baz",
),
[],
),
],
},
),
provides: ProvidesTo {
provides_keyword: Spaces {
before: [
Newline,
],
item: ProvidesKeyword,
after: [],
},
entries: [
@88-97 ExposedName(
"quicksort",
),
],
types: Some(
[
@102-107 UppercaseIdent(
"Flags",
),
@109-114 UppercaseIdent(
"Model",
),
],
),
to_keyword: Spaces {
before: [],
item: ToKeyword,
after: [],
},
to: @121-123 ExistingPackage(
"pf",
),
},
],
imports: [
@59-70 Package(
"foo",
ModuleName(
"Bar.Baz",
),
[],
),
],
provides: [
@88-97 ExposedName(
"quicksort",
),
],
provides_types: Some(
[
@102-107 UppercaseIdent(
"Flags",
),
@109-114 UppercaseIdent(
"Model",
),
],
),
to: @121-123 ExistingPackage(
"pf",
),
before_header: [],
after_app_keyword: [],
before_packages: [
Newline,
],
after_packages: [],
before_imports: [
Newline,
],
after_imports: [],
before_provides: [
Newline,
],
after_provides: [],
before_to: [],
after_to: [],
},
},
),
}

View file

@ -1,67 +1,94 @@
Platform {
header: PlatformHeader {
name: @9-21 PackageName(
"test/types",
),
requires: PlatformRequires {
rigids: [
@37-42 UppercaseIdent(
"Flags",
),
@44-49 UppercaseIdent(
"Model",
),
],
signature: @55-77 TypedIdent {
ident: @55-59 "main",
spaces_before_colon: [],
ann: @62-77 Apply(
"",
"App",
[
@66-71 Apply(
"",
Module {
comments: [],
header: Platform(
PlatformHeader {
before_name: [],
name: @9-21 PackageName(
"test/types",
),
requires: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: RequiresKeyword,
after: [],
},
item: PlatformRequires {
rigids: [
@37-42 UppercaseIdent(
"Flags",
[],
),
@72-77 Apply(
"",
@44-49 UppercaseIdent(
"Model",
[],
),
],
),
signature: @55-77 TypedIdent {
ident: @55-59 "main",
spaces_before_colon: [],
ann: @62-77 Apply(
"",
"App",
[
@66-71 Apply(
"",
"Flags",
[],
),
@72-77 Apply(
"",
"Model",
[],
),
],
),
},
},
},
exposes: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ExposesKeyword,
after: [],
},
item: [],
},
packages: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: PackagesKeyword,
after: [],
},
item: [],
},
imports: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ImportsKeyword,
after: [],
},
item: [],
},
provides: KeywordItem {
keyword: Spaces {
before: [
Newline,
],
item: ProvidesKeyword,
after: [],
},
item: [
@141-152 ExposedName(
"mainForHost",
),
],
},
},
exposes: [],
packages: [],
imports: [],
provides: [
@141-152 ExposedName(
"mainForHost",
),
],
before_header: [],
after_platform_keyword: [],
before_requires: [
Newline,
],
after_requires: [],
before_exposes: [
Newline,
],
after_exposes: [],
before_packages: [
Newline,
],
after_packages: [],
before_imports: [
Newline,
],
after_imports: [],
before_provides: [
Newline,
],
after_provides: [],
},
),
}