Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@do fails to complete #102

Closed
axelson opened this issue Jun 3, 2020 · 3 comments
Closed

@do fails to complete #102

axelson opened this issue Jun 3, 2020 · 3 comments

Comments

@axelson
Copy link
Member

axelson commented Jun 3, 2020

In ElixirLS typing @do above a function definition fails to return any completions and can result in an exception:

07:36:09.440 [error] Process #PID<0.400.0> raised an exception
** (CaseClauseError) no case clause matching: [{:hi, [line: 10, column: 7], nil}, [do: {:__block__, [], [{{:., [line: 16, column: 7], [{:__aliases__, [line: 16, column: 5], [:IO]}, :puts]}, [line: 16, column: 7], ["hihihibefesffesfasasd"]}, {{:., [line: 17, column: 9], [{:__aliases__, [line: 17, column: 5], [:Enum]}, :chunk_every]}, [line: 17, column: 9], [[], 3]}]}]]
    (elixir_sense 1.0.1) lib/elixir_sense/core/metadata_builder.ex:556: ElixirSense.Core.MetadataBuilder.pre/2
    (elixir 1.10.3) lib/macro.ex:430: anonymous fn/4 in Macro.do_traverse_args/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:396: Macro.do_traverse/4
    (elixir 1.10.3) lib/macro.ex:411: Macro.do_traverse/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:416: Macro.do_traverse/4

screenshot-elixir-ls-do-fail

Are there currently any tests of completion that involve a file that fails to compile?

@lukaszsamson
Copy link
Collaborator

Are there currently any tests of completion that involve a file that fails to compile?

There are some in test/elixir_sense/suggestion_test.exs

@lukaszsamson
Copy link
Collaborator

I hit some other similar errors lately, e.g.

add_call_to_line({Module.concat(module), call, length(params)}, {line, column + 1})
** (FunctionClauseError) no function clause matching in :elixir_aliases.do_concat/2
    (elixir 1.10.3) src/elixir_aliases.erl:120: :elixir_aliases.do_concat([{:state, [line: 50, column: 5], nil}, :Process], "Elixir")
    (elixir 1.10.3) src/elixir_aliases.erl:108: :elixir_aliases.concat/1
    (elixir_sense 1.0.1) lib/elixir_sense/core/metadata_builder.ex:990: ElixirSense.Core.MetadataBuilder.pre/2
    (elixir 1.10.3) lib/macro.ex:430: anonymous fn/4 in Macro.do_traverse_args/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:396: Macro.do_traverse/4
    (elixir 1.10.3) lib/macro.ex:411: Macro.do_traverse/4


** (FunctionClauseError) no function clause matching in :elixir_aliases.do_concat/2
    (elixir 1.10.3) src/elixir_aliases.erl:120: :elixir_aliases.do_concat([{:|>, [line: 517, column: 5], [{:++, [line: 516, column: 28], [{:news, [line: 516, column: 23], nil}, {:modifys, [line: 516, column: 31], nil}]}, {{:., [line: 517, column: 12], [{:__aliases__, [line: 517, column: 8], [:Enum]}, :group_by]}, [line: 517, column: 12], [{:fn, [line: 517, column: 22], [{:->, [line: 517, column: 48], [[{:{}, [line: 517, column: 25], [{:side, [line: 517, column: 26], nil}, {:_price, [line: 517, column: 32], nil}, {:_order, [line: 517, column: 40], nil}]}], {:side, [line: 517, column: 51], nil}]}]}]}]}, :I], "Elixir")
    (elixir 1.10.3) src/elixir_aliases.erl:108: :elixir_aliases.concat/1
    (elixir_sense 1.0.1) lib/elixir_sense/core/state.ex:974: ElixirSense.Core.State.expand_alias/2
    (elixir_sense 1.0.1) lib/elixir_sense/core/metadata_builder.ex:1226: ElixirSense.Core.MetadataBuilder.get_binding_type/2
    (elixir_sense 1.0.1) lib/elixir_sense/core/metadata_builder.ex:753: ElixirSense.Core.MetadataBuilder.pre/2
    (elixir 1.10.3) lib/macro.ex:430: anonymous fn/4 in Macro.do_traverse_args/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:396: Macro.do_traverse/4
    (elixir 1.10.3) lib/macro.ex:411: Macro.do_traverse/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:416: Macro.do_traverse/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:396: Macro.do_traverse/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.10.3) lib/macro.ex:396: Macro.do_traverse/4
    (elixir 1.10.3) lib/macro.ex:411: Macro.do_traverse/4
    (elixir 1.10.3) lib/enum.ex:1520: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3

Unfortunately it is not worth fixing every one. Metadata builder makes assumptions that AST is relatively sane. In the case with @do ... the parser assumes that function block is the attribute value which is obviously illegal. The best we can do is catch the error and replace the faulty AST node with nil.

@axelson
Copy link
Member Author

axelson commented Jun 7, 2020

Thanks, that seems like a sane fix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants