Skip to content

Instantly share code, notes, and snippets.

@shyiko
Last active December 24, 2015 04:49
Show Gist options
  • Save shyiko/6746525 to your computer and use it in GitHub Desktop.
Save shyiko/6746525 to your computer and use it in GitHub Desktop.
(WebStorm 7.0) TODO highlighting fix for CoffeeScript plugin
diff -rupN --exclude=.DS_Store original/src/main/java/org/coffeescript/index/CoffeeScriptIndexPatternBuilder.java src/main/java/org/coffeescript/index/CoffeeScriptIndexPatternBuilder.java
--- original/src/main/java/org/coffeescript/index/CoffeeScriptIndexPatternBuilder.java 1970-01-01 03:00:00.000000000 +0300
+++ src/main/java/org/coffeescript/index/CoffeeScriptIndexPatternBuilder.java 2013-09-28 23:18:30.000000000 +0300
@@ -0,0 +1,41 @@
+package org.coffeescript.index;
+
+import com.intellij.lexer.Lexer;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.impl.search.IndexPatternBuilder;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.tree.TokenSet;
+import org.coffeescript.lang.lexer.CoffeeScriptFlexLexer;
+import org.coffeescript.lang.lexer.CoffeeScriptTokenTypes;
+import org.coffeescript.lang.psi.CoffeeScriptFile;
+
+public class CoffeeScriptIndexPatternBuilder implements IndexPatternBuilder {
+
+ static final TokenSet COMMENTS_FOR_INDEXING = TokenSet.orSet(
+ TokenSet.create(CoffeeScriptTokenTypes.LINE_COMMENT),
+ TokenSet.create(CoffeeScriptTokenTypes.BLOCK_COMMENT)
+ );
+
+ public Lexer getIndexingLexer(PsiFile file) {
+ if ((file instanceof CoffeeScriptFile)) {
+ return new CoffeeScriptFlexLexer();
+ }
+ return null;
+ }
+
+ public TokenSet getCommentTokenSet(PsiFile file) {
+ if ((file instanceof CoffeeScriptFile)) {
+ return COMMENTS_FOR_INDEXING;
+ }
+ return null;
+ }
+
+ public int getCommentStartDelta(IElementType tokenType) {
+ return 0;
+ }
+
+ public int getCommentEndDelta(IElementType tokenType) {
+ return 0; // fixme: return tokenType == CoffeeScriptTokenTypes.C_STYLE_COMMENT ? "###".length() : 0;
+ }
+
+}
diff -rupN --exclude=.DS_Store original/src/main/java/org/coffeescript/index/CoffeeScriptTodoIndexer.java src/main/java/org/coffeescript/index/CoffeeScriptTodoIndexer.java
--- original/src/main/java/org/coffeescript/index/CoffeeScriptTodoIndexer.java 1970-01-01 03:00:00.000000000 +0300
+++ src/main/java/org/coffeescript/index/CoffeeScriptTodoIndexer.java 2013-09-28 23:18:30.000000000 +0300
@@ -0,0 +1,26 @@
+package org.coffeescript.index;
+
+import com.intellij.lexer.Lexer;
+import com.intellij.psi.impl.cache.impl.BaseFilterLexer;
+import com.intellij.psi.impl.cache.impl.OccurrenceConsumer;
+import com.intellij.psi.impl.cache.impl.todo.LexerBasedTodoIndexer;
+import com.intellij.psi.tree.IElementType;
+import org.coffeescript.lang.lexer.CoffeeScriptFlexLexer;
+
+public class CoffeeScriptTodoIndexer extends LexerBasedTodoIndexer {
+
+ public Lexer createLexer(OccurrenceConsumer consumer) {
+ return new BaseFilterLexer(new CoffeeScriptFlexLexer(), consumer) {
+
+ public void advance() {
+ IElementType tokenType = this.myDelegate.getTokenType();
+ if (CoffeeScriptIndexPatternBuilder.COMMENTS_FOR_INDEXING.contains(tokenType)) {
+ scanWordsInToken(2, false, false);
+ advanceTodoItemCountsInToken();
+ }
+ this.myDelegate.advance();
+ }
+ };
+ }
+
+}
diff -rupN --exclude=.DS_Store original/src/main/resources/META-INF/plugin.xml src/main/resources/META-INF/plugin.xml
--- original/src/main/resources/META-INF/plugin.xml 2013-09-26 13:53:44.000000000 +0300
+++ src/main/resources/META-INF/plugin.xml 2013-09-28 21:12:07.000000000 +0300
@@ -35,6 +35,9 @@
<lang.syntaxHighlighterFactory key="CoffeeScript"
implementationClass="org.coffeescript.highlighter.CoffeeScriptHighlighterFactory"/>
+ <todoIndexer filetype="JavaScript" implementationClass="org.coffeescript.index.CoffeeScriptTodoIndexer"/>
+ <indexPatternBuilder implementation="org.coffeescript.index.CoffeeScriptIndexPatternBuilder"/>
+
<highlightErrorFilter implementation="org.coffeescript.highlighter.CoffeeScriptErrorFilter"/>
<problemFileHighlightFilter implementation="org.coffeescript.highlighter.CoffeeProblemFileHighlightFilter"/>
<lang.parserDefinition language="CoffeeScript"
@shyiko
Copy link
Author

shyiko commented Sep 28, 2013

6746525-gradle-based-project.zip usage

  1. download & extract
  2. update (if necessary) location of WebStorm home directory in gradle.properties
  3. (in terminal) ./gradlew (creates patched version of coffeescript.jar under build/libs)
  4. (optional) patch WebStorm with ./gradlew patchCoffeScriptPlugin (revert with ./gradlew revertCoffeScriptPluginPatch)

@shyiko
Copy link
Author

shyiko commented Sep 28, 2013

In order to properly highlight ### todo: something ### (as a single line) CoffeeScriptIndexPatternBuilder.getCommentEndDelta needs to be changed (see fixme note). Also, highlighting inside embedded HTML/JS snippets has not been tested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment