Hello there,
I've not had to reach out to the NetBeans community for a while,
although I've been using NetBeans and the RCP for many years.
Most of the work I've done has involved embedding different Swing-based
JPanels in TopComponents and just leveraging the platform's windowing
system etc. Recently I started to develop an editor for a custom
language, which is the first time I've done this. I've been following
the tutorials, and learning a lot about lexing and parsing etc. Along
the way I've run into a few speed bumps, but I've been able to resolve
everything by reading the copious documentation on the platform or, on
occasion, delving into the source on GitHub to see how a particular
issue was been resolved in the IDE itself.
There is one issue I cannot seem to find an answer for.
*The BACKGROUND*
This relates to error highlighting. As per the error highlighting
tutorial
(https://netbeans.apache.org/tutorial/main/tutorials/nbm-javacc-parser/#_implementing_a_new_feature_error_parsing)
I've create an error highlighting task that extends ParserResultTask and
implemented a factory that extends TaskFactory:
public class EclSyntaxErrorHighlightingTask extends
ParserResultTask<EclParserResult> {
@Override
public void run(EclParserResult result, SchedulerEvent event) {
LOG.log(Level.INFO, "Running EclSyntaxErrorHighlightingTask: {0}", new
Object[]{event.toString()});
try {
[ omitted ...]
} catch (BadLocationException |
org.netbeans.modules.parsing.spi.ParseException ex) {
Exceptions.printStackTrace(ex);
}
}
@Override
public int getPriority() {
return 100;
}
@Override
public Class<? extends Scheduler> getSchedulerClass() {
return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER;
}
@Override
public void cancel() {
}
}
and
@MimeRegistration(mimeType = "text/x-eclipse", service = TaskFactory.class)
public class EclSyntaxErrorHighlightingTaskFactory extends TaskFactory {
@Override
public Collection<? extends SchedulerTask> create(Snapshot snapshot) {
EclSyntaxErrorHighlightingTask task = new
EclSyntaxErrorHighlightingTask();
LOG.log(Level.INFO, "Created EclSyntaxErrorHighlightingTask from {0}",
new Object[]{snapshot.toString()});
return Collections.singleton(task);
}
}
Note I've added a couple of logging events so I can see when the factory
is called and creates the highlighting task, and also see when the task
is run. For the eagle-eyed, yes the language is called the eclipse
language, but it is nothing to do with that other IDE. It's a reservoir
simulation language in the oil and gas industry that dates back to the
1980s...
*The ISSUE*
When I run the custom language model as a module within the IDE
(right-click the module and Run), everything works a charm. Opening a
file generates the following in the log:
INFO
[au.com.newwavegeo.eclipse.editor.EclSyntaxErrorHighlightingTaskFactory]:
Created EclSyntaxErrorHighlightingTask from Snapshot 1894046798:
ECLIPSE_Test_Deck.ecl
INFO
[au.com.newwavegeo.eclipse.editor.EclSyntaxErrorHighlightingTaskFactory]:
Created EclSyntaxErrorHighlightingTask from Snapshot 1894046798:
ECLIPSE_Test_Deck.ecl
INFO [au.com.newwavegeo.eclipse.editor.EclSyntaxErrorHighlightingTask]:
Running EclSyntaxErrorHighlightingTask: SchedulerEvent
1007833880(source: CurrentDocumentScheduler)
INFO [au.com.newwavegeo.eclipse.editor.EclSyntaxErrorHighlightingTask]:
Running EclSyntaxErrorHighlightingTask: SchedulerEvent 210858918(source:
CurrentDocumentScheduler)
So the task is being created and added to the Scheduler, and is being run.
Now, rather than running as a standalone module, what I really want to
do is to put the module into my platform suite. Adding the module into
the platform suite and then running the application works for everything
except the error highlighting. So far I've done syntax highlighting,
code completion, code reformatting, code folding, match occurrences.
It's all working. But the error highlighting stubbornly does nothing.
Not even having the decency to throw an exception...
When opening my custom language file, the log now shows:
22:09:48 [EclSyntaxErrorHighlightingTaskFactory|INFO]: Created
EclSyntaxErrorHighlightingTask from Snapshot 1437838154:
ECLIPSE_Test_Deck.ecl
So it appears that the highlighting task gets created, but it just isn't
being run. Ever.
*Attempts to RESOLVE*
In my custom language module I've added all the dependencies needed,
plus a few more for the platform (I have in mind to submit a pull
request for the documentation file which addresses some of the gaps I
came across). I doubt it's a problem with the code I've written -- it
works as a plugin in the IDE. So my thinking is that there must be some
module that needs to be included in the suite which the ParserResultTask
needs for it to be run. However, a brute force solution of just enabling
every single module in the the 'ide' and 'platform' in my suite's
Platform Modules didn't fix the problem. I've made a list of all the
modules that are loaded when I run the module in the IDE and all the
modules that are loaded when I run the platform suite application, and
my next step would be to start enabling one by one to see which one it
is that makes it work.
But before I do that, I thought I'd reach out and see if anyone knows
what I might be missing. Is there something I need to do to activate the
CurrentDocumentScheduler that it appears is calling the highlighting
task when run within the IDE?
I'm running:
*Product Version:* Apache NetBeans IDE 20
*Java:* 17.0.8; OpenJDK 64-Bit Server VM 17.0.8+7
*Runtime:* OpenJDK Runtime Environment 17.0.8+7
*System:* Windows 11 version 10.0 running on amd64; Cp1252; en_AU (nb)
Thanks for reading and for any help or suggestions,
Peter