What you have is probably fairly reasonable at this time. There are ways to hook into the lifecycle, e.g. invokeMethod, which I assume you have looked at. You could remove some of the duplication around calling _processMessage that way.
Cheers, Paul. On Wed, May 20, 2020 at 1:57 AM o...@ocs.cz <o...@ocs.cz> wrote: > Hi there, > > well, another thing I need to tweak in the compiler is to change the way > the errors and warnings are reported. > > I actually have a trick which so far seems to work and which I bumped into > years ago. It looks like this (again removed the self-evident parts); as > you can see, it is far from elegant: > > === > @GroovyASTTransformation(phase = CompilePhase.INITIALIZATION) > class ErrorReporterOverrideAST extends ASTT { > void visitNodes(ASTNode[] nodes, SourceUnit su) { > ErrorCollectorProxy > ecproxy=ErrorCollectorProxy.newInstance(su.configuration) > ecproxy.su=su > su.errorCollector=ecproxy > } > } > @InheritConstructors class ErrorCollectorProxy extends ErrorCollector { > SourceUnit su > void _processSyntaxException(SyntaxException exc,SourceUnit > ovrdsu=nil) { ... own processing and report ... } > void _processMessage(Message message) { > if (message in SyntaxErrorMessage) > _processSyntaxException(message.cause) > else { ... own processing and report ... } > } > void addError(Message message) { _processMessage(message) } > void addError(Message message, boolean fatal) { > _processMessage(message) } > void addErrorAndContinue(Message message) { _processMessage(message) } > void addErrorAndContinue(SyntaxException error, SourceUnit source) { > _processSyntaxException(error,source) } > void addException(java.lang.Exception cause, SourceUnit source) { ... > own processing and report ... } > void addFatalError(Message message) { _processMessage(message) } > void addWarning(WarningMessage message) { ... own processing and > report ... } > } > === > > The question is, can't it be done in some more elegant and robust way? > E.g., not through and ASTT but simply using a compilation customizer (I > have checked, found none, alas). Or at least, with just one override point > general enough to be sure I won't miss errors in future Groovy releases, or > something like that? > > Sufficient if it works Groovy 3+ only -- I won't change the ASTTs in my > old projects anymore, but would like to clean up the newly refactored ones > far as reasonably possible. > > Thanks! > OC > >