Packages

spark

1.1.40
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 aliases.ex
Raw

lib/spark/elixir_sense/aliases.ex

defmodule Spark.ElixirSense.Types do
@moduledoc false
alias ElixirSense.Core.Introspection
alias ElixirSense.Plugins.Util
alias ElixirSense.Providers.Suggestion.Matcher
def find_builtin_types(module, func, hint, cursor_context, templates \\ []) do
text_before = cursor_context.text_before
text_after = cursor_context.text_after
actual_hint =
if String.ends_with?(text_before, "{" <> hint) do
"{" <> hint
else
hint
end
with true <- Code.ensure_loaded?(module),
true <- :erlang.function_exported(module, func, 0) do
for {name, _, _} = type <- builtin_types(module, func, templates),
apply(Matcher, :match?, [name, actual_hint]) do
buitin_type_to_suggestion(type, module, actual_hint, text_after)
end
end
end
defp builtin_types(module, func, templates) do
module
|> apply(func, [])
|> Enum.map(fn {name, value} ->
{inspect(name), value, nil}
end)
|> Enum.concat(templates)
end
def find_custom_types(type_module, func, hint, module_store) do
builtin_types = Keyword.values(apply(type_module, func, []))
for module <- module_store.by_behaviour[type_module] || [],
module not in builtin_types,
type_str = inspect(module),
apply(Util, :match_module?, [type_str, hint]) do
custom_type_to_suggestion(module, type_module, hint)
end
end
defp buitin_type_to_suggestion({type, mod_or_description, snippet}, module, hint, text_after) do
[_, hint_prefix] = Regex.run(~r/(.*?)[\w0-9\._!\?\->]*$/, hint)
insert_text = String.replace_prefix(type, hint_prefix, "")
snippet = snippet && String.replace_prefix(snippet, hint_prefix, "")
{insert_text, snippet} =
if String.starts_with?(text_after, "}") do
snippet = snippet && String.replace_suffix(snippet, "}", "")
insert_text = String.replace_suffix(insert_text, "}", "")
{insert_text, snippet}
else
{insert_text, snippet}
end
docs =
if is_binary(mod_or_description) do
mod_or_description
else
{doc, _} = apply(Introspection, :get_module_docs_summary, [mod_or_description])
doc
end
doc = """
Built-in #{inspect(module)}
#{docs}
"""
%{
type: :generic,
kind: :type_parameter,
label: type,
insert_text: insert_text,
snippet: snippet,
detail: inspect(module),
documentation: doc,
priority: 0
}
end
defp custom_type_to_suggestion(type, module, hint) do
type_str = inspect(type)
{doc, _} = apply(Introspection, :get_module_docs_summary, [type])
%{
type: :generic,
kind: :type_parameter,
label: type_str,
insert_text: apply(Util, :trim_leading_for_insertion, [hint, type_str]),
detail: "Custom #{inspect(module)}",
documentation: doc,
priority: 1
}
end
end