diff --git a/src/parser/lexer.mll b/src/parser/lexer.mll index 81dbbc6280..929acf017a 100644 --- a/src/parser/lexer.mll +++ b/src/parser/lexer.mll @@ -74,7 +74,8 @@ let trim_leading_whitespace : string -> string = fun s -> let count_leading_whitespace : string -> int = fun line -> let rec count_leading_whitespace' : int -> int = fun index -> if index >= String.length line then - index + (* Ignore empty and whitespace-only lines. *) + max_int else match line.[index] with | ' ' | '\t' -> count_leading_whitespace' (index + 1) @@ -92,10 +93,13 @@ let trim_leading_whitespace : string -> string = fun s -> |> List.fold_left min max_int in let remove_whitespace : string -> string = fun line -> - String.sub + if String.length line < least_amount_of_whitespace then line - least_amount_of_whitespace - (String.length line - least_amount_of_whitespace) + else + String.sub + line + least_amount_of_whitespace + (String.length line - least_amount_of_whitespace) in lines |> List.map remove_whitespace diff --git a/test/parser/expect/code-block/leading-whitespace-with-empty-line.txt b/test/parser/expect/code-block/leading-whitespace-with-empty-line.txt new file mode 100644 index 0000000000..fad56a8b83 --- /dev/null +++ b/test/parser/expect/code-block/leading-whitespace-with-empty-line.txt @@ -0,0 +1,4 @@ +((output (ok (((f.ml (1 0) (3 6)) (code_block "foo\ + \n\ + \nbar"))))) + (warnings ())) diff --git a/test/parser/expect/code-block/leading-whitespace-with-whitespace-line-long.txt b/test/parser/expect/code-block/leading-whitespace-with-whitespace-line-long.txt new file mode 100644 index 0000000000..b41282e038 --- /dev/null +++ b/test/parser/expect/code-block/leading-whitespace-with-whitespace-line-long.txt @@ -0,0 +1,4 @@ +((output (ok (((f.ml (1 0) (3 6)) (code_block "foo\ + \n \ + \nbar"))))) + (warnings ())) diff --git a/test/parser/expect/code-block/leading-whitespace-with-whitespace-line-short.txt b/test/parser/expect/code-block/leading-whitespace-with-whitespace-line-short.txt new file mode 100644 index 0000000000..83fe000ea5 --- /dev/null +++ b/test/parser/expect/code-block/leading-whitespace-with-whitespace-line-short.txt @@ -0,0 +1,4 @@ +((output (ok (((f.ml (1 0) (3 7)) (code_block "foo\ + \n \ + \nbar"))))) + (warnings ())) diff --git a/test/parser/test.ml b/test/parser/test.ml index a08ebb1213..594489a0a8 100644 --- a/test/parser/test.ml +++ b/test/parser/test.ml @@ -275,6 +275,9 @@ let tests : test_suite list = [ t "leading-whitespace-two-cr-lf" "{[ foo\r\n bar]}"; t "leading-whitespace-two-different-indent" "{[ foo\n bar]}"; t "leading-whitespace-two-different-indent-rev" "{[ foo\n bar]}"; + t "leading-whitespace-with-empty-line" "{[ foo\n\n bar]}"; + t "leading-whitespace-with-whitespace-line-short" "{[ foo\n \n bar]}"; + t "leading-whitespace-with-whitespace-line-long" "{[ foo\n \n bar]}"; t "leading-tab" "{[\tfoo]}"; t "leading-tab-two" "{[\tfoo\n\tbar]}"; t "leading-tab-two-different-indent" "{[\tfoo\n\t\tbar]}";