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