IntelliJ IDEA FRC Plugin Update Released for 2025 Season

FRC Plugin for IntelliJ IDEA

For the 2025 FRC season, I’ve released version 5.0.0 of the (unofficial) FRC Plugin for IntelliJ IDEA . Versions 2024.1.x, 2024.2.x and 2024.3.x of IntelliJ IDEA are supported for all editions: Community, Education, and Ultimate. (2023.3 and older versions of IntelliJ IDEA are no longer supported. It just takes too much time to maintain numerous versions.)

Installation

You can install the plugin in IntelliJ IDEA by going to File | Settings | Plugins, select the “Marketplace” tab, and then search for “FRC”. Select the “FRC” plugin and click the Install button. After it completes, you may need to restart IntelliJ IDEA.

To upgrade, go the File | Settings | Plugins, select the “Installed” tab, then search either for “FRC” or for “/outdated”. Click the “Update” button. After it completes, you may need to restart IntelliJ IDEA.

What’s New

2025 WPILib Support and Templates

I’ve updated of the New FRC Project Wizard to support the 2025 templates. The Java templates are direct ports of the official WPI Lib templates, with the ability to add some enhancements such as Kotlin support, include a customized the .gitignore file (or exclude it), and more. The Kotlin templates are my conversions of the official Java templates, and are modified to be more Kotlinesque in their design. The Kotlin files are created in src/main/java rather than src/main/kotlin so you can very easily use both Java and Kotlin code in the project, with the classes living side by side. (Kotlin natively supports using either source directory structure.)

Kotlin DSL Gradle file

New for 2025, the New FRC Project Wizard now has the ability to create the Gradle build file using the Gradle Kotlin DSL in a build.gradle.kts file. The usual disclaimers that this is an unofficial implementation apply :slight_smile: But for the Kotlin lovers out there, it’s the next step in coding your robot 100% in Kotlin. NOTE: You do not have to write your Robot in Kotlin, or even have Kotlin support in your robot project, to use the Kotlin DSL in your Gradle build.
image

Run/Debug Configurations storage location changed

The plugin creates IntelliJ IDEA run/debug configurations for building and deploying the robot. These configurations are automatically created 1) when you crate a robot project via the New FRC Project Wizard; 2) the first time you open an externally generated/created FRC robot project in IntelliJ IDEA; 3) “manually” via the menu: Tools | FRC | Create Run/Debug Configurations | Create Build, Deploy, and Debugging Run/Debug Configurations . Previously these were create in a .run directory in the root of the project. This is the recommended alternative directory name for run/debug configurations that you do not want to store inside the .idea directory. (Making their inclusion in git easier.) However, I’ve been plagued by a bug in IntelliJ IDEA that will often remove the generated FRC run/debug configurations from the run/debug menu when Gradle is reimported. Even though the files are still present in the .run directory. Moving them to the default .idea/runConfigurations directory prevents them from disappearing. So they now are placed in that directory. And a !.idea/runConfigurations pattern has been added to the .gitignore file (for projects created via the FRC Plugin’s new project wizard) so the configurations can be shared. (I have opened a bug report with JetBrains on this. So hopefully next season I can move them back to the .run directory.)

Improved FRC Framework detection

Leveraging a new plugin API added in IntelliJ IDEA 2024.1, the detection of an FRC robot project by the plugin, when opening an externally created or generated project for the first time, has been improved. While the old methodology worked well, there were a few corner cases where it failed. And the new methodology is faster.

Known Issues

K2 Mode compatibility

Just after releasing v5.0.0 of the plugin, I learned that the plugin will not load if you have Kotlin K2 compiler support enabled in IntelliJ IDEA. There is a simple fix for this. I need to add a setting in the plugin’s configuration file that declares it it K2 compatible. Since I am not doing any low level Kotlin interactions in my plugin, I can easily make that declaration. I hope to have a fix published this weekend. It then takes up to 48 hours to appear in the marketplace. So with luck, it will be available Monday, Tuesday at the latest. In the meantime, if you have K2 support enabled, you will need to disable it, restart IntelliJ IDEA, and then re-enable (or possibly even reinstall) the FRC plugin. Sorry for the inconvenience. It’s a challenge keeping up on all the changes to the IntelliJ IDEA Plugin API.

Read Access Exceptions

JetBrains has been greatly restructuring the Threading model within IntelliJ IDEA. Over the past year and a half, each new major version of IntelliJ IDEA has had significant changes to the threading model. I have done my best to catch all the places a change is needed. But if one was missed, IntelliJ IDEA will throw an “Read Access” (or “Write Access”) error. These can be reported via the Error Submitter by clicking on the explanation point icon in the lower right of the IDE.

image

This of course will show exception in other plugins and the core IDE itself if applicable. Any ones in the FRC plugin will be labeled as such. Reporting these to me via the Error Submitter will help me track them down and resolve them. No personal information is sent with the report. Just the version of IDE, the version of the Plugin, and the exception stacktrace.

Previously Existing Features

For those new to the FRC plugin for IntelliJ IDEA, here is a list of its features. Many screenshots show the legacy IntelliJ IDEA UI. I need to get updated screenshots created. But functionality is the same in the new UI.

New Project Wizard

The plugin provides a New FRC Project Wizard for generating FRC robot projects in either Java or Kotlin. (Kotlin templates are only available for the Project Templates, and not the numerous example templates.) These are direct ports of the official WPI Lib templates. Launch the Wizard either for the “New Project” button on the IntelliJ IDEA Welcome screen, or via File | New| Project. Select “FRC Robot Project” form the list of project generators. select the version of WPI Lib to use, and click “Next”.

Select the desired template and language, Java or Kotlin, to create the files in. As you select a template, a description of the template is shown. Once you have made you selection, click “Next”.

Select the various options:

Command Based Robot Templates

There are several command based robot class templates to make coding easier. Open the context menu (i.e. right click) on any package folder and select New > FRC > Java (or Kotlin) > Template Name. (You can also access this via the main menu under File > New > FRC > …)

For example, when creating a command, you can select required subsystems:

image

I will note that I need to improve this dialog. If the list of available base commands or subsystems is large, the dialog gets very large. I need to have the UI switch to an alternate layout if there are more than say 6 or 8 items. It’s on the list of things to get to when I have time :slight_smile:

The resultant created command will have the appropriate call to addRequirements:

In Commands written in Kotlin as well:

RioLog Console Tool Window

While the Gradle “riolog” task can be used to view the riolog output in the Gradle build window, the FRC Plugin provides a dedicated RioLog Console Tool Window which allows for pausing, restarting, search, and clearing of the output, either on demand or automatically upon robot restart. It also provides native supports the awesome Grep Console plugin providing you with color syntax highlighting, output folding – so you can have those verbose debug statements folded out of view until you need them – as well as the ability to filter out lines. (FYI, I have no affiliation with the free Grep Console plugin. I just think its a great plugin and therefore wanted to provide support for it, if for no other reason then for my own use :slight_smile: )

Run/Debug Configurations

The FRC Plugin will generate run/debug configurations. This not only makes building and deploying easier – and accessible from all the familiar run/debug keyboard shortcuts – but it makes debugging easier. No more digging through the docs or Chief Delphi to refresh your memory on how to configure things to attach your Robot to the debugger. Simply run the “Build & Deploy Robot for Debugging” configuration, then use one of the “Debug Robot” debugger tasks (depending on how you are connected to the robot) to attach IntelliJ IDEA’s debugger.

image

You can also access the Gradle based run/debug configurations from the Gradle tool window:

image

You can, as of 2023, also create these run/debug configurations via the menu: Tools | FRC | Create Run/Debug Configurations | Create Build, Deploy, and Debugging Run/Debug Configurations.

Automatic notifications of WPILib Updates Available

When a WPILib update is available, the FRC Plugin will provide a notification to you. And with one click, your Gradle build file will be updated to the new version, and your project re-imported (i.e. sync’ed).
image

The check for update can also be run manually from the Tool menu:
image

Notifications for updates only occur for updates for the same season/year. For example, if you open a 2024 robot now, it will not indicate that the 2025.1.1 update is available. This is because new year updates are not backwards compatible. And often you may want to work on a previous years robot.

Note that automatically updating a Kotlin DSL Gradle build file is not yet implemented, I hope to get that implemented in the next week or so.

Vendordeps Addition Detection

If you add a vendordeps file, either manually of via the ./gradlew vendordep --url command, or modify an existing file, the FRC Plugin will detect the change and trigger a Gradle reimport so the new libraries are picked up and added to the project.

There is a bug that if the vendordeps directory did not previously exist, the File Watcher implementation does not work properly and does not trigger the Gradle reimport. It is on my list to resolve this issue. In the meantime, as a workaround, you can manually run the Gradle reimport via the “Reload all Gradle projects” button in the Gradle toolwindow.

I have yet to implement a feature to add a vendordeps file via the IntelliJ IDEA UI. Every year I hope to get to it, and every year it slips. :disappointed: So for now, you can simply download or copy the needed file into the vendordeps directory, or use the ./gradlew vendordep --url command in the terminal window.

Feedback Welcome

As always, I sincerely appreciate any feedback you have. Please let me know if you are finding the plugin worthwhile by commenting below, or giving it a quick 5 star rating , or leaving a review. The positive feedback is very rewarding, and helps incentivizes me to continue working on the plugin. It takes a lot of time to maintain and enhance the plugin and a positive review makes the work worth it. Also please feel free to open any feature requests, or report any issue via the Project’s Issue Tracker . I have a few more minor tweaks I hope to get done and pushed out soon before my Software Mentoring duties become my main focus for Q1.

Good luck to all the teams this year. I hope this plugin helps you to develop your robot with pleasure.

14 Likes

Just a disclaimer from WPILib about this. Kotlin DSL is extremely unsupported from the WPILib end. We’ve had a lot of trouble and bad experiences with it in the past. So you’re unlikely to get any support from our end if something goes wrong with it.

It basically also breaks all VS Code support, which from past experiences doesn’t work with Kotlin DSL either.

So know that if you do choose this path, support will be basically non existent from our end.

2 Likes

Thanks Thad. I do have a disclaimer to this effect in the wizard:

image

I can update the disclaimer to indicate that it will cause issues with VS Code.

It was a popular feature request. Hence why I added it.

1 Like

Adding a warning about vs code would be great, and also remove “event” from the wording there too. Any troubleshooting won’t happen from our end, not just event troubleshooting.

Will do.

EVERY YEAR!! Tbh i just love being able to update a day or 2 after each new inteliJ version is released and this works.

Thanks for the amazing plugin!

1 Like

:smile: I so wish I had more time to work on this plugin. I have so many ideas for it, and I do enjoy developing it. But time is in short supply. I just need to find a wealthy sponsor so I can retire and work on the plugin full time. :sweat_smile:

Thanks. I appreciate it.

1 Like

Using the Debug robot over IP or USB how do we open up the profiler? Assuming we modified the build.gradle to start the server.

When you say “the profiler”, are you referring to the IntelliJ Profiler found in the IntelliJ IDEA Ultimate Edition for profiling memory and CPU usage? If so, I have never tried attaching the profiler. Just the standard debugger.

Also when you say " Assuming we modified the build.gradle to start the server", I am also uncertain to what you are referencing. To debug the gradle property debugMode needs to be set to true. While you can do that by editing the gradle build file, the easier way is to run the Build & Deploy Robot for Debugging configuration (or the Clean Build & Deploy Robot for Debugging configuration. That will set it the gradle property debugMode to true for that deployment and running of the robot. Once the robot is deployed , Click the debug button for the Debug Robot via USB (or IP) configuration. The debug toolwindow should open automatically. But if not, you can click it to open it. Once a breakpoint is hit (or you Pause the run) you will see the the debugging information. You may need to change to the “debugger” (legacy UI) or “Thread & Variables” (new UI) tab.

Hopefully that answers your question. If not, can you give me some more details as to what it is you are trying to do. Thanks.

1 Like

Yes, sorry that wasn’t clear!


—>

from here

frcJava(getArtifactTypeClass('FRCJavaArtifact')) {
   // Enable VisualVM connection
   jvmArgs.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8349")
}

The rest does explain how it was intended. Thanks!