Packages

spark

2.3.9
2.7.2 2.7.1 2.7.0 2.6.1 2.6.0 2.5.0 2.4.1 2.4.0 2.3.14 2.3.13 2.3.12 2.3.11 2.3.10 2.3.9 2.3.8 2.3.7 2.3.6 2.3.5 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.69 2.2.68 2.2.67 2.2.66 2.2.65 2.2.64 2.2.63 2.2.62 2.2.61 2.2.60 2.2.59 2.2.58 2.2.57 2.2.56 2.2.55 2.2.54 2.2.53 2.2.52 2.2.51 2.2.50 2.2.49 2.2.48 2.2.47 2.2.46 2.2.45 2.2.44 2.2.43 2.2.42 2.2.41 2.2.40 2.2.39 2.2.38 2.2.37 2.2.36 2.2.35 2.2.34 2.2.33 2.2.32 2.2.31 2.2.30 2.2.29 2.2.28 2.2.27 2.2.26 2.2.25 2.2.24 2.2.23 2.2.22 2.2.21 2.2.20 2.2.19 2.2.18 2.2.17 2.2.16 2.2.15 2.2.14 2.2.13 2.2.12 2.2.11 2.2.10 2.2.9 2.2.8 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.24 2.1.23 2.1.22 2.1.21 2.1.20 2.1.19 2.1.18 2.1.17 2.1.16 2.1.15 2.1.14 2.1.13 2.1.12 2.1.11 2.1.10 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 2.1.2 2.1.1 2.1.0 2.0.1 2.0.0 1.1.55 1.1.54 1.1.53 1.1.52 1.1.51 1.1.50 1.1.49 1.1.48 1.1.47 1.1.46 1.1.45 1.1.44 1.1.43 1.1.42 1.1.41 1.1.40 1.1.39 1.1.38 1.1.37 1.1.36 1.1.35 1.1.34 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.26 1.1.25 1.1.24 1.1.22 1.1.21 1.1.20 1.1.19 1.1.18 1.1.17 1.1.16 1.1.15 1.1.14 retired 1.1.13 1.1.12 1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.9 1.0.8 1.0.7 1.0.6 1.0.5 1.0.4 1.0.3 1.0.2 1.0.1 1.0.0 0.4.12 0.4.11 0.4.10 0.4.9 0.4.8 0.4.7 0.4.6 0.4.5 0.4.4 0.4.3 0.4.2 0.4.1 0.3.12 0.3.11 0.3.10 0.3.9 0.3.8 0.3.7 0.3.6 0.3.5 0.3.4 0.3.3 0.3.2 0.3.1 0.3.0 0.2.18 0.2.17 0.2.16 0.2.15 0.2.14 0.2.13 0.2.12 0.2.11 0.2.10 0.2.9 0.2.8 0.2.7 0.2.6 0.2.5 0.2.4 0.2.3 0.2.2 0.2.1 0.2.0 0.1.29 0.1.28 0.1.27 0.1.26 0.1.25 0.1.24 0.1.23 0.1.22 0.1.21 0.1.20 0.1.19 0.1.18 0.1.17 0.1.16 0.1.15 0.1.14 0.1.13 0.1.12 0.1.11 0.1.10 0.1.9 0.1.8 0.1.7 0.1.6 0.1.5 0.1.4 0.1.3 0.1.2 0.1.1 0.1.0

Generic tooling for building DSLs

Current section

Files

Jump to
spark lib spark elixir_sense entity.ex
Raw

lib/spark/elixir_sense/entity.ex

# SPDX-FileCopyrightText: 2022 spark contributors <https://github.com/ash-project/spark/graphs.contributors>
#
# SPDX-License-Identifier: MIT
defmodule Spark.ElixirSense.Entity do
@moduledoc false
alias ElixirSense.Core.Introspection
alias ElixirSense.Providers.Suggestion.Complete
cond do
Code.ensure_loaded?(ElixirSense.Providers.Plugins.Util) ->
@util ElixirSense.Providers.Plugins.Util
Code.ensure_loaded?(ElixirLS.LanguageServer.Plugins.Util) ->
@util ElixirLS.LanguageServer.Plugins.Util
true ->
@util ElixirSense.Plugins.Util
end
def find_entities(type, hint) do
for {module, _} <- :code.all_loaded(),
type in (module.module_info(:attributes)[:spark_is] || []),
mod_str = inspect(module),
apply(@util, :match_module?, [mod_str, hint]) do
{doc, _} = apply(Introspection, :get_module_docs_summary, [module])
%{
type: :generic,
kind: :class,
label: mod_str,
insert_text: apply(@util, :trim_leading_for_insertion, [hint, mod_str]),
detail: "Spark resource",
documentation: doc
}
end
end
def find_spark_behaviour_impls(behaviour, builtins, hint, module_store) do
builtins =
if builtins && !String.contains?(hint, ".") && lowercase_string?(hint) do
cond do
Code.ensure_loaded?(ElixirSense.Providers.Completion.CompletionEngine) ->
apply(ElixirSense.Providers.Completion.CompletionEngine, :complete, [
to_string("#{inspect(builtins)}.#{hint}"),
apply(ElixirSense.Core.State.Env, :__struct__, []),
apply(ElixirSense.Core.Metadata, :__struct__, []),
0
])
Code.ensure_loaded?(ElixirLS.Utils.CompletionEngine) ->
apply(ElixirLS.Utils.CompletionEngine, :complete, [
to_string("#{inspect(builtins)}.#{hint}"),
apply(ElixirSense.Core.State.Env, :__struct__, []),
apply(ElixirSense.Core.Metadata, :__struct__, []),
0
])
function_exported?(Complete, :complete, 4) ->
apply(Complete, :complete, [
to_string("#{inspect(builtins)}.#{hint}"),
apply(ElixirSense.Core.State.Env, :__struct__, []),
apply(ElixirSense.Core.Metadata, :__struct__, []),
0
])
true ->
apply(Complete, :complete, [
to_string("#{inspect(builtins)}.#{hint}"),
apply(Complete.Env, :__struct__, [])
])
end
else
[]
end
|> Enum.reject(fn
%{name: name} when name in ["__info__", "module_info", "module_info"] ->
true
_ ->
false
end)
|> Enum.map(fn
%{type: :function, origin: origin, name: name, arity: arity} = completion ->
try do
{:docs_v1, _, _, _, _, _, functions} = Code.fetch_docs(Module.concat([origin]))
new_summary =
Enum.find_value(functions, fn
{{:function, func_name, func_arity}, _, _,
%{
"en" => docs
}, _} ->
if to_string(func_name) == name && func_arity == arity do
docs
end
_other ->
false
end)
%{completion | summary: new_summary || completion.summary}
rescue
_e ->
completion
end
other ->
other
end)
first = behaviour |> Module.split() |> Enum.at(0)
custom =
for module <- module_store.by_behaviour[behaviour] || [],
mod_str = inspect(module),
!String.starts_with?(mod_str, "#{first}."),
apply(@util, :match_module?, [mod_str, hint]) do
{doc, _} = apply(Introspection, :get_module_docs_summary, [module])
%{
type: :generic,
kind: :class,
label: mod_str,
insert_text: apply(@util, :trim_leading_for_insertion, [hint, mod_str]),
detail: "#{inspect(behaviour)}",
documentation: doc
}
end
builtins ++ custom
end
def find_behaviour_impls(behaviour, hint, module_store) do
for module <- module_store.by_behaviour[behaviour] || [],
mod_str = inspect(module),
apply(@util, :match_module?, [mod_str, hint]),
!asks_to_skip?(module) do
{doc, _} = apply(Introspection, :get_module_docs_summary, [module])
%{
type: :generic,
kind: :class,
label: mod_str,
insert_text: apply(@util, :trim_leading_for_insertion, [hint, mod_str]),
detail: "#{inspect(behaviour)}",
documentation: doc
}
end
end
defp asks_to_skip?(module) do
Code.ensure_loaded?(module) && function_exported?(module, :skip_in_spark_autocomplete, 0) &&
module.skip_in_spark_autocomplete()
end
defp lowercase_string?(""), do: true
defp lowercase_string?(string) do
first = String.first(string)
String.downcase(first) == first
end
end