From 591740717a9dc32a5949191c2c495903d4b1945c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 11 Jul 2011 23:02:18 +0400 Subject: [PATCH] JET-142 Support string templates --- idea/src/org/jetbrains/jet/JetNodeTypes.java | 6 + .../jet/codegen/ExpressionCodegen.java | 19 + .../jet/lang/cfg/JetControlFlowProcessor.java | 11 + .../lang/parsing/JetExpressionParsing.java | 85 +- .../lang/psi/JetBlockStringTemplateEntry.java | 18 + .../jet/lang/psi/JetConstantExpression.java | 1 + .../psi/JetEscapeStringTemplateEntry.java | 18 + .../psi/JetLiteralStringTemplateEntry.java | 18 + .../jet/lang/psi/JetSimpleNameExpression.java | 7 +- .../psi/JetSimpleNameStringTemplateEntry.java | 20 + .../jet/lang/psi/JetStringTemplateEntry.java | 20 + .../JetStringTemplateEntryWithExpression.java | 18 + .../lang/psi/JetStringTemplateExpression.java | 23 + .../jetbrains/jet/lang/psi/JetVisitor.java | 28 + .../jet/lang/types/JetTypeInferrer.java | 38 +- idea/src/org/jetbrains/jet/lexer/Jet.flex | 252 ++-- .../org/jetbrains/jet/lexer/JetTokens.java | 10 + .../org/jetbrains/jet/lexer/_JetLexer.java | 1048 +++++++++-------- .../jetbrains/jet/plugin/JetHighlighter.java | 27 +- idea/testData/checker/StringTemplates.jet | 21 + idea/testData/psi/SimpleExpressions.txt | 14 +- idea/testData/psi/StringTemplates.jet | 22 + idea/testData/psi/StringTemplates.txt | 368 ++++++ idea/testData/psi/When.jet | 2 +- idea/testData/psi/When.txt | 35 +- idea/testData/psi/examples/BinaryTree.txt | 7 +- idea/testData/psi/examples/Builder.txt | 37 +- idea/testData/psi/examples/With.txt | 28 +- idea/testData/resolve/StringTemplates.jet | 21 + 29 files changed, 1565 insertions(+), 657 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetBlockStringTemplateEntry.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetEscapeStringTemplateEntry.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetLiteralStringTemplateEntry.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameStringTemplateEntry.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntry.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntryWithExpression.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateExpression.java create mode 100644 idea/testData/checker/StringTemplates.jet create mode 100644 idea/testData/psi/StringTemplates.jet create mode 100644 idea/testData/psi/StringTemplates.txt create mode 100644 idea/testData/resolve/StringTemplates.jet diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 9b447eefc02..94676d424b9 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -70,6 +70,12 @@ public interface JetNodeTypes { JetNodeType INTEGER_CONSTANT = new JetNodeType("INTEGER_CONSTANT", JetConstantExpression.class); JetNodeType LONG_CONSTANT = new JetNodeType("LONG_CONSTANT", JetConstantExpression.class); + JetNodeType STRING_TEMPLATE = new JetNodeType("STRING_TEMPLATE", JetStringTemplateExpression.class); + JetNodeType LONG_STRING_TEMPLATE_ENTRY = new JetNodeType("LONG_STRING_TEMPLATE_ENTRY", JetBlockStringTemplateEntry.class); + JetNodeType SHORT_STRING_TEMPLATE_ENTRY = new JetNodeType("SHORT_STRING_TEMPLATE_ENTRY", JetSimpleNameStringTemplateEntry.class); + JetNodeType LITERAL_STRING_TEMPLATE_ENTRY = new JetNodeType("LITERAL_STRING_TEMPLATE_ENTRY", JetLiteralStringTemplateEntry.class); + JetNodeType ESCAPE_STRING_TEMPLATE_ENTRY = new JetNodeType("ESCAPE_STRING_TEMPLATE_ENTRY", JetEscapeStringTemplateEntry.class); + JetNodeType TUPLE = new JetNodeType("TUPLE", JetTupleExpression.class); JetNodeType PARENTHESIZED = new JetNodeType("PARENTHESIZED", JetParenthesizedExpression.class); JetNodeType RETURN = new JetNodeType("RETURN", JetReturnExpression.class); diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 36c28f15ba6..f5ae48e8cd1 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -488,6 +488,25 @@ public class ExpressionCodegen extends JetVisitor { myStack.push(StackValue.constant(expression.getValue(), expressionType(expression))); } + @Override + public void visitStringTemplateExpression(JetStringTemplateExpression expression) { + final StringBuilder builder = new StringBuilder(); + for (JetStringTemplateEntry entry : expression.getEntries()) { + entry.accept(new JetVisitor() { + @Override + public void visitStringTemplateEntry(JetStringTemplateEntry entry) { + throw new UnsupportedOperationException("Unsupported string template entry: " + entry); // TODO + } + + @Override + public void visitLiteralStringTemplateEntry(JetLiteralStringTemplateEntry entry) { + builder.append(entry.getText()); + } + }); + } + myStack.push(StackValue.constant(builder.toString(), expressionType(expression))); + } + @Override public void visitBlockExpression(JetBlockExpression expression) { List statements = expression.getStatements(); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index bac7f3e697a..a9cee63c9e7 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -747,6 +747,17 @@ public class JetControlFlowProcessor { } } + @Override + public void visitStringTemplateExpression(JetStringTemplateExpression expression) { + for (JetStringTemplateEntry entry : expression.getEntries()) { + if (entry instanceof JetStringTemplateEntryWithExpression) { + JetStringTemplateEntryWithExpression entryWithExpression = (JetStringTemplateEntryWithExpression) entry; + value(entryWithExpression.getExpression(), true, false); + } + } + builder.read(expression); + } + @Override public void visitTypeProjection(JetTypeProjection typeProjection) { // TODO : Support Type Arguments. Class object may be initialized at this point"); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index ee79c91b1c6..9084406a721 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -69,7 +69,9 @@ public class JetExpressionParsing extends AbstractJetParsing { IDENTIFIER, // SimpleName FIELD_IDENTIFIER, // Field reference - NAMESPACE_KEYWORD // for absolute qualified names + NAMESPACE_KEYWORD, // for absolute qualified names + + OPEN_QUOTE // STRINGS ); private static final TokenSet STATEMENT_FIRST = TokenSet.orSet( @@ -535,12 +537,90 @@ public class JetExpressionParsing extends AbstractJetParsing { else if (at(LBRACE)) { parseFunctionLiteral(); } + else if (at(OPEN_QUOTE)) { + parseStringTemplate(); + } else if (!parseLiteralConstant()) { // TODO: better recovery if FIRST(element) did not match errorWithRecovery("Expecting an element", EXPRESSION_FOLLOW); } } + /* + * stringTemplate + * : OPEN_QUOTE stringTemplateElement* CLOSING_QUOTE + * ; + */ + private void parseStringTemplate() { + assert _at(OPEN_QUOTE); + + PsiBuilder.Marker template = mark(); + + advance(); // OPEN_QUOTE + + while (!eof()) { + if (at(CLOSING_QUOTE) || at(DANGLING_NEWLINE)) { + break; + } + parseStringTemplateElement(); + } + + if (at(DANGLING_NEWLINE)) { + errorAndAdvance("Expecting '\"'"); + } + else { + expect(CLOSING_QUOTE, "Expecting '\"'"); + } + template.done(STRING_TEMPLATE); + } + + /* + * stringTemplateElement + * : RegularStringPart + * : ShortTemplateEntry + * : EscapeSequence + * : longTemplate + * ; + * + * longTemplate + * : "${" expression "}" + * ; + */ + private void parseStringTemplateElement() { + if (at(REGULAR_STRING_PART)) { + PsiBuilder.Marker mark = mark(); + advance(); // REGULAR_STRING_PART + mark.done(LITERAL_STRING_TEMPLATE_ENTRY); + } + else if (at(ESCAPE_SEQUENCE)) { + PsiBuilder.Marker mark = mark(); + advance(); // ESCAPE_SEQUENCE + mark.done(ESCAPE_STRING_TEMPLATE_ENTRY); + } + else if (at(SHORT_TEMPLATE_ENTRY)) { + PsiBuilder.Marker entry = mark(); + + PsiBuilder.Marker reference = mark(); + advance(); // SHORT_TEMPLATE_ENTRY + reference.done(REFERENCE_EXPRESSION); + + entry.done(SHORT_STRING_TEMPLATE_ENTRY); + } + else if (at(LONG_TEMPLATE_ENTRY_START)) { + PsiBuilder.Marker longTemplateEntry = mark(); + + advance(); // LONG_TEMPLATE_ENTRY_START + + parseExpression(); + + expect(LONG_TEMPLATE_ENTRY_END, "Expecting '}'", TokenSet.create(CLOSING_QUOTE, DANGLING_NEWLINE, REGULAR_STRING_PART, ESCAPE_SEQUENCE, SHORT_TEMPLATE_ENTRY)); + longTemplateEntry.done(LONG_STRING_TEMPLATE_ENTRY); + } + else { + errorAndAdvance("Unexpected token in a string template"); + } + } + /* * literalConstant * : "true" | "false" @@ -788,6 +868,9 @@ public class JetExpressionParsing extends AbstractJetParsing { } else if (at(VAL_KEYWORD)) { parseBindingPattern(); pattern.done(BINDING_PATTERN); + } else if (at(OPEN_QUOTE)) { + parseStringTemplate(); + pattern.done(EXPRESSION_PATTERN); } else if (parseLiteralConstant()) { pattern.done(EXPRESSION_PATTERN); } else { diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetBlockStringTemplateEntry.java b/idea/src/org/jetbrains/jet/lang/psi/JetBlockStringTemplateEntry.java new file mode 100644 index 00000000000..82536d2a4d3 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetBlockStringTemplateEntry.java @@ -0,0 +1,18 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetBlockStringTemplateEntry extends JetStringTemplateEntryWithExpression { + public JetBlockStringTemplateEntry(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitBlockStringTemplateEntry(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java index 9bd030956d0..c057e48b0b9 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetConstantExpression.java @@ -67,6 +67,7 @@ public class JetConstantExpression extends JetExpression { return nodeText.charAt(1); } else if (elementType == JetNodeTypes.STRING_CONSTANT) { + if (nodeText.length() == 1) return ""; int tail = nodeText.length(); if (nodeText.endsWith("\"")) tail--; return nodeText.substring(1, tail); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetEscapeStringTemplateEntry.java b/idea/src/org/jetbrains/jet/lang/psi/JetEscapeStringTemplateEntry.java new file mode 100644 index 00000000000..006810c6a28 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetEscapeStringTemplateEntry.java @@ -0,0 +1,18 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetEscapeStringTemplateEntry extends JetStringTemplateEntry { + public JetEscapeStringTemplateEntry(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitEscapeStringTemplateEntry(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetLiteralStringTemplateEntry.java b/idea/src/org/jetbrains/jet/lang/psi/JetLiteralStringTemplateEntry.java new file mode 100644 index 00000000000..d3f921042e4 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetLiteralStringTemplateEntry.java @@ -0,0 +1,18 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetLiteralStringTemplateEntry extends JetStringTemplateEntry { + public JetLiteralStringTemplateEntry(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitLiteralStringTemplateEntry(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java index 98b6e166ba0..d71507e1383 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java @@ -29,7 +29,7 @@ import java.util.List; * @author max */ public class JetSimpleNameExpression extends JetReferenceExpression { - public static final TokenSet REFERENCE_TOKENS = TokenSet.orSet(JetTokens.LABELS, TokenSet.create(JetTokens.IDENTIFIER, JetTokens.FIELD_IDENTIFIER, JetTokens.THIS_KEYWORD)); + public static final TokenSet REFERENCE_TOKENS = TokenSet.orSet(JetTokens.LABELS, TokenSet.create(JetTokens.IDENTIFIER, JetTokens.FIELD_IDENTIFIER, JetTokens.THIS_KEYWORD, JetTokens.SHORT_TEMPLATE_ENTRY)); public JetSimpleNameExpression(@NotNull ASTNode node) { super(node); @@ -41,7 +41,10 @@ public class JetSimpleNameExpression extends JetReferenceExpression { if (referencedNameElement == null) { return null; } - final String text = referencedNameElement.getNode().getText(); + String text = referencedNameElement.getNode().getText(); + if (referencedNameElement.getNode().getElementType() == JetTokens.SHORT_TEMPLATE_ENTRY) { + text = text.substring(1); // Strip the '$' + } if (text.startsWith("`") && text.endsWith("`") && text.length() >= 2) { return text.substring(1, text.length()-1); } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameStringTemplateEntry.java b/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameStringTemplateEntry.java new file mode 100644 index 00000000000..b126b050107 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameStringTemplateEntry.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; + +/** + * @author abreslav + */ +public class JetSimpleNameStringTemplateEntry extends JetStringTemplateEntryWithExpression +{ + public JetSimpleNameStringTemplateEntry(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitSimpleNameStringTemplateEntry(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntry.java b/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntry.java new file mode 100644 index 00000000000..bc679ce2540 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntry.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author abreslav + */ +public abstract class JetStringTemplateEntry extends JetElement { + public JetStringTemplateEntry(@NotNull ASTNode node) { + super(node); + } + + @Nullable + public JetExpression getExpression() { + return findChildByClass(JetExpression.class); + } + +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntryWithExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntryWithExpression.java new file mode 100644 index 00000000000..9114f373c87 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateEntryWithExpression.java @@ -0,0 +1,18 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public abstract class JetStringTemplateEntryWithExpression extends JetStringTemplateEntry { + public JetStringTemplateEntryWithExpression(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitStringTemplateEntryWithExpression(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateExpression.java new file mode 100644 index 00000000000..9f935a0cdab --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetStringTemplateExpression.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetStringTemplateExpression extends JetExpression { + public JetStringTemplateExpression(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitStringTemplateExpression(this); + } + + @NotNull + public JetStringTemplateEntry[] getEntries() { + return findChildrenByClass(JetStringTemplateEntry.class); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 7235bb583d5..fbb90c85a38 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -326,6 +326,10 @@ public class JetVisitor extends PsiElementVisitor { visitExpression(expression); } + public void visitStringTemplateExpression(JetStringTemplateExpression expression) { + visitExpression(expression); + } + public void visitNamedDeclaration(JetNamedDeclaration declaration) { visitDeclaration(declaration); } @@ -389,4 +393,28 @@ public class JetVisitor extends PsiElementVisitor { public void visitBindingPattern(JetBindingPattern pattern) { visitPattern(pattern); } + + public void visitStringTemplateEntry(JetStringTemplateEntry entry) { + visitJetElement(entry); + } + + public void visitStringTemplateEntryWithExpression(JetStringTemplateEntryWithExpression entry) { + visitStringTemplateEntry(entry); + } + + public void visitBlockStringTemplateEntry(JetBlockStringTemplateEntry entry) { + visitStringTemplateEntryWithExpression(entry); + } + + public void visitSimpleNameStringTemplateEntry(JetSimpleNameStringTemplateEntry entry) { + visitStringTemplateEntryWithExpression(entry); + } + + public void visitLiteralStringTemplateEntry(JetLiteralStringTemplateEntry entry) { + visitStringTemplateEntry(entry); + } + + public void visitEscapeStringTemplateEntry(JetEscapeStringTemplateEntry entry) { + visitStringTemplateEntry(entry); + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index b787fa6616b..c9914843aee 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -7,6 +7,7 @@ import com.google.common.collect.Sets; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; @@ -865,7 +866,7 @@ public class JetTypeInferrer { } } else { - assert expression.getReferencedNameElementType() == JetTokens.IDENTIFIER; + assert TokenSet.create(JetTokens.IDENTIFIER, JetTokens.SHORT_TEMPLATE_ENTRY).contains(expression.getReferencedNameElementType()); if (referencedName != null) { VariableDescriptor variable = context.scope.getVariable(referencedName); if (variable != null) { @@ -2431,6 +2432,41 @@ public class JetTypeInferrer { result = null; } + + @Override + public void visitStringTemplateExpression(JetStringTemplateExpression expression) { + for (JetStringTemplateEntry entry : expression.getEntries()) { + entry.accept(new JetVisitor() { + + @Override + public void visitStringTemplateEntryWithExpression(JetStringTemplateEntryWithExpression entry) { + JetExpression entryExpression = entry.getExpression(); + if (entryExpression != null) { + getType(context.scope, entryExpression, true); + } + } + + @Override + public void visitLiteralStringTemplateEntry(JetLiteralStringTemplateEntry entry) { + // Nothing + } + + @Override + public void visitEscapeStringTemplateEntry(JetEscapeStringTemplateEntry entry) { + // TODO : Check escape + String text = entry.getText(); + assert text.length() == 2; + char escaped = text.charAt(1); + Character[] legal = {'n', 'r', 't', 'b', 'f', '$', '\"', '$', '\\'}; + if (!Sets.newHashSet(legal).contains(escaped)) { + context.trace.getErrorHandler().genericError(entry.getNode(), "Illegal escape sequence"); + } + } + }); + } + result = semanticServices.getStandardLibrary().getStringType(); + } + @Override public void visitJetElement(JetElement element) { context.trace.getErrorHandler().genericError(element.getNode(), "[JetTypeInferrer] Unsupported element: " + element + " " + element.getClass().getCanonicalName()); diff --git a/idea/src/org/jetbrains/jet/lexer/Jet.flex b/idea/src/org/jetbrains/jet/lexer/Jet.flex index 1fb3c26dee5..540b41dde74 100644 --- a/idea/src/org/jetbrains/jet/lexer/Jet.flex +++ b/idea/src/org/jetbrains/jet/lexer/Jet.flex @@ -1,6 +1,7 @@ /* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; +import java.util.*; import com.intellij.lexer.*; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; @@ -12,17 +13,49 @@ import org.jetbrains.jet.lexer.JetTokens; %unicode %class _JetLexer %implements FlexLexer + +%{ + private static final class State { + final int lBraceCount; + final int state; + + public State(int state, int lBraceCount) { + this.state = state; + this.lBraceCount = lBraceCount; + } + } + + private final Stack states = new Stack(); + private int lBraceCount; + + private void pushState(int state) { + states.push(new State(yystate(), lBraceCount)); + lBraceCount = 0; + yybegin(state); + } + + private void popState() { + State state = states.pop(); + lBraceCount = state.lBraceCount; + yybegin(state.state); + } +%} + %function advance %type IElementType %eof{ return; %eof} +%xstate STRING +%state LONG_TEMPLATE + DIGIT=[0-9] HEX_DIGIT=[0-9A-Fa-f] WHITE_SPACE_CHAR=[\ \n\t\f] // TODO: prohibit '$' in identifiers? -PLAIN_IDENTIFIER=[:jletter:] [:jletterdigit:]* +LETTER = [:letter:]|_ +PLAIN_IDENTIFIER={LETTER} ([:digit:]|{LETTER})* // TODO: this one MUST allow everything accepted by the runtime // TODO: Replace backticks by one backslash in the begining ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}` @@ -68,109 +101,140 @@ ONE_TWO_QUO = (\"[^\"]) | (\"\"[^\"]) QUO_STRING_CHAR = [^\"] | {ONE_TWO_QUO} RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}? +REGULAR_STRING_PART=[^\\\"\n\$]+ +SHORT_TEMPLATE_ENTRY=\${IDENTIFIER} +LONELY_DOLLAR=\$ +LONG_TEMPLATE_ENTRY_START=\$\{ +LONG_TEMPLATE_ENTRY_END=\} + %% - {BLOCK_COMMENT} { return JetTokens.BLOCK_COMMENT; } - {DOC_COMMENT} { return JetTokens.DOC_COMMENT; } +// String templates - ({WHITE_SPACE_CHAR})+ { return JetTokens.WHITE_SPACE; } +\" { pushState(STRING); return JetTokens.OPEN_QUOTE; } - {EOL_COMMENT} { return JetTokens.EOL_COMMENT; } + \" { popState(); return JetTokens.CLOSING_QUOTE; } + \n { popState(); yypushback(1); return JetTokens.DANGLING_NEWLINE; } + {REGULAR_STRING_PART} { return JetTokens.REGULAR_STRING_PART; } + {ESCAPE_SEQUENCE} { return JetTokens.ESCAPE_SEQUENCE; } + {SHORT_TEMPLATE_ENTRY} { return JetTokens.SHORT_TEMPLATE_ENTRY; } + {LONELY_DOLLAR} { return JetTokens.REGULAR_STRING_PART; } + {LONG_TEMPLATE_ENTRY_START} { pushState(LONG_TEMPLATE); return JetTokens.LONG_TEMPLATE_ENTRY_START; } - {INTEGER_LITERAL}\.\. { yypushback(2); return JetTokens.INTEGER_LITERAL; } - {INTEGER_LITERAL} { return JetTokens.INTEGER_LITERAL; } -// {LONG_LITERAL} { return JetTokens.LONG_LITERAL; } + "{" { lBraceCount++; return JetTokens.LBRACE; } + "}" { + if (lBraceCount == 0) { + popState(); + return JetTokens.LONG_TEMPLATE_ENTRY_END; + } + lBraceCount--; + return JetTokens.RBRACE; + } -// {FLOAT_LITERAL} { return JetTokens.FLOAT_LITERAL; } -// {HEX_FLOAT_LITERAL} { return JetTokens.FLOAT_LITERAL; } - {DOUBLE_LITERAL} { return JetTokens.FLOAT_LITERAL; } - {HEX_DOUBLE_LITERAL} { return JetTokens.FLOAT_LITERAL; } +// Mere mortals + +{BLOCK_COMMENT} { return JetTokens.BLOCK_COMMENT; } +{DOC_COMMENT} { return JetTokens.DOC_COMMENT; } + +({WHITE_SPACE_CHAR})+ { return JetTokens.WHITE_SPACE; } + +{EOL_COMMENT} { return JetTokens.EOL_COMMENT; } + +{INTEGER_LITERAL}\.\. { yypushback(2); return JetTokens.INTEGER_LITERAL; } +{INTEGER_LITERAL} { return JetTokens.INTEGER_LITERAL; } +//{LONG_LITERAL} { return JetTokens.LONG_LITERAL; } + +//{FLOAT_LITERAL} { return JetTokens.FLOAT_LITERAL; } +//{HEX_FLOAT_LITERAL} { return JetTokens.FLOAT_LITERAL; } +{DOUBLE_LITERAL} { return JetTokens.FLOAT_LITERAL; } +{HEX_DOUBLE_LITERAL} { return JetTokens.FLOAT_LITERAL; } + +{CHARACTER_LITERAL} { return JetTokens.CHARACTER_LITERAL; } +//{STRING_LITERAL} { return JetTokens.STRING_LITERAL; } - {CHARACTER_LITERAL} { return JetTokens.CHARACTER_LITERAL; } - {STRING_LITERAL} { return JetTokens.STRING_LITERAL; } // TODO: Decide what to do with """ ... """" - {RAW_STRING_LITERAL} { return JetTokens.RAW_STRING_LITERAL; } +{RAW_STRING_LITERAL} { return JetTokens.RAW_STRING_LITERAL; } - "namespace" { return JetTokens.NAMESPACE_KEYWORD ;} - "continue" { return JetTokens.CONTINUE_KEYWORD ;} - "return" { return JetTokens.RETURN_KEYWORD ;} - "object" { return JetTokens.OBJECT_KEYWORD ;} - "while" { return JetTokens.WHILE_KEYWORD ;} - "break" { return JetTokens.BREAK_KEYWORD ;} - "class" { return JetTokens.CLASS_KEYWORD ;} - "throw" { return JetTokens.THROW_KEYWORD ;} - "false" { return JetTokens.FALSE_KEYWORD ;} - "when" { return JetTokens.WHEN_KEYWORD ;} - "true" { return JetTokens.TRUE_KEYWORD ;} - "type" { return JetTokens.TYPE_KEYWORD ;} - "this" { return JetTokens.THIS_KEYWORD ;} - "null" { return JetTokens.NULL_KEYWORD ;} - "else" { return JetTokens.ELSE_KEYWORD ;} - "This" { return JetTokens.CAPITALIZED_THIS_KEYWORD ;} - "try" { return JetTokens.TRY_KEYWORD ;} - "val" { return JetTokens.VAL_KEYWORD ;} - "var" { return JetTokens.VAR_KEYWORD ;} - "fun" { return JetTokens.FUN_KEYWORD ;} - "for" { return JetTokens.FOR_KEYWORD ;} -// "new" { return JetTokens.NEW_KEYWORD ;} - "is" { return JetTokens.IS_KEYWORD ;} - "in" { return JetTokens.IN_KEYWORD ;} - "if" { return JetTokens.IF_KEYWORD ;} - "do" { return JetTokens.DO_KEYWORD ;} - "as" { return JetTokens.AS_KEYWORD ;} +"namespace" { return JetTokens.NAMESPACE_KEYWORD ;} +"continue" { return JetTokens.CONTINUE_KEYWORD ;} +"return" { return JetTokens.RETURN_KEYWORD ;} +"object" { return JetTokens.OBJECT_KEYWORD ;} +"while" { return JetTokens.WHILE_KEYWORD ;} +"break" { return JetTokens.BREAK_KEYWORD ;} +"class" { return JetTokens.CLASS_KEYWORD ;} +"throw" { return JetTokens.THROW_KEYWORD ;} +"false" { return JetTokens.FALSE_KEYWORD ;} +"when" { return JetTokens.WHEN_KEYWORD ;} +"true" { return JetTokens.TRUE_KEYWORD ;} +"type" { return JetTokens.TYPE_KEYWORD ;} +"this" { return JetTokens.THIS_KEYWORD ;} +"null" { return JetTokens.NULL_KEYWORD ;} +"else" { return JetTokens.ELSE_KEYWORD ;} +"This" { return JetTokens.CAPITALIZED_THIS_KEYWORD ;} +"try" { return JetTokens.TRY_KEYWORD ;} +"val" { return JetTokens.VAL_KEYWORD ;} +"var" { return JetTokens.VAR_KEYWORD ;} +"fun" { return JetTokens.FUN_KEYWORD ;} +"for" { return JetTokens.FOR_KEYWORD ;} +//"new" { return JetTokens.NEW_KEYWORD ;} +"is" { return JetTokens.IS_KEYWORD ;} +"in" { return JetTokens.IN_KEYWORD ;} +"if" { return JetTokens.IF_KEYWORD ;} +"do" { return JetTokens.DO_KEYWORD ;} +"as" { return JetTokens.AS_KEYWORD ;} - {FIELD_IDENTIFIER} { return JetTokens.FIELD_IDENTIFIER; } - {IDENTIFIER} { return JetTokens.IDENTIFIER; } - {LABEL_IDENTIFIER} { return JetTokens.LABEL_IDENTIFIER; } +{FIELD_IDENTIFIER} { return JetTokens.FIELD_IDENTIFIER; } +{IDENTIFIER} { return JetTokens.IDENTIFIER; } +{LABEL_IDENTIFIER} { return JetTokens.LABEL_IDENTIFIER; } - "===" { return JetTokens.EQEQEQ ; } - "!==" { return JetTokens.EXCLEQEQEQ; } - "!in" { return JetTokens.NOT_IN; } - "!is" { return JetTokens.NOT_IS; } - "as?" { return JetTokens.AS_SAFE; } - "++" { return JetTokens.PLUSPLUS ; } - "--" { return JetTokens.MINUSMINUS; } - "<=" { return JetTokens.LTEQ ; } - ">=" { return JetTokens.GTEQ ; } - "==" { return JetTokens.EQEQ ; } - "!=" { return JetTokens.EXCLEQ ; } - "&&" { return JetTokens.ANDAND ; } - "||" { return JetTokens.OROR ; } - "?." { return JetTokens.SAFE_ACCESS;} - "?:" { return JetTokens.ELVIS ; } -// ".*" { return JetTokens.MAP ; } -// ".?" { return JetTokens.FILTER ; } - "*=" { return JetTokens.MULTEQ ; } - "/=" { return JetTokens.DIVEQ ; } - "%=" { return JetTokens.PERCEQ ; } - "+=" { return JetTokens.PLUSEQ ; } - "-=" { return JetTokens.MINUSEQ ; } - "->" { return JetTokens.ARROW ; } - "=>" { return JetTokens.DOUBLE_ARROW; } - ".." { return JetTokens.RANGE ; } - "@@" { return JetTokens.ATAT ; } - "[" { return JetTokens.LBRACKET ; } - "]" { return JetTokens.RBRACKET ; } - "{" { return JetTokens.LBRACE ; } - "}" { return JetTokens.RBRACE ; } - "(" { return JetTokens.LPAR ; } - ")" { return JetTokens.RPAR ; } - "." { return JetTokens.DOT ; } - "*" { return JetTokens.MUL ; } - "+" { return JetTokens.PLUS ; } - "-" { return JetTokens.MINUS ; } - "!" { return JetTokens.EXCL ; } - "/" { return JetTokens.DIV ; } - "%" { return JetTokens.PERC ; } - "<" { return JetTokens.LT ; } - ">" { return JetTokens.GT ; } - "?" { return JetTokens.QUEST ; } - ":" { return JetTokens.COLON ; } - ";" { return JetTokens.SEMICOLON ; } - "=" { return JetTokens.EQ ; } - "," { return JetTokens.COMMA ; } - "#" { return JetTokens.HASH ; } - "@" { return JetTokens.AT ; } +"===" { return JetTokens.EQEQEQ ; } +"!==" { return JetTokens.EXCLEQEQEQ; } +"!in" { return JetTokens.NOT_IN; } +"!is" { return JetTokens.NOT_IS; } +"as?" { return JetTokens.AS_SAFE; } +"++" { return JetTokens.PLUSPLUS ; } +"--" { return JetTokens.MINUSMINUS; } +"<=" { return JetTokens.LTEQ ; } +">=" { return JetTokens.GTEQ ; } +"==" { return JetTokens.EQEQ ; } +"!=" { return JetTokens.EXCLEQ ; } +"&&" { return JetTokens.ANDAND ; } +"||" { return JetTokens.OROR ; } +"?." { return JetTokens.SAFE_ACCESS;} +"?:" { return JetTokens.ELVIS ; } +//".*" { return JetTokens.MAP ; } +//".?" { return JetTokens.FILTER ; } +"*=" { return JetTokens.MULTEQ ; } +"/=" { return JetTokens.DIVEQ ; } +"%=" { return JetTokens.PERCEQ ; } +"+=" { return JetTokens.PLUSEQ ; } +"-=" { return JetTokens.MINUSEQ ; } +"->" { return JetTokens.ARROW ; } +"=>" { return JetTokens.DOUBLE_ARROW; } +".." { return JetTokens.RANGE ; } +"@@" { return JetTokens.ATAT ; } +"[" { return JetTokens.LBRACKET ; } +"]" { return JetTokens.RBRACKET ; } +"{" { return JetTokens.LBRACE ; } +"}" { return JetTokens.RBRACE ; } +"(" { return JetTokens.LPAR ; } +")" { return JetTokens.RPAR ; } +"." { return JetTokens.DOT ; } +"*" { return JetTokens.MUL ; } +"+" { return JetTokens.PLUS ; } +"-" { return JetTokens.MINUS ; } +"!" { return JetTokens.EXCL ; } +"/" { return JetTokens.DIV ; } +"%" { return JetTokens.PERC ; } +"<" { return JetTokens.LT ; } +">" { return JetTokens.GT ; } +"?" { return JetTokens.QUEST ; } +":" { return JetTokens.COLON ; } +";" { return JetTokens.SEMICOLON ; } +"=" { return JetTokens.EQ ; } +"," { return JetTokens.COMMA ; } +"#" { return JetTokens.HASH ; } +"@" { return JetTokens.AT ; } - . { return TokenType.BAD_CHARACTER; } +. { return TokenType.BAD_CHARACTER; } diff --git a/idea/src/org/jetbrains/jet/lexer/JetTokens.java b/idea/src/org/jetbrains/jet/lexer/JetTokens.java index bfa7d488288..59dbafd9366 100644 --- a/idea/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/idea/src/org/jetbrains/jet/lexer/JetTokens.java @@ -21,6 +21,16 @@ public interface JetTokens { JetToken FLOAT_LITERAL = new JetToken("FLOAT_CONSTANT"); JetToken CHARACTER_LITERAL = new JetToken("CHARACTER_LITERAL"); JetToken STRING_LITERAL = new JetToken("STRING_LITERAL"); + + JetToken CLOSING_QUOTE = new JetToken("CLOSING_QUOTE"); + JetToken OPEN_QUOTE = new JetToken("OPEN_QUOTE"); + JetToken REGULAR_STRING_PART = new JetToken("REGULAR_STRING_PART"); + JetToken SHORT_TEMPLATE_ENTRY = new JetToken("SHORT_TEMPLATE_ENTRY"); + JetToken ESCAPE_SEQUENCE = new JetToken("ESCAPE_SEQUENCE"); + JetToken LONG_TEMPLATE_ENTRY_START = new JetToken("LONG_TEMPLATE_ENTRY_START"); + JetToken LONG_TEMPLATE_ENTRY_END = new JetToken("LONG_TEMPLATE_ENTRY_END"); + JetToken DANGLING_NEWLINE = new JetToken("DANGLING_NEWLINE"); + JetToken RAW_STRING_LITERAL = new JetToken("RAW_STRING_LITERAL"); JetKeywordToken NAMESPACE_KEYWORD = JetKeywordToken.keyword("namespace"); diff --git a/idea/src/org/jetbrains/jet/lexer/_JetLexer.java b/idea/src/org/jetbrains/jet/lexer/_JetLexer.java index 36cb03fff84..cb0dc0fd86e 100644 --- a/idea/src/org/jetbrains/jet/lexer/_JetLexer.java +++ b/idea/src/org/jetbrains/jet/lexer/_JetLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 7/8/11 9:42 PM */ +/* The following code was generated by JFlex 1.4.3 on 7/11/11 10:31 PM */ /* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; @@ -7,11 +7,13 @@ import com.intellij.lexer.FlexLexer; import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; +import java.util.Stack; + /** * This class is a scanner generated by * JFlex 1.4.3 - * on 7/8/11 9:42 PM from the specification file + * on 7/11/11 10:31 PM from the specification file * /Users/abreslav/work/jet/idea/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { @@ -19,6 +21,8 @@ class _JetLexer implements FlexLexer { private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ + public static final int LONG_TEMPLATE = 4; + public static final int STRING = 2; public static final int YYINITIAL = 0; /** @@ -28,103 +32,80 @@ class _JetLexer implements FlexLexer { * l is of the form l = 2*k, k a non negative integer */ private static final int ZZ_LEXSTATE[] = { - 0, 0 + 0, 0, 1, 1, 2, 2 }; /** * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\11\5\1\3\1\13\1\0\1\3\1\0\16\5\4\0\1\3\1\56"+ - "\1\25\1\77\1\7\1\66\1\63\1\23\1\73\1\74\1\12\1\60"+ - "\1\76\1\21\1\17\1\11\1\14\11\1\1\65\1\75\1\61\1\55"+ - "\1\62\1\57\1\10\1\2\1\16\2\2\1\20\1\2\5\4\1\4"+ - "\3\4\1\22\3\4\1\52\3\4\1\15\2\4\1\67\1\24\1\70"+ - "\1\0\1\4\1\6\1\27\1\42\1\34\1\54\1\31\1\50\1\4"+ - "\1\45\1\37\1\43\1\47\1\46\1\30\1\26\1\35\1\33\1\4"+ - "\1\41\1\32\1\36\1\40\1\53\1\44\1\15\1\51\1\4\1\71"+ - "\1\64\1\72\1\0\41\5\2\0\4\4\4\0\1\4\2\0\1\5"+ - "\7\0\1\4\4\0\1\4\5\0\27\4\1\0\37\4\1\0\u013f\4"+ - "\31\0\162\4\4\0\14\4\16\0\5\4\11\0\1\4\21\0\130\5"+ - "\5\0\23\5\12\0\1\4\13\0\1\4\1\0\3\4\1\0\1\4"+ - "\1\0\24\4\1\0\54\4\1\0\46\4\1\0\5\4\4\0\202\4"+ - "\1\0\4\5\3\0\105\4\1\0\46\4\2\0\2\4\6\0\20\4"+ - "\41\0\46\4\2\0\1\4\7\0\47\4\11\0\21\5\1\0\27\5"+ - "\1\0\3\5\1\0\1\5\1\0\2\5\1\0\1\5\13\0\33\4"+ - "\5\0\3\4\15\0\4\5\14\0\6\5\13\0\32\4\5\0\13\4"+ - "\16\5\7\0\12\5\4\0\2\4\1\5\143\4\1\0\1\4\10\5"+ - "\1\0\6\5\2\4\2\5\1\0\4\5\2\4\12\5\3\4\2\0"+ - "\1\4\17\0\1\5\1\4\1\5\36\4\33\5\2\0\3\4\60\0"+ - "\46\4\13\5\1\4\u014f\0\3\5\66\4\2\0\1\5\1\4\20\5"+ - "\2\0\1\4\4\5\3\0\12\4\2\5\2\0\12\5\21\0\3\5"+ - "\1\0\10\4\2\0\2\4\2\0\26\4\1\0\7\4\1\0\1\4"+ - "\3\0\4\4\2\0\1\5\1\4\7\5\2\0\2\5\2\0\3\5"+ - "\11\0\1\5\4\0\2\4\1\0\3\4\2\5\2\0\12\5\4\4"+ - "\15\0\3\5\1\0\6\4\4\0\2\4\2\0\26\4\1\0\7\4"+ - "\1\0\2\4\1\0\2\4\1\0\2\4\2\0\1\5\1\0\5\5"+ - "\4\0\2\5\2\0\3\5\13\0\4\4\1\0\1\4\7\0\14\5"+ - "\3\4\14\0\3\5\1\0\11\4\1\0\3\4\1\0\26\4\1\0"+ - "\7\4\1\0\2\4\1\0\5\4\2\0\1\5\1\4\10\5\1\0"+ - "\3\5\1\0\3\5\2\0\1\4\17\0\2\4\2\5\2\0\12\5"+ - "\1\0\1\4\17\0\3\5\1\0\10\4\2\0\2\4\2\0\26\4"+ - "\1\0\7\4\1\0\2\4\1\0\5\4\2\0\1\5\1\4\6\5"+ - "\3\0\2\5\2\0\3\5\10\0\2\5\4\0\2\4\1\0\3\4"+ - "\4\0\12\5\1\0\1\4\20\0\1\5\1\4\1\0\6\4\3\0"+ - "\3\4\1\0\4\4\3\0\2\4\1\0\1\4\1\0\2\4\3\0"+ - "\2\4\3\0\3\4\3\0\10\4\1\0\3\4\4\0\5\5\3\0"+ - "\3\5\1\0\4\5\11\0\1\5\17\0\11\5\11\0\1\4\7\0"+ - "\3\5\1\0\10\4\1\0\3\4\1\0\27\4\1\0\12\4\1\0"+ - "\5\4\4\0\7\5\1\0\3\5\1\0\4\5\7\0\2\5\11\0"+ - "\2\4\4\0\12\5\22\0\2\5\1\0\10\4\1\0\3\4\1\0"+ - "\27\4\1\0\12\4\1\0\5\4\2\0\1\5\1\4\7\5\1\0"+ - "\3\5\1\0\4\5\7\0\2\5\7\0\1\4\1\0\2\4\4\0"+ - "\12\5\22\0\2\5\1\0\10\4\1\0\3\4\1\0\27\4\1\0"+ - "\20\4\4\0\6\5\2\0\3\5\1\0\4\5\11\0\1\5\10\0"+ - "\2\4\4\0\12\5\22\0\2\5\1\0\22\4\3\0\30\4\1\0"+ - "\11\4\1\0\1\4\2\0\7\4\3\0\1\5\4\0\6\5\1\0"+ - "\1\5\1\0\10\5\22\0\2\5\15\0\60\4\1\5\2\4\7\5"+ - "\4\0\10\4\10\5\1\0\12\5\47\0\2\4\1\0\1\4\2\0"+ - "\2\4\1\0\1\4\2\0\1\4\6\0\4\4\1\0\7\4\1\0"+ - "\3\4\1\0\1\4\1\0\1\4\2\0\2\4\1\0\4\4\1\5"+ - "\2\4\6\5\1\0\2\5\1\4\2\0\5\4\1\0\1\4\1\0"+ - "\6\5\2\0\12\5\2\0\2\4\42\0\1\4\27\0\2\5\6\0"+ - "\12\5\13\0\1\5\1\0\1\5\1\0\1\5\4\0\2\5\10\4"+ - "\1\0\42\4\6\0\24\5\1\0\2\5\4\4\4\0\10\5\1\0"+ - "\44\5\11\0\1\5\71\0\42\4\1\0\5\4\1\0\2\4\1\0"+ - "\7\5\3\0\4\5\6\0\12\5\6\0\6\4\4\5\106\0\46\4"+ - "\12\0\51\4\7\0\132\4\5\0\104\4\5\0\122\4\6\0\7\4"+ - "\1\0\77\4\1\0\1\4\1\0\4\4\2\0\7\4\1\0\1\4"+ - "\1\0\4\4\2\0\47\4\1\0\1\4\1\0\4\4\2\0\37\4"+ - "\1\0\1\4\1\0\4\4\2\0\7\4\1\0\1\4\1\0\4\4"+ - "\2\0\7\4\1\0\7\4\1\0\27\4\1\0\37\4\1\0\1\4"+ - "\1\0\4\4\2\0\7\4\1\0\47\4\1\0\23\4\16\0\11\5"+ - "\56\0\125\4\14\0\u026c\4\2\0\10\4\12\0\32\4\5\0\113\4"+ - "\3\0\3\4\17\0\15\4\1\0\4\4\3\5\13\0\22\4\3\5"+ - "\13\0\22\4\2\5\14\0\15\4\1\0\3\4\1\0\2\5\14\0"+ - "\64\4\40\5\3\0\1\4\3\0\2\4\1\5\2\0\12\5\41\0"+ - "\3\5\2\0\12\5\6\0\130\4\10\0\51\4\1\5\126\0\35\4"+ - "\3\0\14\5\4\0\14\5\12\0\12\5\36\4\2\0\5\4\u038b\0"+ - "\154\4\224\0\234\4\4\0\132\4\6\0\26\4\2\0\6\4\2\0"+ - "\46\4\2\0\6\4\2\0\10\4\1\0\1\4\1\0\1\4\1\0"+ - "\1\4\1\0\37\4\2\0\65\4\1\0\7\4\1\0\1\4\3\0"+ - "\3\4\1\0\7\4\3\0\4\4\2\0\6\4\4\0\15\4\5\0"+ - "\3\4\1\0\7\4\17\0\4\5\32\0\5\5\20\0\2\4\23\0"+ - "\1\4\13\0\4\5\6\0\6\5\1\0\1\4\15\0\1\4\40\0"+ - "\22\4\36\0\15\5\4\0\1\5\3\0\6\5\27\0\1\4\4\0"+ - "\1\4\2\0\12\4\1\0\1\4\3\0\5\4\6\0\1\4\1\0"+ - "\1\4\1\0\1\4\1\0\4\4\1\0\3\4\1\0\7\4\3\0"+ - "\3\4\5\0\5\4\26\0\44\4\u0e81\0\3\4\31\0\11\4\6\5"+ - "\1\0\5\4\2\0\5\4\4\0\126\4\2\0\2\5\2\0\3\4"+ - "\1\0\137\4\5\0\50\4\4\0\136\4\21\0\30\4\70\0\20\4"+ - "\u0200\0\u19b6\4\112\0\u51a6\4\132\0\u048d\4\u0773\0\u2ba4\4\u215c\0\u012e\4"+ - "\2\0\73\4\225\0\7\4\14\0\5\4\5\0\1\4\1\5\12\4"+ - "\1\0\15\4\1\0\5\4\1\0\1\4\1\0\2\4\1\0\2\4"+ - "\1\0\154\4\41\0\u016b\4\22\0\100\4\2\0\66\4\50\0\15\4"+ - "\3\0\20\5\20\0\4\5\17\0\2\4\30\0\3\4\31\0\1\4"+ - "\6\0\5\4\1\0\207\4\2\0\1\5\4\0\1\4\13\0\12\5"+ - "\7\0\32\4\4\0\1\4\1\0\32\4\12\0\132\4\3\0\6\4"+ - "\2\0\6\4\2\0\6\4\2\0\3\4\3\0\2\4\3\0\2\4"+ - "\22\0\3\5\4\0"; + "\11\0\1\3\1\13\1\0\1\3\23\0\1\3\1\60\1\25\1\77"+ + "\1\7\1\70\1\65\1\23\1\73\1\74\1\12\1\62\1\76\1\21"+ + "\1\17\1\11\1\14\11\1\1\67\1\75\1\63\1\57\1\64\1\61"+ + "\1\10\1\2\1\16\2\2\1\20\1\2\5\4\1\4\3\4\1\22"+ + "\3\4\1\54\3\4\1\15\2\4\1\71\1\24\1\72\1\0\1\4"+ + "\1\6\1\31\1\44\1\36\1\56\1\33\1\52\1\4\1\47\1\41"+ + "\1\45\1\51\1\50\1\32\1\30\1\37\1\35\1\4\1\43\1\34"+ + "\1\40\1\42\1\55\1\46\1\15\1\53\1\4\1\26\1\66\1\27"+ + "\54\0\1\4\12\0\1\4\4\0\1\4\5\0\27\4\1\0\37\4"+ + "\1\0\u013f\4\31\0\162\4\4\0\14\4\16\0\5\4\11\0\1\4"+ + "\213\0\1\4\13\0\1\4\1\0\3\4\1\0\1\4\1\0\24\4"+ + "\1\0\54\4\1\0\46\4\1\0\5\4\4\0\202\4\10\0\105\4"+ + "\1\0\46\4\2\0\2\4\6\0\20\4\41\0\46\4\2\0\1\4"+ + "\7\0\47\4\110\0\33\4\5\0\3\4\56\0\32\4\5\0\13\4"+ + "\25\0\12\5\4\0\2\4\1\0\143\4\1\0\1\4\17\0\2\4"+ + "\7\0\2\4\12\5\3\4\2\0\1\4\20\0\1\4\1\0\36\4"+ + "\35\0\3\4\60\0\46\4\13\0\1\4\u0152\0\66\4\3\0\1\4"+ + "\22\0\1\4\7\0\12\4\4\0\12\5\25\0\10\4\2\0\2\4"+ + "\2\0\26\4\1\0\7\4\1\0\1\4\3\0\4\4\3\0\1\4"+ + "\36\0\2\4\1\0\3\4\4\0\12\5\2\4\23\0\6\4\4\0"+ + "\2\4\2\0\26\4\1\0\7\4\1\0\2\4\1\0\2\4\1\0"+ + "\2\4\37\0\4\4\1\0\1\4\7\0\12\5\2\0\3\4\20\0"+ + "\11\4\1\0\3\4\1\0\26\4\1\0\7\4\1\0\2\4\1\0"+ + "\5\4\3\0\1\4\22\0\1\4\17\0\2\4\4\0\12\5\25\0"+ + "\10\4\2\0\2\4\2\0\26\4\1\0\7\4\1\0\2\4\1\0"+ + "\5\4\3\0\1\4\36\0\2\4\1\0\3\4\4\0\12\5\1\0"+ + "\1\4\21\0\1\4\1\0\6\4\3\0\3\4\1\0\4\4\3\0"+ + "\2\4\1\0\1\4\1\0\2\4\3\0\2\4\3\0\3\4\3\0"+ + "\10\4\1\0\3\4\55\0\11\5\25\0\10\4\1\0\3\4\1\0"+ + "\27\4\1\0\12\4\1\0\5\4\46\0\2\4\4\0\12\5\25\0"+ + "\10\4\1\0\3\4\1\0\27\4\1\0\12\4\1\0\5\4\3\0"+ + "\1\4\40\0\1\4\1\0\2\4\4\0\12\5\25\0\10\4\1\0"+ + "\3\4\1\0\27\4\1\0\20\4\46\0\2\4\4\0\12\5\25\0"+ + "\22\4\3\0\30\4\1\0\11\4\1\0\1\4\2\0\7\4\72\0"+ + "\60\4\1\0\2\4\14\0\7\4\11\0\12\5\47\0\2\4\1\0"+ + "\1\4\2\0\2\4\1\0\1\4\2\0\1\4\6\0\4\4\1\0"+ + "\7\4\1\0\3\4\1\0\1\4\1\0\1\4\2\0\2\4\1\0"+ + "\4\4\1\0\2\4\11\0\1\4\2\0\5\4\1\0\1\4\11\0"+ + "\12\5\2\0\2\4\42\0\1\4\37\0\12\5\26\0\10\4\1\0"+ + "\42\4\35\0\4\4\164\0\42\4\1\0\5\4\1\0\2\4\25\0"+ + "\12\5\6\0\6\4\112\0\46\4\12\0\51\4\7\0\132\4\5\0"+ + "\104\4\5\0\122\4\6\0\7\4\1\0\77\4\1\0\1\4\1\0"+ + "\4\4\2\0\7\4\1\0\1\4\1\0\4\4\2\0\47\4\1\0"+ + "\1\4\1\0\4\4\2\0\37\4\1\0\1\4\1\0\4\4\2\0"+ + "\7\4\1\0\1\4\1\0\4\4\2\0\7\4\1\0\7\4\1\0"+ + "\27\4\1\0\37\4\1\0\1\4\1\0\4\4\2\0\7\4\1\0"+ + "\47\4\1\0\23\4\16\0\11\5\56\0\125\4\14\0\u026c\4\2\0"+ + "\10\4\12\0\32\4\5\0\113\4\25\0\15\4\1\0\4\4\16\0"+ + "\22\4\16\0\22\4\16\0\15\4\1\0\3\4\17\0\64\4\43\0"+ + "\1\4\4\0\1\4\3\0\12\5\46\0\12\5\6\0\130\4\10\0"+ + "\51\4\127\0\35\4\51\0\12\5\36\4\2\0\5\4\u038b\0\154\4"+ + "\224\0\234\4\4\0\132\4\6\0\26\4\2\0\6\4\2\0\46\4"+ + "\2\0\6\4\2\0\10\4\1\0\1\4\1\0\1\4\1\0\1\4"+ + "\1\0\37\4\2\0\65\4\1\0\7\4\1\0\1\4\3\0\3\4"+ + "\1\0\7\4\3\0\4\4\2\0\6\4\4\0\15\4\5\0\3\4"+ + "\1\0\7\4\164\0\1\4\15\0\1\4\202\0\1\4\4\0\1\4"+ + "\2\0\12\4\1\0\1\4\3\0\5\4\6\0\1\4\1\0\1\4"+ + "\1\0\1\4\1\0\4\4\1\0\3\4\1\0\7\4\3\0\3\4"+ + "\5\0\5\4\u0ebb\0\2\4\52\0\5\4\5\0\2\4\4\0\126\4"+ + "\6\0\3\4\1\0\132\4\1\0\4\4\5\0\50\4\4\0\136\4"+ + "\21\0\30\4\70\0\20\4\u0200\0\u19b6\4\112\0\u51a6\4\132\0\u048d\4"+ + "\u0773\0\u2ba4\4\u215c\0\u012e\4\2\0\73\4\225\0\7\4\14\0\5\4"+ + "\5\0\1\4\1\0\12\4\1\0\15\4\1\0\5\4\1\0\1\4"+ + "\1\0\2\4\1\0\2\4\1\0\154\4\41\0\u016b\4\22\0\100\4"+ + "\2\0\66\4\50\0\14\4\164\0\5\4\1\0\207\4\23\0\12\5"+ + "\7\0\32\4\6\0\32\4\13\0\131\4\3\0\6\4\2\0\6\4"+ + "\2\0\6\4\2\0\3\4\43\0"; /** * Translates characters to character classes @@ -137,26 +118,27 @@ class _JetLexer implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\1\0\1\1\1\2\1\3\1\4\1\1\1\3\1\5"+ - "\1\6\1\7\1\2\1\10\1\11\1\12\1\13\16\3"+ - "\1\14\1\15\1\16\1\17\1\20\1\21\2\1\1\22"+ - "\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+ - "\1\33\1\34\1\0\1\35\1\0\1\36\1\0\1\37"+ - "\1\0\1\40\1\41\1\42\1\43\1\44\1\35\2\2"+ - "\1\35\1\45\1\46\1\47\1\50\2\12\3\13\2\3"+ - "\1\51\7\3\1\52\1\53\1\54\10\3\1\55\1\56"+ - "\1\57\1\0\1\60\1\61\1\62\1\63\1\64\1\65"+ - "\1\66\1\67\1\70\1\71\1\72\1\35\1\3\2\0"+ - "\1\42\1\73\4\0\1\13\1\74\2\3\1\75\5\3"+ - "\1\76\10\3\1\77\1\100\1\3\1\101\1\102\1\103"+ - "\1\104\1\105\1\106\1\36\1\37\1\0\2\73\1\35"+ - "\2\0\1\3\1\107\1\110\3\3\1\111\1\112\1\3"+ - "\1\113\2\3\1\114\2\3\1\115\1\42\2\0\2\3"+ - "\1\116\1\3\1\117\1\3\1\120\1\121\1\122\1\74"+ - "\2\3\1\123\1\124\3\3\1\125\1\126"; + "\3\0\1\1\1\2\1\3\1\4\2\1\1\5\1\6"+ + "\1\7\1\2\1\10\1\11\1\12\1\13\1\14\1\15"+ + "\16\3\1\16\1\17\1\20\1\21\1\22\1\23\2\1"+ + "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+ + "\1\34\2\35\1\36\1\0\1\37\1\40\1\41\1\0"+ + "\1\42\1\0\1\43\1\0\1\44\1\0\1\45\1\46"+ + "\1\47\1\50\1\51\1\42\2\2\1\42\1\52\1\53"+ + "\1\54\1\55\2\12\1\0\2\3\1\56\7\3\1\57"+ + "\1\60\1\61\10\3\1\62\1\63\1\64\1\0\1\65"+ + "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ + "\1\76\1\77\1\0\1\100\1\101\1\102\1\42\1\3"+ + "\2\0\1\47\1\103\4\0\1\104\2\3\1\105\5\3"+ + "\1\106\10\3\1\107\1\110\1\3\1\111\1\112\1\113"+ + "\1\114\1\115\1\116\1\0\1\43\1\44\1\0\2\103"+ + "\1\42\2\0\1\3\1\117\1\120\3\3\1\121\1\122"+ + "\1\3\1\123\2\3\1\124\2\3\1\125\1\77\1\47"+ + "\2\0\2\3\1\126\1\3\1\127\1\3\1\130\1\131"+ + "\1\132\1\104\2\3\1\133\1\134\3\3\1\135\1\136"; private static int [] zzUnpackAction() { - int [] result = new int[193]; + int [] result = new int[205]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -183,32 +165,33 @@ class _JetLexer implements FlexLexer { private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\100\0\200\0\300\0\u0100\0\u0140\0\u0180\0\u01c0"+ "\0\u0200\0\u0240\0\u0280\0\u02c0\0\u0300\0\u0340\0\u0380\0\u03c0"+ - "\0\u0400\0\u0440\0\u0480\0\u04c0\0\u0500\0\u0540\0\u0580\0\u05c0"+ - "\0\u0600\0\u0640\0\u0680\0\u06c0\0\u0700\0\u0740\0\u0780\0\u07c0"+ - "\0\u0800\0\u0840\0\u0880\0\u08c0\0\u0900\0\100\0\u0940\0\100"+ - "\0\100\0\100\0\100\0\100\0\100\0\100\0\100\0\100"+ - "\0\u0980\0\u09c0\0\u0a00\0\u0a40\0\u0a80\0\u0ac0\0\u0b00\0\100"+ - "\0\u0b40\0\u0b80\0\100\0\100\0\u0bc0\0\u0c00\0\u0c40\0\u0c80"+ - "\0\100\0\100\0\100\0\100\0\100\0\u0cc0\0\u0d00\0\u0d40"+ - "\0\u0d80\0\u0dc0\0\u0e00\0\u0e40\0\u0e80\0\u0ec0\0\u0f00\0\u0f40"+ - "\0\u0f80\0\u0fc0\0\u1000\0\300\0\300\0\300\0\u1040\0\u1080"+ - "\0\u10c0\0\u1100\0\u1140\0\u1180\0\u11c0\0\u1200\0\300\0\u1240"+ - "\0\100\0\u1280\0\u12c0\0\100\0\100\0\100\0\100\0\100"+ - "\0\100\0\100\0\100\0\100\0\100\0\u1300\0\100\0\u1340"+ - "\0\u1380\0\u13c0\0\u1400\0\u1440\0\u1480\0\u14c0\0\u1500\0\100"+ - "\0\u1540\0\u1580\0\u15c0\0\100\0\u1600\0\u1640\0\u1680\0\u16c0"+ - "\0\u1700\0\300\0\u1740\0\u1780\0\u17c0\0\u1800\0\u1840\0\u1880"+ - "\0\u18c0\0\u1900\0\300\0\300\0\u1940\0\300\0\300\0\100"+ - "\0\100\0\100\0\100\0\100\0\100\0\u1980\0\u19c0\0\100"+ - "\0\u1a00\0\u1300\0\u1a40\0\u1a80\0\300\0\300\0\u1ac0\0\u1b00"+ - "\0\u1b40\0\300\0\300\0\u1b80\0\300\0\u1bc0\0\u1c00\0\300"+ - "\0\u1c40\0\u1c80\0\300\0\100\0\u1cc0\0\u1d00\0\u1d40\0\u1d80"+ - "\0\300\0\u1dc0\0\300\0\u1e00\0\300\0\300\0\300\0\100"+ - "\0\u1e40\0\u1e80\0\300\0\300\0\u1ec0\0\u1f00\0\u1f40\0\300"+ - "\0\300"; + "\0\u0400\0\300\0\300\0\u0440\0\u0480\0\u04c0\0\u0500\0\u0540"+ + "\0\u0580\0\u05c0\0\u0600\0\u0640\0\u0680\0\u06c0\0\u0700\0\u0740"+ + "\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0880\0\u08c0\0\u0900\0\u0940"+ + "\0\u0980\0\300\0\u09c0\0\300\0\300\0\300\0\300\0\300"+ + "\0\300\0\300\0\u0a00\0\u0a40\0\300\0\u0a80\0\300\0\300"+ + "\0\300\0\u0ac0\0\u0b00\0\u0b40\0\u0b80\0\u0bc0\0\u0c00\0\u0c40"+ + "\0\300\0\u0c80\0\u0cc0\0\300\0\300\0\u0d00\0\u0d40\0\u0d80"+ + "\0\u0dc0\0\300\0\300\0\300\0\300\0\300\0\u0e00\0\u0e40"+ + "\0\u0e80\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0\0\u1000\0\u1040"+ + "\0\u1080\0\u10c0\0\u0140\0\u0140\0\u0140\0\u1100\0\u1140\0\u1180"+ + "\0\u11c0\0\u1200\0\u1240\0\u1280\0\u12c0\0\u0140\0\u1300\0\300"+ + "\0\u1340\0\u1380\0\300\0\300\0\300\0\300\0\300\0\300"+ + "\0\300\0\300\0\300\0\u13c0\0\u1400\0\300\0\300\0\300"+ + "\0\u1440\0\300\0\u1480\0\u14c0\0\u1500\0\u1540\0\u1580\0\u15c0"+ + "\0\u1600\0\u1640\0\u1680\0\u16c0\0\u1700\0\300\0\u1740\0\u1780"+ + "\0\u17c0\0\u1800\0\u1840\0\u0140\0\u1880\0\u18c0\0\u1900\0\u1940"+ + "\0\u1980\0\u19c0\0\u1a00\0\u1a40\0\u0140\0\u0140\0\u1a80\0\u0140"+ + "\0\u0140\0\300\0\300\0\300\0\300\0\u1ac0\0\300\0\300"+ + "\0\u1b00\0\u1b40\0\300\0\u1b80\0\u1440\0\u1bc0\0\u1c00\0\u0140"+ + "\0\u0140\0\u1c40\0\u1c80\0\u1cc0\0\u0140\0\u0140\0\u1d00\0\u0140"+ + "\0\u1d40\0\u1d80\0\u0140\0\u1dc0\0\u1e00\0\u0140\0\300\0\300"+ + "\0\u1e40\0\u1e80\0\u1ec0\0\u1f00\0\u0140\0\u1f40\0\u0140\0\u1f80"+ + "\0\u0140\0\u0140\0\u0140\0\300\0\u1fc0\0\u2000\0\u0140\0\u0140"+ + "\0\u2040\0\u2080\0\u20c0\0\u0140\0\u0140"; private static int [] zzUnpackRowMap() { - int [] result = new int[193]; + int [] result = new int[205]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -231,204 +214,201 @@ class _JetLexer implements FlexLexer { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\2\1\3\1\4\1\5\1\4\1\2\1\6\1\7"+ - "\1\10\1\11\1\12\1\5\1\13\2\4\1\14\1\4"+ - "\1\15\1\4\1\16\1\2\1\17\1\20\1\21\1\4"+ - "\1\22\2\4\1\23\1\24\1\25\1\26\1\4\1\27"+ - "\1\30\1\4\1\31\3\4\1\32\1\4\1\33\1\34"+ - "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+ - "\1\45\1\46\1\47\1\50\1\51\1\52\1\53\1\54"+ - "\1\55\1\56\1\57\1\60\101\0\1\3\12\0\1\3"+ - "\2\0\1\61\1\62\10\0\1\62\47\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\27\4\26\0\1\5\7\0\1\5\66\0"+ - "\1\63\1\0\1\63\2\0\1\63\5\0\2\63\1\0"+ - "\1\63\1\0\1\63\3\0\27\63\24\0\1\4\1\64"+ - "\1\0\1\64\1\4\1\65\1\64\4\0\1\4\2\64"+ - "\1\0\1\64\1\0\1\64\3\0\27\64\25\0\1\66"+ - "\1\0\1\66\1\0\1\67\1\66\1\70\4\0\2\66"+ - "\1\0\1\66\1\0\1\66\3\0\27\66\34\0\1\71"+ - "\1\72\42\0\1\73\77\0\1\74\23\0\1\75\12\0"+ - "\1\75\1\76\1\77\1\61\1\62\10\0\1\62\10\0"+ - "\1\77\36\0\1\100\12\0\1\100\2\0\1\101\101\0"+ - "\1\102\33\0\1\103\4\0\1\104\15\0\13\16\1\0"+ - "\7\16\1\105\1\106\53\16\13\107\1\0\10\107\1\110"+ - "\1\111\52\107\1\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\1\4"+ - "\1\112\10\4\1\113\14\4\24\0\2\4\1\0\2\4"+ - "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ - "\3\0\4\4\1\114\22\4\24\0\2\4\1\0\2\4"+ - "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ - "\3\0\20\4\1\115\6\4\24\0\2\4\1\0\2\4"+ - "\1\0\1\4\4\0\3\4\1\0\1\4\1\0\1\4"+ - "\3\0\7\4\1\116\10\4\1\117\6\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\14\4\1\120\12\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\13\4\1\121\3\4\1\122\3\4"+ - "\1\123\3\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\1\124"+ - "\3\4\1\125\15\4\1\126\4\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\3\4\1\127\23\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\13\4\1\130\13\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\17\4\1\131\7\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\1\4\1\132\5\4\1\133\2\4\1\134"+ - "\14\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\17\4\1\135"+ - "\7\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\1\4\1\136"+ - "\25\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\7\4\1\137"+ - "\17\4\100\0\1\140\4\0\1\141\54\0\1\142\15\0"+ - "\1\143\41\0\1\144\45\0\1\145\67\0\1\146\2\0"+ - "\1\147\74\0\1\150\77\0\1\151\105\0\1\152\100\0"+ - "\1\153\70\0\1\154\23\0\1\100\12\0\1\100\2\0"+ - "\1\155\61\0\1\156\12\0\1\156\4\0\1\156\36\0"+ - "\1\156\20\0\2\63\1\0\2\63\1\157\1\63\4\0"+ - "\3\63\1\0\1\63\1\0\1\63\3\0\27\63\24\0"+ - "\2\64\1\0\2\64\1\0\1\64\4\0\3\64\1\0"+ - "\1\64\1\0\1\64\3\0\27\64\25\0\1\160\1\0"+ - "\1\160\2\0\1\160\5\0\2\160\1\0\1\160\1\0"+ - "\1\160\3\0\27\160\24\0\2\66\1\0\2\66\1\0"+ - "\1\66\4\0\3\66\1\0\1\66\1\0\1\66\3\0"+ - "\27\66\25\0\1\161\1\0\1\161\2\0\1\161\5\0"+ - "\2\161\1\0\1\161\1\0\1\161\3\0\27\161\23\0"+ - "\13\71\1\0\64\71\12\162\1\163\65\162\1\0\1\75"+ - "\12\0\1\75\2\0\1\164\1\62\10\0\1\62\47\0"+ - "\2\76\11\0\1\76\1\0\1\76\1\165\1\76\1\0"+ - "\1\166\4\0\1\76\1\0\1\76\1\0\1\166\1\76"+ - "\5\0\1\76\5\0\1\76\3\0\1\76\24\0\1\77"+ - "\12\0\1\77\2\0\1\167\61\0\1\100\12\0\1\100"+ - "\3\0\1\62\10\0\1\62\46\0\13\16\1\0\64\16"+ - "\13\107\1\0\10\107\1\110\1\170\65\107\1\0\64\107"+ - "\25\0\1\171\53\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\2\4"+ - "\1\172\24\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\20\4"+ - "\1\173\6\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\27\4"+ - "\2\0\1\174\21\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\4\4"+ - "\1\175\22\4\24\0\2\4\1\0\2\4\1\0\1\4"+ - "\4\0\3\4\1\0\1\4\1\0\1\4\3\0\1\176"+ - "\26\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\1\4\1\177"+ - "\25\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\15\4\1\200"+ - "\11\4\24\0\2\4\1\0\2\4\1\0\1\4\4\0"+ - "\3\4\1\0\1\4\1\0\1\4\3\0\12\4\1\201"+ - "\10\4\1\202\3\4\24\0\2\4\1\0\2\4\1\0"+ - "\1\4\4\0\3\4\1\0\1\4\1\0\1\4\3\0"+ - "\11\4\1\203\1\4\1\204\13\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\5\4\1\205\21\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\10\4\1\206\16\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\3\4\1\207\23\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\3\4\1\210\5\4\1\211\15\4\24\0"+ - "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\20\4\1\212\6\4\24\0"+ - "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\13\4\1\213\13\4\24\0"+ - "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\1\214\26\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\11\4\1\215\15\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\13\4\1\216\4\4\1\217\6\4"+ - "\100\0\1\220\50\0\1\221\3\0\1\222\122\0\1\223"+ - "\23\0\1\156\12\0\1\156\64\0\2\160\1\0\2\160"+ - "\1\224\1\160\4\0\3\160\1\0\1\160\1\0\1\160"+ - "\3\0\27\160\24\0\2\161\1\0\2\161\1\225\1\161"+ - "\4\0\3\161\1\0\1\161\1\0\1\161\3\0\27\161"+ - "\23\0\12\162\1\226\65\162\11\227\1\230\1\163\65\227"+ - "\1\0\1\100\12\0\1\100\64\0\2\231\11\0\1\231"+ - "\1\0\1\231\1\155\1\231\6\0\1\231\1\0\1\231"+ - "\2\0\1\231\5\0\1\231\5\0\1\231\3\0\1\231"+ - "\24\0\1\156\12\0\1\156\4\0\1\232\36\0\1\232"+ - "\36\0\1\155\60\0\25\171\1\233\52\171\1\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\234\23\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\20\4\1\235\6\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\236\23\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\10\4\1\237\16\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\4\4\1\240\22\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\241\23\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\242\23\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\4\4\1\243\22\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\7\4\1\244\17\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\245\23\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\12\4\1\246\14\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\1\4\1\247\25\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\1\250\26\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\20\4\1\251\6\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\4\4\1\252\22\4\24\0\2\4\1\0"+ - "\2\4\1\0\1\4\4\0\3\4\1\0\1\4\1\0"+ - "\1\4\3\0\4\4\1\253\22\4\23\0\11\162\1\254"+ - "\1\226\65\162\12\227\1\255\65\227\1\0\2\231\11\0"+ - "\1\231\1\0\1\231\1\0\1\231\1\0\1\166\4\0"+ - "\1\231\1\0\1\231\1\0\1\166\1\231\5\0\1\231"+ - "\5\0\1\231\3\0\1\231\23\0\25\171\1\256\52\171"+ - "\1\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\4\4\1\257\22\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\11\4\1\260\15\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\4\4\1\261\22\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\6\4\1\262\20\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\16\4\1\263\10\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\13\4\1\264\13\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\21\4\1\265\5\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\3\4\1\266\23\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\3\4\1\267\23\4"+ - "\23\0\11\227\1\230\1\255\65\227\25\171\1\270\52\171"+ - "\1\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\5\4\1\271\21\4"+ - "\24\0\2\4\1\0\2\4\1\0\1\4\4\0\3\4"+ - "\1\0\1\4\1\0\1\4\3\0\1\272\26\4\24\0"+ - "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\10\4\1\273\16\4\24\0"+ - "\2\4\1\0\2\4\1\0\1\4\4\0\3\4\1\0"+ - "\1\4\1\0\1\4\3\0\1\274\26\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\1\4\1\275\25\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\12\4\1\276\14\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\6\4\1\277\20\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\300\23\4\24\0\2\4"+ - "\1\0\2\4\1\0\1\4\4\0\3\4\1\0\1\4"+ - "\1\0\1\4\3\0\3\4\1\301\23\4\23\0"; + "\1\4\1\5\1\6\1\7\1\6\1\4\1\10\1\11"+ + "\1\12\1\13\1\14\1\7\1\15\2\6\1\16\1\6"+ + "\1\17\1\6\1\20\1\4\1\21\1\22\1\23\1\24"+ + "\1\25\1\6\1\26\2\6\1\27\1\30\1\31\1\32"+ + "\1\6\1\33\1\34\1\6\1\35\3\6\1\36\1\6"+ + "\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46"+ + "\1\47\1\50\1\51\1\52\1\53\1\54\1\55\1\56"+ + "\1\57\1\60\1\61\1\62\7\63\1\64\3\63\1\65"+ + "\10\63\1\66\1\67\52\63\1\4\1\5\1\6\1\7"+ + "\1\6\1\4\1\10\1\11\1\12\1\13\1\14\1\7"+ + "\1\15\2\6\1\16\1\6\1\17\1\6\1\20\1\4"+ + "\1\21\1\70\1\71\1\24\1\25\1\6\1\26\2\6"+ + "\1\27\1\30\1\31\1\32\1\6\1\33\1\34\1\6"+ + "\1\35\3\6\1\36\1\6\1\37\1\40\1\41\1\42"+ + "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52"+ + "\1\53\1\54\1\55\1\56\1\57\1\60\1\61\1\62"+ + "\101\0\1\5\12\0\1\5\2\0\1\72\1\73\12\0"+ + "\1\73\45\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\27\6\24\0\1\7\7\0"+ + "\1\7\66\0\1\74\1\0\1\74\10\0\2\74\1\0"+ + "\1\74\1\0\1\74\5\0\27\74\23\0\1\75\1\0"+ + "\1\75\1\0\1\76\6\0\2\75\1\0\1\75\1\0"+ + "\1\75\5\0\27\75\23\0\1\77\1\0\1\77\1\0"+ + "\1\100\1\0\1\101\4\0\2\77\1\0\1\77\1\0"+ + "\1\77\5\0\27\77\32\0\1\102\1\103\44\0\1\104"+ + "\77\0\1\105\21\0\1\106\12\0\1\106\1\107\1\110"+ + "\1\72\1\73\12\0\1\73\10\0\1\110\34\0\1\111"+ + "\12\0\1\111\2\0\1\112\101\0\1\113\35\0\1\114"+ + "\4\0\1\115\13\0\13\20\1\0\7\20\1\116\1\117"+ + "\53\20\25\0\1\120\53\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\1\6\1\121"+ + "\10\6\1\122\14\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\4\6\1\123"+ + "\22\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\20\6\1\124\6\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\7\6\1\125\10\6\1\126\6\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\14\6\1\127\12\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\13\6\1\130\3\6\1\131\3\6\1\132\3\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\1\133\3\6\1\134\15\6\1\135\4\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\3\6\1\136\23\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\13\6\1\137\13\6\22\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\17\6"+ + "\1\140\7\6\22\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\1\6\1\141\5\6"+ + "\1\142\2\6\1\143\14\6\22\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\17\6"+ + "\1\144\7\6\22\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\1\6\1\145\25\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\7\6\1\146\17\6\100\0\1\147"+ + "\4\0\1\150\54\0\1\151\15\0\1\152\37\0\1\153"+ + "\47\0\1\154\67\0\1\155\2\0\1\156\74\0\1\157"+ + "\77\0\1\160\105\0\1\161\100\0\1\162\70\0\1\163"+ + "\20\0\7\63\1\0\3\63\1\0\10\63\2\0\52\63"+ + "\2\0\1\164\1\0\1\164\1\0\1\165\6\0\2\164"+ + "\1\0\1\164\1\0\1\164\3\0\1\166\1\0\27\164"+ + "\21\0\13\167\1\0\64\167\1\0\1\111\12\0\1\111"+ + "\2\0\1\170\61\0\1\171\12\0\1\171\4\0\1\171"+ + "\40\0\1\171\16\0\2\74\1\0\2\74\1\172\5\0"+ + "\3\74\1\0\1\74\1\0\1\74\5\0\27\74\22\0"+ + "\2\75\1\0\2\75\6\0\3\75\1\0\1\75\1\0"+ + "\1\75\5\0\27\75\23\0\1\173\1\0\1\173\10\0"+ + "\2\173\1\0\1\173\1\0\1\173\5\0\27\173\22\0"+ + "\2\77\1\0\2\77\6\0\3\77\1\0\1\77\1\0"+ + "\1\77\5\0\27\77\23\0\1\174\1\0\1\174\10\0"+ + "\2\174\1\0\1\174\1\0\1\174\5\0\27\174\21\0"+ + "\13\102\1\0\64\102\12\175\1\176\65\175\1\0\1\106"+ + "\12\0\1\106\2\0\1\177\1\73\12\0\1\73\45\0"+ + "\2\107\11\0\1\107\1\0\1\107\1\200\1\107\1\0"+ + "\1\201\6\0\1\107\1\0\1\107\1\0\1\201\1\107"+ + "\5\0\1\107\5\0\1\107\3\0\1\107\22\0\1\110"+ + "\12\0\1\110\2\0\1\202\61\0\1\111\12\0\1\111"+ + "\3\0\1\73\12\0\1\73\44\0\13\20\1\0\64\20"+ + "\25\0\1\203\53\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\2\6\1\204\24\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\20\6\1\205\6\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\27\6\2\0\1\206\17\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\4\6"+ + "\1\207\22\6\22\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\1\210\26\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\1\6\1\211\25\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\15\6\1\212\11\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\12\6\1\213"+ + "\10\6\1\214\3\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\11\6\1\215"+ + "\1\6\1\216\13\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\5\6\1\217"+ + "\21\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\10\6\1\220\16\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\3\6\1\221\23\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\3\6\1\222\5\6\1\223\15\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\20\6\1\224\6\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\13\6\1\225"+ + "\13\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\1\226\26\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\11\6\1\227\15\6\22\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\13\6"+ + "\1\230\4\6\1\231\6\6\100\0\1\232\50\0\1\233"+ + "\3\0\1\234\122\0\1\235\21\0\2\164\1\0\2\164"+ + "\6\0\3\164\1\0\1\164\1\0\1\164\5\0\27\164"+ + "\23\0\1\236\1\0\1\236\10\0\2\236\1\0\1\236"+ + "\1\0\1\236\5\0\27\236\22\0\1\171\12\0\1\171"+ + "\64\0\2\173\1\0\2\173\1\237\5\0\3\173\1\0"+ + "\1\173\1\0\1\173\5\0\27\173\22\0\2\174\1\0"+ + "\2\174\1\240\5\0\3\174\1\0\1\174\1\0\1\174"+ + "\5\0\27\174\21\0\12\175\1\241\65\175\11\242\1\243"+ + "\1\176\65\242\1\0\1\111\12\0\1\111\64\0\2\244"+ + "\11\0\1\244\1\0\1\244\1\170\1\244\10\0\1\244"+ + "\1\0\1\244\2\0\1\244\5\0\1\244\5\0\1\244"+ + "\3\0\1\244\22\0\1\171\12\0\1\171\4\0\1\245"+ + "\40\0\1\245\34\0\1\170\60\0\25\203\1\246\52\203"+ + "\1\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\3\6\1\247\23\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\20\6\1\250\6\6\22\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\3\6"+ + "\1\251\23\6\22\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\10\6\1\252\16\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\4\6\1\253\22\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\3\6\1\254\23\6\22\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\3\6"+ + "\1\255\23\6\22\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\4\6\1\256\22\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\7\6\1\257\17\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\3\6\1\260\23\6\22\0\2\6\1\0\2\6"+ + "\6\0\3\6\1\0\1\6\1\0\1\6\5\0\12\6"+ + "\1\261\14\6\22\0\2\6\1\0\2\6\6\0\3\6"+ + "\1\0\1\6\1\0\1\6\5\0\1\6\1\262\25\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\1\263\26\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\20\6\1\264\6\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\4\6\1\265"+ + "\22\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\4\6\1\266\22\6\22\0"+ + "\2\236\1\0\2\236\1\267\5\0\3\236\1\0\1\236"+ + "\1\0\1\236\5\0\27\236\21\0\11\175\1\270\1\241"+ + "\65\175\12\242\1\271\65\242\1\0\2\244\11\0\1\244"+ + "\1\0\1\244\1\0\1\244\1\0\1\201\6\0\1\244"+ + "\1\0\1\244\1\0\1\201\1\244\5\0\1\244\5\0"+ + "\1\244\3\0\1\244\21\0\25\203\1\272\52\203\1\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\4\6\1\273\22\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\11\6\1\274\15\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\4\6\1\275"+ + "\22\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\6\6\1\276\20\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\16\6\1\277\10\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\13\6\1\300\13\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\21\6\1\301"+ + "\5\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\3\6\1\302\23\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\3\6\1\303\23\6\21\0\11\242\1\243"+ + "\1\271\65\242\25\203\1\304\52\203\1\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\5\6\1\305\21\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\1\306\26\6"+ + "\22\0\2\6\1\0\2\6\6\0\3\6\1\0\1\6"+ + "\1\0\1\6\5\0\10\6\1\307\16\6\22\0\2\6"+ + "\1\0\2\6\6\0\3\6\1\0\1\6\1\0\1\6"+ + "\5\0\1\310\26\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\1\6\1\311"+ + "\25\6\22\0\2\6\1\0\2\6\6\0\3\6\1\0"+ + "\1\6\1\0\1\6\5\0\12\6\1\312\14\6\22\0"+ + "\2\6\1\0\2\6\6\0\3\6\1\0\1\6\1\0"+ + "\1\6\5\0\6\6\1\313\20\6\22\0\2\6\1\0"+ + "\2\6\6\0\3\6\1\0\1\6\1\0\1\6\5\0"+ + "\3\6\1\314\23\6\22\0\2\6\1\0\2\6\6\0"+ + "\3\6\1\0\1\6\1\0\1\6\5\0\3\6\1\315"+ + "\23\6\21\0"; private static int [] zzUnpackTrans() { - int [] result = new int[8064]; + int [] result = new int[8448]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -469,15 +449,16 @@ class _JetLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\1\0\1\11\43\1\1\11\1\1\11\11\1\0\1\1"+ - "\1\0\1\1\1\0\1\1\1\0\1\11\2\1\2\11"+ - "\4\1\5\11\33\1\1\11\1\0\1\1\12\11\1\1"+ - "\1\11\2\0\2\1\4\0\1\11\3\1\1\11\23\1"+ - "\6\11\1\0\1\1\1\11\1\1\2\0\20\1\1\11"+ - "\2\0\11\1\1\11\11\1"; + "\3\0\1\11\15\1\2\11\26\1\1\11\1\1\7\11"+ + "\2\1\1\11\1\0\3\11\1\0\1\1\1\0\1\1"+ + "\1\0\1\1\1\0\1\11\2\1\2\11\4\1\5\11"+ + "\1\1\1\0\27\1\1\11\1\0\1\1\11\11\1\1"+ + "\1\0\3\11\1\1\1\11\2\0\2\1\4\0\3\1"+ + "\1\11\23\1\4\11\1\0\2\11\1\0\1\1\1\11"+ + "\1\1\2\0\20\1\2\11\2\0\11\1\1\11\11\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[193]; + int [] result = new int[205]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -535,6 +516,32 @@ class _JetLexer implements FlexLexer { /** denotes if the user-EOF-code has already been executed */ private boolean zzEOFDone; + /* user code: */ + private static final class State { + final int lBraceCount; + final int state; + + public State(int state, int lBraceCount) { + this.state = state; + this.lBraceCount = lBraceCount; + } + } + + private final Stack states = new Stack(); + private int lBraceCount; + + private void pushState(int state) { + states.push(new State(yystate(), lBraceCount)); + lBraceCount = 0; + yybegin(state); + } + + private void popState() { + State state = states.pop(); + lBraceCount = state.lBraceCount; + yybegin(state.state); + } + _JetLexer(java.io.Reader in) { this.zzReader = in; @@ -560,7 +567,7 @@ class _JetLexer implements FlexLexer { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1786) { + while (i < 1330) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -785,347 +792,384 @@ class _JetLexer implements FlexLexer { case 3: { return JetTokens.IDENTIFIER; } - case 87: break; - case 63: + case 95: break; + case 11: + { pushState(STRING); return JetTokens.OPEN_QUOTE; + } + case 96: break; + case 71: { return JetTokens.FOR_KEYWORD ; } - case 88: break; - case 84: + case 97: break; + case 92: { return JetTokens.RETURN_KEYWORD ; } - case 89: break; - case 71: + case 98: break; + case 79: { return JetTokens.NULL_KEYWORD ; } - case 90: break; - case 16: + case 99: break; + case 33: + { if (lBraceCount == 0) { + popState(); + return JetTokens.LONG_TEMPLATE_ENTRY_END; + } + lBraceCount--; + return JetTokens.RBRACE; + } + case 100: break; + case 18: { return JetTokens.LT ; } - case 91: break; - case 45: + case 101: break; + case 50: { return JetTokens.DO_KEYWORD ; } - case 92: break; - case 15: + case 102: break; + case 17: { return JetTokens.PLUS ; } - case 93: break; - case 60: + case 103: break; + case 68: { return JetTokens.RAW_STRING_LITERAL; } - case 94: break; - case 51: + case 104: break; + case 56: { return JetTokens.PLUSEQ ; } - case 95: break; + case 105: break; case 27: { return JetTokens.COMMA ; } - case 96: break; - case 17: + case 106: break; + case 19: { return JetTokens.GT ; } - case 97: break; + case 107: break; case 4: { return JetTokens.WHITE_SPACE; } - case 98: break; + case 108: break; case 25: { return JetTokens.RPAR ; } - case 99: break; - case 47: + case 109: break; + case 52: { return JetTokens.DOUBLE_ARROW; } - case 100: break; - case 73: + case 110: break; + case 81: { return JetTokens.TRUE_KEYWORD ; } - case 101: break; - case 30: + case 111: break; + case 35: { return JetTokens.FIELD_IDENTIFIER; } - case 102: break; - case 55: + case 112: break; + case 60: { return JetTokens.ANDAND ; } - case 103: break; - case 59: + case 113: break; + case 67: { return JetTokens.DOC_COMMENT; } - case 104: break; - case 29: + case 114: break; + case 34: { return JetTokens.FLOAT_LITERAL; } - case 105: break; - case 33: + case 115: break; + case 38: { return JetTokens.EOL_COMMENT; } - case 106: break; - case 76: + case 116: break; + case 84: { return JetTokens.WHEN_KEYWORD ; } - case 107: break; - case 18: + case 117: break; + case 20: { return JetTokens.COLON ; } - case 108: break; - case 53: + case 118: break; + case 58: { return JetTokens.LTEQ ; } - case 109: break; - case 40: + case 119: break; + case 45: { return JetTokens.ARROW ; } - case 110: break; - case 20: + case 120: break; + case 22: { return JetTokens.LBRACKET ; } - case 111: break; - case 58: + case 121: break; + case 66: { yypushback(2); return JetTokens.INTEGER_LITERAL; } - case 112: break; + case 122: break; case 10: { return JetTokens.CHARACTER_LITERAL; } - case 113: break; - case 65: + case 123: break; + case 73: { return JetTokens.VAR_KEYWORD ; } - case 114: break; - case 54: + case 124: break; + case 59: { return JetTokens.GTEQ ; } - case 115: break; + case 125: break; case 2: { return JetTokens.INTEGER_LITERAL; } - case 116: break; - case 23: + case 126: break; + case 13: { return JetTokens.RBRACE ; } - case 117: break; - case 78: + case 127: break; + case 86: { return JetTokens.CLASS_KEYWORD ; } - case 118: break; - case 13: + case 128: break; + case 15: { return JetTokens.EXCL ; } - case 119: break; - case 62: + case 129: break; + case 70: { return JetTokens.TRY_KEYWORD ; } - case 120: break; - case 48: + case 130: break; + case 53: { return JetTokens.EXCLEQ ; } - case 121: break; - case 39: + case 131: break; + case 44: { return JetTokens.MINUSEQ ; } - case 122: break; - case 79: + case 132: break; + case 87: { return JetTokens.THROW_KEYWORD ; } - case 123: break; - case 81: + case 133: break; + case 89: { return JetTokens.WHILE_KEYWORD ; } - case 124: break; - case 38: + case 134: break; + case 43: { return JetTokens.MINUSMINUS; } - case 125: break; - case 85: + case 135: break; + case 93: { return JetTokens.CONTINUE_KEYWORD ; } - case 126: break; - case 32: - { return JetTokens.ATAT ; - } - case 127: break; - case 68: + case 136: break; + case 76: { return JetTokens.NOT_IN; } - case 128: break; + case 137: break; + case 37: + { return JetTokens.ATAT ; + } + case 138: break; case 6: { return JetTokens.DIV ; } - case 129: break; - case 50: + case 139: break; + case 55: { return JetTokens.ELVIS ; } - case 130: break; - case 31: + case 140: break; + case 36: { return JetTokens.LABEL_IDENTIFIER; } - case 131: break; - case 14: + case 141: break; + case 29: + { return JetTokens.REGULAR_STRING_PART; + } + case 142: break; + case 16: { return JetTokens.QUEST ; } - case 132: break; - case 56: + case 143: break; + case 61: { return JetTokens.OROR ; } - case 133: break; - case 19: + case 144: break; + case 21: { return JetTokens.PERC ; } - case 134: break; - case 70: + case 145: break; + case 78: { return JetTokens.EXCLEQEQEQ; } - case 135: break; - case 57: + case 146: break; + case 62: { return JetTokens.PERCEQ ; } - case 136: break; - case 37: + case 147: break; + case 42: { return JetTokens.RANGE ; } - case 137: break; + case 148: break; + case 64: + { pushState(LONG_TEMPLATE); return JetTokens.LONG_TEMPLATE_ENTRY_START; + } + case 149: break; case 1: { return TokenType.BAD_CHARACTER; } - case 138: break; - case 49: + case 150: break; + case 54: { return JetTokens.SAFE_ACCESS; } - case 139: break; - case 86: + case 151: break; + case 94: { return JetTokens.NAMESPACE_KEYWORD ; } - case 140: break; - case 69: + case 152: break; + case 77: { return JetTokens.NOT_IS; } - case 141: break; + case 153: break; case 7: { return JetTokens.MUL ; } - case 142: break; - case 21: + case 154: break; + case 23: { return JetTokens.RBRACKET ; } - case 143: break; - case 52: + case 155: break; + case 57: { return JetTokens.PLUSPLUS ; } - case 144: break; - case 74: + case 156: break; + case 63: + { return JetTokens.SHORT_TEMPLATE_ENTRY; + } + case 157: break; + case 82: { return JetTokens.THIS_KEYWORD ; } - case 145: break; + case 158: break; case 8: { return JetTokens.DOT ; } - case 146: break; + case 159: break; case 26: { return JetTokens.SEMICOLON ; } - case 147: break; - case 44: + case 160: break; + case 49: { return JetTokens.IF_KEYWORD ; } - case 148: break; - case 12: + case 161: break; + case 65: + { return JetTokens.ESCAPE_SEQUENCE; + } + case 162: break; + case 31: + { popState(); return JetTokens.CLOSING_QUOTE; + } + case 163: break; + case 14: { return JetTokens.EQ ; } - case 149: break; + case 164: break; case 5: { return JetTokens.AT ; } - case 150: break; - case 61: + case 165: break; + case 69: { return JetTokens.AS_SAFE; } - case 151: break; + case 166: break; case 24: { return JetTokens.LPAR ; } - case 152: break; + case 167: break; case 9: { return JetTokens.MINUS ; } - case 153: break; - case 82: + case 168: break; + case 90: { return JetTokens.FALSE_KEYWORD ; } - case 154: break; - case 75: + case 169: break; + case 83: { return JetTokens.TYPE_KEYWORD ; } - case 155: break; - case 64: + case 170: break; + case 72: { return JetTokens.FUN_KEYWORD ; } - case 156: break; - case 43: + case 171: break; + case 48: { return JetTokens.IS_KEYWORD ; } - case 157: break; - case 35: + case 172: break; + case 30: + { popState(); yypushback(1); return JetTokens.DANGLING_NEWLINE; + } + case 173: break; + case 32: + { lBraceCount++; return JetTokens.LBRACE; + } + case 174: break; + case 40: { return JetTokens.DIVEQ ; } - case 158: break; - case 72: + case 175: break; + case 80: { return JetTokens.ELSE_KEYWORD ; } - case 159: break; - case 41: + case 176: break; + case 46: { return JetTokens.AS_KEYWORD ; } - case 160: break; - case 42: + case 177: break; + case 47: { return JetTokens.IN_KEYWORD ; } - case 161: break; - case 46: + case 178: break; + case 51: { return JetTokens.EQEQ ; } - case 162: break; - case 66: - { return JetTokens.VAL_KEYWORD ; - } - case 163: break; - case 67: + case 179: break; + case 75: { return JetTokens.EQEQEQ ; } - case 164: break; - case 77: + case 180: break; + case 74: + { return JetTokens.VAL_KEYWORD ; + } + case 181: break; + case 85: { return JetTokens.CAPITALIZED_THIS_KEYWORD ; } - case 165: break; - case 36: + case 182: break; + case 41: { return JetTokens.MULTEQ ; } - case 166: break; - case 11: - { return JetTokens.STRING_LITERAL; - } - case 167: break; - case 22: + case 183: break; + case 12: { return JetTokens.LBRACE ; } - case 168: break; - case 83: + case 184: break; + case 91: { return JetTokens.OBJECT_KEYWORD ; } - case 169: break; - case 80: + case 185: break; + case 88: { return JetTokens.BREAK_KEYWORD ; } - case 170: break; - case 34: + case 186: break; + case 39: { return JetTokens.BLOCK_COMMENT; } - case 171: break; + case 187: break; case 28: { return JetTokens.HASH ; } - case 172: break; + case 188: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/idea/src/org/jetbrains/jet/plugin/JetHighlighter.java b/idea/src/org/jetbrains/jet/plugin/JetHighlighter.java index fc303c1f7ac..b467da05d19 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetHighlighter.java +++ b/idea/src/org/jetbrains/jet/plugin/JetHighlighter.java @@ -61,10 +61,20 @@ public class JetHighlighter extends SyntaxHighlighterBase { SyntaxHighlighterColors.STRING.getDefaultAttributes() ); - private static final TextAttributesKey JET_COMMENT = TextAttributesKey.createTextAttributesKey( - "JET.COMMENT", - SyntaxHighlighterColors.LINE_COMMENT.getDefaultAttributes() - ); + public static final TextAttributesKey JET_STRING_ESCAPE = TextAttributesKey.createTextAttributesKey( + "JET.STRING.ESCAPE", + SyntaxHighlighterColors.VALID_STRING_ESCAPE.getDefaultAttributes() + ); + + private static final TextAttributesKey JET_COMMENT; + static { + TextAttributes attributes = SyntaxHighlighterColors.LINE_COMMENT.getDefaultAttributes().clone(); + attributes.setFontType(Font.PLAIN); + JET_COMMENT = TextAttributesKey.createTextAttributesKey( + "JET.COMMENT", + attributes + ); + } private static final TextAttributesKey JET_BAD_CHARACTER = TextAttributesKey.createTextAttributesKey( "JET.BADCHARACTER", @@ -72,6 +82,7 @@ public class JetHighlighter extends SyntaxHighlighterBase { ); public static final TextAttributesKey JET_AUTO_CAST_EXPRESSION; + static { TextAttributes clone = SyntaxHighlighterColors.STRING.getDefaultAttributes().clone(); clone.setFontType(Font.PLAIN); @@ -105,6 +116,14 @@ public class JetHighlighter extends SyntaxHighlighterBase { keys1.put(JetTokens.FLOAT_LITERAL, JET_NUMBER); keys1.put(JetTokens.STRING_LITERAL, JET_STRING); + keys1.put(JetTokens.OPEN_QUOTE, JET_STRING); + keys1.put(JetTokens.CLOSING_QUOTE, JET_STRING); + keys1.put(JetTokens.REGULAR_STRING_PART, JET_STRING); + keys1.put(JetTokens.LONG_TEMPLATE_ENTRY_END, JET_STRING_ESCAPE); + keys1.put(JetTokens.LONG_TEMPLATE_ENTRY_START, JET_STRING_ESCAPE); + + keys1.put(JetTokens.ESCAPE_SEQUENCE, JET_STRING_ESCAPE); + keys1.put(JetTokens.CHARACTER_LITERAL, JET_STRING); keys1.put(JetTokens.RAW_STRING_LITERAL, JET_STRING); diff --git a/idea/testData/checker/StringTemplates.jet b/idea/testData/checker/StringTemplates.jet new file mode 100644 index 00000000000..a83865b1975 --- /dev/null +++ b/idea/testData/checker/StringTemplates.jet @@ -0,0 +1,21 @@ +fun demo() { + val abc = 1 + val a = "" + val asd = 1 + val bar = 5 + fun map(f : fun () : Any?) : Int = 1 + fun buzz(f : fun () : Any?) : Int = 1 + val sdf = 1 + val foo = 3; + "$abc" + "$" + "$.$.asdf$\t" + "asd\$" + "asd$a\x" + "asd$a$asd$ $xxx" + "fosdfasdo${1 + bar + 100}}sdsdfgdsfsdf" + "foo${bar + map {foo}}sdfsdf" + "foo${bar + map { "foo" }}sdfsdf" + "foo${bar + map { + "foo$sdf${ buzz{}}" }}sdfsdf" +} \ No newline at end of file diff --git a/idea/testData/psi/SimpleExpressions.txt b/idea/testData/psi/SimpleExpressions.txt index 545a786a89b..077ad384866 100644 --- a/idea/testData/psi/SimpleExpressions.txt +++ b/idea/testData/psi/SimpleExpressions.txt @@ -84,8 +84,11 @@ JetFile: SimpleExpressions.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"dsf"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('dsf') + PsiElement(CLOSING_QUOTE)('"') PsiElement(COMMA)(',') PsiWhiteSpace('\n ') VALUE_PARAMETER @@ -325,8 +328,11 @@ JetFile: SimpleExpressions.jet PsiElement(INTEGER_LITERAL)('10') PsiElement(COMMA)(',') PsiWhiteSpace(' ') - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"A"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('A') + PsiElement(CLOSING_QUOTE)('"') PsiElement(COMMA)(',') PsiWhiteSpace(' ') INTEGER_CONSTANT diff --git a/idea/testData/psi/StringTemplates.jet b/idea/testData/psi/StringTemplates.jet new file mode 100644 index 00000000000..6b628c0b435 --- /dev/null +++ b/idea/testData/psi/StringTemplates.jet @@ -0,0 +1,22 @@ +fun demo() { + val abc = 1 + val a = "" + val asd = 1 + val bar = 5 + fun map(f : fun () : Any?) : Int = 1 + fun buzz(f : fun () : Any?) : Int = 1 + val sdf = 1 + val foo = 3; + "$abc" + "$abc\" + "$" + "$.$.asdf$\t" + "asd\$" + "asd$a" + "asd$a$asd$" + "fosdfasdo${1 + bar + 100}}sdsdfgdsfsdf" + "foo${bar + map {foo}}sdfsdf" + "foo${bar + map { "foo" }}sdfsdf" + "foo${bar + map { + "foo$sdf${ buzz{}}" }}sdfsdf" +} \ No newline at end of file diff --git a/idea/testData/psi/StringTemplates.txt b/idea/testData/psi/StringTemplates.txt new file mode 100644 index 00000000000..ba9ccd091cf --- /dev/null +++ b/idea/testData/psi/StringTemplates.txt @@ -0,0 +1,368 @@ +JetFile: StringTemplates.jet + NAMESPACE + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('demo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('abc') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('asd') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('5') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('map') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('f') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + FUNCTION_TYPE + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + NULLABLE_TYPE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Any') + PsiElement(QUEST)('?') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('buzz') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('f') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + FUNCTION_TYPE + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + NULLABLE_TYPE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Any') + PsiElement(QUEST)('?') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('sdf') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('3') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$abc') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$abc') + ESCAPE_STRING_TEMPLATE_ENTRY + PsiElement(ESCAPE_SEQUENCE)('\"') + PsiErrorElement:Expecting '"' + + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('$') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('$') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('.') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('$') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('.asdf') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('$') + ESCAPE_STRING_TEMPLATE_ENTRY + PsiElement(ESCAPE_SEQUENCE)('\t') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('asd') + ESCAPE_STRING_TEMPLATE_ENTRY + PsiElement(ESCAPE_SEQUENCE)('\$') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('asd') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$a') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('asd') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$a') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$asd') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('$') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('fosdfasdo') + LONG_STRING_TEMPLATE_ENTRY + PsiElement(LONG_TEMPLATE_ENTRY_START)('${') + BINARY_EXPRESSION + BINARY_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('100') + PsiElement(LONG_TEMPLATE_ENTRY_END)('}') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('}sdsdfgdsfsdf') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + LONG_STRING_TEMPLATE_ENTRY + PsiElement(LONG_TEMPLATE_ENTRY_START)('${') + BINARY_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('map') + PsiWhiteSpace(' ') + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + PsiElement(RBRACE)('}') + PsiElement(LONG_TEMPLATE_ENTRY_END)('}') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('sdfsdf') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + LONG_STRING_TEMPLATE_ENTRY + PsiElement(LONG_TEMPLATE_ENTRY_START)('${') + BINARY_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('map') + PsiWhiteSpace(' ') + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace(' ') + BLOCK + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace(' ') + PsiElement(RBRACE)('}') + PsiElement(LONG_TEMPLATE_ENTRY_END)('}') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('sdfsdf') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + LONG_STRING_TEMPLATE_ENTRY + PsiElement(LONG_TEMPLATE_ENTRY_START)('${') + BINARY_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('map') + PsiWhiteSpace(' ') + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$sdf') + LONG_STRING_TEMPLATE_ENTRY + PsiElement(LONG_TEMPLATE_ENTRY_START)('${') + PsiWhiteSpace(' ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('buzz') + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiElement(LONG_TEMPLATE_ENTRY_END)('}') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace(' ') + PsiElement(RBRACE)('}') + PsiElement(LONG_TEMPLATE_ENTRY_END)('}') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('sdfsdf') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/idea/testData/psi/When.jet b/idea/testData/psi/When.jet index 961e746c053..a169a11155c 100644 --- a/idea/testData/psi/When.jet +++ b/idea/testData/psi/When.jet @@ -67,6 +67,6 @@ fun foo() { is a @ (a, b) => c 1, foo(), bar, 2 + 3, is a @ (a, b) => c - is a.a @ (val b, b) if (b == a + 3) => c + is a.a @ (val b, b) => c } } diff --git a/idea/testData/psi/When.txt b/idea/testData/psi/When.txt index fed4ec1dea6..d535df43f4f 100644 --- a/idea/testData/psi/When.txt +++ b/idea/testData/psi/When.txt @@ -243,8 +243,11 @@ JetFile: When.jet PsiElement(is)('is') PsiWhiteSpace(' ') EXPRESSION_PATTERN - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"sadfsa"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('sadfsa') + PsiElement(CLOSING_QUOTE)('"') PsiWhiteSpace(' ') PsiElement(DOUBLE_ARROW)('=>') PsiWhiteSpace(' ') @@ -1193,34 +1196,6 @@ JetFile: When.jet PsiElement(IDENTIFIER)('b') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - PsiErrorElement:Expecting '=>' or 'when' - PsiElement(if)('if') - PsiWhiteSpace(' ') - PARENTHESIZED - PsiElement(LPAR)('(') - BINARY_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('b') - PsiWhiteSpace(' ') - OPERATION_REFERENCE - PsiElement(EQEQ)('==') - PsiWhiteSpace(' ') - BINARY_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('a') - PsiWhiteSpace(' ') - OPERATION_REFERENCE - PsiElement(PLUS)('+') - PsiWhiteSpace(' ') - INTEGER_CONSTANT - PsiElement(INTEGER_LITERAL)('3') - PsiElement(RPAR)(')') - PsiWhiteSpace(' ') - WHEN_ENTRY - WHEN_CONDITION_IS_PATTERN - EXPRESSION_PATTERN - PsiErrorElement:Expecting an element, is-condition or in-condition - PsiElement(DOUBLE_ARROW)('=>') PsiWhiteSpace(' ') REFERENCE_EXPRESSION diff --git a/idea/testData/psi/examples/BinaryTree.txt b/idea/testData/psi/examples/BinaryTree.txt index aa4f1894ac9..da8feb54c4f 100644 --- a/idea/testData/psi/examples/BinaryTree.txt +++ b/idea/testData/psi/examples/BinaryTree.txt @@ -2480,8 +2480,11 @@ JetFile: BinaryTree.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"Nothing to remove"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('Nothing to remove') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiWhiteSpace('\n ') CALL_EXPRESSION diff --git a/idea/testData/psi/examples/Builder.txt b/idea/testData/psi/examples/Builder.txt index 8a256b3d745..5975af7f822 100644 --- a/idea/testData/psi/examples/Builder.txt +++ b/idea/testData/psi/examples/Builder.txt @@ -59,8 +59,14 @@ JetFile: Builder.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"$libs/groovy-..."') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$libs') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('/groovy-...') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiWhiteSpace('\n ') PsiElement(RBRACE)('}') @@ -99,8 +105,14 @@ JetFile: Builder.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"$gantHome/lib"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$gantHome') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('/lib') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiElement(DOT)('.') REFERENCE_EXPRESSION @@ -162,8 +174,11 @@ JetFile: Builder.jet OPERATION_REFERENCE PsiElement(EQ)('=') PsiWhiteSpace(' ') - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"1.5"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('1.5') + PsiElement(CLOSING_QUOTE)('"') PsiWhiteSpace('\n ') CALL_EXPRESSION REFERENCE_EXPRESSION @@ -191,8 +206,14 @@ JetFile: Builder.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"$projectHome/antLayout/src"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + REFERENCE_EXPRESSION + PsiElement(SHORT_TEMPLATE_ENTRY)('$projectHome') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('/antLayout/src') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiWhiteSpace('\n ') PsiElement(RBRACE)('}') diff --git a/idea/testData/psi/examples/With.txt b/idea/testData/psi/examples/With.txt index 3e598cbbe49..4297666ad47 100644 --- a/idea/testData/psi/examples/With.txt +++ b/idea/testData/psi/examples/With.txt @@ -115,8 +115,11 @@ JetFile: With.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"foo"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiElement(SEMICOLON)(';') PsiWhiteSpace('\n ') @@ -126,8 +129,11 @@ JetFile: With.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"bar"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('bar') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiElement(SEMICOLON)(';') PsiWhiteSpace('\n ') @@ -153,8 +159,11 @@ JetFile: With.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"foo"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiElement(SEMICOLON)(';') PsiWhiteSpace('\n ') @@ -164,8 +173,11 @@ JetFile: With.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - STRING_CONSTANT - PsiElement(STRING_LITERAL)('"bar"') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('bar') + PsiElement(CLOSING_QUOTE)('"') PsiElement(RPAR)(')') PsiElement(SEMICOLON)(';') PsiWhiteSpace('\n ') diff --git a/idea/testData/resolve/StringTemplates.jet b/idea/testData/resolve/StringTemplates.jet new file mode 100644 index 00000000000..76ba565259f --- /dev/null +++ b/idea/testData/resolve/StringTemplates.jet @@ -0,0 +1,21 @@ +fun demo() { + ~abc~val abc = 1 + ~a~val a = "" + ~asd~val asd = 1 + ~bar~val bar = 5 + ~map~fun map(f : fun () : Any?) : Int = 1 + ~buzz~fun buzz(f : fun () : Any?) : Int = 1 + ~sdf~val sdf = 1 + ~foo~val foo = 3; + "`abc`$abc" + "$" + "$.$.asdf$\t" + "asd\$" + "asd`a`$a" + "asd`a`$a`asd`$asd$" + "fosdfasdo${1 + `bar`bar + 100}}sdsdfgdsfsdf" + "foo${`bar`bar + `map`map {`foo`foo}}sdfsdf" + "foo${`bar`bar + `map`map { "foo" }}sdfsdf" + "foo${`bar`bar + `map`map { + "foo`sdf`$sdf${ `buzz`buzz{}}" }}sdfsdf" +} \ No newline at end of file