Given Elixir compile time is really executing code, then I think it would be a nice feature to attempt to extract it from exceptions, although I understand it can be brittle.
If the error is really a compile-time reason (invalid syntax, invalid call, etc), then Elixir does show a proper error with file:line. On Fri, May 15, 2020 at 9:30 PM cward <cadebw...@gmail.com> wrote: > 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> 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. >>> 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 > <https://groups.google.com/d/msgid/elixir-lang-core/d92d2a86-2b27-406f-9d70-a96600fc51ed%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/CAGnRm4%2BcbR9wt9yUopVvBTseiG00t8oNmSMn2viKQax8ZrRWnw%40mail.gmail.com.