From 09b505861f7ad05fcfdbe16f62d5acc5610f678e Mon Sep 17 00:00:00 2001 From: Roberto Aloi Date: Tue, 16 Jul 2019 15:41:10 +0200 Subject: [PATCH] [#22] Convert indexer into gen_server --- src/erlang_ls_indexer.erl | 87 ++++++++++++++++++++++++++++++++++++--- src/erlang_ls_sup.erl | 4 ++ 2 files changed, 86 insertions(+), 5 deletions(-) diff --git a/src/erlang_ls_indexer.erl b/src/erlang_ls_indexer.erl index f09b554c2..fba199510 100644 --- a/src/erlang_ls_indexer.erl +++ b/src/erlang_ls_indexer.erl @@ -1,16 +1,92 @@ +%%============================================================================== +%% The Buffer Server +%%============================================================================== -module(erlang_ls_indexer). --export([ index/1 ]). +%%============================================================================== +%% Behaviours +%%============================================================================== +-behaviour(gen_server). --spec index(string()) -> map(). -index(Path) -> - {ok, IoDevice} = file:open(Path, [read]), +%%============================================================================== +%% Exports +%%============================================================================== +%% API +-export([ start_link/0 + , index/1 + , stop/0 + ]). + +%% gen_server callbacks +-export([ init/1 + , handle_call/3 + , handle_cast/2 + ]). + +%%============================================================================== +%% Includes +%%============================================================================== +-include("erlang_ls.hrl"). + +%%============================================================================== +%% Defines +%%============================================================================== +-define(SERVER, ?MODULE). + +%%============================================================================== +%% Record Definitions +%%============================================================================== +-record(state, {}). + +%%============================================================================== +%% Type Definitions +%%============================================================================== +-type state() :: #state{}. + +%%%============================================================================= +%%% API +%%%============================================================================= +-spec start_link() -> {ok, pid()}. +start_link() -> + gen_server:start_link({local, ?SERVER}, ?MODULE, {}, []). + +-spec index(uri()) -> ok. +index(Uri) -> + gen_server:call(?SERVER, {index, Uri}). + +-spec stop() -> ok. +stop() -> + gen_server:stop(?SERVER). + +%%============================================================================== +%% gen_server Callback Functions +%%============================================================================== +-spec init({}) -> {ok, state()}. +init({}) -> + {ok, #state{}}. + +-spec handle_call(any(), any(), state()) -> {reply, ok, state()}. +handle_call({index, Uri}, _From, State) -> + ok = do_index(Uri), + {reply, ok, State}. + +-spec handle_cast(any(), state()) -> {noreply, state()}. +handle_cast(_Msg, State) -> {noreply, State}. + +%%============================================================================== +%% Internal Functions +%%============================================================================== +-spec do_index(uri()) -> ok. +do_index(Uri) -> + {ok, IoDevice} = file:open(Uri, [read]), {ok, Forms} = epp_dodger:parse(IoDevice, {1, 1}), erl_syntax_lib:mapfold(fun analyze_form/2, #{ module => undefined , macros => [] , variables => [] , applications => [] - }, erl_syntax:form_list(Forms)). + }, erl_syntax:form_list(Forms)), + ok = file:close(IoDevice), + ok. -spec analyze_form(erl_syntax:syntax_tree(), map()) -> map(). analyze_form(Form, Acc) -> @@ -71,3 +147,4 @@ analyze_tree(_Form, _Type, Acc) -> %% TODO: Assume OTP structure on init %% TODO: Function to append to map field %% TODO: We should input binaries, not files. Could we patch epp? +%% TODO: Avoid epp parsing twice diff --git a/src/erlang_ls_sup.erl b/src/erlang_ls_sup.erl index 281f38810..e2034e28f 100644 --- a/src/erlang_ls_sup.erl +++ b/src/erlang_ls_sup.erl @@ -47,5 +47,9 @@ init([]) -> , start => {erlang_ls_buffer_sup, start_link, []} , shutdown => brutal_kill } + , #{ id => erlang_ls_indexer + , start => {erlang_ls_indexer, start_link, []} + , shutdown => brutal_kill + } ], {ok, {SupFlags, ChildSpecs}}.