From 0056a81b7f940eeae32fed76e87a7047f9d040eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20K=C5=82osko?= Date: Thu, 25 Jan 2024 12:03:34 +0100 Subject: [PATCH] Skip docs requests for remote node intellisense (#2447) --- lib/livebook/intellisense/docs.ex | 14 +++++++++++++- test/livebook/remote_intellisense_test.exs | 18 +++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/lib/livebook/intellisense/docs.ex b/lib/livebook/intellisense/docs.ex index 118dc8c56..51e2705ba 100644 --- a/lib/livebook/intellisense/docs.ex +++ b/lib/livebook/intellisense/docs.ex @@ -1,6 +1,12 @@ defmodule Livebook.Intellisense.Docs do # This module is responsible for extracting and normalizing # information like documentation, signatures and specs. + # + # Note that we only extract the docs information when requested for + # for the current node. For remote nodes, making several requests + # for docs (which may be necessary if there are multiple modules) + # adds to the overall latency. Remote intellisense is primarily used + # with remote release nodes, which have docs stripped out anyway. @type member_info :: %{ kind: member_kind(), @@ -38,6 +44,8 @@ defmodule Livebook.Intellisense.Docs do Fetches documentation for the given module if available. """ @spec get_module_documentation(module(), node()) :: documentation() + def get_module_documentation(_module, node) when node != node(), do: nil + def get_module_documentation(module, node) do case :erpc.call(node, Code, :fetch_docs, [module]) do {:docs_v1, _, _, format, %{"en" => docstring}, _, _} -> @@ -75,7 +83,11 @@ defmodule Livebook.Intellisense.Docs do node(), keyword() ) :: list(member_info()) - def lookup_module_members(module, members, node, opts \\ []) do + def lookup_module_members(module, members, node, opts \\ []) + + def lookup_module_members(_module, _members, node, _opts) when node != node(), do: [] + + def lookup_module_members(module, members, node, opts) do members = MapSet.new(members) kinds = opts[:kinds] || [:function, :macro, :type] diff --git a/test/livebook/remote_intellisense_test.exs b/test/livebook/remote_intellisense_test.exs index edc7875a5..09566ffc0 100644 --- a/test/livebook/remote_intellisense_test.exs +++ b/test/livebook/remote_intellisense_test.exs @@ -74,7 +74,7 @@ defmodule Livebook.RemoteIntellisenseTest do label: "RemoteModule", kind: :module, detail: "module", - documentation: "RemoteModule module docs", + documentation: "No documentation available", insert_text: "RemoteModule" } in Intellisense.get_completion_items("RemoteModule", context, node) end @@ -85,8 +85,8 @@ defmodule Livebook.RemoteIntellisenseTest do assert %{ label: "hello/1", kind: :function, - detail: "RemoteModule.hello(message)", - documentation: "Hello doc", + detail: nil, + documentation: "No documentation available", insert_text: "hello(${})" } in Intellisense.get_completion_items("RemoteModule.hel", context, node) end @@ -97,20 +97,20 @@ defmodule Livebook.RemoteIntellisenseTest do assert [ %{ - label: "all_keys/1", + label: "unsubscribe/1", kind: :function, - detail: ":mnesia.all_keys/1", - documentation: _all_keys_doc, - insert_text: "all_keys(${})" + detail: nil, + documentation: "No documentation available", + insert_text: "unsubscribe(${})" } - ] = Intellisense.get_completion_items(":mnesia.all", context, node) + ] = Intellisense.get_completion_items(":mnesia.unsub", context, node) end test "get details", %{node: node} do context = eval(do: nil) assert %{contents: [content]} = Intellisense.get_details("RemoteModule", 6, context, node) - assert content =~ "RemoteModule module docs" + assert content =~ "No documentation available" end end end