diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java index a350578a268..84d278d0b30 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java @@ -873,7 +873,7 @@ public class JetParsing extends AbstractJetParsing { advance(); // CONSTRUCTOR_KEYWORD - TokenSet valueArgsRecoverySet = TokenSet.create(COLON, LBRACE, SEMICOLON, RPAR); + TokenSet valueArgsRecoverySet = TokenSet.create(COLON, LBRACE, SEMICOLON, RPAR, EOL_OR_SEMICOLON, RBRACE); if (at(LPAR)) { parseValueParameterList(false, /*typeRequired = */ true, valueArgsRecoverySet); } @@ -888,16 +888,26 @@ public class JetParsing extends AbstractJetParsing { if (at(THIS_KEYWORD) || at(SUPER_KEYWORD)) { parseThisOrSuper(); + myExpressionParsing.parseValueArgumentList(); } else { - // if we're on LPAR it's probably start of value arguments list - if (!at(LPAR)) { - advance(); // wrong delegation call keyword? - } error("Expecting a 'this' or 'super' constructor call"); - } + PsiBuilder.Marker beforeWrongDelegationCallee = null; + if (!at(LPAR)) { + beforeWrongDelegationCallee = mark(); + advance(); // wrong delegation callee + } + myExpressionParsing.parseValueArgumentList(); - myExpressionParsing.parseValueArgumentList(); + if (beforeWrongDelegationCallee != null) { + if (at(LBRACE)) { + beforeWrongDelegationCallee.drop(); + } + else { + beforeWrongDelegationCallee.rollbackTo(); + } + } + } delegationCall.done(CONSTRUCTOR_DELEGATION_CALL); } diff --git a/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.kt b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.kt new file mode 100644 index 00000000000..156bfe17a40 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.kt @@ -0,0 +1,14 @@ +class A { + constructor + val x: Int + + constructor + constructor() {} + + constructor {} + fun foo() + + constructor +} + +class B diff --git a/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.txt b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.txt new file mode 100644 index 00000000000..1e7fe098c53 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.txt @@ -0,0 +1,85 @@ +JetFile: recoveryJustConstructorKeyword.kt + PACKAGE_DIRECTIVE + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('A') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace('\n') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('B') \ No newline at end of file diff --git a/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.kt b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.kt new file mode 100644 index 00000000000..b942063d8fc --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.kt @@ -0,0 +1,14 @@ +class A { + constructor + val x: Int + + constructor + constructor() {} + + constructor {} + fun foo() + + constructor} class B { + +} + diff --git a/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.txt b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.txt new file mode 100644 index 00000000000..4fc9d729ea0 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.txt @@ -0,0 +1,89 @@ +JetFile: recoveryJustConstructorKeywordSameLineBrace.kt + PACKAGE_DIRECTIVE + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('A') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + PsiElement(RBRACE)('}') + PsiWhiteSpace(' ') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('B') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.kt b/compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.kt new file mode 100644 index 00000000000..22b8d901d7f --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.kt @@ -0,0 +1,13 @@ +class A { + constructor(): + val x = 1 + + constructor(): + constructor() + + constructor(): {} + fun foo() + constructor(): +} + +class B diff --git a/compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.txt b/compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.txt new file mode 100644 index 00000000000..f85c30c00c2 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.txt @@ -0,0 +1,88 @@ +JetFile: recoveryNoDelegationCallAfterColon.kt + PACKAGE_DIRECTIVE + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('A') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace('\n') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('B') \ No newline at end of file diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.kt b/compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.kt new file mode 100644 index 00000000000..d29ce5ba201 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.kt @@ -0,0 +1,14 @@ +class A { + constructor(): thi() + val x: Int + + constructor(): + + ann fun foo() + + constructor(): sup + + constructor(): thi() +} + +class B diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.txt b/compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.txt new file mode 100644 index 00000000000..9466b0fbb44 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.txt @@ -0,0 +1,116 @@ +JetFile: recoveryWithoutBodyWrongDelegationName.kt + PACKAGE_DIRECTIVE + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('A') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + PROPERTY + MODIFIER_LIST + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('thi') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace('\n\n ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + FUN + MODIFIER_LIST + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('ann') + PsiWhiteSpace(' ') + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + SECONDARY_CONSTRUCTOR + MODIFIER_LIST + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('sup') + PsiWhiteSpace('\n\n ') + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + MODIFIER_LIST + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('thi') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiErrorElement:Expecting member declaration + + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('B') \ No newline at end of file diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt index ee6aa19994d..17884cdbd6e 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt +++ b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt @@ -3,8 +3,5 @@ class A { val x: Int } -class B { - constructor() : thhiis(3, 4) -} -val x: Int = 1 \ No newline at end of file +val x: Int = 1 diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt index b06cddc773f..bc4d601877d 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt +++ b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt @@ -18,9 +18,9 @@ JetFile: recoveryWrongDelegationName.kt PsiElement(COLON)(':') PsiWhiteSpace(' ') CONSTRUCTOR_DELEGATION_CALL - PsiElement(IDENTIFIER)('superr') PsiErrorElement:Expecting a 'this' or 'super' constructor call + PsiElement(IDENTIFIER)('superr') VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT @@ -48,41 +48,7 @@ JetFile: recoveryWrongDelegationName.kt PsiElement(IDENTIFIER)('Int') PsiWhiteSpace('\n') PsiElement(RBRACE)('}') - PsiWhiteSpace('\n\n') - CLASS - PsiElement(class)('class') - PsiWhiteSpace(' ') - PsiElement(IDENTIFIER)('B') - PsiWhiteSpace(' ') - CLASS_BODY - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - SECONDARY_CONSTRUCTOR - PsiElement(constructor)('constructor') - VALUE_PARAMETER_LIST - PsiElement(LPAR)('(') - PsiElement(RPAR)(')') - PsiWhiteSpace(' ') - PsiElement(COLON)(':') - PsiWhiteSpace(' ') - CONSTRUCTOR_DELEGATION_CALL - PsiElement(IDENTIFIER)('thhiis') - PsiErrorElement:Expecting a 'this' or 'super' constructor call - - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - INTEGER_CONSTANT - PsiElement(INTEGER_LITERAL)('3') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - INTEGER_CONSTANT - PsiElement(INTEGER_LITERAL)('4') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n') - PsiElement(RBRACE)('}') - PsiWhiteSpace('\n\n') + PsiWhiteSpace('\n\n\n') PROPERTY PsiElement(val)('val') PsiWhiteSpace(' ') diff --git a/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java index a9966f75d00..b068a59fc49 100644 --- a/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java @@ -1935,6 +1935,30 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest { doParsingTest(fileName); } + @TestMetadata("recoveryJustConstructorKeyword.kt") + public void testRecoveryJustConstructorKeyword() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeyword.kt"); + doParsingTest(fileName); + } + + @TestMetadata("recoveryJustConstructorKeywordSameLineBrace.kt") + public void testRecoveryJustConstructorKeywordSameLineBrace() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/recoveryJustConstructorKeywordSameLineBrace.kt"); + doParsingTest(fileName); + } + + @TestMetadata("recoveryNoDelegationCallAfterColon.kt") + public void testRecoveryNoDelegationCallAfterColon() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/recoveryNoDelegationCallAfterColon.kt"); + doParsingTest(fileName); + } + + @TestMetadata("recoveryWithoutBodyWrongDelegationName.kt") + public void testRecoveryWithoutBodyWrongDelegationName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/recoveryWithoutBodyWrongDelegationName.kt"); + doParsingTest(fileName); + } + @TestMetadata("recoveryWithoutParameterList.kt") public void testRecoveryWithoutParameterList() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.kt");