It seems unreasonable for the editor to infer the line number from the 
`message` key. Am I wrong in thinking that? It seems that `position` is 
getting lost at some point in translation. Why would the `message` string 
contain the full stacktrace with line number, but `position` is `nil`?

After reading this thread, I now realize that this is actually somewhat 
common. I don't have a use case off the top of my head, but it's often that 
the `position` key is lost when an error comes from a macro.

In the case of elixir_ls (vscode language server), the position is 
expected, and the fallback is to highlight the whole file: 
https://github.com/elixir-lsp/elixir-ls/blob/master/apps/language_server/lib/language_server/build.ex#L63

On Friday, May 15, 2020 at 12:30:52 PM UTC-6, José Valim wrote:
>
> You can use reraise/3. It is a bit misnamed, but it is correct. But this 
> behaviour in particular sounds like a bug in the editor itself, given it 
> does have a line in the stacktrace specific to that file.
>
> On Fri, May 15, 2020 at 8:04 PM Dallin Osmun <dos...@gmail.com 
> <javascript:>> wrote:
>
>> I must be missing something. I am already using Macro.Env.stacktrace when 
>> emitting my warnings and that's working great. The problem happens when 
>> calling raise. Is there a way to pass a new stacktrace into raise? The docs 
>> for Kernel.raise say it accepts either a message or an exception and 
>> attributes. Kernel.reraise takes in a stacktrace but when I use that I only 
>> see changes in the compiler diagnostic's message; not in it's file nor 
>> position.
>>
>>
>> On Friday, May 15, 2020 at 11:45:10 AM UTC-6, José Valim wrote:
>>>
>>> 1. Yes, the granularity you get is per macro.
>>>
>>> 2. When emitting the warning, do "Macro.Env.stacktrace(__CALLER__)" to 
>>> get the actual caller. You may also need to look at the AST to get the 
>>> proper line. Note you would need to do the same if we were to introduce 
>>> some sort of IO.error.
>>>
>>> On Fri, May 15, 2020 at 6:22 PM Dallin Osmun <dos...@gmail.com> wrote:
>>>
>>>> Hi José,
>>>>
>>>> Thanks for the helpful response!
>>>>
>>>> What you are saying makes sense. I must admit I don't have a very 
>>>> advanced knowledge of metaprogramming in elixir so I'll have to 
>>>> learn/practice a lot more before I can come up with an informed response.
>>>>
>>>> I tried out your suggestion and wanted to report back on how it went. 
>>>> Using IO.warn to report problems worked well. However, two issues arose 
>>>> when I added this line to the end of the macro:
>>>>
>>>> raise "There are errors in your query"
>>>>
>>>>
>>>> Here is the code in question:
>>>>
>>>>
>>>> defmodule Queries do
>>>>   use MyGoblet
>>>>
>>>>   query "First" do
>>>>     error1
>>>>     error2
>>>>   end
>>>>
>>>>   query "Second" do
>>>>     error3
>>>>     error4
>>>>   end
>>>> end
>>>>
>>>>
>>>> 1. The first call to the macro ran, reported warnings, and then raised, 
>>>> halting compilation. error3 and error4 were then never reported. This can 
>>>> be resolved by calling raise in an @after_compile hook but I fear doing so 
>>>> may suffer from the same issues you described above. Unless you have any 
>>>> other suggestions I think that this issue, while not ideal, is still 
>>>> acceptable.
>>>>
>>>> 2. Calling raise inside the macro caused the entire file in my editor 
>>>> to turn red which made it next-to-impossible to see the original warnings 
>>>> (see the attached screenshot). This was the diagnostic that was reported 
>>>> from elixir:
>>>>
>>>>
>>>> %Mix.Task.Compiler.Diagnostic{
>>>>   compiler_name: "Elixir",
>>>>   details: nil,
>>>>   file: "/Users/dallin/code/goblet/lib/testing.ex",
>>>>   message: "** (RuntimeError) There are errors in your query\n    
>>>> (goblet 0.1.0) lib/goblet.ex:74: Goblet.build/6\n    expanding macro: 
>>>> MyGoblet.query/2\n    lib/testing.ex:8: Queries (module)\n",
>>>>   position: nil,
>>>>   severity: :error
>>>> }
>>>>
>>>>
>>>> Even though the stack trace has a line number in it, that position is 
>>>> missing at the root of the diagnostic. This is what ultimately causes the 
>>>> issue. Would you like me to file this as a bug in the elixir issue 
>>>> tracker? 
>>>> Or should I instead work with the authors of the editor plugin to handle 
>>>> position-less Diagnostics differently?
>>>>
>>>> [image: screenshot.png]
>>>>
>>>>
>>>>
>>>> On Wednesday, May 13, 2020 at 12:20:29 PM UTC-6, José Valim wrote:
>>>>>
>>>>> Hi Dallin,
>>>>>
>>>>> Thank you for the detailed proposal.
>>>>>
>>>>> It is important to remember that in Elixir compilation and execution 
>>>>> steps are not necessarily distinct. For example, someone could have this 
>>>>> project:
>>>>>
>>>>> # lib/a.ex
>>>>> defmodule A do
>>>>>   use UsesYourMacro
>>>>>   query do
>>>>>     ...
>>>>>   end
>>>>> end
>>>>>
>>>>> # lib/b.ex
>>>>> defmodule B do
>>>>>   A.query
>>>>> end
>>>>>
>>>>> In other words, B can already try to execute the code from A before 
>>>>> compilation finishes. Therefore, "error" can be misleading because 
>>>>> continuing compilation with an error can lead to cascading failures, and 
>>>>> causing the user to chase a bug that's not the original one.
>>>>>
>>>>> At best, you would need to consider mixing "IO.error" and "raise". My 
>>>>> suggestion in your case is to emit warnings for all errors in a 
>>>>> particular 
>>>>> query definition, allowing the user to get multiple reports, and then 
>>>>> raise 
>>>>> at the end of that query definition if any warning was emitted.
>>>>>
>>>>> This doesn't provide warnings across all files but it can be a good 
>>>>> starting point, especially because we indeed cannot continue beyond that 
>>>>> file for the reasons I mentioned above.
>>>>>  
>>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "elixir-lang-core" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to elixir-l...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/elixir-lang-core/ad4e81d8-6495-4511-ad7b-f6064dd1a95c%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/elixir-lang-core/ad4e81d8-6495-4511-ad7b-f6064dd1a95c%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-l...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/704b0050-1e98-4322-b63f-34ebdc36e324%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/704b0050-1e98-4322-b63f-34ebdc36e324%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/d92d2a86-2b27-406f-9d70-a96600fc51ed%40googlegroups.com.

Reply via email to