[squeak-dev] the semantics of SyntaxErrorNotification resume:
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Fri Apr 16 19:52:17 UTC 2021
Le ven. 16 avr. 2021 à 20:35, Nicolas Cellier
<nicolas.cellier.aka.nice at gmail.com> a écrit :
>
> Hi all,
> I see some new tests failing
> - testResumeEarlySyntaxError
> - testResumeLateSyntaxError
>
> This is entirely my fault because of the "fix" of exception handling.
> Indeed, I have not rearmed the exception stack in resume: action, and
> I think I should have done so.
>
> However, I see that SyntaxErrorNotification>>resume: launch a new
> compilation entirely.
> This sounds un-necessary to me because we already have
> ReparseAfterSourceEditing for that purpose...
> (again I'm the original author of that, Christoph only improved it)
>
> IMO, the purpose is not really to resume: but rather to retry
> compilation using newSource.
> We (I ?) have used resume: only because notify:at: does signal a
> SyntaxErrorNotification, then immediately retries if the exception
> resumes.
>
> (notification := SyntaxErrorNotification
> cue: (cue copy
> source: (source contents asText
> copyReplaceFrom: location
> to: location - 1
> with: messageText);
> yourself)
> doitFlag: doitFlag
> errorMessage: string
> location: location) signal.
> notification tryNewSourceIfAvailable
>
> But if the handler does retryWithNewSource: newSource instead of
> resume: newSource, then we just have to let retryWithNewSource perform
> a self resignalAs: ReparseAfterSourceEditing new.
>
> I think that it's the right solution, rather than bending the
> semantics of resume: (the argument of resume: is normally the value
> that should be returned to the sender of signal...).
>
> So if you see some changes of SyntaxErrorNotification in trunk, you'll
> know a bit more about it
> (I'm not sure whether I can redact a commit message with that level of
> explanation).
>
> Nicolas
On the other hand, I cannot entirely remove tryNewSourceIfAvailable,
because it is still the resolution path for SyntaxError window...
So I have two alternatives: resignalAs: or resume: (with
reactivateHandlers fix).
retryWithNewSource: source
"Retry the compilation with new source code.
Assume that there is already a handler of
ReparseAfterSourceEditing on the sender stack.
All I have to do then, is to resignal myself as such and let the
existing handler do its business."
^ self resignalAs: (ReparseAfterSourceEditing new withNewSource: source)
Or:
retryWithNewSource: source
"Retry the compilation with new source code.
Assume:
- that the signallerContext will tryNewSourceIfAvailable
- and the presence of a handler of ReparseAfterSourceEditing on
the sender stack"
newSource := source.
^ self resume: self defaultResumeValue
I'm still in favour of naming it #retryWithNewSource: rather than
resume: because super resume: has another semantic than we shall
better not bend.
More information about the Squeak-dev
mailing list
|