Packages
spark
2.1.7
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
Current section
Files
lib/spark/elixir_sense/entity.ex
defmodule Spark.ElixirSense.Entity do
@moduledoc false
alias ElixirSense.Core.Introspection
alias ElixirSense.Plugins.Util
alias ElixirSense.Providers.Suggestion.Complete
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
if function_exported?(Complete, :complete, 4) do
apply(Complete, :complete, [
to_string("#{inspect(builtins)}.#{hint}"),
apply(ElixirSense.Core.State.Env, :__struct__, []),
apply(ElixirSense.Core.Metadata, :__struct__, []),
0
])
else
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