diff --git a/src/res_diagnostics.ml b/src/res_diagnostics.ml index 22a2db18..1e5c6be2 100644 --- a/src/res_diagnostics.ml +++ b/src/res_diagnostics.ml @@ -142,15 +142,24 @@ let make ~startPos ~endPos category = { } let printReport diagnostics src = + let rec print diagnostics src = + match diagnostics with + | [] -> () + | d::rest -> + Res_diagnostics_printing_utils.Super_location.super_error_reporter + Format.err_formatter + ~src + ~startPos:d.startPos + ~endPos:d.endPos + ~msg:(explain d); + begin match rest with + | [] -> () + | _ -> Format.fprintf Format.err_formatter "@." + end; + print rest src + in Format.fprintf Format.err_formatter "@["; - List.rev diagnostics |> List.iter (fun d -> - Res_diagnostics_printing_utils.Super_location.super_error_reporter - Format.err_formatter - ~src - ~startPos:d.startPos - ~endPos:d.endPos - ~msg:(explain d) - ); + print (List.rev diagnostics) src; Format.fprintf Format.err_formatter "@]@." let unexpected token context = diff --git a/src/res_doc.ml b/src/res_doc.ml index 9fb5b4ff..621e7391 100644 --- a/src/res_doc.ml +++ b/src/res_doc.ml @@ -209,10 +209,6 @@ let toString ~width doc = end in process ~pos:0 [] [0, Flat, doc]; - - let len = MiniBuffer.length buffer in - if len > 0 && MiniBuffer.unsafe_get buffer (len - 1) != '\n' then - MiniBuffer.add_char buffer '\n'; MiniBuffer.contents buffer diff --git a/src/res_minibuffer.ml b/src/res_minibuffer.ml index c72b5f89..43ba4334 100644 --- a/src/res_minibuffer.ml +++ b/src/res_minibuffer.ml @@ -11,11 +11,6 @@ let create n = let contents b = Bytes.sub_string b.buffer 0 b.position -let unsafe_get b ofs = - Bytes.unsafe_get b.buffer ofs - -let length b = b.position - (* Can't be called directly, don't add to the interface *) let resize_internal b more = let len = b.length in @@ -52,4 +47,4 @@ let flush_newline b = position := !position - 1; done; b.position <- !position; - add_char b '\n' \ No newline at end of file + add_char b '\n' diff --git a/src/res_minibuffer.mli b/src/res_minibuffer.mli index 4c8e459f..cadf0c50 100644 --- a/src/res_minibuffer.mli +++ b/src/res_minibuffer.mli @@ -1,8 +1,5 @@ type t -val add_char : t -> char -> unit val add_string : t -> string -> unit val contents : t -> string val create : int -> t val flush_newline : t -> unit -val length : t -> int -val unsafe_get : t -> int -> char \ No newline at end of file diff --git a/src/res_printer.ml b/src/res_printer.ml index f5b25aa2..4e3bfdbf 100644 --- a/src/res_printer.ml +++ b/src/res_printer.ml @@ -5004,9 +5004,9 @@ let printImplementation ~width (s: Parsetree.structure) ~comments = (* CommentTable.log cmtTbl; *) let doc = printStructure s cmtTbl in (* Doc.debug doc; *) - Doc.toString ~width doc + Doc.toString ~width doc ^ "\n" let printInterface ~width (s: Parsetree.signature) ~comments = let cmtTbl = CommentTable.make () in CommentTable.walkSignature s cmtTbl comments; - Doc.toString ~width (printSignature s cmtTbl) + Doc.toString ~width (printSignature s cmtTbl) ^ "\n" diff --git a/tests/oprint/oprint.res.snapshot b/tests/oprint/oprint.res.snapshot index 9240b417..5bb75dd8 100644 --- a/tests/oprint/oprint.res.snapshot +++ b/tests/oprint/oprint.res.snapshot @@ -142,4 +142,4 @@ type t21 = [#\"va r ia nt"] type t22 = [#\"Variant β›°"] type \"let" = int type \"type" = [#\"PointπŸ—Ώ"(\"let", float)] -type exoticUser = {\"let": string, \"type": float} +type exoticUser = {\"let": string, \"type": float} \ No newline at end of file diff --git a/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap index 218eca1d..96ca5119 100644 --- a/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap @@ -31,7 +31,6 @@ let x = ((let a = 1 in let b = 2 in fun pattern -> (\\"test\\" : int)) 2) (pattern: int) => \\"test\\" - ========================================================" `; @@ -108,6 +107,7 @@ let pipeline = Did you forget a \`)\` here? + Syntax error! parsing/errors/expressions/block.js:18:25-19:1 16 β”‚ @@ -119,6 +119,7 @@ let pipeline = Did you forget a \`)\` here? + Syntax error! parsing/errors/expressions/block.js:22:11-23:1 20 β”‚ @@ -130,6 +131,7 @@ let pipeline = Looks like there might be an expression missing here + Syntax error! parsing/errors/expressions/block.js:26:7-27:1 24 β”‚ | Join(doc1, doc2) => @@ -141,6 +143,7 @@ let pipeline = Did you forget a \`)\` here? + Syntax error! parsing/errors/expressions/block.js:30:10-31:1 28 β”‚ @@ -173,6 +176,7 @@ let () = ((let open Foo in let exception End in x ())[@ns.braces ]) consecutive statements on a line must be separated by ';' or a newline + Syntax error! parsing/errors/expressions/consecutive.res:4:7 2 β”‚ @@ -183,6 +187,7 @@ let () = ((let open Foo in let exception End in x ())[@ns.braces ]) consecutive expressions on a line must be separated by ';' or a newline + Syntax error! parsing/errors/expressions/consecutive.res:8:16-27 6 β”‚ @@ -193,6 +198,7 @@ let () = ((let open Foo in let exception End in x ())[@ns.braces ]) consecutive expressions on a line must be separated by ';' or a newline + Syntax error! parsing/errors/expressions/consecutive.res:12:11-20 10 β”‚ @@ -221,6 +227,7 @@ let f a b = ((())[@ns.braces ]) This let-binding misses an expression + Syntax error! parsing/errors/expressions/emptyBlock.js:3:20 1 β”‚ let x = {} @@ -299,7 +306,6 @@ switch result { } - ========================================================" `; @@ -351,6 +357,7 @@ let x = I'm not sure what to parse here when looking at \\"-\\". + Syntax error! parsing/errors/expressions/jsx.js:2:20 1 β”‚ let x = @@ -360,6 +367,7 @@ let x = Did you forget a \` @@ -370,6 +378,7 @@ let x = Missing + Syntax error! parsing/errors/expressions/jsx.js:4:9-34 2 β”‚ let x = ; @@ -380,6 +389,7 @@ let x = Missing + Syntax error! parsing/errors/expressions/jsx.js:5:9-27 3 β”‚ let x = ; @@ -390,6 +400,7 @@ let x = Missing + Syntax error! parsing/errors/expressions/jsx.js:6:17 4 β”‚ let x = @@ -436,6 +447,7 @@ let record = { field = ([%rescript.exprhole ]) } Did you forget a \`,\` here? + Syntax error! parsing/errors/expressions/record.js:8:10-18 6 β”‚ @@ -446,6 +458,7 @@ let record = { field = ([%rescript.exprhole ]) } Did you forget a \`:\` here? + Syntax error! parsing/errors/expressions/record.js:13:9-17:0 11 β”‚ @@ -547,6 +560,5 @@ let x = (\\"hi\\" : string) (\\"hi\\": string) - ========================================================" `; diff --git a/tests/parsing/errors/other/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/other/__snapshots__/parse.spec.js.snap index b6e709cc..6ffddda7 100644 --- a/tests/parsing/errors/other/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/other/__snapshots__/parse.spec.js.snap @@ -38,6 +38,7 @@ type nonrec 'extraInfo student = Did you forget a \`,\` here? + Syntax error! parsing/errors/other/regionMissingComma.res:8:11-9:11 6 β”‚ type student<'extraInfo> = { @@ -71,6 +72,7 @@ let x::y = myList Arrays can't use the \`...\` spread currently. Please use \`concat\` or other Array helpers. + Syntax error! parsing/errors/other/spread.js:2:6-8 1 β”‚ let arr = [...x, ...y] @@ -82,6 +84,7 @@ let x::y = myList Explanation: such spread would create a subarray; out of performance concern, our pattern matching currently guarantees to never create new intermediate data. Solution: if it's to validate the first few elements, use a \`when\` clause + Array size check + \`get\` checks on the current pattern. If it's to obtain a subarray, use \`Array.sub\` or \`Belt.Array.slice\`. + Syntax error! parsing/errors/other/spread.js:4:21-23 2 β”‚ let [...arr, _] = [1, 2, 3] @@ -93,6 +96,7 @@ Solution: if it's to validate the first few elements, use a \`when\` clause + Ar Records can only have one \`...\` spread, at the beginning. Explanation: since records have a known, fixed shape, a spread like \`{a, ...b}\` wouldn't make sense, as \`b\` would override every field of \`a\` anyway. + Syntax error! parsing/errors/other/spread.js:5:15-18 3 β”‚ @@ -105,6 +109,7 @@ Explanation: since records have a known, fixed shape, a spread like \`{a, ...b}\ Explanation: you can't collect a subset of a record's field into its own record, since a record needs an explicit declaration and that subset wouldn't have one. Solution: you need to pull out each field you want explicitly. + Syntax error! parsing/errors/other/spread.js:8:13-22 6 β”‚ diff --git a/tests/parsing/errors/pattern/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/pattern/__snapshots__/parse.spec.js.snap index 626822b0..c8980539 100644 --- a/tests/parsing/errors/pattern/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/pattern/__snapshots__/parse.spec.js.snap @@ -15,6 +15,7 @@ let 4 = for [%rescript.patternhole ] = 0 to 10 do Js.log \\"for\\" done I was expecting a name for this let-binding. Example: \`let message = \\"hello\\"\` + Syntax error! parsing/errors/pattern/missing.res:2:5 1 β”‚ let = 2 @@ -24,6 +25,7 @@ let 4 = for [%rescript.patternhole ] = 0 to 10 do Js.log \\"for\\" done I was expecting a name for this let-binding. Example: \`let message = \\"hello\\"\` + Syntax error! parsing/errors/pattern/missing.res:4:5-6 2 β”‚ let = 4 @@ -34,6 +36,7 @@ let 4 = for [%rescript.patternhole ] = 0 to 10 do Js.log \\"for\\" done A for-loop has the following form: \`for i in 0 to 10\`. Did you forget to supply a name before \`in\`? + Syntax error! parsing/errors/pattern/missing.res:9:3-4 7 β”‚ diff --git a/tests/parsing/errors/scanner/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/scanner/__snapshots__/parse.spec.js.snap index 00cc0d37..86a8b726 100644 --- a/tests/parsing/errors/scanner/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/scanner/__snapshots__/parse.spec.js.snap @@ -14,6 +14,7 @@ let x = \\"\\\\\\\\0AAA\\" unknown escape sequence + Syntax error! parsing/errors/scanner/escapeSequence.js:3:10-11 1 β”‚ let x = \\"\\\\0\\" @@ -42,6 +43,7 @@ let newX = x +. (newVelocity *. secondPerFrame) Hmm, not sure what I should do here with this character. If you're trying to deref an expression, use \`foo.contents\` instead. + Syntax error! parsing/errors/scanner/oldDerefOp.js:2:46 1 β”‚ let newVelocity = velocity +. a *. secondPerFrame^; diff --git a/tests/parsing/errors/signature/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/signature/__snapshots__/parse.spec.js.snap index 37dbb4e8..2d85e2e1 100644 --- a/tests/parsing/errors/signature/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/signature/__snapshots__/parse.spec.js.snap @@ -36,6 +36,7 @@ val z2 : float[@@genType ] consecutive specifications on a line must be separated by ';' or a newline + Syntax error! parsing/errors/signature/consecutive.resi:3:15-21 1 β”‚ let x: int let y: float diff --git a/tests/parsing/errors/structure/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/structure/__snapshots__/parse.spec.js.snap index 2013b05e..835ae819 100644 --- a/tests/parsing/errors/structure/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/structure/__snapshots__/parse.spec.js.snap @@ -122,6 +122,7 @@ let (x : int1) = (int2 = 3 :> int3) Did you forget a \`=\` here? + Syntax error! parsing/errors/structure/letBinding.js:8:12-13 6 β”‚ let x = { @@ -132,6 +133,7 @@ let (x : int1) = (int2 = 3 :> int3) Did you forget a \`=\` here? + Syntax error! parsing/errors/structure/letBinding.js:14:19-26 12 β”‚ let t = { @@ -142,6 +144,7 @@ let (x : int1) = (int2 = 3 :> int3) Did you forget a \`=\` here? + Syntax error! parsing/errors/structure/letBinding.js:18:39-20:3 16 β”‚ } @@ -154,6 +157,7 @@ let (x : int1) = (int2 = 3 :> int3) This let-binding misses an expression + Syntax error! parsing/errors/structure/letBinding.js:20:10-23:3 18 β”‚ let keyTable: Belt.Map.String.t = @@ -167,6 +171,7 @@ let (x : int1) = (int2 = 3 :> int3) This let-binding misses an expression + Syntax error! parsing/errors/structure/letBinding.js:23:11-13 21 β”‚ @@ -177,6 +182,7 @@ let (x : int1) = (int2 = 3 :> int3) Did you forget a \`=\` here? + Syntax error! parsing/errors/structure/letBinding.js:26:6-8 24 β”‚ @@ -187,6 +193,7 @@ let (x : int1) = (int2 = 3 :> int3) Did you forget a \`=\` here? + Syntax error! parsing/errors/structure/letBinding.js:29:13-15 27 β”‚ @@ -214,6 +221,7 @@ let [%rescript.patternhole ] = 3 \`open\` is a reserved keyword. Keywords need to be escaped: \\\\\\"open\\" + Syntax error! parsing/errors/structure/letBindingPatternKeyword.js:2:5-6 1 β”‚ let open = 1 diff --git a/tests/parsing/errors/typeDef/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/typeDef/__snapshots__/parse.spec.js.snap index 4db91d64..026b4d0d 100644 --- a/tests/parsing/errors/typeDef/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/typeDef/__snapshots__/parse.spec.js.snap @@ -64,6 +64,7 @@ let make (props : < handleClick: Click.t -> unit ;value: string > Js.t) = An inline record type declaration is only allowed in a variant constructor's declaration + Syntax error! parsing/errors/typeDef/inlineRecord.res:14:5-10 12 ┆ name: string, @@ -74,6 +75,7 @@ let make (props : < handleClick: Click.t -> unit ;value: string > Js.t) = An inline record type declaration is only allowed in a variant constructor's declaration + Syntax error! parsing/errors/typeDef/inlineRecord.res:19:21-31 17 β”‚ } @@ -120,6 +122,7 @@ type t = [ [%rescript.typehole ] | [%rescript.typehole ]] I'm not sure what to parse here when looking at \\"]\\". + Syntax error! parsing/errors/typeDef/polyvariant.js:3:13-14 1 β”‚ type t = [< ] @@ -130,6 +133,7 @@ type t = [ [%rescript.typehole ] | [%rescript.typehole ]] Did you forget a \`|\` here? + Syntax error! parsing/errors/typeDef/polyvariant.js:7:15 5 β”‚ type z = [< | #A | #B > ] @@ -181,6 +185,7 @@ type nonrec state = [%rescript.typehole ] Did you forget a \`=\` here? + Syntax error! parsing/errors/typeDef/typeDef.js:8:1-4 6 β”‚ @@ -190,6 +195,7 @@ type nonrec state = [%rescript.typehole ] Missing a type here + Syntax error! parsing/errors/typeDef/typeDef.js:9:1 7 β”‚ // missing type @@ -244,6 +250,7 @@ type nonrec ('from, 'foo) derivedNode = \`to\` is a reserved keyword. Keywords need to be escaped: \\\\\\"to\\" + Syntax error! parsing/errors/typeDef/typeParams.js:10:26 8 β”‚ } @@ -254,6 +261,7 @@ type nonrec ('from, 'foo) derivedNode = A type param consists of a singlequote followed by a name like \`'a\` or \`'A\` + Syntax error! parsing/errors/typeDef/typeParams.js:15:26 13 β”‚ } @@ -264,6 +272,7 @@ type nonrec ('from, 'foo) derivedNode = A type param consists of a singlequote followed by a name like \`'a\` or \`'A\` + Syntax error! parsing/errors/typeDef/typeParams.js:21:25-27 19 β”‚ diff --git a/tests/parsing/errors/typexpr/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/typexpr/__snapshots__/parse.spec.js.snap index fd81de05..1dd0001b 100644 --- a/tests/parsing/errors/typexpr/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/typexpr/__snapshots__/parse.spec.js.snap @@ -28,6 +28,7 @@ module Error3 = Did you forget a \`=>\` here? + Syntax error! parsing/errors/typexpr/arrow.js:7:27-30 5 β”‚ type observation ={ @@ -38,6 +39,7 @@ module Error3 = Did you forget a \`:\` here? It signals the start of a type + Syntax error! parsing/errors/typexpr/arrow.js:14:26-29 12 β”‚ type observation ={ @@ -85,6 +87,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t Did you forget a \`:\` here? It signals the start of a type + Syntax error! parsing/errors/typexpr/bsObjSugar.js:7:14-8:13 5 β”‚ @@ -96,6 +99,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t Did you forget a \`:\` here? It signals the start of a type + Syntax error! parsing/errors/typexpr/bsObjSugar.js:13:14-14:13 11 β”‚ type state = { @@ -107,6 +111,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t Did you forget a \`:\` here? It signals the start of a type + Syntax error! parsing/errors/typexpr/bsObjSugar.js:19:14-20:1 17 β”‚ type state = { @@ -118,6 +123,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t Did you forget a \`:\` here? It signals the start of a type + Syntax error! parsing/errors/typexpr/bsObjSugar.js:25:1 23 β”‚ @bs.meth @@ -128,6 +134,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t I'm missing a type here + Syntax error! parsing/errors/typexpr/bsObjSugar.js:28:10 26 β”‚ @@ -138,6 +145,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t I'm missing a type here + Syntax error! parsing/errors/typexpr/bsObjSugar.js:33:18 31 β”‚ @@ -148,6 +156,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t I'm missing a type here + Syntax error! parsing/errors/typexpr/bsObjSugar.js:37:25 35 β”‚ } @@ -158,6 +167,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t I'm missing a type here + Syntax error! parsing/errors/typexpr/bsObjSugar.js:40:8-41:8 38 β”‚ type state = { @@ -169,6 +179,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t Did you forget a \`:\` here? It signals the start of a type + Syntax error! parsing/errors/typexpr/bsObjSugar.js:46:3-11 44 β”‚ type websocket = { @@ -179,6 +190,7 @@ type nonrec websocket = < id: [%rescript.typehole ] > Js.t I'm missing a type here + Syntax error! parsing/errors/typexpr/bsObjSugar.js:50:7-51:0 48 β”‚ @@ -282,6 +294,7 @@ type nonrec 'A x = 'let A type variable consists of a singlequote followed by a name like \`'a\` or \`'A\` + Syntax error! parsing/errors/typexpr/typeVar.res:2:15-17 1 β”‚ type x<'A> = '_ diff --git a/tests/parsing/infiniteLoops/__snapshots__/parse.spec.js.snap b/tests/parsing/infiniteLoops/__snapshots__/parse.spec.js.snap index 86a1dbdc..af5d7444 100644 --- a/tests/parsing/infiniteLoops/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/infiniteLoops/__snapshots__/parse.spec.js.snap @@ -180,6 +180,7 @@ let (a : action) = AddUser \\"test\\" consecutive statements on a line must be separated by ';' or a newline + Syntax error! parsing/infiniteLoops/jsxChildren.js:1:22-29 1 β”‚ type action = AddUser @@ -610,6 +611,7 @@ include consecutive statements on a line must be separated by ';' or a newline + Syntax error! parsing/infiniteLoops/nonRecTypes.js:67:26-68:3 65 β”‚ }; @@ -622,6 +624,7 @@ include I'm not sure what to parse here when looking at \\"let\\". + Syntax error! parsing/infiniteLoops/nonRecTypes.js:68:21-69:3 66 β”‚ let has = (rbt, value) => _findNode(rbt, rootGet(rbt), value) !== None @@ -634,6 +637,7 @@ include I'm not sure what to parse here when looking at \\"let\\". + Syntax error! parsing/infiniteLoops/nonRecTypes.js:434:31-38 432 β”‚ updateSum(Some(node), ~delta); @@ -646,6 +650,5 @@ include oldNewVisibleNodes<'value> - ========================================================" `; diff --git a/tests/printer/comments/__snapshots__/render.spec.js.snap b/tests/printer/comments/__snapshots__/render.spec.js.snap index fe783da6..eed61030 100644 --- a/tests/printer/comments/__snapshots__/render.spec.js.snap +++ b/tests/printer/comments/__snapshots__/render.spec.js.snap @@ -902,6 +902,7 @@ exports[`extensionConstructor.res 1`] = ` exports[`fileWithOneSingleLineComment.res 1`] = ` "// retain this comment + " `; @@ -914,6 +915,7 @@ comment */ // more comments + " `; @@ -947,6 +949,7 @@ let getZ2 = nested => exports[`interfaceWithOneSingleComment.resi 1`] = ` "// retain this comment + " `; @@ -956,6 +959,7 @@ exports[`interfaceWithOnlyComments.resi 1`] = ` /* test */ // ok + " `;