Packages
spark
2.7.2
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/mix/tasks/spark.formatter.ex
# SPDX-FileCopyrightText: 2022 spark contributors <https://github.com/ash-project/spark/graphs/contributors>
#
# SPDX-License-Identifier: MIT
if Code.ensure_loaded?(Sourceror) do
defmodule Mix.Tasks.Spark.Formatter do
@shortdoc "Manages a variable called `spark_locals_without_parens` in the .formatter.exs from a list of DSL extensions."
@moduledoc @shortdoc
use Mix.Task
@spec run(term) :: no_return
def run(opts) do
# Compile if safe to do so (not at umbrella root)
if not Mix.Project.umbrella?() do
Mix.Task.run("compile")
end
{opts, []} = OptionParser.parse!(opts, strict: [check: :boolean, extensions: :string])
unless opts[:extensions] do
raise "Must supply a comma separated list of extensions to generate a .formatter.exs for"
end
extensions =
opts[:extensions]
|> String.split(",")
|> Enum.map(&Module.concat([&1]))
locals_without_parens =
Enum.flat_map(extensions, fn extension_mod ->
all_entity_builders_everywhere(
extension_mod.sections(),
extension_mod.dsl_patches(),
extensions
)
end)
|> Enum.uniq()
|> Enum.sort()
contents = File.read!(".formatter.exs")
{_ast, spark_locals_without_parens} =
contents
|> Sourceror.parse_string!()
|> Macro.prewalk(
nil,
fn
{:=, _,
[
{:spark_locals_without_parens, _, _},
right
]} = ast,
_acc ->
{ast, right}
ast, acc ->
{ast, acc}
end
)
if !spark_locals_without_parens do
raise "Add `spark_locals_without_parens = []` to your .formatter.exs and run this again to populate the list."
end
new_contents =
contents
|> Sourceror.patch_string([
Sourceror.Patch.new(
Sourceror.get_range(spark_locals_without_parens, include_comments: true),
Sourceror.to_string(locals_without_parens, opts)
)
])
|> Code.format_string!()
contents_with_newline = [new_contents, "\n"]
if opts[:check] do
if contents != IO.iodata_to_binary(contents_with_newline) do
raise """
.formatter.exs is not up to date!
Run the following command and commit the result:
mix spark.formatter --extensions #{opts[:extensions]}
"""
else
IO.puts("The current .formatter.exs is correct")
end
else
File.write!(".formatter.exs", contents_with_newline)
end
end
def all_entity_builders_everywhere(sections, dsl_patches, extensions, path \\ []) do
patch_builders =
dsl_patches
|> Enum.filter(fn
%Spark.Dsl.Patch.AddEntity{} ->
true
_ ->
false
end)
|> Enum.map(& &1.entity)
|> Enum.flat_map(fn entity ->
Enum.concat([
Spark.Formatter.entity_option_builders(entity),
Spark.Formatter.entity_builders(entity)
])
end)
sections
|> Enum.flat_map(fn section ->
all_entity_builders_everywhere(
section.sections,
[],
extensions,
path ++ [section.name]
)
end)
|> Enum.concat(Spark.Formatter.all_entity_builders(sections, extensions, path))
|> Enum.concat(patch_builders)
end
end
else
defmodule Mix.Tasks.Spark.Formatter do
@shortdoc "Manages a variable called `spark_locals_without_parens` in the .formatter.exs from a list of DSL extensions."
@moduledoc @shortdoc
use Mix.Task
def run(_opts) do
raise "This task requires sourceror to run. Please add it as a dev/test dependency"
end
end
end