Skip to content

Commit b1fa0e1

Browse files
committed
address todo
1 parent 6c293f2 commit b1fa0e1

File tree

2 files changed

+9
-64
lines changed

2 files changed

+9
-64
lines changed

lib/elixir_sense/core/compiler/typespec.ex

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -361,41 +361,13 @@ defmodule ElixirSense.Core.Compiler.Typespec do
361361

362362
defp typespec({:record, meta, [tag, field_specs]}, vars, caller, state)
363363
when is_atom(tag) and is_list(field_specs) do
364-
# We cannot set a function name to avoid tracking
365-
# as a compile time dependency because for records it actually is one.
366-
case Compiler.Macro.expand({tag, [], [{:{}, [], []}]}, caller) do
367-
{_, _, [name, fields | _]} when is_list(fields) ->
368-
types =
369-
:lists.map(
370-
fn {field, _} ->
371-
{:"::", [],
372-
[
373-
{field, [], nil},
374-
Keyword.get(field_specs, field, quote(do: term()))
375-
]}
376-
end,
377-
fields
378-
)
364+
# elixir expands record macro to get fields and tag
365+
# for simplicity only fields are expanded here
379366

380-
# look for cursor in invalid fields
381-
# elixir raises if there are any
382-
state =
383-
field_specs
384-
|> Enum.filter(fn {field, _} -> not Keyword.has_key?(fields, field) end)
385-
|> Enum.reduce(state, fn {_, type}, acc ->
386-
{_, acc} = typespec(type, vars, caller, acc)
387-
acc
388-
end)
389-
390-
typespec({:{}, meta, [name | types]}, vars, caller, state)
367+
{field_specs, state} =
368+
:lists.mapfoldl(&typespec(&1, vars, caller, &2), state, field_specs)
391369

392-
_ ->
393-
# elixir raises here
394-
{field_specs, state} =
395-
:lists.mapfoldl(&typespec(&1, vars, caller, &2), state, field_specs)
396-
397-
{{:record, meta, [tag, field_specs]}, state}
398-
end
370+
{{:record, meta, [tag, field_specs]}, state}
399371
end
400372

401373
# Handle ranges

test/elixir_sense/core/compiler/typespec_test.exs

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -353,47 +353,20 @@ defmodule ElixirSense.Core.Compiler.TypespecTest do
353353
Compiler.env()
354354
|> NormalizedMacroEnv.define_import([], ElixirSenseExample.ModuleWithRecord, trace: false)
355355

356-
assert {{
357-
:{},
358-
[],
359-
[
360-
:user,
361-
{:"::", [], [{:name, [], nil}, {:term, [], []}]},
362-
{:"::", [], [{:age, [], nil}, {:term, [], []}]}
363-
]
364-
}, _state} = expand_typespec({:record, [], [:user]}, [], default_state(), env)
356+
assert {{:record, [], [:user, []]}, _state} =
357+
expand_typespec({:record, [], [:user]}, [], default_state(), env)
365358

366-
assert {{
367-
:{},
368-
[],
369-
[
370-
:user,
371-
{:"::", [], [{:name, [], nil}, {:term, [], []}]},
372-
{:"::", [], [{:age, [], nil}, :foo]}
373-
]
374-
},
375-
_state} =
359+
assert {{:record, [], [:user, [age: :foo]]}, _state} =
376360
expand_typespec({:record, [], [:user, [age: :foo]]}, [], default_state(), env)
377361

378362
# invalid record
379363
assert {{:record, [], [1, []]}, _} = expand_typespec({:record, [], [1]})
380364

381365
# invalid field
382-
assert {{
383-
:{},
384-
[],
385-
[
386-
:user,
387-
{:"::", [], [{:name, [], nil}, {:term, [], []}]},
388-
{:"::", [], [{:age, [], nil}, {:term, [], []}]}
389-
]
390-
},
391-
_state} =
366+
assert {{:record, [], [:user, [invalid: :foo]]}, _state} =
392367
expand_typespec({:record, [], [:user, [invalid: :foo]]}, [], default_state(), env)
393368

394369
# unknown record
395370
assert {{:record, [], [:foo, []]}, _} = expand_typespec({:record, [], [:foo]})
396-
397-
# TODO make it work with metadata records
398371
end
399372
end

0 commit comments

Comments
 (0)