Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
694 changes: 455 additions & 239 deletions compiler/syntax/src/res_core.ml

Large diffs are not rendered by default.

285 changes: 218 additions & 67 deletions compiler/syntax/src/res_printer.ml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
type f1.a = {
x: int }[@@res.inlineRecordDefinition ]
external f1 : a:f1.a -> unit (a:1) = "f1"
type f2.return.type = {
id: string }[@@res.inlineRecordDefinition ]
external f2 : int -> f2.return.type (a:1) = "f2"
type f3.return.type = {
b: int }[@@res.inlineRecordDefinition ]
and f3.returnType = {
a: int }[@@res.inlineRecordDefinition ]
external f3 : returnType:f3.returnType -> f3.return.type (a:1) = "f3"
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
type f1.arg0 = {
x: int }[@@res.inlineRecordDefinition ]
external f1 : f1.arg0 -> unit (a:1) = "f1"
type f2.arg0 = {
x: int }[@@res.inlineRecordDefinition ]
external f2 : f2.arg0 -> string -> unit (a:2) = "f2"
type f3.return.type = {
done: bool }[@@res.inlineRecordDefinition ]
and f3.arg1 = {
y: string }[@@res.inlineRecordDefinition ]
and f3.arg0 = {
x: int }[@@res.inlineRecordDefinition ]
external f3 : f3.arg0 option -> f3.arg1 -> f3.return.type option (a:2) = "f3"
type f4.arg1 = {
y: string }[@@res.inlineRecordDefinition ]
and f4.named = {
x: int }[@@res.inlineRecordDefinition ]
external f4 : named:f4.named -> f4.arg1 -> unit (a:2) = "f4"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
type nonrec f = string
type f.arg0 = {
z: int }[@@res.inlineRecordDefinition ]
external f : f.arg0 -> unit (a:1) = "f"
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type nonrec foo = string
type t.foo = {
x: int }[@@res.inlineRecordDefinition ]
and t = {
foo: t.foo }
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
external f1: (~a: {x: int}) => unit = "f1"
external f2: int => {id: string} = "f2"

external f3: (~returnType: {a:int}) => {b:int} = "f3"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
external f1: {x: int} => unit = "f1"
external f2: ({x: int}, string) => unit = "f2"
external f3: (option<{x: int}>, {y: string}) => option<{done: bool}> = "f3"
external f4: (~named: {x: int}, {y: string}) => unit = "f4"
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
type f = string
external f: {z: int} => unit = "f"
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
type foo = string
type t = {foo: {x: int}}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@module("node:fs")
external readFileSync: (
string,
~options: {
encoding?: [#utf8 | #ascii | #base64],
flag?: string,
misc?: {
mode?: int,
},
},
) => option<{filename: string, size: string}> = "fs.readFileSync"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
external f1: {x: int} => unit = "f1"
external f2: ({x: int}, string) => unit = "f2"
external f3: (option<{x: int}>, {y: string}) => option<{done: bool}> = "f3"
external f4: (~named: {x: int}, {y: string}) => unit = "f4"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
external getMeta: int => {id: string} = "getMeta"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
type user = {"name": string}
@val
external steve: {...user, "age": int} = "steve"
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@module("node:fs")
external readFileSync: (string, ~options: {
encoding?: [#utf8 | #ascii | #base64],
flag?: string,
misc?: {
mode?: int
}
}) => option<{filename: string, size: string}> = "fs.readFileSync"

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
external f1: {x: int} => unit = "f1"
external f2: ({x: int}, string) => unit = "f2"
external f3: (option<{x: int}>, {y: string}) => option<{done: bool}> = "f3"
external f4: (~named: {x: int}, {y: string}) => unit = "f4"
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
external getMeta: int => {id: string} = "getMeta"

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
type user = {"name": string}
@val
external steve: {...user, "age": int} = "steve"

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@module("node:fs")
external readFileSync: (
string,
~options: {
encoding?: [#utf8 | #ascii | #base64],
flag?: string,
misc?: {
mode?: int,
},
},
) => option<{filename: string, size: string}> = "fs.readFileSync"
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
@module("m1")
external f1: (~a: {x: int}, ~b: {y: string}) => unit = "f1"

@module("m2")
external f2: (~opt: {z: int}=?) => unit = "f2"

@module("m3")
external f3: (
~options: {
misc?: {
details: {
n: int,
},
},
},
) => unit = "f3"

@module("m4")
external f4: int => {id2: string} = "f4"

// Non-arrow external should not derive inline records
@val
external s1: {...user, "age": int} = "s1"
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
external f1: {x: int} => unit = "f1"
external f2: ({x: int}, string) => unit = "f2"
external f3: (option<{x: int}>, {y: string}) => option<{done: bool}> = "f3"
external f4: (~named: {x: int}, {y: string}) => unit = "f4"

type f = string
external f: {z: int} => unit = "f"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
external getMeta: int => {id: string} = "getMeta"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// preserved
@module("m")
external read: (~options: {flag?: string}) => unit = "read"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
type user = {"name": string}
@val
external steve: {...user, "age": int} = "steve"
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@module("node:fs")
external readFileSync: (string, ~options: {
encoding?: [#utf8 | #ascii | #base64],
flag?: string,
misc?: {
mode?: int
}
}) => option<{filename: string, size: string}> = "fs.readFileSync"

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@module("m1")
external f1: (~a: {x: int}, ~b: {y: string}) => unit = "f1"

@module("m2")
external f2: (~opt: {z: int}=?) => unit = "f2"

@module("m3")
external f3: (~options: {
misc?: {
details: {
n: int
}
}
}) => unit = "f3"

@module("m4")
external f4: int => {id2: string} = "f4"

// Non-arrow external should not derive inline records
@val
external s1: {...user, "age": int} = "s1"
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
external f1: {x: int} => unit = "f1"
external f2: ({x: int}, string) => unit = "f2"
external f3: (option<{x: int}>, {y: string}) => option<{done: bool}> = "f3"
external f4: (~named: {x: int}, {y: string}) => unit = "f4"

type f = string
external f: {z: int} => unit = "f"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
external getMeta: int => {id: string} = "getMeta"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// preserved
@module("m")
external read: (~options: {flag?: string}) => unit = "read"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
type user = {"name": string}
@val
external steve: {...user, "age": int} = "steve"

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
type foo = string
type t = {foo: {x: int}}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
type foo = string
type t = {foo: {x: int}}
Loading