Require capture annotation on extern definitions
Time and time again I and others have observed that capture annotations on externs defaulting to io is more confusing than always requiring it to be explicitly annotated. The following should no longer be accepted:
extern def alert(message: String): Unit =
js "alert(message)"
Instead one has to write the following with the same meaning:
extern def alert(message: String) at io: Unit =
js "alert(message)"
I'd disagree here: if you use tooling, the at io capture is clearly ascribed by the inlay hints via LSP:
https://github.com/user-attachments/assets/9ff1fec2-9cdf-4b91-b0de-3e4a40099974
Nevertheless, one option would be to add a parser warning when a capture set for an external is missing akin to #1249, but we definitely don't want to stop compilation with a bad error just because the user doesn't know the syntax or even semantics of captures (especially since we have a Obviously Correct™️ default).
Here's the context for the parser and warnings:
https://github.com/effekt-lang/effekt/blob/25a07b908374ec3ff06240501e5cfa2d56164552/effekt/shared/src/main/scala/effekt/Parser.scala#L1605-L1606
https://github.com/effekt-lang/effekt/blob/25a07b908374ec3ff06240501e5cfa2d56164552/effekt/shared/src/main/scala/effekt/Parser.scala#L1050-L1058
https://github.com/effekt-lang/effekt/blob/25a07b908374ec3ff06240501e5cfa2d56164552/effekt/shared/src/main/scala/effekt/Parser.scala#L676-L682