package com.dslplatform.ideaplugin; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class DslSyntaxHighlighterFactory extends SyntaxHighlighterFactory { private static class MapKey { private final Project project; private final String file; private final String id; MapKey(Project project, String file) { this.project = project; this.file = file; id = project == null ? file : project.getName() + "/" + file; } @Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if (!(obj instanceof MapKey)) return false; MapKey mk = (MapKey)obj; return mk.id.equals(this.id); } } private final ConcurrentMap<MapKey, DslSyntaxHighlighter> highlighters = new ConcurrentHashMap<MapKey, DslSyntaxHighlighter>(); @NotNull @Override public SyntaxHighlighter getSyntaxHighlighter(Project project, VirtualFile virtualFile) { MapKey key = new MapKey(project, virtualFile != null ? virtualFile.getPath() + "/" + virtualFile.getName() : ""); DslSyntaxHighlighter highlighter = highlighters.get(key); if (highlighter == null || highlighter.virtualFile == null || !highlighter.virtualFile.isValid() || virtualFile != null && !virtualFile.equals(highlighter.virtualFile) || highlighter.isDisposed()) { if (highlighter != null) highlighter.stop(); highlighter = new DslSyntaxHighlighter(project, virtualFile); highlighters.put(key, highlighter); } return highlighter; } }