From 2c2c6ea0995e0631ca17cf9ca613aa79815d93c9 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Nov 2011 14:51:41 +0300 Subject: [PATCH 01/17] Clarifying comments added --- .../src/org/jetbrains/jet/lang/resolve/BindingContext.java | 2 +- .../src/org/jetbrains/jet/lang/resolve/BodyResolver.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 70345773268..e4e031f6aa4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -65,7 +65,7 @@ public interface BindingContext { if (declarationPsiElement instanceof JetParameter) { JetParameter jetParameter = (JetParameter) declarationPsiElement; return jetParameter.getValOrVarNode() != null || - backingFieldRequired; + backingFieldRequired; // this part is unused because we do not allow access to constructor parameters in member bodies } if (propertyDescriptor.getModality() == Modality.ABSTRACT) return false; PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index b360e44faf3..c08a8fc9cc1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -57,6 +57,7 @@ public class BodyResolver { }); // This tracks access to properties in order to register primary constructor parameters that yield real fields (JET-9) + // NOTE!!! This code is not used, because we do not allow constructor parameter access in member bodies this.traceForMembers = new ObservableBindingTrace(context.getTrace()).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler() { @Override public void handleRecord(WritableSlice slice, JetReferenceExpression expression, DeclarationDescriptor descriptor) { From cd2dab3e53e4be54f348d445c02a4f5f2f05c666 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 15:05:07 +0400 Subject: [PATCH 02/17] KT-451 Incorrect character literals cause assertion failures '' '21' --- .../constants/CompileTimeConstantResolver.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java index 526bb6d3db0..7a1e1953cb2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java @@ -167,19 +167,20 @@ public class CompileTimeConstantResolver { assert text.charAt(0) == '\'' && text.charAt(text.length() - 1) == '\''; text = text.substring(1, text.length() - 1); - assert text.length() < 3 && text.length() > 0; - if (text.length() == 2) { - assert text.charAt(0) == '\\'; + if (text.length() == 0) { + return new ErrorValue("Empty character literal"); + } else if (text.length() == 1) { + return new CharValue(text.charAt(0)); + } else if (text.length() == 2 && text.charAt(0) == '\\') { Character escaped = translateEscape(text.charAt(1)); if (escaped == null) { return new ErrorValue("Illegal escape: " + text); } return new CharValue(escaped); + } else { + return new ErrorValue("Too many characters in character literal"); } - - assert text.length() == 1; - return new CharValue(text.charAt(0)); } @Nullable From 763be2af9e46fdefee6e3d0f9ae2d7d8f64ab0d5 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 15:09:11 +0400 Subject: [PATCH 03/17] fix comment: it is not automatically generated --- compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex index 95576d76e5a..2b64d56252e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex @@ -1,4 +1,3 @@ -/* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; import java.util.*; From c8e2e06d59cca5edd9614642446e6ef6fa572a9f Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 15:13:08 +0400 Subject: [PATCH 04/17] missing test for KT-451 incorrect character liternals assertion error --- .../quick/IncorrectCharacterLiterals.jet | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet diff --git a/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet b/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet new file mode 100644 index 00000000000..e115b7ca23c --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet @@ -0,0 +1,6 @@ +// http://youtrack.jetbrains.net/issue/KT-451 + +fun ff() { + val b = '' + val c = '23' +} From dda5759643a42dc5a28e2408240286d1d957db26 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Nov 2011 15:42:14 +0300 Subject: [PATCH 05/17] More tests for KT-451 Incorrect character literals cause assertion failures --- .../quick/IncorrectCharacterLiterals.jet | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet b/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet index e115b7ca23c..fcc34e9e44f 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet @@ -1,6 +1,23 @@ // http://youtrack.jetbrains.net/issue/KT-451 +// KT-451 Incorrect character literals cause assertion failures fun ff() { val b = '' val c = '23' } + +fun test() { + 'a' + '\n' + '\t' + '\b' + '\r' + '\"' + '\'' + '\\' + '\$' + '\x' + '\123' + '\ra' + '\000' +} \ No newline at end of file From 44b631cdd00feeb94c3037f05e8a352e2fa61f2a Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 16:16:31 +0400 Subject: [PATCH 06/17] enhancements in character constant parsing * missing assertion converted to ErrorValue * added test for 'a * '\' must be error (KT-461) --- .../constants/CompileTimeConstantResolver.java | 11 +++++++++-- .../quick/IncorrectCharacterLiterals.jet | 5 ++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java index 7a1e1953cb2..7a1d4ffebde 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java @@ -164,14 +164,21 @@ public class CompileTimeConstantResolver { if (error != null) { return error; } - assert text.charAt(0) == '\'' && text.charAt(text.length() - 1) == '\''; + + if (text.charAt(0) != '\'' || text.charAt(text.length() - 1) != '\'') { + return new ErrorValue("Incorret character constant"); + } text = text.substring(1, text.length() - 1); if (text.length() == 0) { return new ErrorValue("Empty character literal"); } else if (text.length() == 1) { - return new CharValue(text.charAt(0)); + if (text.charAt(0) == '\\') { + return new ErrorValue("Illegal escape: " + text); + } else { + return new CharValue(text.charAt(0)); + } } else if (text.length() == 2 && text.charAt(0) == '\\') { Character escaped = translateEscape(text.charAt(1)); if (escaped == null) { diff --git a/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet b/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet index fcc34e9e44f..5808615db0f 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/IncorrectCharacterLiterals.jet @@ -4,6 +4,9 @@ fun ff() { val b = '' val c = '23' + val d = 'a + val e = 'ab + val f = '\' } fun test() { @@ -20,4 +23,4 @@ fun test() { '\123' '\ra' '\000' -} \ No newline at end of file +} From ea9b67c5cd2f66b6cb40ef19b8c7e707fb019a82 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 16:27:25 +0400 Subject: [PATCH 07/17] regenerate grammar --- .../frontend/src/org/jetbrains/jet/lexer/_JetLexer.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java index e2851597318..edfba28c004 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java @@ -1,6 +1,5 @@ -/* The following code was generated by JFlex 1.4.3 on 10/19/11 2:50 PM */ +/* The following code was generated by JFlex 1.4.3 on 11/10/11 3:26 PM */ -/* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; import java.util.*; @@ -14,8 +13,8 @@ import org.jetbrains.jet.lexer.JetTokens; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 10/19/11 2:50 PM from the specification file - * /Users/abreslav/work/jet/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex + * on 11/10/11 3:26 PM from the specification file + * /Users/yozh/devel/jb/jet/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { /** initial size of the lookahead buffer */ From 70b7810c3059a33d6fdaa29208af02a67e87448e Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 16:50:23 +0400 Subject: [PATCH 08/17] KT-458 Need to improve quoted identifiers support class `$$$` should not fail --- .../src/org/jetbrains/jet/lexer/Jet.flex | 2 +- .../org/jetbrains/jet/lexer/_JetLexer.java | 359 +++++++++--------- compiler/testData/psi/QuotedIdentifiers.jet | 5 + compiler/testData/psi/QuotedIdentifiers.txt | 30 +- 4 files changed, 209 insertions(+), 187 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex index 2b64d56252e..246c6d27e1e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex @@ -58,7 +58,7 @@ IDENTIFIER_PART=[:digit:]|{LETTER} PLAIN_IDENTIFIER={LETTER} {IDENTIFIER_PART}* // TODO: this one MUST allow everything accepted by the runtime // TODO: Replace backticks by one backslash in the begining -ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}` +ESCAPED_IDENTIFIER = `[^`\n]+` IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER} FIELD_IDENTIFIER = \${IDENTIFIER} LABEL_IDENTIFIER = \@{IDENTIFIER} diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java index edfba28c004..698d78e7c93 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/10/11 3:26 PM */ +/* The following code was generated by JFlex 1.4.3 on 11/10/11 3:46 PM */ package org.jetbrains.jet.lexer; @@ -13,7 +13,7 @@ import org.jetbrains.jet.lexer.JetTokens; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 11/10/11 3:26 PM from the specification file + * on 11/10/11 3:46 PM from the specification file * /Users/yozh/devel/jb/jet/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { @@ -40,10 +40,10 @@ class _JetLexer implements FlexLexer { * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\11\0\1\3\1\13\1\0\1\3\23\0\1\3\1\57\1\25\1\77"+ - "\1\7\1\67\1\65\1\23\1\72\1\73\1\12\1\62\1\76\1\21"+ - "\1\17\1\11\1\14\11\1\1\74\1\75\1\63\1\60\1\64\1\61"+ - "\1\10\1\2\1\16\2\2\1\20\1\2\11\4\1\22\3\4\1\54"+ + "\11\0\1\3\1\7\1\0\1\3\23\0\1\3\1\57\1\25\1\77"+ + "\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\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"+ @@ -123,21 +123,21 @@ class _JetLexer implements FlexLexer { "\1\7\1\2\1\10\1\11\1\12\1\13\1\14\1\15"+ "\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\2\35\1\36\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\1\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\10\3\1\106\1\107\1\3\1\110\1\111"+ - "\1\112\1\113\1\114\1\115\1\0\1\40\1\44\1\45"+ - "\1\0\2\102\1\43\2\0\1\3\1\116\1\117\5\3"+ - "\1\120\1\121\1\3\1\122\2\3\1\123\2\3\1\124"+ - "\1\125\1\76\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\103"+ - "\2\3\1\135\1\136\3\3\1\137\1\140"; + "\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\1\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\10\3\1\106\1\107\1\3\1\110"+ + "\1\111\1\112\1\113\1\114\1\115\1\0\1\40\1\44"+ + "\1\45\1\0\2\102\1\43\2\0\1\3\1\116\1\117"+ + "\5\3\1\120\1\121\1\3\1\122\2\3\1\123\2\3"+ + "\1\124\1\125\1\76\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\103\2\3\1\135\1\136\3\3\1\137\1\140"; private static int [] zzUnpackAction() { int [] result = new int[217]; @@ -171,7 +171,7 @@ class _JetLexer implements FlexLexer { "\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\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\u0a80\0\u0100\0\u0ac0"+ + "\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"+ @@ -218,177 +218,166 @@ class _JetLexer implements FlexLexer { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\5\1\6\1\7\1\10\1\7\1\5\1\11\1\12"+ - "\1\13\1\14\1\15\1\10\1\16\2\7\1\17\1\7"+ + "\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\23\1\24\1\25"+ "\1\26\1\7\1\27\1\30\1\7\1\31\1\32\1\33"+ "\1\34\1\7\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\7\65\1\66\3\65"+ - "\1\67\10\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\5\0\27\72\21\0\1\5\1\6\1\7\1\10"+ - "\1\7\1\5\1\11\1\12\1\13\1\14\1\15\1\10"+ - "\1\16\2\7\1\17\1\7\1\20\1\7\1\21\1\5"+ - "\1\22\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\7\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"+ - "\12\0\1\77\45\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\27\7\24\0\1\10"+ - "\7\0\1\10\66\0\1\100\1\0\1\100\10\0\2\100"+ - "\1\0\1\100\1\0\1\100\5\0\27\100\23\0\1\101"+ - "\1\0\1\101\1\0\1\102\6\0\2\101\1\0\1\101"+ - "\1\0\1\101\5\0\27\101\23\0\1\103\1\0\1\103"+ - "\1\0\1\104\1\0\1\105\4\0\2\103\1\0\1\103"+ - "\1\0\1\103\5\0\27\103\32\0\1\106\1\107\45\0"+ - "\1\110\77\0\1\111\20\0\1\112\12\0\1\112\1\113"+ - "\1\114\1\76\1\77\12\0\1\77\10\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\13\21\1\0\7\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\5\0\1\7"+ - "\1\125\10\7\1\126\14\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\4\7"+ - "\1\127\22\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\20\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\5\0\12\7\1\131\14\7\22\0\2\7"+ + "\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"+ + "\5\0\27\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\74\1\75\1\25\1\26\1\7\1\27\1\30\1\7"+ + "\1\31\1\32\1\33\1\34\1\7\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\12\0"+ + "\1\77\45\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\27\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\5\0\27\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\5\0\27\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\12\0\1\77\10\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\5\0\1\7\1\125"+ + "\10\7\1\126\14\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\4\7\1\127"+ + "\22\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\20\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\5\0\12\7\1\131\14\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\7\7\1\132\10\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\5\0"+ + "\14\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\5\0\13\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\5\0"+ + "\1\140\3\7\1\141\15\7\1\142\4\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\7\7\1\132\10\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"+ - "\5\0\14\7\1\134\12\7\22\0\2\7\1\0\2\7"+ + "\5\0\3\7\1\143\23\7\22\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\13\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"+ - "\5\0\1\140\3\7\1\141\15\7\1\142\4\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\3\7\1\143\23\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\13\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\5\0\17\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\5\0\1\7\1\146\5\7\1\147"+ - "\2\7\1\150\14\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\17\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\5\0\1\7\1\152\25\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\7\7\1\153\17\7\62\0\1\154\16\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\1\0\3\65\1\0"+ - "\10\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\171\1\0\27\167\21\0\13\172\1\0\64\172\1\0"+ - "\2\72\1\0\2\72\6\0\3\72\1\0\1\72\1\0"+ - "\1\72\5\0\27\72\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"+ - "\1\115\12\0\1\115\2\0\1\174\61\0\1\175\12\0"+ - "\1\175\4\0\1\175\40\0\1\175\16\0\2\100\1\0"+ - "\2\100\1\176\5\0\3\100\1\0\1\100\1\0\1\100"+ - "\5\0\27\100\22\0\2\101\1\0\2\101\6\0\3\101"+ - "\1\0\1\101\1\0\1\101\5\0\27\101\23\0\1\177"+ - "\1\0\1\177\10\0\2\177\1\0\1\177\1\0\1\177"+ - "\5\0\27\177\22\0\2\103\1\0\2\103\6\0\3\103"+ - "\1\0\1\103\1\0\1\103\5\0\27\103\23\0\1\200"+ - "\1\0\1\200\10\0\2\200\1\0\1\200\1\0\1\200"+ - "\5\0\27\200\21\0\13\106\1\0\64\106\12\201\1\202"+ - "\65\201\1\0\1\112\12\0\1\112\2\0\1\203\1\77"+ - "\12\0\1\77\45\0\2\113\11\0\1\113\1\0\1\113"+ - "\1\204\1\113\1\0\1\205\6\0\1\113\1\0\1\113"+ - "\1\0\1\205\1\113\5\0\1\113\5\0\1\113\3\0"+ - "\1\113\22\0\1\114\12\0\1\114\2\0\1\206\61\0"+ - "\1\115\12\0\1\115\3\0\1\77\12\0\1\77\44\0"+ - "\13\21\1\0\64\21\25\0\1\207\53\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\2\7\1\210\24\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\20\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\5\0\27\7\2\0\1\212\17\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\4\7\1\213\22\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\5\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\5\0\1\215\26\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\5\0\17\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\5\0\1\7\1\216\25\7\22\0\2\7"+ + "\1\0\1\7\5\0\1\7\1\146\5\7\1\147\2\7"+ + "\1\150\14\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\17\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\5\0\1\7\1\152\25\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\15\7\1\217\11\7\22\0\2\7\1\0\2\7"+ + "\5\0\7\7\1\153\17\7\62\0\1\154\16\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\171\1\0\27\167"+ + "\21\0\7\172\1\0\70\172\1\0\2\72\1\0\2\72"+ + "\6\0\3\72\1\0\1\72\1\0\1\72\5\0\27\72"+ + "\21\0\6\173\2\0\70\173\1\0\1\115\12\0\1\115"+ + "\2\0\1\174\61\0\1\175\12\0\1\175\4\0\1\175"+ + "\40\0\1\175\15\0\6\100\1\176\1\0\70\100\1\0"+ + "\2\101\1\0\2\101\6\0\3\101\1\0\1\101\1\0"+ + "\1\101\5\0\27\101\21\0\6\177\2\0\70\177\1\0"+ + "\2\103\1\0\2\103\6\0\3\103\1\0\1\103\1\0"+ + "\1\103\5\0\27\103\21\0\6\200\2\0\70\200\7\106"+ + "\1\0\70\106\13\201\1\202\64\201\1\0\1\112\12\0"+ + "\1\112\2\0\1\203\1\77\12\0\1\77\45\0\2\113"+ + "\11\0\1\113\1\0\1\113\1\204\1\113\1\0\1\205"+ + "\6\0\1\113\1\0\1\113\1\0\1\205\1\113\5\0"+ + "\1\113\5\0\1\113\3\0\1\113\22\0\1\114\12\0"+ + "\1\114\2\0\1\206\61\0\1\115\12\0\1\115\3\0"+ + "\1\77\12\0\1\77\44\0\7\21\1\0\70\21\25\0"+ + "\1\207\53\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\2\7\1\210\24\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\20\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\5\0"+ + "\27\7\2\0\1\212\17\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\4\7\1\213"+ + "\22\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\5\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\5\0\1\215\26\7\22\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\7"+ - "\1\220\10\7\1\221\10\7\1\222\3\7\22\0\2\7"+ - "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\11\7\1\223\1\7\1\224\13\7\22\0\2\7"+ - "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\5\7\1\225\21\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\10\7"+ - "\1\226\16\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\3\7\1\227\23\7"+ + "\1\216\25\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\15\7\1\217\11\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\3\7\1\230\5\7\1\231\15\7"+ + "\1\0\1\7\5\0\1\7\1\220\10\7\1\221\10\7"+ + "\1\222\3\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\11\7\1\223\1\7"+ + "\1\224\13\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\5\7\1\225\21\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\20\7\1\232\6\7\22\0\2\7"+ + "\1\0\1\7\5\0\10\7\1\226\16\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\13\7\1\233\13\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\234"+ - "\26\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\11\7\1\235\15\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\13\7\1\236\4\7\1\237\6\7\51\0"+ - "\1\240\3\0\1\241\123\0\1\242\77\0\1\243\20\0"+ - "\2\167\1\0\2\167\6\0\3\167\1\0\1\167\1\0"+ - "\1\167\5\0\27\167\23\0\1\244\1\0\1\244\10\0"+ - "\2\244\1\0\1\244\1\0\1\244\5\0\27\244\22\0"+ - "\2\173\1\0\2\173\1\245\5\0\3\173\1\0\1\173"+ - "\1\0\1\173\5\0\27\173\22\0\1\175\12\0\1\175"+ - "\64\0\2\177\1\0\2\177\1\246\5\0\3\177\1\0"+ - "\1\177\1\0\1\177\5\0\27\177\22\0\2\200\1\0"+ - "\2\200\1\247\5\0\3\200\1\0\1\200\1\0\1\200"+ - "\5\0\27\200\21\0\12\201\1\250\65\201\11\251\1\252"+ - "\1\202\65\251\1\0\1\115\12\0\1\115\64\0\2\253"+ - "\11\0\1\253\1\0\1\253\1\174\1\253\10\0\1\253"+ - "\1\0\1\253\2\0\1\253\5\0\1\253\5\0\1\253"+ - "\3\0\1\253\22\0\1\175\12\0\1\175\4\0\1\254"+ - "\40\0\1\254\34\0\1\174\60\0\25\207\1\255\52\207"+ - "\1\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\3\7\1\256\23\7\22\0\2\7"+ - "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\20\7\1\257\6\7\22\0\2\7\1\0\2\7"+ + "\5\0\3\7\1\227\23\7\22\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\3\7"+ - "\1\260\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\3\7\1\261\23\7"+ + "\1\230\5\7\1\231\15\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\20\7"+ + "\1\232\6\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\13\7\1\233\13\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\10\7\1\262\16\7\22\0\2\7"+ - "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\4\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\5\0\3\7"+ - "\1\264\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\11\7\1\265\15\7"+ - "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\3\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"+ - "\5\0\4\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\5\0\7\7"+ - "\1\270\17\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\3\7\1\271\23\7"+ - "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\12\7\1\272\14\7\22\0\2\7"+ - "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\1\7\1\273\25\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\274"+ - "\26\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\20\7\1\275\6\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\4\7\1\276\22\7\22\0\2\7\1\0"+ + "\1\0\1\7\5\0\1\234\26\7\22\0\2\7\1\0"+ "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\4\7\1\277\22\7\22\0\2\300\1\0\2\300\6\0"+ - "\3\300\1\0\1\300\1\0\1\300\5\0\27\300\22\0"+ - "\2\244\1\0\2\244\1\301\5\0\3\244\1\0\1\244"+ - "\1\0\1\244\5\0\27\244\21\0\11\201\1\302\1\250"+ - "\65\201\12\251\1\303\65\251\1\0\2\253\11\0\1\253"+ + "\11\7\1\235\15\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\13\7\1\236"+ + "\4\7\1\237\6\7\51\0\1\240\3\0\1\241\123\0"+ + "\1\242\77\0\1\243\20\0\2\167\1\0\2\167\6\0"+ + "\3\167\1\0\1\167\1\0\1\167\5\0\27\167\21\0"+ + "\6\244\2\0\70\244\6\173\1\245\1\0\70\173\1\0"+ + "\1\175\12\0\1\175\63\0\6\177\1\246\1\0\70\177"+ + "\6\200\1\247\1\0\70\200\13\201\1\250\64\201\12\251"+ + "\1\252\1\202\64\251\1\0\1\115\12\0\1\115\64\0"+ + "\2\253\11\0\1\253\1\0\1\253\1\174\1\253\10\0"+ + "\1\253\1\0\1\253\2\0\1\253\5\0\1\253\5\0"+ + "\1\253\3\0\1\253\22\0\1\175\12\0\1\175\4\0"+ + "\1\254\40\0\1\254\34\0\1\174\60\0\25\207\1\255"+ + "\52\207\1\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\3\7\1\256\23\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\20\7\1\257\6\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\3\7\1\260\23\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\3\7\1\261"+ + "\23\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\10\7\1\262\16\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\4\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\5\0"+ + "\3\7\1\264\23\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\11\7\1\265"+ + "\15\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\3\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\5\0\4\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\5\0"+ + "\7\7\1\270\17\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\3\7\1\271"+ + "\23\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\12\7\1\272\14\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\1\7\1\273\25\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\1\274\26\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\20\7\1\275\6\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\5\0\4\7\1\276\22\7\22\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\5\0\4\7\1\277\22\7\22\0\2\300\1\0\2\300"+ + "\6\0\3\300\1\0\1\300\1\0\1\300\5\0\27\300"+ + "\21\0\6\244\1\301\1\0\70\244\12\201\1\302\1\250"+ + "\64\201\13\251\1\303\64\251\1\0\2\253\11\0\1\253"+ "\1\0\1\253\1\0\1\253\1\0\1\205\6\0\1\253"+ "\1\0\1\253\1\0\1\205\1\253\5\0\1\253\5\0"+ "\1\253\3\0\1\253\21\0\25\207\1\304\52\207\1\0"+ @@ -411,7 +400,7 @@ class _JetLexer implements FlexLexer { "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ "\3\7\1\316\23\7\22\0\2\7\1\0\2\7\6\0"+ "\3\7\1\0\1\7\1\0\1\7\5\0\3\7\1\317"+ - "\23\7\21\0\11\251\1\252\1\303\65\251\25\207\1\320"+ + "\23\7\21\0\12\251\1\252\1\303\64\251\25\207\1\320"+ "\52\207\1\0\2\7\1\0\2\7\6\0\3\7\1\0"+ "\1\7\1\0\1\7\5\0\5\7\1\321\21\7\22\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ @@ -472,13 +461,13 @@ 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"+ - "\2\1\1\11\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\0\1\11\1\1\1\11"+ - "\2\0\2\1\4\0\3\1\1\11\27\1\2\11\1\0"+ - "\3\11\1\0\1\1\1\11\1\1\2\0\22\1\3\11"+ - "\2\0\13\1\1\11\11\1"; + "\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\0\1\11\1\1"+ + "\1\11\2\0\2\1\4\0\3\1\1\11\27\1\2\11"+ + "\1\0\3\11\1\0\1\1\1\11\1\1\2\0\22\1"+ + "\3\11\2\0\13\1\1\11\11\1"; private static int [] zzUnpackAttribute() { int [] result = new int[217]; diff --git a/compiler/testData/psi/QuotedIdentifiers.jet b/compiler/testData/psi/QuotedIdentifiers.jet index ecf9496efe6..d878c2ee8fa 100644 --- a/compiler/testData/psi/QuotedIdentifiers.jet +++ b/compiler/testData/psi/QuotedIdentifiers.jet @@ -1,3 +1,8 @@ [`return`] fun `namespace`() { `class`() } + +class `$` +class `$$` +class ` ` +class `1` diff --git a/compiler/testData/psi/QuotedIdentifiers.txt b/compiler/testData/psi/QuotedIdentifiers.txt index ce428edd419..43788d8c138 100644 --- a/compiler/testData/psi/QuotedIdentifiers.txt +++ b/compiler/testData/psi/QuotedIdentifiers.txt @@ -29,4 +29,32 @@ JetFile: QuotedIdentifiers.jet PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiWhiteSpace('\n') - PsiElement(RBRACE)('}') \ No newline at end of file + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('`$`') + PsiWhiteSpace('\n') + TYPE_PARAMETER_LIST + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('`$$`') + PsiWhiteSpace('\n') + TYPE_PARAMETER_LIST + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('` `') + PsiWhiteSpace('\n') + TYPE_PARAMETER_LIST + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('`1`') + TYPE_PARAMETER_LIST + From 5fbf684998da293885d878c6c16a0bda6ef70935 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 19:07:51 +0400 Subject: [PATCH 09/17] continue work on KT-458 70b7810c3059a33d6fdaa29208af02a67e87448e fixed parser this commit fixes typer --- .../jet/lang/psi/JetNamedDeclaration.java | 7 ++++- .../jetbrains/jet/lang/psi/JetPsiUtil.java | 26 ++++++++++++++++++ .../jet/lang/psi/JetSimpleNameExpression.java | 5 +--- .../checkerWithErrorTypes/quick/Dollar.jet | 15 +++++++++++ .../jet/lang/psi/JetPsiUtilTest.java | 27 +++++++++++++++++++ 5 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/checkerWithErrorTypes/quick/Dollar.jet create mode 100644 compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclaration.java index f80a390fc75..dc37a770c64 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclaration.java @@ -19,7 +19,12 @@ public abstract class JetNamedDeclaration extends JetDeclaration implements PsiN @Override public String getName() { PsiElement identifier = getNameIdentifier(); - return identifier != null ? identifier.getText() : null; + if (identifier != null) { + String text = identifier.getText(); + return text != null ? JetPsiUtil.unquoteIdentifier(text) : null; + } else { + return null; + } } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index 0af3fab3d14..c5f1e8c216c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -73,4 +73,30 @@ public class JetPsiUtil { } return null; } + + @NotNull + public static String unquoteIdentifier(@NotNull String quoted) { + if (quoted.indexOf('`') < 0) { + return quoted; + } + + if (quoted.startsWith("`") && quoted.endsWith("`") && quoted.length() >= 2) { + return quoted.substring(1, quoted.length() - 1); + } else { + return quoted; + } + } + + @NotNull + public static String unquoteIdentifierOrFieldReference(@NotNull String quoted) { + if (quoted.indexOf('`') < 0) { + return quoted; + } + + if (quoted.startsWith("$")) { + return "$" + unquoteIdentifier(quoted.substring(1)); + } else { + return unquoteIdentifier(quoted); + } + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java index 4ef04645259..8b2d824ad3c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java @@ -30,10 +30,7 @@ public class JetSimpleNameExpression extends JetReferenceExpression { return null; } String text = referencedNameElement.getNode().getText(); - if (text.startsWith("`") && text.endsWith("`") && text.length() >= 2) { - return text.substring(1, text.length()-1); - } - return text; + return text != null ? JetPsiUtil.unquoteIdentifierOrFieldReference(text) : null; } @Nullable @IfNotParsed diff --git a/compiler/testData/checkerWithErrorTypes/quick/Dollar.jet b/compiler/testData/checkerWithErrorTypes/quick/Dollar.jet new file mode 100644 index 00000000000..7966eb21ab9 --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/quick/Dollar.jet @@ -0,0 +1,15 @@ +namespace dollar + +open class `$$$$$`() { +} +open class `$`() { +} +open class `$$`(`$$$$` : `$$$$$`?) : `$`() { + val `$$$` : `$$$$$`? + { + $`$$$` = `$$$$` + } + open public fun `$$$$$$`() : `$$$$$`? { + return `$$$` + } +} diff --git a/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java b/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java new file mode 100644 index 00000000000..1036e6fdd20 --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.lang.psi; + +import junit.framework.Assert; +import junit.framework.TestCase; + +/** + * @author Stepan Koltsov + */ +public class JetPsiUtilTest extends TestCase { + + public void testUnquotedIdentifier() { + Assert.assertEquals("", JetPsiUtil.unquoteIdentifier("")); + Assert.assertEquals("a2", JetPsiUtil.unquoteIdentifier("a2")); + Assert.assertEquals("", JetPsiUtil.unquoteIdentifier("``")); + Assert.assertEquals("a2", JetPsiUtil.unquoteIdentifier("`a2`")); + } + + public void testUnquotedIdentifierOrFieldReference() { + Assert.assertEquals("", JetPsiUtil.unquoteIdentifierOrFieldReference("")); + Assert.assertEquals("a2", JetPsiUtil.unquoteIdentifierOrFieldReference("a2")); + Assert.assertEquals("", JetPsiUtil.unquoteIdentifierOrFieldReference("``")); + Assert.assertEquals("a2", JetPsiUtil.unquoteIdentifierOrFieldReference("`a2`")); + Assert.assertEquals("$a2", JetPsiUtil.unquoteIdentifierOrFieldReference("$a2")); + Assert.assertEquals("$a2", JetPsiUtil.unquoteIdentifierOrFieldReference("$`a2`")); + } + +} From 5218246d80855fbc2ebd96cfa333e3ce003be1ef Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 20:00:15 +0400 Subject: [PATCH 10/17] KT-424: Check declarations for overload-compatibility === fun a() {} fun a() {} === must be an error. --- .../jet/lang/diagnostics/Errors.java | 13 ++ .../jet/lang/resolve/OverloadResolver.java | 86 ++++++++++ .../jet/lang/resolve/OverloadUtil.java | 52 ++++++ .../jet/lang/resolve/OverridingUtil.java | 7 + .../jet/lang/resolve/TopDownAnalyzer.java | 1 + .../quick/ConflictingOverloads.jet | 12 ++ .../jetbrains/jet/types/JetOverloadTest.java | 158 ++++++++++++++++++ .../jet/types/JetOverridingTest.java | 7 + 8 files changed, 336 insertions(+) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadUtil.java create mode 100644 compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet create mode 100644 compiler/tests/org/jetbrains/jet/types/JetOverloadTest.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 52b22dbcb3c..d18d4ca5db8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -375,6 +375,19 @@ public interface Errors { } }; + ParameterizedDiagnosticFactory2 CONFLICTING_OVERLOADS = new ParameterizedDiagnosticFactory2(ERROR, "{1} is already defined in ''{0}''") { + @Override + protected String makeMessageForA(@NotNull JetClassOrObject jetClassOrObject) { + return jetClassOrObject.getName(); + } + + @Override + protected String makeMessageForB(@NotNull CallableMemberDescriptor memberDescriptor) { + return DescriptorRenderer.TEXT.render(memberDescriptor); + } + }; + + ParameterizedDiagnosticFactory3 RESULT_TYPE_MISMATCH = ParameterizedDiagnosticFactory3.create(ERROR, "{0} must return {1} but returns {2}"); ParameterizedDiagnosticFactory3 UNSAFE_INFIX_CALL = ParameterizedDiagnosticFactory3.create(ERROR, "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java new file mode 100644 index 00000000000..be18d1938de --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -0,0 +1,86 @@ +package org.jetbrains.jet.lang.resolve; + +import com.intellij.psi.PsiElement; +import com.intellij.util.containers.MultiMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.MutableClassDescriptor; +import org.jetbrains.jet.lang.diagnostics.Errors; +import org.jetbrains.jet.lang.psi.*; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.jetbrains.jet.lang.resolve.BindingContext.DELEGATED; + +/** + * @author Stepan Koltsov + */ +public class OverloadResolver { + private final TopDownAnalysisContext context; + + public OverloadResolver(@NotNull TopDownAnalysisContext context) { + this.context = context; + } + + public void process() { + checkOverloads(); + } + + private void checkOverloads() { + for (Map.Entry entry : context.getClasses().entrySet()) { + checkOverloadsInAClass(entry.getValue(), entry.getKey()); + } + for (Map.Entry entry : context.getObjects().entrySet()) { + checkOverloadsInAClass(entry.getValue(), entry.getKey()); + } + } + + private void checkOverloadsInAClass(MutableClassDescriptor classDescriptor, JetClassOrObject klass) { + MultiMap functionsByName = MultiMap.create(); + + for (FunctionDescriptor function : classDescriptor.getFunctions()) { + functionsByName.putValue(function.getName(), function); + } + + for (Map.Entry> e : functionsByName.entrySet()) { + checkOverloadsWithSameName(e.getKey(), e.getValue(), klass); + } + + // properties are checked elsewhere + + // Kotlin has no secondary constructors at this time + + } + + private void checkOverloadsWithSameName(String name, Collection functions, JetClassOrObject klass) { + if (functions.size() == 1) { + // microoptimization + return; + } + + for (FunctionDescriptor function : functions) { + for (FunctionDescriptor function2 : functions) { + if (function == function2) { + continue; + } + + OverloadUtil.OverloadCompatibilityInfo overloadble = OverloadUtil.isOverloadble(function, function2); + if (!overloadble.isSuccess()) { + JetNamedFunction member = (JetNamedFunction) context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, function); + if (member == null) { + assert context.getTrace().get(DELEGATED, function); + return; + } + + // XXX: mark "fun" keyword and parameters as in Java IDE // stepan.koltsov@ + PsiElement mark = member.getNameIdentifier(); + context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(mark, klass, function)); + } + } + } + } + +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadUtil.java new file mode 100644 index 00000000000..c33d452ada0 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadUtil.java @@ -0,0 +1,52 @@ +package org.jetbrains.jet.lang.resolve; + +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; + +/** + * @author Stepan Koltsov + */ +public class OverloadUtil { + + public static OverloadCompatibilityInfo isOverloadble(FunctionDescriptor a, FunctionDescriptor b) { + OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = OverridingUtil.isOverridableByImpl(a, b, false); + if (overrideCompatibilityInfo.isSuccess()) { + return OverloadCompatibilityInfo.someError(); + } else { + return OverloadCompatibilityInfo.success(); + } + } + + public static class OverloadCompatibilityInfo { + + private static final OverloadCompatibilityInfo SUCCESS = new OverloadCompatibilityInfo(true, "SUCCESS"); + + public static OverloadCompatibilityInfo success() { + return SUCCESS; + } + + public static OverloadCompatibilityInfo someError() { + return new OverloadCompatibilityInfo(false, "XXX"); + } + + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + private final boolean isSuccess; + private final String message; + + public OverloadCompatibilityInfo(boolean success, String message) { + isSuccess = success; + this.message = message; + } + + public boolean isSuccess() { + return isSuccess; + } + + public String getMessage() { + return message; + } + + } + +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java index 53b95a441f4..6b26f59f733 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java @@ -93,6 +93,13 @@ public class OverridingUtil { @NotNull public static OverrideCompatibilityInfo isOverridableBy(@NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor) { + return isOverridableByImpl(superDescriptor, subDescriptor, true); + } + + /** + * @param forOverride true for override, false for overload + */ + static OverrideCompatibilityInfo isOverridableByImpl(CallableDescriptor superDescriptor, CallableDescriptor subDescriptor, boolean forOverride) { if (superDescriptor instanceof FunctionDescriptor) { if (subDescriptor instanceof PropertyDescriptor) return OverrideCompatibilityInfo.memberKindMismatch(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 48a8733ee82..eefbe5a7e4b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -52,6 +52,7 @@ public class TopDownAnalyzer { new DeclarationResolver(context).process(); new DelegationResolver(context).process(); new OverrideResolver(context).process(); + new OverloadResolver(context).process(); new BodyResolver(context).resolveBehaviorDeclarationBodies(); new ControlFlowAnalyzer(context, flowDataTraceFactory, declaredLocally).process(); new DeclarationsChecker(context).process(); diff --git a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet new file mode 100644 index 00000000000..e1d47e33868 --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet @@ -0,0 +1,12 @@ +// http://youtrack.jetbrains.net/issue/KT-424 + +class A { + // XXX: error should be reported on the whole method signature + // not only on method name + fun a() { + } + + fun a() { + } +} + diff --git a/compiler/tests/org/jetbrains/jet/types/JetOverloadTest.java b/compiler/tests/org/jetbrains/jet/types/JetOverloadTest.java new file mode 100644 index 00000000000..30916fa528a --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/types/JetOverloadTest.java @@ -0,0 +1,158 @@ +package org.jetbrains.jet.types; + +import org.jetbrains.jet.JetLiteFixture; +import org.jetbrains.jet.JetTestCaseBuilder; +import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.lang.JetSemanticServices; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; +import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.resolve.ClassDescriptorResolver; +import org.jetbrains.jet.lang.resolve.OverloadUtil; +import org.jetbrains.jet.lang.types.JetStandardLibrary; + +/** + * @author Stepan Koltsov + */ +public class JetOverloadTest extends JetLiteFixture { + + private ModuleDescriptor root = new ModuleDescriptor("test_root"); + private JetStandardLibrary library; + private JetSemanticServices semanticServices; + private ClassDescriptorResolver classDescriptorResolver; + + @Override + public void setUp() throws Exception { + super.setUp(); + library = JetStandardLibrary.getJetStandardLibrary(getProject()); + semanticServices = JetSemanticServices.createSemanticServices(library); + classDescriptorResolver = semanticServices.getClassDescriptorResolver(JetTestUtils.DUMMY_TRACE); + } + + @Override + protected String getTestDataPath() { + return JetTestCaseBuilder.getTestDataPathBase(); + } + + public void testBasic() throws Exception { + + assertNotOverloadable( + "fun a() : Int", + "fun a() : Int"); + + assertNotOverloadable( + "fun a() : Int", + "fun a() : Any"); + + assertNotOverloadable( + "fun a() : T1", + "fun a() : T"); + + assertNotOverloadable( + "fun a(a : T1) : T1", + "fun a(a : T) : T"); + + assertNotOverloadable( + "fun a(a : T1) : T1", + "fun a(a : T) : T"); + + assertNotOverloadable( + "fun a(a : T1) : T1", + "fun a(a : T) : Y"); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + assertOverloadable( + "fun ab() : Int", + "fun a() : Int"); + + assertNotOverloadable( + "fun a() : Int", + "fun a() : Any"); + + assertOverloadable( + "fun a(a : Int) : Int", + "fun a() : Int"); + + assertOverloadable( + "fun a() : Int", + "fun a(a : Int) : Int"); + + assertOverloadable( + "fun a(a : Int?) : Int", + "fun a(a : Int) : Int"); + + // XXX: different from overridable + /* + assertNotOverloadable( + "fun a(a : Int) : Int", + "fun a(a : Int) : Int"); + */ + + assertOverloadable( + "fun a(a : T1) : T1", + "fun a(a : T) : T"); + + assertOverloadable( + "fun a(a : T1) : T1", + "fun a(a : Y) : T"); + + assertNotOverloadable( + "fun a(a : T1) : X", + "fun a(a : T) : T"); + + assertNotOverloadable( + "fun a>(a : Array) : T1", + "fun a>(a : Array) : T"); + + assertOverloadable( + "fun a>(a : Array) : T1", + "fun a>(a : Array) : T"); + + assertOverloadable( + "fun a>(a : Array) : T1", + "fun a>(a : Array) : T"); + + assertOverloadable( + "fun a>(a : Array) : T1", + "fun a>(a : Array) : T"); + + assertOverloadable( + "fun a>(a : Array) : T1", + "fun a>(a : Array) : T"); + + assertOverloadable( + "fun a>(a : Array<*>) : T1", + "fun a>(a : Array) : T"); + + } + + private void assertNotOverloadable(String funA, String funB) { + assertOverloadabilityRelation(funA, funB, true); + } + + private void assertOverloadable(String funA, String funB) { + assertOverloadabilityRelation(funA, funB, false); + } + + private void assertOverloadabilityRelation(String funA, String funB, boolean expectedIsError) { + FunctionDescriptor a = makeFunction(funA); + FunctionDescriptor b = makeFunction(funB); + { + OverloadUtil.OverloadCompatibilityInfo overloadableWith = OverloadUtil.isOverloadble(a, b); + assertEquals(overloadableWith.getMessage(), expectedIsError, !overloadableWith.isSuccess()); + } + { + OverloadUtil.OverloadCompatibilityInfo overloadableWith = OverloadUtil.isOverloadble(b, a); + assertEquals(overloadableWith.getMessage(), expectedIsError, !overloadableWith.isSuccess()); + } + } + + private FunctionDescriptor makeFunction(String funDecl) { + JetNamedFunction function = JetPsiFactory.createFunction(getProject(), funDecl); + return classDescriptorResolver.resolveFunctionDescriptor(root, library.getLibraryScope(), function); + } + +} diff --git a/compiler/tests/org/jetbrains/jet/types/JetOverridingTest.java b/compiler/tests/org/jetbrains/jet/types/JetOverridingTest.java index 4de8bd9a285..18b27921f61 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetOverridingTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetOverridingTest.java @@ -67,6 +67,13 @@ public class JetOverridingTest extends JetLiteFixture { "fun a() : Int", "fun a() : Any"); + // return types are not cheked in the utility + /* + assertNotOverridable( + "fun a() : Any", + "fun a() : Int"); + */ + assertNotOverridable( "fun a(a : Int) : Int", "fun a() : Int"); From d155de2bdcbc8adbb6c557cb73fc0528626a3158 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 20:00:19 +0400 Subject: [PATCH 11/17] better diagnostics for KT-424 highlight full function definition, not only function name --- .../jet/lang/diagnostics/Errors.java | 12 +------ .../FunctionSignatureDiagnosticFactory.java | 33 +++++++++++++++++++ .../jet/lang/psi/JetNamedFunction.java | 22 +++++++++++++ .../jet/lang/resolve/OverloadResolver.java | 4 +-- .../quick/ConflictingOverloads.jet | 12 ++++--- 5 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index d18d4ca5db8..fc73f338479 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -375,17 +375,7 @@ public interface Errors { } }; - ParameterizedDiagnosticFactory2 CONFLICTING_OVERLOADS = new ParameterizedDiagnosticFactory2(ERROR, "{1} is already defined in ''{0}''") { - @Override - protected String makeMessageForA(@NotNull JetClassOrObject jetClassOrObject) { - return jetClassOrObject.getName(); - } - - @Override - protected String makeMessageForB(@NotNull CallableMemberDescriptor memberDescriptor) { - return DescriptorRenderer.TEXT.render(memberDescriptor); - } - }; + FunctionSignatureDiagnosticFactory CONFLICTING_OVERLOADS = new FunctionSignatureDiagnosticFactory(ERROR, "{1} is already defined in ''{0}''"); ParameterizedDiagnosticFactory3 RESULT_TYPE_MISMATCH = ParameterizedDiagnosticFactory3.create(ERROR, "{0} must return {1} but returns {2}"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java new file mode 100644 index 00000000000..cea7b7f3f4c --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java @@ -0,0 +1,33 @@ +package org.jetbrains.jet.lang.diagnostics; + +import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.psi.JetClassOrObject; +import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.resolve.DescriptorRenderer; + +/** + * @author Stepan Koltsov + */ +public class FunctionSignatureDiagnosticFactory extends DiagnosticFactoryWithMessageFormat { + + public FunctionSignatureDiagnosticFactory(Severity severity, String messageTemplate) { + super(severity, messageTemplate); + } + + @NotNull + public Diagnostic on(@NotNull JetNamedFunction functionElement, @NotNull FunctionDescriptor functionDescriptor, + @NotNull JetClassOrObject jetClassOrObject) + { + TextRange rangeToMark = new TextRange( + functionElement.getStartOfSignatureElement().getTextRange().getStartOffset(), + functionElement.getEndOfSignatureElement().getTextRange().getEndOffset() + ); + String message = messageFormat.format(new Object[]{ + jetClassOrObject.getName(), + DescriptorRenderer.TEXT.render(functionDescriptor)}); + return new GenericDiagnostic(this, severity, message, functionElement.getContainingFile(), rangeToMark); + } + +} //~ diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java index 34e96ce83b9..30ffa3b5248 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java @@ -40,4 +40,26 @@ public class JetNamedFunction extends JetFunction { return findChildByType(JetTokens.EQ) == null; } + @NotNull + public JetElement getStartOfSignatureElement() { + return this; + } + + @NotNull + public JetElement getEndOfSignatureElement() { + JetElement r = getReturnTypeRef(); + if (r != null) { + return r; + } + + r = getValueParameterList(); + if (r != null) { + return r; + } + + // otherwise it is an error + + return this; + } + } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index be18d1938de..08a4e044179 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -75,9 +75,7 @@ public class OverloadResolver { return; } - // XXX: mark "fun" keyword and parameters as in Java IDE // stepan.koltsov@ - PsiElement mark = member.getNameIdentifier(); - context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(mark, klass, function)); + context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, klass)); } } } diff --git a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet index e1d47e33868..84260a7cbd0 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet @@ -1,12 +1,14 @@ // http://youtrack.jetbrains.net/issue/KT-424 class A { - // XXX: error should be reported on the whole method signature - // not only on method name - fun a() { + fun a(a: Int): Int = 0 + + fun a(a: Int) { } - fun a() { + fun b() { + } + + fun b() { } } - From 31b049893f9819cc12eca835147cd7996cd2f63d Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 20:00:26 +0400 Subject: [PATCH 12/17] fix wrong test (unnecessary overload) --- .../quick/nullabilityAndAutoCasts/ReceiverNullability.jet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/testData/checkerWithErrorTypes/quick/nullabilityAndAutoCasts/ReceiverNullability.jet b/compiler/testData/checkerWithErrorTypes/quick/nullabilityAndAutoCasts/ReceiverNullability.jet index 0995252deff..3bea190f1d3 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/nullabilityAndAutoCasts/ReceiverNullability.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/nullabilityAndAutoCasts/ReceiverNullability.jet @@ -15,7 +15,7 @@ fun test(a : A?) { a?.buzz() // warning } -fun A.test() { +fun A.test2() { foo() bar() buzz() From a4b62868fa579780c7cfa997ca05661ccf92a2d7 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 20:00:34 +0400 Subject: [PATCH 13/17] KT-424 also check overloads in namespaces --- .../FunctionSignatureDiagnosticFactory.java | 4 +- .../jet/lang/resolve/OverloadResolver.java | 42 ++++++++++++++++--- .../quick/ConflictingOverloads.jet | 28 +++++++++++++ 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java index cea7b7f3f4c..4f5e64a5288 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java @@ -18,14 +18,14 @@ public class FunctionSignatureDiagnosticFactory extends DiagnosticFactoryWithMes @NotNull public Diagnostic on(@NotNull JetNamedFunction functionElement, @NotNull FunctionDescriptor functionDescriptor, - @NotNull JetClassOrObject jetClassOrObject) + @NotNull String functionContainer) { TextRange rangeToMark = new TextRange( functionElement.getStartOfSignatureElement().getTextRange().getStartOffset(), functionElement.getEndOfSignatureElement().getTextRange().getEndOffset() ); String message = messageFormat.format(new Object[]{ - jetClassOrObject.getName(), + functionContainer, DescriptorRenderer.TEXT.render(functionDescriptor)}); return new GenericDiagnostic(this, severity, message, functionElement.getContainingFile(), rangeToMark); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index 08a4e044179..de621ebf5d0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -1,10 +1,11 @@ package org.jetbrains.jet.lang.resolve; +import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.MutableClassDescriptor; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; @@ -36,6 +37,37 @@ public class OverloadResolver { for (Map.Entry entry : context.getObjects().entrySet()) { checkOverloadsInAClass(entry.getValue(), entry.getKey()); } + checkOverloadsInANamespace(); + } + + private void checkOverloadsInANamespace() { + class Key extends Pair { + Key(String namespace, String name) { + super(namespace, name); + } + + public String getNamespace() { + return first; + } + + public String getFunctionName() { + return second; + } + } + + MultiMap functionsByName = MultiMap.create(); + + for (FunctionDescriptorImpl function : context.getFunctions().values()) { + DeclarationDescriptor containingDeclaration = function.getContainingDeclaration(); + if (containingDeclaration instanceof NamespaceDescriptor) { + NamespaceDescriptor namespaceDescriptor = (NamespaceDescriptor) containingDeclaration; + functionsByName.putValue(new Key(namespaceDescriptor.getName(), function.getName()), function); + } + } + + for (Map.Entry> e : functionsByName.entrySet()) { + checkOverloadsWithSameName(e.getKey().getFunctionName(), e.getValue(), e.getKey().getNamespace()); + } } private void checkOverloadsInAClass(MutableClassDescriptor classDescriptor, JetClassOrObject klass) { @@ -46,7 +78,7 @@ public class OverloadResolver { } for (Map.Entry> e : functionsByName.entrySet()) { - checkOverloadsWithSameName(e.getKey(), e.getValue(), klass); + checkOverloadsWithSameName(e.getKey(), e.getValue(), klass.getName()); } // properties are checked elsewhere @@ -55,7 +87,7 @@ public class OverloadResolver { } - private void checkOverloadsWithSameName(String name, Collection functions, JetClassOrObject klass) { + private void checkOverloadsWithSameName(String name, Collection functions, String functionContainer) { if (functions.size() == 1) { // microoptimization return; @@ -75,7 +107,7 @@ public class OverloadResolver { return; } - context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, klass)); + context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, functionContainer)); } } } diff --git a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet index 84260a7cbd0..ab9380427fb 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet @@ -12,3 +12,31 @@ class A { fun b() { } } + +namespace deepSpace { + fun c(s: String) { + } + + fun c(s: String) { + } + + class B { + fun d(s: String) { + } + + fun d(s: String) { + } + } +} + + +// check no error in overload in different namespaces + +namespace ns1 { + fun e() = 1 +} + +namespace ns2 { + fun e() = 1 +} + From 1e3f2889a4f6d4f5b5fecd8028536d4c599251c6 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Nov 2011 19:44:47 +0300 Subject: [PATCH 14/17] KT-336 Can't infer type parameter for ArrayList in a generic function (Exception in type inference) KT-335 Type inference fails on Collections.sort --- .../lang/types/inference/ConstraintSystemImpl.java | 1 + .../full/regression/kt335.336.jet | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 compiler/testData/checkerWithErrorTypes/full/regression/kt335.336.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java index a569a0beb1f..30f28d9ffa7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java @@ -376,6 +376,7 @@ public class ConstraintSystemImpl implements ConstraintSystem { DeclarationDescriptor declarationDescriptor = key.getDeclarationDescriptor(); if (declarationDescriptor instanceof TypeParameterDescriptor) { TypeParameterDescriptor descriptor = (TypeParameterDescriptor) declarationDescriptor; + if (!unknownTypes.containsKey(descriptor)) return null; println(descriptor + " |-> " + getValue(descriptor)); return new TypeProjection(getValue(descriptor)); } diff --git a/compiler/testData/checkerWithErrorTypes/full/regression/kt335.336.jet b/compiler/testData/checkerWithErrorTypes/full/regression/kt335.336.jet new file mode 100644 index 00000000000..46537f0041c --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/full/regression/kt335.336.jet @@ -0,0 +1,14 @@ +// KT-336 Can't infer type parameter for ArrayList in a generic function (Exception in type inference) +// KT-335 Type inference fails on Collections.sort + +import java.util.* +import java.lang.Comparable as Comparable + +fun > List.sort() { + Collections.sort(this) // Error here +} + +fun List.plus(other : List) : List { + val result = ArrayList(this) + return result +} From 839d986f44a6589a63037e918fd20c24f21b1184 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Nov 2011 20:55:12 +0300 Subject: [PATCH 15/17] KT-385 type inference does not work properly KT-109 Good code is red: type arguments are not inferred KT-441 Exception in type inference when multiple overloads accepting an integer literal are accessible --- .../jet/lang/resolve/calls/CallResolver.java | 2 +- .../types/inference/ConstraintSystemImpl.java | 66 +++++++++++++++---- .../inference/ConstraintSystemSolution.java | 5 +- .../lang/types/inference/SolutionStatus.java | 15 +++++ .../full/regression/kt385.109.441.jet | 34 ++++++++++ 5 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/types/inference/SolutionStatus.java create mode 100644 compiler/testData/checkerWithErrorTypes/full/regression/kt385.109.441.jet 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 6047be04453..e6db420488d 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 @@ -442,7 +442,7 @@ public class CallResolver { } ConstraintSystemSolution solution = constraintSystem.solve(); - if (solution.isSuccessful()) { + if (solution.getStatus().isSuccessful()) { D substitute = (D) candidate.substitute(solution.getSubstitutor()); assert substitute != null; replaceValueParametersWithSubstitutedOnes(candidateCall, substitute); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java index 30f28d9ffa7..43cc85b9f99 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemImpl.java @@ -269,8 +269,10 @@ public class ConstraintSystemImpl implements ConstraintSystem { private void addSubtypingConstraintOnTypeValues(TypeValue typeValueForLower, TypeValue typeValueForUpper) { println(typeValueForLower + " :< " + typeValueForUpper); - typeValueForLower.getUpperBounds().add(typeValueForUpper); - typeValueForUpper.getLowerBounds().add(typeValueForLower); + if (typeValueForLower != typeValueForUpper) { + typeValueForLower.getUpperBounds().add(typeValueForUpper); + typeValueForUpper.getLowerBounds().add(typeValueForLower); + } } @Override @@ -286,7 +288,7 @@ public class ConstraintSystemImpl implements ConstraintSystem { KnownType knownBoundType = (KnownType) upperBound; boolean ok = constraintExpander.run(jetType, knownBoundType.getType()); if (!ok) { - return new Solution(true); + return new Solution().registerError("Mismatch while expanding constraints"); } } } @@ -314,7 +316,7 @@ public class ConstraintSystemImpl implements ConstraintSystem { } // Find inconsistencies - Solution solution = new Solution(false); + Solution solution = new Solution(); for (UnknownType unknownType : unknownTypes.values()) { check(unknownType, solution); @@ -337,20 +339,33 @@ public class ConstraintSystemImpl implements ConstraintSystem { for (TypeValue upperBound : typeValue.getUpperBounds()) { JetType boundingType = solution.getSubstitutor().substitute(upperBound.getValue().getType(), Variance.INVARIANT); if (!typeChecker.isSubtypeOf(type, boundingType)) { // TODO - solution.registerError(); + solution.registerError("Constraint violation: " + type + " is not a subtype of " + boundingType); println("Constraint violation: " + type + " :< " + boundingType); } } for (TypeValue lowerBound : typeValue.getLowerBounds()) { JetType boundingType = solution.getSubstitutor().substitute(lowerBound.getValue().getType(), Variance.INVARIANT); if (!typeChecker.isSubtypeOf(boundingType, type)) { - solution.registerError(); + solution.registerError("Constraint violation: " + boundingType + " is not a subtype of " + type); println("Constraint violation: " + boundingType + " :< " + type); } } } catch (LoopInTypeVariableConstraintsException e) { - solution.registerError(); + println("-------------------------------------------------------------------"); + for (Map.Entry entry : unknownTypes.entrySet()) { + println("Unknown: " + entry.getKey()); + UnknownType unknownType = entry.getValue(); + println("Lower bounds: "); + for (TypeValue lowerBound : unknownType.getLowerBounds()) { + println(" " + lowerBound); + } + println("Upper bounds: "); + for (TypeValue lowerBound : unknownType.getUpperBounds()) { + println(" " + lowerBound); + } + } + solution.registerError("[TODO] Loop in constraints"); e.printStackTrace(); } } @@ -369,6 +384,25 @@ public class ConstraintSystemImpl implements ConstraintSystem { } } + private static class Error implements SolutionStatus { + + private final String message; + + private Error(String message) { + this.message = message; + } + + @Override + public boolean isSuccessful() { + return false; + } + + @Override + public String toString() { + return message; + } + } + public class Solution implements ConstraintSystemSolution { private final TypeSubstitutor typeSubstitutor = TypeSubstitutor.create(new TypeSubstitutor.TypeSubstitution() { @Override @@ -388,19 +422,22 @@ public class ConstraintSystemImpl implements ConstraintSystem { return false; } }); - private boolean failed; - public Solution(boolean failed) { - this.failed = failed; + private SolutionStatus status; + + public Solution() { + this.status = SolutionStatus.SUCCESS; } - private void registerError() { - failed = true; + private Solution registerError(String message) { + status = new Error(message); + return this; } + @NotNull @Override - public boolean isSuccessful() { - return !failed; + public SolutionStatus getStatus() { + return status; } @Override @@ -409,6 +446,7 @@ public class ConstraintSystemImpl implements ConstraintSystem { return value == null ? null : value.getType(); } + @NotNull @Override public TypeSubstitutor getSubstitutor() { return typeSubstitutor; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemSolution.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemSolution.java index 9a78a00adda..40a2cbbb90e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemSolution.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/ConstraintSystemSolution.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.lang.types.inference; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.types.JetType; @@ -9,8 +10,10 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor; * @author abreslav */ public interface ConstraintSystemSolution { - boolean isSuccessful(); + @NotNull + SolutionStatus getStatus(); + @NotNull TypeSubstitutor getSubstitutor(); @Nullable diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/SolutionStatus.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/SolutionStatus.java new file mode 100644 index 00000000000..0fd5cd02517 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/inference/SolutionStatus.java @@ -0,0 +1,15 @@ +package org.jetbrains.jet.lang.types.inference; + +/** +* @author abreslav +*/ +public interface SolutionStatus { + SolutionStatus SUCCESS = new SolutionStatus() { + @Override + public boolean isSuccessful() { + return true; + } + }; + + boolean isSuccessful(); +} diff --git a/compiler/testData/checkerWithErrorTypes/full/regression/kt385.109.441.jet b/compiler/testData/checkerWithErrorTypes/full/regression/kt385.109.441.jet new file mode 100644 index 00000000000..8af621372fd --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/full/regression/kt385.109.441.jet @@ -0,0 +1,34 @@ +// KT-385 type inference does not work properly` +// KT-109 Good code is red: type arguments are not inferred +// KT-441 Exception in type inference when multiple overloads accepting an integer literal are accessible + +import java.util.* + +fun Iterator.foreach(operation: fun(element: T) : Unit) : Unit = while(hasNext) operation(next()) + +fun Iterator.foreach(operation: fun(index: Int, element: T) : Unit) : Unit { + var k = 0 + while(hasNext) + operation(k++, next()) +} + +fun Iterable.foreach(operation: fun(element: T) : Unit) : Unit = iterator() foreach operation + +fun Iterable.foreach(operation: fun(index: Int, element: T) : Unit) : Unit = iterator() foreach operation + +fun box() : String { + return generic_invoker( { () : String => "OK"} ) +} + +fun generic_invoker(gen : fun () : T) : T { + return gen() +} + +fun println(message : Int) { System.out?.println(message) } +fun println(message : Long) { System.out?.println(message) } +inline fun run(body : fun() : T) : T = body() + +fun main(args : Array) { + + println(run { 1 }) +} \ No newline at end of file From 4224e00cbd27bb9f692f2cc14ea2340633a26f01 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Nov 2011 21:33:46 +0300 Subject: [PATCH 16/17] Most of the tests fixed --- .../full/CovariantOverrideType.jet | 3 +- .../full/FunctionReturnTypes.jet | 42 +++++++++---------- .../full/ResolveOfJavaGenerics.jet | 4 -- .../full/infos/Autocasts.jet | 2 +- idea/testData/checker/FunctionReturnTypes.jet | 38 ++++++++--------- idea/testData/checker/infos/Autocasts.jet | 2 +- 6 files changed, 44 insertions(+), 47 deletions(-) diff --git a/compiler/testData/checkerWithErrorTypes/full/CovariantOverrideType.jet b/compiler/testData/checkerWithErrorTypes/full/CovariantOverrideType.jet index a32e3d0ca40..1ffd989245c 100644 --- a/compiler/testData/checkerWithErrorTypes/full/CovariantOverrideType.jet +++ b/compiler/testData/checkerWithErrorTypes/full/CovariantOverrideType.jet @@ -1,5 +1,6 @@ trait A { fun foo() : Int = 1 + fun foo2() : Int = 1 fun foo1() : Int = 1 val a : Int val a1 : Int @@ -12,7 +13,7 @@ trait A { abstract class B() : A { override fun foo() { } - override fun foo() : Unit { + override fun foo2() : Unit { } override val a : Double = 1.dbl diff --git a/compiler/testData/checkerWithErrorTypes/full/FunctionReturnTypes.jet b/compiler/testData/checkerWithErrorTypes/full/FunctionReturnTypes.jet index 311a3b16aa6..33d62a62ca3 100644 --- a/compiler/testData/checkerWithErrorTypes/full/FunctionReturnTypes.jet +++ b/compiler/testData/checkerWithErrorTypes/full/FunctionReturnTypes.jet @@ -10,7 +10,7 @@ fun test2() : Any = @a {return@a 1} fun test3() : Any { return } fun test4(): fun(): Unit = { return@test4 } fun test5(): Any = @{ return@ } -fun test5(): Any = {return 1} +fun test6(): Any = {return 1} fun bbb() { return 1 @@ -34,7 +34,7 @@ fun intShortInfer() = 1 fun intShort() : Int = 1 //fun intBlockInfer() {1} fun intBlock() : Int {return 1} -fun intBlock() : Int {1} +fun intBlock1() : Int {1} fun intString(): Int = "s" fun intFunctionLiteral(): Int = { 10 } @@ -47,70 +47,70 @@ fun blockReturnValueTypeMismatchUnit() : Int {return ()} fun blockAndAndMismatch() : Int { true && false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch1() : Int { return true && false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch2() : Int { (return true) && (return false) } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch3() : Int { true || false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch4() : Int { return true || false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch5() : Int { (return true) || (return false) } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch1() : Int { return if (1 > 2) 1.0 else 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch2() : Int { return if (1 > 2) 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch3() : Int { return if (1 > 2) else 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch4() : Int { if (1 > 2) return 1.0 else return 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch5() : Int { if (1 > 2) return 1.0 return 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch6() : Int { if (1 > 2) else return 1.0 return 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch7() : Int { if (1 > 2) 1.0 else 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch8() : Int { if (1 > 2) 1.0 else 2.0 return 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch9() : Int { if (1 > 2) 1.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch10() : Int { return if (1 > 2) 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch11() : Int { if (1 > 2) else 1.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch12() : Int { if (1 > 2) return 1 else return 1.0 @@ -166,9 +166,9 @@ fun f(): Int { if (1 < 2) { return 1 } else returnNothing() } -fun f(): Int = if (1 < 2) 1 else returnNothing() +fun f1(): Int = if (1 < 2) 1 else returnNothing() -public fun f() = 1 +public fun f2() = 1 class B() { protected fun f() = "ss" } diff --git a/compiler/testData/checkerWithErrorTypes/full/ResolveOfJavaGenerics.jet b/compiler/testData/checkerWithErrorTypes/full/ResolveOfJavaGenerics.jet index 702b40d4426..d98dd030994 100644 --- a/compiler/testData/checkerWithErrorTypes/full/ResolveOfJavaGenerics.jet +++ b/compiler/testData/checkerWithErrorTypes/full/ResolveOfJavaGenerics.jet @@ -17,8 +17,4 @@ fun test(a : java.util.ArrayList) { fun test(a : java.lang.Class) { -} - -fun test(a : java.lang.Class) { - } \ No newline at end of file diff --git a/compiler/testData/checkerWithErrorTypes/full/infos/Autocasts.jet b/compiler/testData/checkerWithErrorTypes/full/infos/Autocasts.jet index 0960ee88808..0d4a237a116 100644 --- a/compiler/testData/checkerWithErrorTypes/full/infos/Autocasts.jet +++ b/compiler/testData/checkerWithErrorTypes/full/infos/Autocasts.jet @@ -46,7 +46,7 @@ class C() : A() { } } -fun f10(a : A?) { +fun f101(a : A?) { if (a is C) { a.bar(); } diff --git a/idea/testData/checker/FunctionReturnTypes.jet b/idea/testData/checker/FunctionReturnTypes.jet index b912b8d3022..652bc6648f3 100644 --- a/idea/testData/checker/FunctionReturnTypes.jet +++ b/idea/testData/checker/FunctionReturnTypes.jet @@ -31,7 +31,7 @@ fun intShortInfer() = 1 fun intShort() : Int = 1 //fun intBlockInfer() {1} fun intBlock() : Int {return 1} -fun intBlock() : Int {1} +fun intBlock1() : Int {1} fun intString(): Int = "s" fun intFunctionLiteral(): Int = { 10 } @@ -44,70 +44,70 @@ fun blockReturnValueTypeMismatchUnit() : Int {return ()} fun blockAndAndMismatch() : Int { true && false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch1() : Int { return true && false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch2() : Int { (return true) && (return false) } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch3() : Int { true || false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch4() : Int { return true || false } -fun blockAndAndMismatch() : Int { +fun blockAndAndMismatch5() : Int { (return true) || (return false) } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch1() : Int { return if (1 > 2) 1.0 else 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch2() : Int { return if (1 > 2) 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch3() : Int { return if (1 > 2) else 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch4() : Int { if (1 > 2) return 1.0 else return 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch5() : Int { if (1 > 2) return 1.0 return 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch6() : Int { if (1 > 2) else return 1.0 return 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch7() : Int { if (1 > 2) 1.0 else 2.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch8() : Int { if (1 > 2) 1.0 else 2.0 return 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch9() : Int { if (1 > 2) 1.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch10() : Int { return if (1 > 2) 1 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch11() : Int { if (1 > 2) else 1.0 } -fun blockReturnValueTypeMatch() : Int { +fun blockReturnValueTypeMatch12() : Int { if (1 > 2) return 1 else return 1.0 @@ -163,4 +163,4 @@ fun f(): Int { if (1 < 2) { return 1 } else returnNothing() } -fun f(): Int = if (1 < 2) 1 else returnNothing() +fun f1(): Int = if (1 < 2) 1 else returnNothing() diff --git a/idea/testData/checker/infos/Autocasts.jet b/idea/testData/checker/infos/Autocasts.jet index fc5f8807328..d84364c7330 100644 --- a/idea/testData/checker/infos/Autocasts.jet +++ b/idea/testData/checker/infos/Autocasts.jet @@ -44,7 +44,7 @@ class C() : A() { } } -fun f10(a : A?) { +fun f101(a : A?) { if (a is C) { a.bar(); } From e001c6e3069820579a4f5282c1eaa5374485f21e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Nov 2011 21:52:14 +0300 Subject: [PATCH 17/17] Unified processing in TopDownAnalyzer to avoid inconsistencies --- .../jet/lang/resolve/OverrideResolver.java | 2 ++ .../lang/resolve/TopDownAnalysisContext.java | 10 ++++++ .../jet/lang/resolve/TopDownAnalyzer.java | 31 ++++++++++--------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index c59fd03c47e..161eb5bcd7a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -97,6 +97,8 @@ public class OverrideResolver { } protected void checkOverridesInAClass(MutableClassDescriptor classDescriptor, JetClassOrObject klass) { + if (context.analyzingBootstrapLibrary()) return; + // Check overrides for internal consistency for (CallableMemberDescriptor member : classDescriptor.getCallableMembers()) { checkOverride(member); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java index db48bedaaed..012d5bebf7c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -41,6 +41,8 @@ import java.util.Set; private StringBuilder debugOutput; + private boolean analyzingBootstrapLibrary = false; + public TopDownAnalysisContext(JetSemanticServices semanticServices, BindingTrace trace, Predicate analyzeCompletely) { this.trace = new ObservableBindingTrace(trace); this.semanticServices = semanticServices; @@ -66,6 +68,14 @@ import java.util.Set; } } + public boolean analyzingBootstrapLibrary() { + return analyzingBootstrapLibrary; + } + + public void setAnalyzingBootstrapLibrary(boolean analyzingBootstrapLibrary) { + this.analyzingBootstrapLibrary = analyzingBootstrapLibrary; + } + public boolean completeAnalysisNeeded(@NotNull PsiElement element) { PsiFile containingFile = element.getContainingFile(); boolean result = containingFile != null && analyzeCompletely.apply(containingFile); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index eefbe5a7e4b..fc27060c882 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -7,7 +7,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetNamespace; import org.jetbrains.jet.lang.psi.JetObjectDeclaration; @@ -45,6 +44,16 @@ public class TopDownAnalyzer { @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory, boolean declaredLocally) { TopDownAnalysisContext context = new TopDownAnalysisContext(semanticServices, trace, analyzeCompletely); + doProcess(context, outerScope, owner, declarations, flowDataTraceFactory, declaredLocally); + + } + + private static void doProcess( + TopDownAnalysisContext context, JetScope outerScope, + NamespaceLike owner, + Collection declarations, + JetControlFlowDataTraceFactory flowDataTraceFactory, + boolean declaredLocally) { // context.enableDebugOutput(); context.debug("Enter"); @@ -53,9 +62,11 @@ public class TopDownAnalyzer { new DelegationResolver(context).process(); new OverrideResolver(context).process(); new OverloadResolver(context).process(); - new BodyResolver(context).resolveBehaviorDeclarationBodies(); - new ControlFlowAnalyzer(context, flowDataTraceFactory, declaredLocally).process(); - new DeclarationsChecker(context).process(); + if (!context.analyzingBootstrapLibrary()) { + new BodyResolver(context).resolveBehaviorDeclarationBodies(); + new ControlFlowAnalyzer(context, flowDataTraceFactory, declaredLocally).process(); + new DeclarationsChecker(context).process(); + } context.debug("Exit"); context.printDebugOutput(System.out); @@ -69,17 +80,9 @@ public class TopDownAnalyzer { context.getNamespaceScopes().put(namespace, standardLibraryNamespace.getMemberScope()); context.getNamespaceDescriptors().put(namespace, standardLibraryNamespace); context.getDeclaringScopes().put(namespace, outerScope); + context.setAnalyzingBootstrapLibrary(true); - new TypeHierarchyResolver(context).process(outerScope, standardLibraryNamespace, namespace.getDeclarations()); - new DeclarationResolver(context).process(); - new DelegationResolver(context).process(); - OverrideResolver overrideResolver = new OverrideResolver(context) { - @Override - protected void checkOverridesInAClass(MutableClassDescriptor classDescriptor, JetClassOrObject klass) { - } - }; - overrideResolver.process(); - new BodyResolver(context).resolveBehaviorDeclarationBodies(); + doProcess(context, outerScope, standardLibraryNamespace, namespace.getDeclarations(), JetControlFlowDataTraceFactory.EMPTY, false); } public static void processObject(