PageRenderTime 22ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/scss.editor/src/org/netbeans/modules/languages/scss/parser/ScssSemanticAnalyzer.java

http://scss-editor.googlecode.com/
Java | 241 lines | 88 code | 29 blank | 124 comment | 7 complexity | b09ee5acb9a01b98f3fbe8213d1c3c96 MD5 | raw file
  1. package org.netbeans.modules.languages.scss.parser;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.netbeans.modules.csl.api.ColoringAttributes;
  5. import org.netbeans.modules.csl.api.OffsetRange;
  6. import org.netbeans.modules.csl.api.SemanticAnalyzer;
  7. import java.util.Set;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. import javax.swing.text.Document;
  11. import org.netbeans.modules.parsing.spi.Parser.Result;
  12. import org.netbeans.modules.parsing.spi.Scheduler;
  13. import org.netbeans.modules.parsing.spi.SchedulerEvent;
  14. import javax.swing.text.StyledDocument;
  15. import org.antlr.runtime.Token;
  16. import org.antlr.runtime.tree.CommonTree;
  17. import org.openide.text.NbDocument;
  18. /**
  19. *
  20. * @author marsaultj
  21. */
  22. public class ScssSemanticAnalyzer extends SemanticAnalyzer {
  23. private boolean cancelled;
  24. private Document doc;
  25. private static final Pattern INTERPOLATION = Pattern.compile("[^\\\\]\\{\\$#?[a-zA-Z0-9\\.\\(\\)]*\\}?");
  26. private static final Pattern VAR = Pattern.compile("#\\{(.+?)\\}");
  27. private Map<OffsetRange, Set<ColoringAttributes>> semanticHighlights;
  28. // @Override
  29. // public Map<OffsetRange, ColoringAttributes> getHighlights() {
  30. // return semanticHighlights;
  31. // }
  32. public void cancel() {
  33. cancelled = true;
  34. }
  35. // public void run(CompilationInfo ci) throws Exception {
  36. @Override
  37. public void run(Result result, SchedulerEvent se) {
  38. final Map<OffsetRange, Set<ColoringAttributes>> highlights = new HashMap<OffsetRange, Set<ColoringAttributes>>();
  39. semanticHighlights = null;
  40. // OffsetRange range = null;
  41. if (cancelled) {
  42. return;
  43. }
  44. System.out.println("CSSSemanticAnalyzer run");
  45. doc = result.getSnapshot().getSource().getDocument(false);
  46. // bag.clear();
  47. // HighlightsSequence.EMPTY;
  48. // OffsetsBag newBag = new OffsetsBag(doc, true);
  49. NBScssParser.ScssEditorParserResult pResult = (NBScssParser.ScssEditorParserResult) result;
  50. CommonTree tree = pResult.getTree();
  51. for (int i = 0; i < tree.getChildCount(); i++) {
  52. if (tree.getChild(i) != null && tree.getChild(i).getText() != null) {
  53. CommonTree node = ((CommonTree) tree.getChild(i));
  54. //node.
  55. Token token = node.token;
  56. int startRef = NbDocument.findLineOffset((StyledDocument) doc, token.getLine() - 1) + token.getCharPositionInLine();
  57. String str = node.getText();
  58. System.out.println("INTERPOLATION.matcher(str)");
  59. Matcher matcher = INTERPOLATION.matcher(str);
  60. while (matcher.find()) {
  61. System.out.println("INTERPOLATION found in str " + str);
  62. int start = startRef + matcher.start();
  63. int end = startRef + matcher.end();
  64. System.out.println(" start = <" + start + ">");
  65. System.out.println(" end = <" + end + ">");
  66. OffsetRange range = new OffsetRange(start, end);
  67. highlights.put(range, ColoringAttributes.CUSTOM2_SET);
  68. OffsetRange varRange = new OffsetRange(start + 2, end - 1);
  69. highlights.put(varRange, ColoringAttributes.FIELD_SET);
  70. }
  71. // matcher = VAR.matcher(str);
  72. // while (matcher.find()) {
  73. // System.out.println("VAR found in str " + str);
  74. // int start = startRef + matcher.start();
  75. // int end = startRef + matcher.end();
  76. // System.out.println(" start = <" + start + ">");
  77. // System.out.println(" end = <" + end + ">");
  78. // OffsetRange range = new OffsetRange(start, end);
  79. // highlights.put(range, ColoringAttributes.FIELD_SET);
  80. // }
  81. // if (node.getType() == ScssLexer.IM_SELECTOR) {
  82. // System.out.println("CSSSemanticAnalyzer run IM_SELECTOR");
  83. // highlights.put(this.addHighlight(node), ColoringAttributes.METHOD_SET);
  84. // System.out.println("CSSSemanticAnalyzer run IM_SELECTOR fin");
  85. //
  86. // }
  87. // if (node.getType() == ScssLexer.IM_PROPERTY) {
  88. // System.out.println("CSSSemanticAnalyzer run IM_PROPERTY");
  89. // highlights.put(this.addHighlight(node), ColoringAttributes.CUSTOM1_SET);
  90. // System.out.println("CSSSemanticAnalyzer run IM_PROPERTY fin");
  91. // }
  92. // System.out.println("CSSSemanticAnalyzer run VAR before");
  93. // if (node.getType() == ScssLexer.IM_VAR) {
  94. // System.out.println("CSSSemanticAnalyzer run VAR");
  95. // highlights.put(this.addHighlight(node), ColoringAttributes.FIELD_SET);
  96. // System.out.println("CSSSemanticAnalyzer run VAR fin");
  97. // }
  98. //TODO repaint vars
  99. }
  100. }
  101. // final Map<OffsetRange, ColoringAttributes> highlights = new HashMap<OffsetRange, ColoringAttributes>();
  102. //
  103. // //XXX fixthis - the css parser always parses the whole css content!
  104. // ParserResult presult = ci.getEmbeddedResults(Css.CSS_MIME_TYPE).iterator().next();
  105. // final TranslatedSource source = presult.getTranslatedSource();
  106. // SimpleNode root = ((CSSParserResult) presult).root();
  107. //
  108. // if (root == null) {
  109. // //serious error in the source, no results
  110. // semanticHighlights = highlights;
  111. // return;
  112. // }
  113. //
  114. // NodeVisitor visitor = new NodeVisitor() {
  115. //
  116. // //XXX using the ColoringAttributes.YYY java specific codes should
  117. // //be changed to something more meaningful
  118. // public void visit(SimpleNode node) {
  119. // if (node.kind() == CSSParserTreeConstants.JJTELEMENTNAME || node.kind() == CSSParserTreeConstants.JJT_CLASS || node.kind() == CSSParserTreeConstants.JJTPSEUDO || node.kind() == CSSParserTreeConstants.JJTHASH || node.kind() == CSSParserTreeConstants.JJTATTRIB) {
  120. // AstOffsetRange range = new AstOffsetRange(node.startOffset(), node.endOffset(), source);
  121. // //filter virtual nodes
  122. // if (!range.isEmpty()) {
  123. // highlights.put(range, ColoringAttributes.METHOD);
  124. // }
  125. // } else if (node.kind() == CSSParserTreeConstants.JJTPROPERTY) {
  126. // //check vendor speficic property
  127. // AstOffsetRange range = new AstOffsetRange(node.startOffset(), node.endOffset(), source);
  128. //
  129. // if (!range.isEmpty()) { //filter virtual nodes
  130. //
  131. // String propertyName = node.image().trim();
  132. // if (CssAnalyser.isVendorSpecificProperty(propertyName)) {
  133. // //special highlight for vend. spec. properties
  134. // highlights.put(range, ColoringAttributes.PARAMETER_USE);
  135. // } else {
  136. // highlights.put(range, ColoringAttributes.PARAMETER);
  137. // }
  138. // }
  139. // }
  140. // }
  141. // };
  142. //
  143. // root.visitChildren(visitor);
  144. // for (int i = 0; i < sheet.getCssRules().getLength(); i++) {
  145. // if (cancelled) {
  146. // return;
  147. // }
  148. //
  149. // CSSRule rule = sheet.getCssRules().item(i);
  150. // if (rule.getType() == CSSRule.STYLE_RULE) {
  151. // CSSStyleRule styleRule = (CSSStyleRule) rule;
  152. //
  153. // CSSStyleDeclaration declaration = styleRule.getStyle();
  154. // System.out.println("rule " + styleRule.getCssText() + ": " + declaration.getCssText());
  155. //
  156. // //TODO compute the range - need to hack the parser so it provides offsets
  157. // OffsetRange range = new OffsetRange(0, 20);
  158. // highlights.put(range, ColoringAttributes.PARAMETER);
  159. // }
  160. // }
  161. System.out.println("highlights size " + highlights.size());
  162. semanticHighlights = highlights;
  163. }
  164. private OffsetRange addHighlight(CommonTree node) {
  165. CommonTree firstChild = (CommonTree) node.getChild(0);
  166. Token token = firstChild.token;
  167. System.out.println(" IMAGINERY_TOKEN = <" + node.getText() + ">");
  168. System.out.println(" subToken.getLine() = <" + token.getLine() + ">");
  169. System.out.println(" subToken.getCharPositionInLine() = <" + token.getCharPositionInLine() + ">");
  170. int start = NbDocument.findLineOffset((StyledDocument) doc, token.getLine() - 1) + token.getCharPositionInLine();
  171. int stop = start + node.getText().length();
  172. System.out.println(" start = <" + start + ">");
  173. System.out.println(" stop = <" + stop + ">");
  174. OffsetRange range = new OffsetRange(start, stop);
  175. return range;
  176. // bag.addHighlight(start, stop, attribute);
  177. }
  178. @Override
  179. public int getPriority() {
  180. return 102;
  181. }
  182. @Override
  183. public Class<? extends Scheduler> getSchedulerClass() {
  184. return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER;
  185. }
  186. @Override
  187. public Map getHighlights() {
  188. System.out.println("getHighlights");
  189. return semanticHighlights;
  190. }
  191. // public static class AstOffsetRange extends OffsetRange {
  192. //
  193. // private TranslatedSource source;
  194. //
  195. // public AstOffsetRange(int start, int end, TranslatedSource source) {
  196. // super(start, end);
  197. // this.source = source;
  198. // }
  199. //
  200. // public int getStart() {
  201. // return source == null ? super.getStart() : source.getLexicalOffset(super.getStart());
  202. // }
  203. //
  204. // public int getEnd() {
  205. // return source == null ? super.getEnd() : source.getLexicalOffset(super.getEnd());
  206. // }
  207. //
  208. // public boolean isEmpty() {
  209. // return getEnd() - getStart() == 0;
  210. // }
  211. // }
  212. }