removed out.println() usages
[fedora-idea.git] / lang-impl / src / com / intellij / codeInsight / template / impl / MacroParser.java
blob9978cee2d0eea1e51c995de42780b65e389d5ba5
1 package com.intellij.codeInsight.template.impl;
3 import com.intellij.codeInsight.template.Expression;
4 import com.intellij.codeInsight.template.Macro;
5 import com.intellij.codeInsight.template.macro.MacroFactory;
6 import com.intellij.lexer.Lexer;
7 import com.intellij.psi.tree.IElementType;
9 /**
12 class MacroParser {
13 private MacroParser() {
16 //-----------------------------------------------------------------------------------
17 public static Expression parse(String expression) {
18 if (expression.length() == 0) {
19 return new ConstantNode("");
21 Lexer lexer = new MacroLexer();
22 lexer.start(expression, 0, expression.length(), 0);
23 skipWhitespaces(lexer);
24 return parseMacro(lexer, expression);
27 //-----------------------------------------------------------------------------------
28 private static void advance(Lexer lexer) {
29 lexer.advance();
30 skipWhitespaces(lexer);
33 //-----------------------------------------------------------------------------------
34 private static void skipWhitespaces(Lexer lexer) {
35 while (lexer.getTokenType() == MacroTokenType.WHITE_SPACE) {
36 lexer.advance();
40 //-----------------------------------------------------------------------------------
41 private static String getString(Lexer lexer, String expression) {
42 return expression.substring(lexer.getTokenStart(), lexer.getTokenEnd());
45 //-----------------------------------------------------------------------------------
46 @SuppressWarnings({"HardCodedStringLiteral"})
47 private static Expression parseMacro(Lexer lexer, String expression) {
48 IElementType tokenType = lexer.getTokenType();
49 String token = getString(lexer, expression);
50 if (tokenType == MacroTokenType.STRING_LITERAL) {
51 advance(lexer);
53 return new ConstantNode(token.substring(1, token.length() - 1).replaceAll("\\\\n", "\n").
54 replaceAll("\\\\r", "\r").replaceAll("\\\\t", "\t").replaceAll("\\\\f", "\f").replaceAll("\\\\(.)", "$1"));
57 if (tokenType != MacroTokenType.IDENTIFIER) {
58 System.out.println("Bad macro syntax: Not identifier: " + token);
59 advance(lexer);
60 return new ConstantNode("");
63 Macro macro = MacroFactory.createMacro(token);
64 if (macro == null) {
65 return parseVariable(lexer, expression);
68 advance(lexer);
69 MacroCallNode macroCallNode = new MacroCallNode(macro);
70 if (lexer.getTokenType() == null) {
71 return macroCallNode;
74 if (lexer.getTokenType() != MacroTokenType.LPAREN) {
75 return macroCallNode;
78 advance(lexer);
79 parseParameters(macroCallNode, lexer, expression);
80 if (lexer.getTokenType() != MacroTokenType.RPAREN) {
81 System.out.println("Bad macro syntax: ) expected: " + expression);
83 advance(lexer);
84 return macroCallNode;
87 private static void parseParameters(MacroCallNode macroCallNode, Lexer lexer, String expression) {
88 if (lexer.getTokenType() != MacroTokenType.RPAREN) {
89 while (lexer.getTokenType() != null) {
90 Expression node = parseMacro(lexer, expression);
91 macroCallNode.addParameter(node);
93 if (lexer.getTokenType() == MacroTokenType.COMMA) {
94 advance(lexer);
96 else {
97 break;
103 private static Expression parseVariable(Lexer lexer, String expression) {
104 String variableName = getString(lexer, expression);
105 advance(lexer);
107 if (lexer.getTokenType() == null) {
108 if (TemplateImpl.END.equals(variableName)) {
109 return new EmptyNode();
112 return new VariableNode(variableName, null);
115 if (lexer.getTokenType() != MacroTokenType.EQ) {
116 return new VariableNode(variableName, null);
119 advance(lexer);
120 Expression node = parseMacro(lexer, expression);
121 return new VariableNode(variableName, node);