src/gleeam_code@internal@stdlib_scanner.erl

-module(gleeam_code@internal@stdlib_scanner).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gleeam_code/internal/stdlib_scanner.gleam").
-export([scan/1]).
-export_type([stdlib_call/0]).

-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).

-type stdlib_call() :: {stdlib_call, binary(), binary()}.

-file("src/gleeam_code/internal/stdlib_scanner.gleam", 55).
?DOC(false).
-spec take_identifier(list(binary()), list(binary())) -> {list(binary()),
    list(binary())}.
take_identifier(Chars, Acc) ->
    case Chars of
        [] ->
            {lists:reverse(Acc), []};

        [C | Rest] ->
            case gleeam_code@internal@char:is_identifier(C) of
                true ->
                    take_identifier(Rest, [C | Acc]);

                false ->
                    {lists:reverse(Acc), Chars}
            end
    end.

-file("src/gleeam_code/internal/stdlib_scanner.gleam", 81).
?DOC(false).
-spec is_stdlib_module(binary()) -> boolean().
is_stdlib_module(Name) ->
    (Name =:= <<"gleam_stdlib"/utf8>>) orelse gleam_stdlib:string_starts_with(
        Name,
        <<"gleam@"/utf8>>
    ).

-file("src/gleeam_code/internal/stdlib_scanner.gleam", 69).
?DOC(false).
-spec try_parse_module(list(binary())) -> {ok, binary()} | {error, nil}.
try_parse_module(Chars) ->
    Name = erlang:list_to_binary(Chars),
    case Name of
        <<""/utf8>> ->
            {error, nil};

        _ ->
            case is_stdlib_module(Name) of
                true ->
                    {ok, Name};

                false ->
                    {error, nil}
            end
    end.

-file("src/gleeam_code/internal/stdlib_scanner.gleam", 39).
?DOC(false).
-spec scan_after_colon(list(binary()), binary(), list(stdlib_call())) -> list(stdlib_call()).
scan_after_colon(Chars, Module, Acc) ->
    {Func_chars, Rest} = take_identifier(Chars, []),
    Func_name = erlang:list_to_binary(Func_chars),
    case Func_name of
        <<""/utf8>> ->
            scan_chars(Rest, [], Acc);

        _ ->
            Call = {stdlib_call, Module, Func_name},
            scan_chars(Rest, [], [Call | Acc])
    end.

-file("src/gleeam_code/internal/stdlib_scanner.gleam", 16).
?DOC(false).
-spec scan_chars(list(binary()), list(binary()), list(stdlib_call())) -> list(stdlib_call()).
scan_chars(Chars, Current, Acc) ->
    case Chars of
        [] ->
            Acc;

        [C | Rest] ->
            case gleeam_code@internal@char:is_identifier(C) of
                true ->
                    scan_chars(Rest, [C | Current], Acc);

                false ->
                    case C of
                        <<":"/utf8>> ->
                            case try_parse_module(lists:reverse(Current)) of
                                {ok, Module} ->
                                    scan_after_colon(Rest, Module, Acc);

                                {error, _} ->
                                    scan_chars(Rest, [], Acc)
                            end;

                        _ ->
                            scan_chars(Rest, [], Acc)
                    end
            end
    end.

-file("src/gleeam_code/internal/stdlib_scanner.gleam", 9).
?DOC(false).
-spec scan(binary()) -> list(stdlib_call()).
scan(Erl_source) ->
    _pipe = Erl_source,
    _pipe@1 = gleam@string:to_graphemes(_pipe),
    _pipe@2 = scan_chars(_pipe@1, [], []),
    gleam@list:unique(_pipe@2).