Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ defmodule Engine.Search.Indexer.Extractors.StructReference do
Analyzer.current_module(reducer.analysis, Reducer.position(reducer))
end

# Any-struct pattern: %_{}
defp expand_alias(:_, _reducer), do: :ignored

# Struct pattern with variable binding: %struct_name{}
defp expand_alias(atom, _reducer) when is_atom(atom), do: :ignored

defp expand_alias(alias, %Reducer{} = reducer) do
{line, column} = reducer.position

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,24 @@ defmodule Engine.Search.Indexer.Extractors.StructReferenceTest do
assert decorate(doc, struct.range) == "variable = «%MyStruct{}»"
end

test "in an any-struct match on the left side and struct on the right" do
{:ok, [struct], doc} = ~q[%_{} = %MyStruct{}] |> index()

assert struct.type == :struct
assert struct.subtype == :reference
assert struct.subject == Subject.module(MyStruct)
assert decorate(doc, struct.range) == "%_{} = «%MyStruct{}»"
end

test "in an any-struct match with binding on the left side and struct on the right" do
{:ok, [struct], doc} = ~q[%str_name{} = %MyStruct{}] |> index()

assert struct.type == :struct
assert struct.subtype == :reference
assert struct.subject == Subject.module(MyStruct)
assert decorate(doc, struct.range) == "%str_name{} = «%MyStruct{}»"
end

test "in a struct reference in params" do
{:ok, [struct], doc} =
~q[
Expand All @@ -69,6 +87,24 @@ defmodule Engine.Search.Indexer.Extractors.StructReferenceTest do
assert decorate(doc, struct.range) == ~S[def my_fn(«%MyStruct{}» = first) do]
end

test "in an any-struct pattern in params" do
assert {:ok, [], _doc} =
~q[
def my_fn(%_{} = first) do
end
]
|> index()
end

test "in an any-struct pattern with binding in params" do
assert {:ok, [], _doc} =
~q[
def my_fn(%struct_name{} = first) do
end
]
|> index()
end

test "in nested struct references" do
{:ok, [outer, inner], doc} =
~q[
Expand Down
Loading