elixir-lsp / elixir-ls

A frontend-independent IDE "smartness" server for Elixir. Implements the "Language Server Protocol" standard and provides debugger support via the "Debug Adapter Protocol"
https://elixir-lsp.github.io/elixir-ls/
Apache License 2.0
1.49k stars 195 forks source link

Complete record fields #1074

Open lukaszsamson opened 1 year ago

lukaszsamson commented 1 year ago

Collect fields in metadata builder. Fall back to typespec. Depends on Code.Fragment

lukaszsamson commented 1 year ago

record AST

record typespec
{:"::", [],
 [
   {:userd, [], []},
   {:{}, [line: 4],
    [
      :userd,
      {:"::", [line: 0],
       [
         {:name, [line: 0], nil},
         {{:., [line: 4], [String, :t]}, [line: 4], []}
       ]},
      {:"::", [line: 0], [{:age, [line: 0], nil}, {:integer, [line: 4], []}]}
    ]}
 ]}

iex(1)> Code.Fragment.surround_context("record = user(age: 26)", {1, 12})
%{begin: {1, 10}, context: {:local_call, 'user'}, end: {1, 14}}
iex(2)> Code.Fragment.surround_context("record = D.user(age: 26)", {1, 12})
%{begin: {1, 10}, context: {:dot, {:alias, 'D'}, 'user'}, end: {1, 16}}
iex(3)> Code.Fragment.container_cursor_to_quoted("record = D.user(")           {:ok, 
 {:=, [line: 1],
  [
    {:record, [line: 1], nil},
    {{:., [line: 1], [{:__aliases__, [line: 1], [:D]}, :user]}, [line: 1],
     [{:__cursor__, [line: 1], []}]}
  ]}}
iex(4)> Code.Fragment.container_cursor_to_quoted("record = user(")  
{:ok,
 {:=, [line: 1],
  [
    {:record, [line: 1], nil},
    {:user, [line: 1], [{:__cursor__, [line: 1], []}]}
  ]}}