-module(kdleam@comment). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/kdleam/comment.gleam"). -export([skip_single_line_comment/1, skip_block_comment/1, skip_ws/1, skip_line_space/1, skip_node_space/1]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -file("src/kdleam/comment.gleam", 7). ?DOC(false). -spec skip_single_line_comment(kdleam@scanner:scanner()) -> {ok, kdleam@scanner:scanner()} | {error, kdleam@error:kdl_error()}. skip_single_line_comment(S) -> case kdleam@scanner:peek(S) of {some, Ch} -> case kdleam@scanner:is_newline(Ch) of true -> {ok, S}; false -> {_, Next} = kdleam@scanner:advance(S), skip_single_line_comment(Next) end; none -> {ok, S} end. -file("src/kdleam/comment.gleam", 26). ?DOC(false). -spec skip_block_comment_depth(kdleam@scanner:scanner(), integer()) -> {ok, kdleam@scanner:scanner()} | {error, kdleam@error:kdl_error()}. skip_block_comment_depth(S, Depth) -> case Depth =< 0 of true -> {ok, S}; false -> case kdleam@scanner:peek(S) of none -> {error, kdleam@scanner:make_error(S, unclosed_block_comment)}; {some, <<"/"/utf8>>} -> case kdleam@scanner:peek_next(S) of {some, <<"*"/utf8>>} -> {_, S1} = kdleam@scanner:advance(S), {_, S2} = kdleam@scanner:advance(S1), skip_block_comment_depth(S2, Depth + 1); _ -> {_, Next} = kdleam@scanner:advance(S), skip_block_comment_depth(Next, Depth) end; {some, <<"*"/utf8>>} -> case kdleam@scanner:peek_next(S) of {some, <<"/"/utf8>>} -> {_, S1@1} = kdleam@scanner:advance(S), {_, S2@1} = kdleam@scanner:advance(S1@1), skip_block_comment_depth(S2@1, Depth - 1); _ -> {_, Next@1} = kdleam@scanner:advance(S), skip_block_comment_depth(Next@1, Depth) end; {some, _} -> {_, Next@2} = kdleam@scanner:advance(S), skip_block_comment_depth(Next@2, Depth) end end. -file("src/kdleam/comment.gleam", 22). ?DOC(false). -spec skip_block_comment(kdleam@scanner:scanner()) -> {ok, kdleam@scanner:scanner()} | {error, kdleam@error:kdl_error()}. skip_block_comment(S) -> skip_block_comment_depth(S, 1). -file("src/kdleam/comment.gleam", 68). ?DOC(false). -spec skip_ws(kdleam@scanner:scanner()) -> {ok, kdleam@scanner:scanner()} | {error, kdleam@error:kdl_error()}. skip_ws(S) -> case kdleam@scanner:peek(S) of {some, Ch} -> case kdleam@scanner:is_unicode_space(Ch) of true -> {_, Next} = kdleam@scanner:advance(S), skip_ws(Next); false -> case (Ch =:= <<"*"/utf8>>) andalso (kdleam@scanner:peek_next( S ) =:= {some, <<"/"/utf8>>}) of true -> {error, kdleam@scanner:make_error( S, unmatched_block_comment_end )}; false -> case (Ch =:= <<"/"/utf8>>) andalso (kdleam@scanner:peek_next( S ) =:= {some, <<"*"/utf8>>}) of true -> {_, S1} = kdleam@scanner:advance(S), {_, S2} = kdleam@scanner:advance(S1), gleam@result:'try'( skip_block_comment(S2), fun(S3) -> skip_ws(S3) end ); false -> {ok, S} end end end; _ -> {ok, S} end. -file("src/kdleam/comment.gleam", 177). ?DOC(false). -spec try_skip_escline(kdleam@scanner:scanner()) -> {ok, {boolean(), kdleam@scanner:scanner()}} | {error, kdleam@error:kdl_error()}. try_skip_escline(S) -> case kdleam@scanner:peek(S) of {some, <<"\\"/utf8>>} -> {_, S1} = kdleam@scanner:advance(S), gleam@result:'try'( skip_ws(S1), fun(S2) -> case kdleam@scanner:peek(S2) of {some, <<"/"/utf8>>} -> case kdleam@scanner:peek_next(S2) of {some, <<"/"/utf8>>} -> {_, S3} = kdleam@scanner:advance(S2), {_, S4} = kdleam@scanner:advance(S3), gleam@result:'try'( skip_single_line_comment(S4), fun(S5) -> {_, S6} = kdleam@scanner:consume_newline( S5 ), {ok, {true, S6}} end ); _ -> {ok, {false, S}} end; {some, Ch} -> case kdleam@scanner:is_newline(Ch) of true -> {_, S3@1} = kdleam@scanner:consume_newline( S2 ), {ok, {true, S3@1}}; false -> {ok, {false, S}} end; none -> {ok, {true, S2}} end end ); _ -> {ok, {false, S}} end. -file("src/kdleam/comment.gleam", 114). ?DOC(false). -spec skip_line_space_checked(kdleam@scanner:scanner(), binary()) -> {ok, kdleam@scanner:scanner()} | {error, kdleam@error:kdl_error()}. skip_line_space_checked(S, Ch) -> case kdleam@scanner:is_newline(Ch) of true -> {_, Next} = kdleam@scanner:consume_newline(S), skip_line_space(Next); false -> case (Ch =:= <<"/"/utf8>>) andalso (kdleam@scanner:peek_next(S) =:= {some, <<"/"/utf8>>}) of true -> {_, S1} = kdleam@scanner:advance(S), {_, S2} = kdleam@scanner:advance(S1), gleam@result:'try'( skip_single_line_comment(S2), fun(S3) -> {_, S4} = kdleam@scanner:consume_newline(S3), skip_line_space(S4) end ); false -> case (Ch =:= <<"/"/utf8>>) andalso (kdleam@scanner:peek_next( S ) =:= {some, <<"*"/utf8>>}) of true -> {_, S1@1} = kdleam@scanner:advance(S), {_, S2@1} = kdleam@scanner:advance(S1@1), gleam@result:'try'( skip_block_comment(S2@1), fun(S3@1) -> skip_line_space(S3@1) end ); false -> case Ch =:= <<"\\"/utf8>> of true -> gleam@result:'try'( try_skip_escline(S), fun(Esc) -> case Esc of {true, Next@1} -> skip_line_space(Next@1); {false, _} -> {ok, S} end end ); false -> {ok, S} end end end end. -file("src/kdleam/comment.gleam", 96). ?DOC(false). -spec skip_line_space(kdleam@scanner:scanner()) -> {ok, kdleam@scanner:scanner()} | {error, kdleam@error:kdl_error()}. skip_line_space(S) -> case kdleam@scanner:peek(S) of {some, Ch} -> case kdleam@scanner:is_unicode_space(Ch) of true -> {_, Next} = kdleam@scanner:advance(S), skip_line_space(Next); false -> case (Ch =:= <<"*"/utf8>>) andalso (kdleam@scanner:peek_next( S ) =:= {some, <<"/"/utf8>>}) of true -> {error, kdleam@scanner:make_error( S, unmatched_block_comment_end )}; false -> skip_line_space_checked(S, Ch) end end; _ -> {ok, S} end. -file("src/kdleam/comment.gleam", 166). ?DOC(false). -spec skip_esclines(kdleam@scanner:scanner(), boolean()) -> {ok, {boolean(), kdleam@scanner:scanner()}} | {error, kdleam@error:kdl_error()}. skip_esclines(S, Had) -> gleam@result:'try'(try_skip_escline(S), fun(Result) -> case Result of {true, Next} -> gleam@result:'try'( skip_ws(Next), fun(After_ws) -> skip_esclines(After_ws, true) end ); {false, _} -> {ok, {Had, S}} end end). -file("src/kdleam/comment.gleam", 157). ?DOC(false). -spec skip_node_space(kdleam@scanner:scanner()) -> {ok, {boolean(), kdleam@scanner:scanner()}} | {error, kdleam@error:kdl_error()}. skip_node_space(S) -> Start = erlang:element(4, S), gleam@result:'try'( skip_ws(S), fun(After_ws) -> Had_ws = erlang:element(4, After_ws) /= Start, gleam@result:'try'( skip_esclines(After_ws, false), fun(Result) -> {Had_escline, Final} = Result, {ok, {Had_ws orelse Had_escline, Final}} end ) end ).