Clone this wiki locally
Welcome to the Non-Dairy-Soy-Plugin wiki!
The Non-Dairy-Soy-Plugin is a plugin for IntelliJ IDEs that adds language support for Google closure templates. The current release of Non-Dairy is compatible with IntelliJ 12 and later.
The plugin provides numerous integrations with standard IDE features:
- Customizable syntax highlighting for over 20 different syntax elements
- Go-to-declaration directly from a call or param tag
- Refatoring support for renaming templates and template parameters
- Find and highlight usages for templates, parameters and function calls
- Code inspections to detect common problems before the soy compiler does
- Symbol search to jump directly to templates
- Code folding on template definitions
- Structure view shows namespace and template names
Ideas for future development include:
- Auto complete for template and parameter names
- Auto insertion of close tags after creating an open tag
- Soy doc popup when creating calls and their parameters
- Translations into other languages
Been pretty busy lately, but I've been able to squeeze in at least 4 hours of work each week, and occasionally a bit more on the weekends. There has been a hefty bit of refactoring and restructuring in the lexer, various parsers, and the path mechanism. As a result, I'm pleased to announce that I will make the first few inspections available in the next release: 0.5.0 (beta)
The path mechanism is fast becoming an extremely powerful framework that can facilitate element traversals with stack operations. This means nearly all path objects can be static. Only the element collections cause churn, and nearly all of that seems to be discarded before it leaves the eden space. Virtually all of the new inspections are resolved using statically defined path objects. I hope is anyone actually looks at the paths, and the implementation behind it, that they make sense. Feedback is welcomed.
Other improvements were made in the testing framework to support tests that require multiple files and depend on the project template cache. I spent waaayyy too much time in 0.4.x manually testing and retesting only to find more regressions than I would have liked. All the cross-file traversal stuff added in 0.4.x, and all the work added for inspections is now covered by unit tests.
There was a big improvement to the web page. Props to Aron R. for his help building the examples, taking the screen shots and his contagious enthusiasm. It still needs lots of love, but since I'm not a UI/UX designer, this really isn't my strong suit. I still need to update it with the stuff I'm adding in 0.5.0.
Feb-19 2012 -- Milestone release: v0.4.0 (beta)!
The plugin now supports lots of useful features now, including the ability to resolve template and parameter references between files, templates can be found using symbol search and refactor rename support for templates and parameters. A few other improvements have been slipped in as well to round out the functionality, and I've spent a significant part of the last week testing, bug fixing and cleaning up the code. (Just ask my wife) I feel good enough about this release to refer to it as a beta.
Next steps will include building a "glory page" to promote the project, and improving the automated test coverage to exercise the reference/resolve and cache mechanisms.
Well, IntelliJ Idea 11 is out, and the plugin, while annoying in 10, is now pretty much broken and unusable. I started with an update to fetch the Idea 11 Community Edition (app + source). I can still only reproduce the bug in the live running app and not in any test. Even with debug mode enabled on the PSIBuilder, I still get no useful information.
I have recently been contacted by a few folks who are interested in this plugin. Even someone who attempted to find the root cause, to whom I owe many thanks for the time spent. Thanks to those who are interested, and my apologies to all the others for leaving this project idle for far too long.
With any luck, I'll have it back up and running on IJ11 in a week or two.
It occurs to me that this plugin is fast approaching the level of functionality I would consider for beta release. I would like to solicit assistance in testing feedback; feel free to log issues here on github. Feel free to capture issues that reveal an unpolished user experience as well.
If anyone want's to see this plugin in a language other than English, please take a look at src/net/venaglia/nondairy/i18n/nondairy_en.properties. There's currently 53 keys to translate (as of v0.3a). The assertion error messages at the bottom should not occur except during development, and may be left in English.
Today, I comitted changes that should make a viable release candidate for v0.3a today. This includes fun things like structure view, code folding, go to declaration, refactor rename, and some bug fixes from v0.2a. The parser is getting closer to being 100% complete, with only a few insignificant things left to wrap up. Oh, I also included a Gimp xcf file for the icons I'm using in the structure view.
Probably the most significant addition in this update is a purely internal mechanism to navigating the Psi tree using traversal directives and element predicates. This has been use extensively for PsiReference implementation returned by PsiElement.getReference(). Needs a few more tweaks, but runs pretty smoothly.
Next week, I'm sure I'll be fixing a whole crop of new bugs that are bound to spring up with all this new functionality. Between bugs and sleep, I'll try to make time to document the code so someone else can follow my nonsense. Maybe I'll burn up some battery life while riding the train to work?
The lexer and package structure should be fairly stable at this point, but the parser still needs more work. The parser currently handles most closure tag commands, and properly recognizes attributes and directives. There is still some work to handle the specialized syntax for for/foreach iterator commands. The expression parser is pretty much complete, although only functions are marked properly at this time. Everything else is marked using a generic "expression" element type.
Next up is to get the iterator commands parsing correctly and handling tag pairs with proper structural hierarchy. Once this is done, I plan to release 0.2a. Although the functionality won't be noticeable to most users, I will appreciate it since I use ctrl-w selection shortcut a fair amount when coding.