diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index cf8e51c37e8..8844d181e69 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -1,9 +1,11 @@ package org.jetbrains.jet.lang.parsing; +import com.google.common.collect.ImmutableMap; import com.intellij.lang.PsiBuilder; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.jet.JetNodeType; +import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.jet.lexer.JetTokens; import java.util.*; @@ -18,6 +20,16 @@ public class JetExpressionParsing extends AbstractJetParsing { private static final TokenSet WHEN_CONDITION_RECOVERY_SET = TokenSet.create(RBRACE, IN_KEYWORD, NOT_IN, IS_KEYWORD, NOT_IS, ELSE_KEYWORD); private static final TokenSet WHEN_CONDITION_RECOVERY_SET_WITH_DOUBLE_ARROW = TokenSet.create(RBRACE, IN_KEYWORD, NOT_IN, IS_KEYWORD, NOT_IS, ELSE_KEYWORD, DOUBLE_ARROW, DOT); + private static final ImmutableMap KEYWORD_TEXTS = tokenSetToMap(KEYWORDS); + + private static ImmutableMap tokenSetToMap(TokenSet tokens) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (IElementType token : tokens.getTypes()) { + builder.put(token.toString(), (JetToken) token); + } + return builder.build(); + } + private static final TokenSet TYPE_ARGUMENT_LIST_STOPPERS = TokenSet.create( INTEGER_LITERAL, FLOAT_LITERAL, CHARACTER_LITERAL, OPEN_QUOTE, RAW_STRING_LITERAL, NAMESPACE_KEYWORD, AS_KEYWORD, TYPE_KEYWORD, TRAIT_KEYWORD, CLASS_KEYWORD, THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, @@ -587,7 +599,7 @@ public class JetExpressionParsing extends AbstractJetParsing { /* * stringTemplateElement * : RegularStringPart - * : ShortTemplateEntrySTART SimpleName + * : ShortTemplateEntrySTART (SimpleName | "this") * : EscapeSequence * : longTemplate * ; @@ -611,9 +623,25 @@ public class JetExpressionParsing extends AbstractJetParsing { PsiBuilder.Marker entry = mark(); advance(); // SHORT_TEMPLATE_ENTRY_START - PsiBuilder.Marker reference = mark(); - expect(IDENTIFIER, "Expecting a name"); - reference.done(REFERENCE_EXPRESSION); + if (at(THIS_KEYWORD)) { + PsiBuilder.Marker thisExpression = mark(); + PsiBuilder.Marker reference = mark(); + advance(); // THIS_KEYWORD + reference.done(REFERENCE_EXPRESSION); + thisExpression.done(THIS_EXPRESSION); + } + else { + JetToken keyword = KEYWORD_TEXTS.get(myBuilder.getTokenText()); + if (keyword != null) { + myBuilder.remapCurrentToken(keyword); + errorAndAdvance("Keyword cannot be used as a reference"); + } + else { + PsiBuilder.Marker reference = mark(); + expect(IDENTIFIER, "Expecting a name"); + reference.done(REFERENCE_EXPRESSION); + } + } entry.done(SHORT_STRING_TEMPLATE_ENTRY); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 989710ce480..18524d28943 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -59,7 +59,7 @@ public class CallResolver { JetSimpleNameExpression nameExpression = (JetSimpleNameExpression) calleeExpression; String referencedName = nameExpression.getReferencedName(); if (referencedName == null) { - return null; + return OverloadResolutionResultsImpl.nameNotFound(); } TaskPrioritizer task_prioritizer; if (nameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 94096c3e154..6d9869adc44 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -916,7 +916,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { public void visitStringTemplateEntryWithExpression(JetStringTemplateEntryWithExpression entry) { JetExpression entryExpression = entry.getExpression(); if (entryExpression != null) { - facade.getType(entryExpression, context.replaceScope(context.scope)); + facade.getType(entryExpression, context); } value[0] = CompileTimeConstantResolver.OUT_OF_RANGE; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex index 8e6d524b28b..a6136493b42 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex @@ -121,6 +121,10 @@ LONG_TEMPLATE_ENTRY_END=\} yypushback(yylength() - 1); return JetTokens.SHORT_TEMPLATE_ENTRY_START; } +// Only *this* keyword is itself an expression valid in this position +// *null*, *true* and *false* are also keywords and expression, but it does not make sense to put them +// in a string template for it'd be easier to just type them in without a dollar + "this" { popState(); return JetTokens.THIS_KEYWORD; } {IDENTIFIER} { popState(); return JetTokens.IDENTIFIER; } {LONELY_DOLLAR} { return JetTokens.REGULAR_STRING_PART; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java index 85d40f6a1a1..444c9e4fbdf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 11/12/11 11:48 AM */ +/* The following code was generated by JFlex 1.4.3 on 12/15/11 8:19 PM */ package org.jetbrains.jet.lexer; @@ -13,8 +13,8 @@ import org.jetbrains.jet.lexer.JetTokens; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 11/12/11 11:48 AM from the specification file - * /Users/abreslav/work/jet/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex + * on 12/15/11 8:19 PM from the specification file + * /Users/abreslav/work/jet-clean/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { /** initial size of the lookahead buffer */ @@ -44,10 +44,10 @@ class _JetLexer implements FlexLexer { "\1\10\1\67\1\65\1\23\1\72\1\73\1\13\1\62\1\76\1\21"+ "\1\17\1\12\1\14\11\1\1\74\1\75\1\63\1\60\1\64\1\61"+ "\1\11\1\2\1\16\2\2\1\20\1\2\11\4\1\22\3\4\1\54"+ - "\3\4\1\15\2\4\1\70\1\24\1\71\1\0\1\4\1\6\1\32"+ - "\1\44\1\37\1\56\1\34\1\52\1\4\1\47\1\42\1\45\1\51"+ - "\1\50\1\33\1\31\1\40\1\36\1\4\1\43\1\35\1\41\1\26"+ - "\1\55\1\46\1\15\1\53\1\4\1\27\1\66\1\30\54\0\1\4"+ + "\3\4\1\15\2\4\1\70\1\24\1\71\1\0\1\4\1\6\1\36"+ + "\1\45\1\42\1\56\1\40\1\52\1\4\1\32\1\33\1\46\1\51"+ + "\1\50\1\37\1\35\1\43\1\41\1\4\1\44\1\34\1\31\1\26"+ + "\1\55\1\47\1\15\1\53\1\4\1\27\1\66\1\30\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"+ @@ -124,24 +124,24 @@ class _JetLexer implements FlexLexer { "\17\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\1\35\1\36\1\35\1\0\1\37\1\40\1\0"+ - "\1\41\1\42\1\0\1\43\1\0\1\44\1\0\1\45"+ - "\1\0\1\46\1\47\1\50\1\51\1\52\1\43\2\2"+ - "\1\43\1\53\1\54\1\55\1\56\2\12\1\0\2\3"+ - "\1\57\10\3\1\60\1\61\1\62\10\3\1\63\1\0"+ - "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\73"+ - "\1\74\1\75\1\76\1\0\1\77\2\100\1\0\1\101"+ - "\1\43\1\3\2\0\1\50\1\102\4\0\1\103\2\3"+ - "\1\104\7\3\1\105\7\3\1\106\1\3\1\107\1\3"+ - "\1\110\1\111\1\112\1\113\1\114\1\115\2\0\1\40"+ - "\1\44\1\45\1\0\2\102\1\43\2\0\1\116\1\3"+ - "\1\117\4\3\1\120\1\3\1\121\1\3\1\122\2\3"+ - "\1\123\2\3\1\124\1\125\1\76\1\0\1\50\2\0"+ - "\1\3\1\126\1\3\1\127\1\3\1\130\1\131\1\3"+ - "\1\132\1\133\1\134\1\0\1\103\2\3\1\135\1\136"+ - "\3\3\1\137\1\140"; + "\1\40\1\41\1\42\1\0\1\43\1\0\1\44\1\0"+ + "\1\45\1\0\1\46\1\47\1\50\1\51\1\52\1\43"+ + "\2\2\1\43\1\53\1\54\1\55\1\56\2\12\1\0"+ + "\3\3\1\57\1\60\1\61\3\3\1\62\14\3\1\63"+ + "\1\0\1\64\1\65\1\66\1\67\1\70\1\71\1\72"+ + "\1\73\1\74\1\75\1\76\1\0\1\77\2\100\1\0"+ + "\1\40\1\101\1\43\1\3\2\0\1\50\1\102\4\0"+ + "\1\103\4\3\1\104\4\3\1\105\10\3\1\106\1\3"+ + "\1\107\1\3\1\110\1\111\1\112\1\113\1\114\1\115"+ + "\2\0\2\40\1\44\1\45\1\0\2\102\1\43\2\0"+ + "\1\116\1\3\1\117\1\3\1\120\1\3\1\121\1\3"+ + "\1\122\6\3\1\123\1\3\1\124\1\125\1\76\1\0"+ + "\1\126\1\50\2\0\1\127\1\130\1\131\2\3\1\132"+ + "\2\3\1\133\1\134\1\135\1\0\1\103\2\3\1\136"+ + "\1\137\3\3\1\140\1\141"; private static int [] zzUnpackAction() { - int [] result = new int[221]; + int [] result = new int[225]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -173,30 +173,31 @@ class _JetLexer implements FlexLexer { "\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0880\0\u0100\0\u08c0\0\u0900"+ "\0\u0940\0\u0980\0\u09c0\0\u0a00\0\u0100\0\u0100\0\u0100\0\u0100"+ "\0\u0100\0\u0100\0\u0100\0\u0100\0\u0a40\0\u0100\0\u0a80\0\u0ac0"+ - "\0\u0100\0\u0b00\0\u0b40\0\u0100\0\u0100\0\u0b80\0\u0bc0\0\u0c00"+ - "\0\u0c40\0\u0c80\0\u0cc0\0\u0d00\0\u0100\0\u0d40\0\u0d80\0\u0100"+ - "\0\u0100\0\u0dc0\0\u0e00\0\u0e40\0\u0e80\0\u0100\0\u0100\0\u0100"+ - "\0\u0100\0\u0100\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0\0\u1000"+ - "\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140\0\u1180\0\u11c0\0\u0180"+ - "\0\u0180\0\u0180\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340"+ - "\0\u1380\0\u13c0\0\u0180\0\u1400\0\u1440\0\u1480\0\u0100\0\u0100"+ - "\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u14c0\0\u1500"+ - "\0\u0100\0\u0100\0\u1540\0\u1580\0\u0100\0\u15c0\0\u0100\0\u1600"+ - "\0\u1640\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0\0\u1800"+ - "\0\u1840\0\u1880\0\u0100\0\u18c0\0\u1900\0\u1940\0\u1980\0\u19c0"+ - "\0\u1a00\0\u1a40\0\u0180\0\u1a80\0\u1ac0\0\u1b00\0\u1b40\0\u1b80"+ - "\0\u1bc0\0\u1c00\0\u0180\0\u1c40\0\u0180\0\u1c80\0\u0180\0\u0180"+ - "\0\u1cc0\0\u1cc0\0\u0100\0\u0100\0\u1d00\0\u1d40\0\u0100\0\u0100"+ - "\0\u0100\0\u1d80\0\u1dc0\0\u0100\0\u1e00\0\u15c0\0\u1e40\0\u0180"+ - "\0\u1e80\0\u0180\0\u1ec0\0\u1f00\0\u1f40\0\u1f80\0\u0180\0\u1fc0"+ - "\0\u0180\0\u2000\0\u0180\0\u2040\0\u2080\0\u0180\0\u20c0\0\u2100"+ - "\0\u0180\0\u0100\0\u0100\0\u2140\0\u0100\0\u2180\0\u21c0\0\u2200"+ - "\0\u0180\0\u2240\0\u0180\0\u2280\0\u0180\0\u0180\0\u22c0\0\u0180"+ - "\0\u0180\0\u0180\0\u2300\0\u0100\0\u2340\0\u2380\0\u0180\0\u0180"+ - "\0\u23c0\0\u2400\0\u2440\0\u0180\0\u0180"; + "\0\u0100\0\u0b00\0\u0b40\0\u0b80\0\u0100\0\u0100\0\u0bc0\0\u0c00"+ + "\0\u0c40\0\u0c80\0\u0cc0\0\u0d00\0\u0d40\0\u0100\0\u0d80\0\u0dc0"+ + "\0\u0100\0\u0100\0\u0e00\0\u0e40\0\u0e80\0\u0ec0\0\u0100\0\u0100"+ + "\0\u0100\0\u0100\0\u0100\0\u0f00\0\u0f40\0\u0f80\0\u0fc0\0\u1000"+ + "\0\u0180\0\u0180\0\u0180\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140"+ + "\0\u1180\0\u11c0\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340"+ + "\0\u1380\0\u13c0\0\u1400\0\u0180\0\u1440\0\u1480\0\u14c0\0\u0100"+ + "\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u1500"+ + "\0\u1540\0\u0100\0\u0100\0\u1580\0\u15c0\0\u1600\0\u0100\0\u1640"+ + "\0\u0100\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0\0\u1800"+ + "\0\u1840\0\u1880\0\u18c0\0\u1900\0\u1940\0\u1980\0\u0180\0\u19c0"+ + "\0\u1a00\0\u1a40\0\u1a80\0\u0100\0\u1ac0\0\u1b00\0\u1b40\0\u1b80"+ + "\0\u1bc0\0\u1c00\0\u1c40\0\u1c80\0\u0180\0\u1cc0\0\u0180\0\u1d00"+ + "\0\u0180\0\u0180\0\u1d40\0\u1d40\0\u0100\0\u0100\0\u1d80\0\u1dc0"+ + "\0\u0100\0\u1e00\0\u0100\0\u0100\0\u1e40\0\u1e80\0\u0100\0\u1ec0"+ + "\0\u1640\0\u1f00\0\u0180\0\u1f40\0\u0180\0\u1f80\0\u0180\0\u1fc0"+ + "\0\u0180\0\u2000\0\u0180\0\u2040\0\u2080\0\u20c0\0\u2100\0\u2140"+ + "\0\u2180\0\u0180\0\u21c0\0\u0180\0\u0100\0\u0100\0\u2200\0\u0b00"+ + "\0\u0100\0\u2240\0\u2280\0\u0180\0\u0180\0\u0180\0\u22c0\0\u2300"+ + "\0\u0180\0\u2340\0\u2380\0\u0180\0\u0180\0\u0180\0\u23c0\0\u0100"+ + "\0\u2400\0\u2440\0\u0180\0\u0180\0\u2480\0\u24c0\0\u2500\0\u0180"+ + "\0\u0180"; private static int [] zzUnpackRowMap() { - int [] result = new int[221]; + int [] result = new int[225]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -222,234 +223,241 @@ class _JetLexer implements FlexLexer { "\1\5\1\6\1\7\1\10\1\7\1\5\1\11\1\10"+ "\1\12\1\13\1\14\1\15\1\16\2\7\1\17\1\7"+ "\1\20\1\7\1\21\1\5\1\22\1\7\1\23\1\24"+ - "\1\25\1\26\1\7\1\27\1\30\1\7\1\31\1\32"+ - "\1\33\1\34\1\35\1\36\1\7\1\37\3\7\1\40"+ + "\1\25\1\7\1\26\1\27\1\30\1\31\1\7\1\32"+ + "\1\7\1\33\1\34\1\35\1\36\1\7\1\37\2\7"+ + "\1\40\1\7\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\1\63\1\64\7\65\1\66"+ + "\1\67\13\65\1\70\1\71\52\65\2\0\1\72\1\0"+ + "\1\72\1\0\1\73\6\0\2\72\1\0\1\72\1\0"+ + "\1\72\3\0\1\72\2\0\1\74\25\72\21\0\1\5"+ + "\1\6\1\7\1\10\1\7\1\5\1\11\1\10\1\12"+ + "\1\13\1\14\1\15\1\16\2\7\1\17\1\7\1\20"+ + "\1\7\1\21\1\5\1\22\1\7\1\75\1\76\1\25"+ + "\1\7\1\26\1\27\1\30\1\31\1\7\1\32\1\7"+ + "\1\33\1\34\1\35\1\36\1\7\1\37\2\7\1\40"+ "\1\7\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\1\63\1\64\7\65\1\66\1\67"+ - "\13\65\1\70\1\71\52\65\2\0\1\72\1\0\1\72"+ - "\1\0\1\73\6\0\2\72\1\0\1\72\1\0\1\72"+ - "\3\0\1\72\2\0\26\72\21\0\1\5\1\6\1\7"+ - "\1\10\1\7\1\5\1\11\1\10\1\12\1\13\1\14"+ - "\1\15\1\16\2\7\1\17\1\7\1\20\1\7\1\21"+ - "\1\5\1\22\1\7\1\74\1\75\1\25\1\26\1\7"+ - "\1\27\1\30\1\7\1\31\1\32\1\33\1\34\1\35"+ - "\1\36\1\7\1\37\3\7\1\40\1\7\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"+ - "\1\63\1\64\101\0\1\6\12\0\1\6\2\0\1\76"+ - "\1\77\13\0\1\77\44\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\26\7\24\0\1\10\3\0\1\10\70\0\6\100\2\0"+ - "\70\100\2\0\1\101\1\0\1\101\1\0\1\102\6\0"+ - "\2\101\1\0\1\101\1\0\1\101\3\0\1\101\2\0"+ - "\26\101\23\0\1\103\1\0\1\103\1\0\1\104\2\0"+ - "\1\105\3\0\2\103\1\0\1\103\1\0\1\103\3\0"+ - "\1\103\2\0\26\103\33\0\1\106\1\107\44\0\1\110"+ - "\77\0\1\111\20\0\1\112\12\0\1\112\1\113\1\114"+ - "\1\76\1\77\13\0\1\77\7\0\1\114\34\0\1\115"+ - "\12\0\1\115\2\0\1\116\101\0\1\117\36\0\1\120"+ - "\3\0\1\121\13\0\7\21\1\0\13\21\1\122\1\123"+ - "\53\21\25\0\1\124\53\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\125\2\0"+ - "\1\7\1\126\24\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\4\7\1\127\21\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\17\7\1\130\6\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\131\2\0"+ - "\26\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\7\7\1\132"+ - "\7\7\1\133\6\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\13\7\1\134\12\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\12\7\1\135\3\7\1\136\3\7\1\137\3\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\3\0\1\7\2\0\1\140\3\7\1\141\14\7"+ - "\1\142\4\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\60\1\61\1\62\1\63\1\64\101\0\1\6\12\0"+ + "\1\6\2\0\1\77\1\100\17\0\1\100\40\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\3\0\1\7\2\0\26\7\24\0\1\10\3\0\1\10"+ + "\70\0\6\101\2\0\70\101\2\0\1\102\1\0\1\102"+ + "\1\0\1\103\6\0\2\102\1\0\1\102\1\0\1\102"+ + "\3\0\1\102\2\0\26\102\23\0\1\104\1\0\1\104"+ + "\1\0\1\105\2\0\1\106\3\0\2\104\1\0\1\104"+ + "\1\0\1\104\3\0\1\104\2\0\26\104\33\0\1\107"+ + "\1\110\44\0\1\111\77\0\1\112\20\0\1\113\12\0"+ + "\1\113\1\114\1\115\1\77\1\100\17\0\1\100\4\0"+ + "\1\115\33\0\1\116\12\0\1\116\2\0\1\117\101\0"+ + "\1\120\36\0\1\121\3\0\1\122\13\0\7\21\1\0"+ + "\13\21\1\123\1\124\53\21\25\0\1\125\53\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\3\0\1\7\2\0\1\7\1\126\11\7\1\127\6\7"+ + "\1\130\3\7\22\0\2\7\1\0\2\7\6\0\3\7"+ "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\3\7"+ - "\1\143\22\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\12\7"+ - "\1\144\13\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\16\7"+ - "\1\145\7\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\146\2\0\1\7"+ - "\1\147\5\7\1\150\16\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\16\7\1\151\7\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\1\7\1\152\24\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\7\7\1\153\16\7\63\0\1\154\15\0\1\155"+ - "\77\0\1\156\3\0\1\157\73\0\1\160\1\0\1\161"+ - "\75\0\1\162\77\0\1\163\104\0\1\164\100\0\1\165"+ - "\71\0\1\166\17\0\7\65\2\0\13\65\2\0\52\65"+ - "\2\0\1\167\1\0\1\167\1\0\1\170\6\0\2\167"+ - "\1\0\1\167\1\0\1\167\3\0\1\167\1\171\1\0"+ - "\26\167\21\0\7\172\1\0\16\172\1\173\51\172\1\0"+ - "\2\72\1\0\2\72\6\0\3\72\1\0\1\72\1\0"+ - "\1\72\3\0\1\72\2\0\26\72\21\0\6\174\2\0"+ - "\70\174\1\0\1\115\12\0\1\115\2\0\1\175\61\0"+ - "\1\176\12\0\1\176\4\0\1\176\40\0\1\176\15\0"+ - "\6\100\1\177\1\0\70\100\1\0\2\101\1\0\2\101"+ - "\6\0\3\101\1\0\1\101\1\0\1\101\3\0\1\101"+ - "\2\0\26\101\21\0\6\200\2\0\70\200\1\0\2\103"+ - "\1\0\2\103\6\0\3\103\1\0\1\103\1\0\1\103"+ - "\3\0\1\103\2\0\26\103\21\0\6\201\2\0\70\201"+ - "\7\106\1\0\70\106\13\202\1\203\64\202\1\0\1\112"+ - "\12\0\1\112\2\0\1\204\1\77\13\0\1\77\44\0"+ - "\2\113\11\0\1\113\1\0\1\113\1\205\1\113\1\0"+ - "\1\206\7\0\1\113\1\0\1\113\1\0\1\206\1\113"+ - "\4\0\1\113\5\0\1\113\3\0\1\113\22\0\1\114"+ - "\12\0\1\114\2\0\1\207\61\0\1\115\12\0\1\115"+ - "\3\0\1\77\13\0\1\77\43\0\7\21\1\0\70\21"+ - "\25\0\1\210\53\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\17\7"+ - "\1\211\6\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\2\7"+ - "\1\212\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\26\7"+ - "\2\0\1\213\17\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\4\7"+ - "\1\214\21\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\5\7"+ - "\1\215\20\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\1\216"+ - "\25\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\1\7\1\217"+ - "\24\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\14\7\1\220"+ - "\11\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\221\2\0\1\7\1\222"+ - "\20\7\1\223\3\7\22\0\2\7\1\0\2\7\6\0"+ + "\1\131\1\132\14\7\1\133\4\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\134\2\0\26\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\3\0\1\135\2\0"+ + "\5\7\1\136\20\7\22\0\2\7\1\0\2\7\6\0"+ "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\11\7\1\224\1\225\13\7\22\0\2\7\1\0\2\7"+ + "\3\7\1\137\22\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ + "\17\7\1\140\6\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ + "\12\7\1\141\4\7\1\142\6\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\7\2\0\14\7\1\143\11\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\7\2\0\7\7\1\144\16\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\7\2\0\13\7\1\145\12\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\7\2\0\1\7\1\146\24\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\147\2\0\5\7\1\150\4\7\1\151\13\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\1\7\1\152\24\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\5\7\1\153\20\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\12\7\1\154\13\7\54\0"+ + "\1\155\24\0\1\156\77\0\1\157\3\0\1\160\73\0"+ + "\1\161\1\0\1\162\75\0\1\163\77\0\1\164\104\0"+ + "\1\165\100\0\1\166\71\0\1\167\17\0\7\65\2\0"+ + "\13\65\2\0\52\65\2\0\1\170\1\0\1\170\1\0"+ + "\1\171\6\0\2\170\1\0\1\170\1\0\1\170\3\0"+ + "\1\170\1\172\1\0\26\170\21\0\7\173\1\0\16\173"+ + "\1\174\51\173\1\0\2\72\1\0\2\72\6\0\3\72"+ + "\1\0\1\72\1\0\1\72\3\0\1\72\2\0\26\72"+ + "\21\0\6\175\2\0\70\175\1\0\2\72\1\0\2\72"+ + "\6\0\3\72\1\0\1\72\1\0\1\72\3\0\1\72"+ + "\2\0\1\72\1\176\24\72\22\0\1\116\12\0\1\116"+ + "\2\0\1\177\61\0\1\200\12\0\1\200\4\0\1\200"+ + "\40\0\1\200\15\0\6\101\1\201\1\0\70\101\1\0"+ + "\2\102\1\0\2\102\6\0\3\102\1\0\1\102\1\0"+ + "\1\102\3\0\1\102\2\0\26\102\21\0\6\202\2\0"+ + "\70\202\1\0\2\104\1\0\2\104\6\0\3\104\1\0"+ + "\1\104\1\0\1\104\3\0\1\104\2\0\26\104\21\0"+ + "\6\203\2\0\70\203\7\107\1\0\70\107\13\204\1\205"+ + "\64\204\1\0\1\113\12\0\1\113\2\0\1\206\1\100"+ + "\17\0\1\100\40\0\2\114\11\0\1\114\1\0\1\114"+ + "\1\207\1\114\1\0\1\210\13\0\1\114\1\0\1\114"+ + "\1\210\1\114\2\0\1\114\4\0\1\114\3\0\1\114"+ + "\22\0\1\115\12\0\1\115\2\0\1\211\61\0\1\116"+ + "\12\0\1\116\3\0\1\100\17\0\1\100\37\0\7\21"+ + "\1\0\70\21\25\0\1\212\53\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\5\7\1\226\20\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\10\7\1\227\15\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\230\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\231\5\7\1\232\14\7\22\0\2\7"+ + "\2\0\2\7\1\213\10\7\1\214\12\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\3\0\1\7\2\0\1\233\25\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ - "\1\7\2\0\17\7\1\234\6\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ - "\1\7\2\0\12\7\1\235\13\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ - "\1\7\2\0\11\7\1\236\14\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ - "\1\7\2\0\12\7\1\237\4\7\1\240\6\7\52\0"+ - "\1\241\3\0\1\242\122\0\1\243\77\0\1\244\20\0"+ - "\2\167\1\0\2\167\6\0\3\167\1\0\1\167\1\0"+ - "\1\167\3\0\1\167\2\0\26\167\21\0\6\245\2\0"+ - "\70\245\1\0\2\246\11\0\1\246\1\0\1\246\1\0"+ - "\1\246\11\0\1\246\1\0\1\246\2\0\1\246\4\0"+ - "\1\246\5\0\1\246\3\0\1\246\21\0\6\174\1\247"+ - "\1\0\70\174\1\0\1\176\12\0\1\176\63\0\6\200"+ - "\1\250\1\0\70\200\6\201\1\251\1\0\70\201\13\202"+ - "\1\252\64\202\12\253\1\254\1\203\64\253\1\0\1\115"+ - "\12\0\1\115\64\0\2\255\11\0\1\255\1\0\1\255"+ - "\1\175\1\255\11\0\1\255\1\0\1\255\2\0\1\255"+ - "\4\0\1\255\5\0\1\255\3\0\1\255\22\0\1\176"+ - "\12\0\1\176\4\0\1\256\40\0\1\256\34\0\1\175"+ - "\60\0\25\210\1\257\52\210\1\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\17\7\1\260\6\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\261\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\262\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\263\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\10\7\1\264\15\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\4\7\1\265\21\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\266\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\267\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\11\7\1\270\14\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\4\7\1\271\21\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\7\7\1\272\16\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ - "\2\0\3\7\1\273\22\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\274"+ - "\2\0\26\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\1\7"+ - "\1\275\24\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\3\0\1\7\2\0\1\276"+ - "\25\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\17\7\1\277"+ - "\6\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\4\7\1\300"+ + "\3\0\1\215\2\0\5\7\1\216\14\7\1\217\3\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\10\7\1\220\15\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\10\7\1\221\15\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\17\7\1\222\6\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\6\7\1\223\17\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\26\7\2\0\1\224"+ + "\17\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\3\7\1\225\22\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\4\7\1\226\21\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\5\7\1\227\20\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\15\7\1\230\10\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\1\231\25\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\7\7\1\232\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\2\7\1\233\4\7\1\234"+ + "\16\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\4\7\1\235"+ "\21\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\4\7\1\301"+ - "\21\7\22\0\2\302\1\0\2\302\6\0\3\302\1\0"+ - "\1\302\1\0\1\302\3\0\1\302\2\0\26\302\21\0"+ - "\6\245\1\303\1\0\70\245\1\0\2\304\11\0\1\304"+ - "\1\0\1\304\1\0\1\304\11\0\1\304\1\0\1\304"+ - "\2\0\1\304\4\0\1\304\5\0\1\304\3\0\1\304"+ - "\21\0\12\202\1\305\1\252\64\202\13\253\1\306\64\253"+ - "\1\0\2\255\11\0\1\255\1\0\1\255\1\0\1\255"+ - "\1\0\1\206\7\0\1\255\1\0\1\255\1\0\1\206"+ - "\1\255\4\0\1\255\5\0\1\255\3\0\1\255\21\0"+ - "\25\210\1\307\52\210\1\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\4\7\1\310\21\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\12\7\1\311\13\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\11\7\1\312\14\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\4\7\1\313\21\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\6\7\1\314\17\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\10\7\1\315\15\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\15\7\1\316\10\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\12\7\1\317\13\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\20\7\1\320\5\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\3\7\1\321\22\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ - "\3\7\1\322\22\7\22\0\2\323\11\0\1\323\1\0"+ - "\1\323\1\0\1\323\11\0\1\323\1\0\1\323\2\0"+ - "\1\323\4\0\1\323\5\0\1\323\3\0\1\323\21\0"+ - "\12\253\1\254\1\306\64\253\25\210\1\324\52\210\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\17\7\1\236"+ + "\6\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\13\7\1\237"+ + "\12\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\2\7\1\240"+ + "\23\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\13\7\1\241"+ + "\3\7\1\242\6\7\55\0\1\243\1\244\122\0\1\245"+ + "\77\0\1\246\20\0\2\170\1\0\2\170\6\0\3\170"+ + "\1\0\1\170\1\0\1\170\3\0\1\170\2\0\26\170"+ + "\21\0\6\247\2\0\70\247\1\0\2\250\11\0\1\250"+ + "\1\0\1\250\1\0\1\250\15\0\1\250\1\0\1\250"+ + "\1\0\1\250\2\0\1\250\4\0\1\250\3\0\1\250"+ + "\21\0\6\175\1\251\1\0\70\175\1\0\2\72\1\0"+ + "\2\72\6\0\3\72\1\0\1\72\1\0\1\72\3\0"+ + "\1\72\2\0\2\72\1\252\23\72\22\0\1\200\12\0"+ + "\1\200\63\0\6\202\1\253\1\0\70\202\6\203\1\254"+ + "\1\0\70\203\13\204\1\255\64\204\12\256\1\257\1\205"+ + "\64\256\1\0\1\116\12\0\1\116\64\0\2\260\11\0"+ + "\1\260\1\0\1\260\1\177\1\260\15\0\1\260\1\0"+ + "\1\260\1\0\1\260\2\0\1\260\4\0\1\260\3\0"+ + "\1\260\22\0\1\200\12\0\1\200\4\0\1\261\40\0"+ + "\1\261\34\0\1\177\60\0\25\212\1\262\52\212\1\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\3\0\1\7\2\0\5\7\1\325\20\7\22\0"+ + "\1\7\3\0\1\7\2\0\3\7\1\263\22\7\22\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\3\0\1\7\2\0\1\326\25\7\22\0\2\7"+ + "\1\7\3\0\1\7\2\0\12\7\1\264\13\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\7\7\1\265\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\2\7\1\266\23\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\7\7\1\267\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\7\7\1\270\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\17\7\1\271\6\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\7\7\1\272\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\7\7\1\273\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\3\0\1\7\2\0\1\274\25\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\3\0\1\7\2\0\10\7\1\327\15\7\22\0\2\7"+ + "\3\0\1\7\2\0\3\7\1\275\22\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\3\0\1\7\2\0\1\330\25\7\22\0\2\172\11\0"+ - "\1\172\1\0\1\172\1\0\1\172\11\0\1\172\1\0"+ - "\1\172\2\0\1\172\4\0\1\172\5\0\1\172\3\0"+ - "\1\172\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\7\2\0\1\7\1\331"+ - "\24\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\3\0\1\332\2\0\26\7\22\0"+ + "\3\0\1\7\2\0\7\7\1\276\16\7\22\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\3\0\1\277\2\0\26\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\5\7\1\300\20\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\17\7\1\301\6\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\4\7\1\302\21\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\3\7\1\303\22\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\3\7\1\304\22\7\22\0\2\305\1\0\2\305"+ + "\6\0\3\305\1\0\1\305\1\0\1\305\3\0\1\305"+ + "\2\0\26\305\21\0\6\247\1\306\1\0\70\247\1\0"+ + "\2\307\11\0\1\307\1\0\1\307\1\0\1\307\15\0"+ + "\1\307\1\0\1\307\1\0\1\307\2\0\1\307\4\0"+ + "\1\307\3\0\1\307\22\0\2\72\1\0\2\72\6\0"+ + "\3\72\1\0\1\72\1\0\1\72\3\0\1\72\2\0"+ + "\3\72\1\310\22\72\21\0\12\204\1\311\1\255\64\204"+ + "\13\256\1\312\64\256\1\0\2\260\11\0\1\260\1\0"+ + "\1\260\1\0\1\260\1\0\1\210\13\0\1\260\1\0"+ + "\1\260\1\210\1\260\2\0\1\260\4\0\1\260\3\0"+ + "\1\260\21\0\25\212\1\313\52\212\1\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\7\2\0\16\7\1\314\7\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\3\0"+ + "\1\7\2\0\1\315\25\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\13\7\1\316\12\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\3\7\1\317\22\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\2\7\1\320\23\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\3\7\1\321\22\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\11\7\1\322\14\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\13\7\1\323\12\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\20\7\1\324\5\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\7\7\1\325\16\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\3\0\1\7"+ + "\2\0\7\7\1\326\16\7\22\0\2\327\11\0\1\327"+ + "\1\0\1\327\1\0\1\327\15\0\1\327\1\0\1\327"+ + "\1\0\1\327\2\0\1\327\4\0\1\327\3\0\1\327"+ + "\21\0\12\256\1\257\1\312\64\256\25\212\1\330\52\212"+ + "\1\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\10\7\1\331\15\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\4\7\1\332\21\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\3\0\1\7\2\0\1\333\25\7\22\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\3\0\1\7\2\0\6\7\1\333\17\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\3\0\1\7\2\0\3\7\1\334\22\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\3\0\1\7\2\0\3\7\1\335\22\7\21\0"; + "\1\7\3\0\1\7\2\0\4\7\1\334\21\7\22\0"+ + "\2\173\11\0\1\173\1\0\1\173\1\0\1\173\15\0"+ + "\1\173\1\0\1\173\1\0\1\173\2\0\1\173\4\0"+ + "\1\173\3\0\1\173\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\3\0\1\7\2\0"+ + "\5\7\1\335\20\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\3\0\1\336\2\0"+ + "\26\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\11\7\1\337"+ + "\14\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\7\7\1\340"+ + "\16\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\3\0\1\7\2\0\7\7\1\341"+ + "\16\7\21\0"; private static int [] zzUnpackTrans() { - int [] result = new int[9344]; + int [] result = new int[9536]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -491,17 +499,17 @@ class _JetLexer implements FlexLexer { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\4\0\1\11\15\1\2\11\21\1\1\11\6\1\10\11"+ - "\1\1\1\11\1\1\1\0\1\11\1\1\1\0\2\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\0"+ - "\2\1\10\11\1\1\1\0\2\11\1\1\1\0\1\11"+ - "\1\1\1\11\2\0\2\1\4\0\3\1\1\11\27\1"+ - "\2\11\2\0\3\11\1\0\1\1\1\11\1\1\2\0"+ - "\22\1\2\11\1\0\1\11\2\0\13\1\1\0\1\11"+ - "\11\1"; + "\1\1\1\11\1\1\1\0\1\11\1\1\1\0\1\1"+ + "\2\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\0\2\1\10\11\1\1\1\0\2\11\1\1\1\0"+ + "\1\1\1\11\1\1\1\11\2\0\2\1\4\0\12\1"+ + "\1\11\20\1\2\11\2\0\1\11\1\1\2\11\1\0"+ + "\1\1\1\11\1\1\2\0\22\1\2\11\1\0\1\1"+ + "\1\11\2\0\13\1\1\0\1\11\11\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[221]; + int [] result = new int[225]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -835,23 +843,23 @@ class _JetLexer implements FlexLexer { case 3: { return JetTokens.IDENTIFIER; } - case 97: break; + case 98: break; case 11: { pushState(STRING); return JetTokens.OPEN_QUOTE; } - case 98: break; + case 99: break; case 71: { return JetTokens.FOR_KEYWORD ; } - case 99: break; - case 94: + case 100: break; + case 95: { return JetTokens.RETURN_KEYWORD ; } - case 100: break; - case 78: + case 101: break; + case 81: { return JetTokens.NULL_KEYWORD ; } - case 101: break; + case 102: break; case 34: { if (lBraceCount == 0) { popState(); @@ -860,369 +868,373 @@ class _JetLexer implements FlexLexer { lBraceCount--; return JetTokens.RBRACE; } - case 102: break; + case 103: break; case 18: { return JetTokens.LT ; } - case 103: break; + case 104: break; case 51: { return JetTokens.DO_KEYWORD ; } - case 104: break; + case 105: break; case 17: { return JetTokens.PLUS ; } - case 105: break; + case 106: break; case 67: { return JetTokens.RAW_STRING_LITERAL; } - case 106: break; + case 107: break; case 55: { return JetTokens.PLUSEQ ; } - case 107: break; + case 108: break; + case 86: + { popState(); return JetTokens.THIS_KEYWORD; + } + case 109: break; case 27: { return JetTokens.COMMA ; } - case 108: break; + case 110: break; case 19: { return JetTokens.GT ; } - case 109: break; + case 111: break; case 4: { return JetTokens.WHITE_SPACE; } - case 110: break; + case 112: break; case 24: { return JetTokens.RPAR ; } - case 111: break; + case 113: break; case 54: { return JetTokens.DOUBLE_ARROW; } - case 112: break; - case 80: + case 114: break; + case 79: { return JetTokens.TRUE_KEYWORD ; } - case 113: break; + case 115: break; case 36: { return JetTokens.FIELD_IDENTIFIER; } - case 114: break; + case 116: break; case 59: { return JetTokens.ANDAND ; } - case 115: break; + case 117: break; case 63: { pushState(LONG_TEMPLATE_ENTRY); return JetTokens.LONG_TEMPLATE_ENTRY_START; } - case 116: break; + case 118: break; case 66: { return JetTokens.DOC_COMMENT; } - case 117: break; + case 119: break; case 35: { return JetTokens.FLOAT_LITERAL; } - case 118: break; + case 120: break; case 39: { return JetTokens.EOL_COMMENT; } - case 119: break; + case 121: break; case 83: { return JetTokens.WHEN_KEYWORD ; } - case 120: break; + case 122: break; case 25: { return JetTokens.COLON ; } - case 121: break; + case 123: break; case 57: { return JetTokens.LTEQ ; } - case 122: break; + case 124: break; case 46: { return JetTokens.ARROW ; } - case 123: break; + case 125: break; case 32: { popState(); return JetTokens.IDENTIFIER; } - case 124: break; + case 126: break; case 21: { return JetTokens.LBRACKET ; } - case 125: break; + case 127: break; case 65: { yypushback(2); return JetTokens.INTEGER_LITERAL; } - case 126: break; + case 128: break; case 10: { return JetTokens.CHARACTER_LITERAL; } - case 127: break; + case 129: break; case 72: { return JetTokens.VAR_KEYWORD ; } - case 128: break; + case 130: break; case 58: { return JetTokens.GTEQ ; } - case 129: break; + case 131: break; case 2: { return JetTokens.INTEGER_LITERAL; } - case 130: break; + case 132: break; case 13: { return JetTokens.RBRACE ; } - case 131: break; - case 87: + case 133: break; + case 90: { return JetTokens.CLASS_KEYWORD ; } - case 132: break; + case 134: break; case 14: { return JetTokens.EXCL ; } - case 133: break; - case 69: + case 135: break; + case 68: { return JetTokens.TRY_KEYWORD ; } - case 134: break; + case 136: break; case 52: { return JetTokens.EXCLEQ ; } - case 135: break; + case 137: break; case 45: { return JetTokens.MINUSEQ ; } - case 136: break; - case 89: + case 138: break; + case 87: { return JetTokens.THROW_KEYWORD ; } - case 137: break; - case 86: + case 139: break; + case 89: { return JetTokens.SUPER_KEYWORD ; } - case 138: break; - case 91: + case 140: break; + case 92: { return JetTokens.WHILE_KEYWORD ; } - case 139: break; + case 141: break; case 44: { return JetTokens.MINUSMINUS; } - case 140: break; - case 95: + case 142: break; + case 96: { return JetTokens.CONTINUE_KEYWORD ; } - case 141: break; - case 74: + case 143: break; + case 75: { return JetTokens.NOT_IN; } - case 142: break; + case 144: break; case 38: { return JetTokens.ATAT ; } - case 143: break; + case 145: break; case 6: { return JetTokens.DIV ; } - case 144: break; + case 146: break; case 37: { return JetTokens.LABEL_IDENTIFIER; } - case 145: break; + case 147: break; case 29: { return JetTokens.REGULAR_STRING_PART; } - case 146: break; + case 148: break; case 16: { return JetTokens.QUEST ; } - case 147: break; + case 149: break; case 60: { return JetTokens.OROR ; } - case 148: break; + case 150: break; case 20: { return JetTokens.PERC ; } - case 149: break; + case 151: break; case 76: { return JetTokens.EXCLEQEQEQ; } - case 150: break; + case 152: break; case 61: { return JetTokens.PERCEQ ; } - case 151: break; + case 153: break; case 43: { return JetTokens.RANGE ; } - case 152: break; + case 154: break; case 1: { return TokenType.BAD_CHARACTER; } - case 153: break; - case 96: + case 155: break; + case 97: { return JetTokens.NAMESPACE_KEYWORD ; } - case 154: break; - case 75: + case 156: break; + case 74: { return JetTokens.NOT_IS; } - case 155: break; + case 157: break; case 7: { return JetTokens.MUL ; } - case 156: break; + case 158: break; case 22: { return JetTokens.RBRACKET ; } - case 157: break; + case 159: break; case 56: { return JetTokens.PLUSPLUS ; } - case 158: break; - case 81: + case 160: break; + case 78: { return JetTokens.THIS_KEYWORD ; } - case 159: break; + case 161: break; case 8: { return JetTokens.DOT ; } - case 160: break; + case 162: break; case 26: { return JetTokens.SEMICOLON ; } - case 161: break; - case 50: + case 163: break; + case 49: { return JetTokens.IF_KEYWORD ; } - case 162: break; + case 164: break; case 64: { return JetTokens.ESCAPE_SEQUENCE; } - case 163: break; + case 165: break; case 31: { popState(); return JetTokens.CLOSING_QUOTE; } - case 164: break; + case 166: break; case 15: { return JetTokens.EQ ; } - case 165: break; + case 167: break; case 5: { return JetTokens.AT ; } - case 166: break; - case 68: + case 168: break; + case 69: { return JetTokens.AS_SAFE; } - case 167: break; + case 169: break; case 23: { return JetTokens.LPAR ; } - case 168: break; + case 170: break; case 9: { return JetTokens.MINUS ; } - case 169: break; - case 92: + case 171: break; + case 93: { return JetTokens.FALSE_KEYWORD ; } - case 170: break; - case 82: + case 172: break; + case 80: { return JetTokens.TYPE_KEYWORD ; } - case 171: break; + case 173: break; case 70: { return JetTokens.FUN_KEYWORD ; } - case 172: break; - case 49: + case 174: break; + case 47: { return JetTokens.IS_KEYWORD ; } - case 173: break; + case 175: break; case 30: { popState(); yypushback(1); return JetTokens.DANGLING_NEWLINE; } - case 174: break; + case 176: break; case 33: { lBraceCount++; return JetTokens.LBRACE; } - case 175: break; + case 177: break; case 85: { yypushback(3); return JetTokens.EXCL; } - case 176: break; + case 178: break; case 41: { return JetTokens.DIVEQ ; } - case 177: break; - case 79: + case 179: break; + case 82: { return JetTokens.ELSE_KEYWORD ; } - case 178: break; - case 47: + case 180: break; + case 50: { return JetTokens.AS_KEYWORD ; } - case 179: break; + case 181: break; case 48: { return JetTokens.IN_KEYWORD ; } - case 180: break; + case 182: break; case 53: { return JetTokens.EQEQ ; } - case 181: break; + case 183: break; case 77: { return JetTokens.EQEQEQ ; } - case 182: break; + case 184: break; case 73: { return JetTokens.VAL_KEYWORD ; } - case 183: break; + case 185: break; case 84: { return JetTokens.CAPITALIZED_THIS_KEYWORD ; } - case 184: break; + case 186: break; case 42: { return JetTokens.MULTEQ ; } - case 185: break; + case 187: break; case 62: { pushState(SHORT_TEMPLATE_ENTRY); yypushback(yylength() - 1); return JetTokens.SHORT_TEMPLATE_ENTRY_START; } - case 186: break; + case 188: break; case 12: { return JetTokens.LBRACE ; } - case 187: break; - case 93: + case 189: break; + case 94: { return JetTokens.OBJECT_KEYWORD ; } - case 188: break; - case 90: + case 190: break; + case 91: { return JetTokens.BREAK_KEYWORD ; } - case 189: break; + case 191: break; case 40: { return JetTokens.BLOCK_COMMENT; } - case 190: break; + case 192: break; case 88: { return JetTokens.TRAIT_KEYWORD ; } - case 191: break; + case 193: break; case 28: { return JetTokens.HASH ; } - case 192: break; + case 194: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/compiler/testData/diagnostics/tests/regressions/kt847.jet b/compiler/testData/diagnostics/tests/regressions/kt847.jet new file mode 100644 index 00000000000..4d696af9910 --- /dev/null +++ b/compiler/testData/diagnostics/tests/regressions/kt847.jet @@ -0,0 +1,3 @@ +fun T.mustBe(t : T) { + "$this must be$as$t" +} \ No newline at end of file diff --git a/compiler/testData/psi/StringTemplates.jet b/compiler/testData/psi/StringTemplates.jet index 6b628c0b435..8bdec253be9 100644 --- a/compiler/testData/psi/StringTemplates.jet +++ b/compiler/testData/psi/StringTemplates.jet @@ -7,6 +7,7 @@ fun demo() { fun buzz(f : fun () : Any?) : Int = 1 val sdf = 1 val foo = 3; + "$this must be$as$t" "$abc" "$abc\" "$" diff --git a/compiler/testData/psi/StringTemplates.txt b/compiler/testData/psi/StringTemplates.txt index 1fc2653edcb..07ea659f400 100644 --- a/compiler/testData/psi/StringTemplates.txt +++ b/compiler/testData/psi/StringTemplates.txt @@ -157,6 +157,25 @@ JetFile: StringTemplates.jet PsiElement(INTEGER_LITERAL)('3') PsiElement(SEMICOLON)(';') PsiWhiteSpace('\n ') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') + THIS_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(this)('this') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)(' must be') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') + PsiErrorElement:Keyword cannot be used as a reference + PsiElement(as)('as') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') STRING_TEMPLATE PsiElement(OPEN_QUOTE)('"') SHORT_STRING_TEMPLATE_ENTRY diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index af07f14c2e9..28f3de35070 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -134,7 +134,7 @@ label literalConstant : "true" | "false" - : StringWithTemplates + : stringTemplate : NoEscapeString : IntegerLiteral : HexadecimalLiteral @@ -143,6 +143,22 @@ literalConstant : "null" ; +stringTemplate + : "\"" stringTemplateElement* "\"" + ; + +stringTemplateElement + : RegularStringPart + : ShortTemplateEntrySTART (SimpleName | "this") + : EscapeSequence + : longTemplate + ; + +longTemplate + : "${" expression "}" + ; + + isRHS : pattern ;