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 
> <javascript:>> 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 <javascript:>.
>> 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-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/704b0050-1e98-4322-b63f-34ebdc36e324%40googlegroups.com.

Reply via email to