diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/AbstractKotlinParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/AbstractKotlinParsing.java index 1787f36ed2e..35c49ad8092 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/AbstractKotlinParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/AbstractKotlinParsing.java @@ -239,8 +239,12 @@ import static org.jetbrains.kotlin.lexer.KtTokens.*; return myBuilder.lookAhead(k); } - protected void consumeIf(KtToken token) { - if (at(token)) advance(); // token + protected boolean consumeIf(KtToken token) { + if (at(token)) { + advance(); // token + return true; + } + return false; } // TODO: Migrate to predicates diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java index 2999cde433c..cd6102462b8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java @@ -335,7 +335,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { */ private void parsePrefixExpression() { if (at(AT)) { - if (!parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */ false)) { + if (!parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */ false, false)) { PsiBuilder.Marker expression = mark(); myKotlinParsing.parseAnnotations(DEFAULT); parsePrefixExpression(); @@ -661,7 +661,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { parseDoWhile(); } else if (atSet(LOCAL_DECLARATION_FIRST) && - parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */ myBuilder.newlineBeforeCurrentToken())) { + parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */ myBuilder.newlineBeforeCurrentToken(), false)) { // declaration was parsed, do nothing } else if (at(IDENTIFIER)) { @@ -830,7 +830,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { PsiBuilder.Marker property = mark(); myKotlinParsing.parseModifierList(DEFAULT, TokenSet.create(EQ, RPAR)); if (at(VAL_KEYWORD) || at(VAR_KEYWORD)) { - myKotlinParsing.parseProperty(true); + myKotlinParsing.parseLocalProperty(false); property.done(PROPERTY); } else { @@ -1008,12 +1008,12 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { /* * modifiers declarationRest */ - private boolean parseLocalDeclaration(boolean rollbackIfDefinitelyNotExpression) { + private boolean parseLocalDeclaration(boolean rollbackIfDefinitelyNotExpression, boolean isScriptTopLevel) { PsiBuilder.Marker decl = mark(); KotlinParsing.ModifierDetector detector = new KotlinParsing.ModifierDetector(); myKotlinParsing.parseModifierList(detector, DEFAULT, TokenSet.EMPTY); - IElementType declType = parseLocalDeclarationRest(detector.isEnumDetected(), rollbackIfDefinitelyNotExpression); + IElementType declType = parseLocalDeclarationRest(detector.isEnumDetected(), rollbackIfDefinitelyNotExpression, isScriptTopLevel); if (declType != null) { // we do not attach preceding comments (non-doc) to local variables because they are likely commenting a few statements below @@ -1243,7 +1243,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { * ; */ private void parseStatement(boolean isScriptTopLevel) { - if (!parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */false)) { + if (!parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */false, /* isScriptTopLevel = */ isScriptTopLevel)) { if (!atSet(EXPRESSION_FIRST)) { errorAndAdvance("Expecting a statement"); } @@ -1293,7 +1293,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { * ; */ @Nullable - private IElementType parseLocalDeclarationRest(boolean isEnum, boolean failIfDefinitelyNotExpression) { + private IElementType parseLocalDeclarationRest(boolean isEnum, boolean failIfDefinitelyNotExpression, boolean isScriptTopLevel) { IElementType keywordToken = tt(); IElementType declType = null; @@ -1310,7 +1310,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { declType = myKotlinParsing.parseFunction(); } else if (keywordToken == VAL_KEYWORD || keywordToken == VAR_KEYWORD) { - declType = myKotlinParsing.parseProperty(true); + declType = myKotlinParsing.parseLocalProperty(isScriptTopLevel); } else if (keywordToken == TYPE_ALIAS_KEYWORD) { declType = myKotlinParsing.parseTypeAlias(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java index 84e4e140fad..f0f381df4e1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java @@ -1242,10 +1242,28 @@ public class KotlinParsing extends AbstractKotlinParsing { * ; */ private IElementType parseProperty() { - return parseProperty(false); + return parseProperty(PropertyParsingMode.MEMBER_OR_TOPLEVEL); } - public IElementType parseProperty(boolean local) { + public IElementType parseLocalProperty(boolean isScriptTopLevel) { + return parseProperty(isScriptTopLevel ? PropertyParsingMode.SCRIPT_TOPLEVEL : PropertyParsingMode.LOCAL); + } + + enum PropertyParsingMode { + MEMBER_OR_TOPLEVEL(false, true), + LOCAL(true, false), + SCRIPT_TOPLEVEL(true, true); + + public final boolean desctructuringAllowed; + public final boolean accessorsAllowed; + + PropertyParsingMode(boolean desctructuringAllowed, boolean accessorsAllowed) { + this.desctructuringAllowed = desctructuringAllowed; + this.accessorsAllowed = accessorsAllowed; + } + } + + public IElementType parseProperty(PropertyParsingMode mode) { assert (at(VAL_KEYWORD) || at(VAR_KEYWORD)); advance(); @@ -1268,7 +1286,7 @@ public class KotlinParsing extends AbstractKotlinParsing { if (multiDeclaration) { PsiBuilder.Marker multiDecl = mark(); parseMultiDeclarationName(propertyNameFollow); - errorIf(multiDecl, !local, "Destructuring declarations are only allowed for local variables/values"); + errorIf(multiDecl, !mode.desctructuringAllowed, "Destructuring declarations are only allowed for local variables/values"); } else { parseFunctionOrPropertyName(receiverTypeDeclared, "property", propertyNameFollow, /*nameRequired = */ true); @@ -1297,25 +1315,30 @@ public class KotlinParsing extends AbstractKotlinParsing { beforeName.drop(); - if (!local) { + if (mode.accessorsAllowed) { // It's only needed for non-local properties, because in local ones: // "val a = 1; b" must not be an infix call of b on "val ...;" - consumeIf(SEMICOLON); - AccessorKind accessorKind = parsePropertyGetterOrSetter(null); - if (accessorKind != null) { - parsePropertyGetterOrSetter(accessorKind); - } + myBuilder.enableNewlines(); + boolean hasNewLineWithSemicolon = consumeIf(SEMICOLON) && myBuilder.newlineBeforeCurrentToken(); + myBuilder.restoreNewlinesState(); - if (!atSet(EOL_OR_SEMICOLON, RBRACE)) { - if (getLastToken() != SEMICOLON) { - errorUntil( - "Property getter or setter expected", - TokenSet.orSet(DECLARATION_FIRST, TokenSet.create(EOL_OR_SEMICOLON, LBRACE, RBRACE))); + if (!hasNewLineWithSemicolon) { + AccessorKind accessorKind = parsePropertyGetterOrSetter(null); + if (accessorKind != null) { + parsePropertyGetterOrSetter(accessorKind); + } + + if (!atSet(EOL_OR_SEMICOLON, RBRACE)) { + if (getLastToken() != SEMICOLON) { + errorUntil( + "Property getter or setter expected", + TokenSet.orSet(DECLARATION_FIRST, TokenSet.create(EOL_OR_SEMICOLON, LBRACE, RBRACE))); + } + } + else { + consumeIf(SEMICOLON); } - } - else { - consumeIf(SEMICOLON); } } diff --git a/compiler/testData/codegen/box/intrinsics/prefixIncDec.kt b/compiler/testData/codegen/box/intrinsics/prefixIncDec.kt index 612c91f3fa7..00321feb2f9 100644 --- a/compiler/testData/codegen/box/intrinsics/prefixIncDec.kt +++ b/compiler/testData/codegen/box/intrinsics/prefixIncDec.kt @@ -1,4 +1,4 @@ -public var inc: Int = 0; +public var inc: Int = 0 public var propInc: Int = 0 get() {++inc; return field} @@ -7,9 +7,9 @@ public var propInc: Int = 0 field = a } -public var dec: Int = 0; +public var dec: Int = 0 -public var propDec: Int = 0; +public var propDec: Int = 0 get() { --dec; return field} set(a: Int) { --dec diff --git a/compiler/testData/codegen/box/operatorConventions/kt4152.kt b/compiler/testData/codegen/box/operatorConventions/kt4152.kt index bc3ad4eada0..7e494f7f032 100644 --- a/compiler/testData/codegen/box/operatorConventions/kt4152.kt +++ b/compiler/testData/codegen/box/operatorConventions/kt4152.kt @@ -9,7 +9,7 @@ public var propInc: Int = 0 public var dec: Int = 0; -public var propDec: Int = 0; +public var propDec: Int = 0 get() { dec--; return field} set(a: Int) { dec-- diff --git a/compiler/testData/codegen/box/statics/incInClassObject.kt b/compiler/testData/codegen/box/statics/incInClassObject.kt index fe763170399..f4cfe90e680 100644 --- a/compiler/testData/codegen/box/statics/incInClassObject.kt +++ b/compiler/testData/codegen/box/statics/incInClassObject.kt @@ -10,7 +10,7 @@ class A { var holder: String = "" - var r2: Int = 1; + var r2: Int = 1 get() { holder += "getR2" return field @@ -22,7 +22,7 @@ class A { return r2 } - var r3: Int = 1; + var r3: Int = 1 set(p: Int) { holder += "setR3" field = p @@ -34,7 +34,7 @@ class A { return r3 } - var r4: Int = 1; + var r4: Int = 1 get() { holder += "getR4" return field diff --git a/compiler/testData/codegen/box/statics/incInObject.kt b/compiler/testData/codegen/box/statics/incInObject.kt index f35b9bb83f7..c1f48692d36 100644 --- a/compiler/testData/codegen/box/statics/incInObject.kt +++ b/compiler/testData/codegen/box/statics/incInObject.kt @@ -9,7 +9,7 @@ object A { var holder: String = "" - var r2: Int = 1; + var r2: Int = 1 get() { holder += "getR2" return field @@ -21,7 +21,7 @@ object A { return r2 } - var r3: Int = 1; + var r3: Int = 1 set(p: Int) { holder += "setR3" field = p @@ -33,7 +33,7 @@ object A { return r3 } - var r4: Int = 1; + var r4: Int = 1 get() { holder += "getR4" return field diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt index 38b869cfcd2..74ff04c6099 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt @@ -7,7 +7,7 @@ annotation class Accessor(val value: String) interface Z { @Property("OK") - val z: String; + val z: String @Accessor("OK") get() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt index 415e1d83135..42afca896fd 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt @@ -7,7 +7,7 @@ annotation class Accessor(val value: String) interface Z { @Property("OK") - val z: String; + val z: String @Accessor("OK") get() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt index 3d8cee11448..2d90bfd0258 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt @@ -2,7 +2,7 @@ // KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS interface Z { - val z: String; + val z: String get() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/simpleProperty.kt b/compiler/testData/codegen/java8/box/jvm8/simpleProperty.kt index e98f05ed57a..984e65cff16 100644 --- a/compiler/testData/codegen/java8/box/jvm8/simpleProperty.kt +++ b/compiler/testData/codegen/java8/box/jvm8/simpleProperty.kt @@ -1,7 +1,7 @@ // JVM_TARGET: 1.8 interface Z { - val z: String; + val z: String get() = "OK" } diff --git a/compiler/testData/codegen/script/topLevelPropertiesWithGetSet.kts b/compiler/testData/codegen/script/topLevelPropertiesWithGetSet.kts new file mode 100644 index 00000000000..54fe4973bda --- /dev/null +++ b/compiler/testData/codegen/script/topLevelPropertiesWithGetSet.kts @@ -0,0 +1,25 @@ +var log = "begin" +fun append(msg: String) { + log = "$log;$msg" +} + +val test1 get() = run { + append("test1.get") + "1" +} + +val test2 get() = run { + append("test2.get") + test1 +} + +var test3: String = "Z" + set(value) { + append("test3.set") + field = value + } + +test3 = "3" + +val r = "$test1;$test2;$test3|$log" +// expected: r: 1;1;3|begin;test3.set;test1.get;test2.get;test1.get \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.kts b/compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.kts new file mode 100644 index 00000000000..6d1fb5ea652 --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.kts @@ -0,0 +1,39 @@ +val testVal: Int get() = 42 + +val testValNoType get() = 42 + +val String.testExtVal: Int get() = 42 + +val String.testExtValNoType get() = 42 + +var testVar: Int get() = 42; set(value) {} + +var String.testExtVar: Int get() = 42; set(value) {} + +val testValLineBreak: Int +get() = 42 + +val testValLineBreakNoType +get() = 42 + +val testValLineBreakSemi: Int; +get() = 42 + +val testValLineBreakSemiNoType; +get() = 42 + +var testVarLineBreak: Int +get() = 42 +set(value) {} + +var String.testExtVarLineBreak: Int +get() = 42 +set(value) {} + +var testVarLineBreakSemi: Int; +get() = 42 +set(value) {} + +var String.testExtVarLineBreakSemi: Int; +get() = 42 +set(value) {} diff --git a/compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.txt b/compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.txt new file mode 100644 index 00000000000..853ce2c1498 --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.txt @@ -0,0 +1,23 @@ +package + +public final class TopLevelPropertiesWithGetSet : kotlin.script.templates.standard.ScriptTemplateWithArgs { + public constructor TopLevelPropertiesWithGetSet(/*0*/ args: kotlin.Array) + public final override /*1*/ /*fake_override*/ val args: kotlin.Array + public final val testVal: kotlin.Int + public final val testValLineBreak: kotlin.Int + public final val testValLineBreakNoType: kotlin.Int + public final val testValLineBreakSemi: kotlin.Int + public final val testValLineBreakSemiNoType: [ERROR : No type, no body] + public final val testValNoType: kotlin.Int + public final var testVar: kotlin.Int + public final var testVarLineBreak: kotlin.Int + public final var testVarLineBreakSemi: kotlin.Int + public final val kotlin.String.testExtVal: kotlin.Int + public final val kotlin.String.testExtValNoType: kotlin.Int + public final var kotlin.String.testExtVar: kotlin.Int + public final var kotlin.String.testExtVarLineBreak: kotlin.Int + public final var kotlin.String.testExtVarLineBreakSemi: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/psi/script/topLevelPropertiesWithGetSet.kts b/compiler/testData/psi/script/topLevelPropertiesWithGetSet.kts new file mode 100644 index 00000000000..236f903d2df --- /dev/null +++ b/compiler/testData/psi/script/topLevelPropertiesWithGetSet.kts @@ -0,0 +1,54 @@ +val testVal: Int get() = 42 + +val testValSemiSameLine: Int; get() = 42 + +val testValNoType get() = 42 + +val String.testExtVal: Int get() = 42 + +val String.testExtValNoType get() = 42 + +var testVar: Int get() = 42; set(value) {} + +var String.testExtVar: Int get() = 42; set(value) {} + +val testValLineBreak: Int + get() = 42 + +val testValLineBreakNoType + get() = 42 + +val testValLineBreakSemi: Int; + get() = 42 + +val testValLineBreakSemiComment1: Int; // this IS NOT an accessor: + get() = 42 + +val testValLineBreakSemiComment2: Int; /* +this IS NOT an accessor either: +*/ + get() = 42 + +val testValLineBreakSemiComment3: Int; /* +this IS an accessor! +*/ get() = 42 + +val testValLineBreakSemiNoType; + get() = 42 + +var testVarLineBreak: Int + get() = 42 + set(value) {} + +var String.testExtVarLineBreak: Int + get() = 42 + set(value) {} + +var testVarLineBreakSemi: Int; + get() = 42 + set(value) {} + +var String.testExtVarLineBreakSemi: Int; + get() = 42 + set(value) {} + diff --git a/compiler/testData/psi/script/topLevelPropertiesWithGetSet.txt b/compiler/testData/psi/script/topLevelPropertiesWithGetSet.txt new file mode 100644 index 00000000000..263a8045021 --- /dev/null +++ b/compiler/testData/psi/script/topLevelPropertiesWithGetSet.txt @@ -0,0 +1,517 @@ +JetFile: topLevelPropertiesWithGetSet.kts + PACKAGE_DIRECTIVE + + IMPORT_LIST + + SCRIPT + BLOCK + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testVal') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValSemiSameLine') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValNoType') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('String') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('testExtVal') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('String') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('testExtValNoType') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(var)('var') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testVar') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(set)('set') + PsiElement(LPAR)('(') + VALUE_PARAMETER_LIST + VALUE_PARAMETER + PsiElement(IDENTIFIER)('value') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(var)('var') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('String') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('testExtVar') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(set)('set') + PsiElement(LPAR)('(') + VALUE_PARAMETER_LIST + VALUE_PARAMETER + PsiElement(IDENTIFIER)('value') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreak') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace('\n ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreakNoType') + PsiWhiteSpace('\n ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreakSemi') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('get') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreakSemiComment1') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace(' ') + PsiComment(EOL_COMMENT)('// this IS NOT an accessor:') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('get') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreakSemiComment2') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace(' ') + PsiComment(BLOCK_COMMENT)('/*\nthis IS NOT an accessor either:\n*/') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('get') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreakSemiComment3') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace(' ') + PsiComment(BLOCK_COMMENT)('/*\nthis IS an accessor!\n*/') + PsiWhiteSpace(' ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testValLineBreakSemiNoType') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('get') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(var)('var') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testVarLineBreak') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace('\n ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n ') + PROPERTY_ACCESSOR + PsiElement(set)('set') + PsiElement(LPAR)('(') + VALUE_PARAMETER_LIST + VALUE_PARAMETER + PsiElement(IDENTIFIER)('value') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(var)('var') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('String') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('testExtVarLineBreak') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace('\n ') + PROPERTY_ACCESSOR + PsiElement(get)('get') + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n ') + PROPERTY_ACCESSOR + PsiElement(set)('set') + PsiElement(LPAR)('(') + VALUE_PARAMETER_LIST + VALUE_PARAMETER + PsiElement(IDENTIFIER)('value') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(var)('var') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('testVarLineBreakSemi') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('get') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('set') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('value') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + LAMBDA_ARGUMENT + LAMBDA_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(var)('var') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('String') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('testExtVarLineBreakSemi') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('get') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('42') + PsiWhiteSpace('\n ') + SCRIPT_INITIALIZER + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('set') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('value') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + LAMBDA_ARGUMENT + LAMBDA_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index d344d50d57d..328ae1b94e8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -23306,6 +23306,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("topLevelPropertiesWithGetSet.kts") + public void testTopLevelPropertiesWithGetSet() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/script/topLevelPropertiesWithGetSet.kts"); + doTest(fileName); + } + @TestMetadata("topLevelVariable.kts") public void testTopLevelVariable() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/script/topLevelVariable.kts"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java index 8d0b6acdae3..092dcf6c112 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java @@ -162,6 +162,12 @@ public class ScriptCodegenTestGenerated extends AbstractScriptCodegenTest { doTest(fileName); } + @TestMetadata("topLevelPropertiesWithGetSet.kts") + public void testTopLevelPropertiesWithGetSet() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/script/topLevelPropertiesWithGetSet.kts"); + doTest(fileName); + } + @TestMetadata("topLevelProperty.kts") public void testTopLevelProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/script/topLevelProperty.kts"); diff --git a/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java index 57f8a86f5f3..5267ee6eef0 100644 --- a/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java @@ -2695,6 +2695,12 @@ public class ParsingTestGenerated extends AbstractParsingTest { doParsingTest(fileName); } + @TestMetadata("topLevelPropertiesWithGetSet.kts") + public void testTopLevelPropertiesWithGetSet() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/psi/script/topLevelPropertiesWithGetSet.kts"); + doParsingTest(fileName); + } + @TestMetadata("unexpectedSymbol.kts") public void testUnexpectedSymbol() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/psi/script/unexpectedSymbol.kts"); diff --git a/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedGetterFromJava.test b/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedGetterFromJava.test index 734bbd4d237..b2e056be03a 100644 --- a/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedGetterFromJava.test +++ b/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedGetterFromJava.test @@ -18,7 +18,7 @@ package foo object Bar { companion object { - val value = "foobar"; + val value = "foobar" @JvmStatic get() { } } diff --git a/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedSetterFromJava.test b/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedSetterFromJava.test index 4d8ddd52d6d..e5e82a746f1 100644 --- a/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedSetterFromJava.test +++ b/idea/testData/quickfix/autoImports/importKotlinCompanionStaticPropertyOverloadedSetterFromJava.test @@ -18,7 +18,7 @@ package foo object Bar { companion object { - var variable: String; + var variable: String @JvmStatic set(value) { field = value } diff --git a/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedGetterFromJava.test b/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedGetterFromJava.test index 2bf52c66289..535338c6fe7 100644 --- a/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedGetterFromJava.test +++ b/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedGetterFromJava.test @@ -17,7 +17,7 @@ public class Foo { package foo object Bar { - val value = "foobar"; + val value = "foobar" @JvmStatic get() { } } diff --git a/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedSetterFromJava.test b/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedSetterFromJava.test index e983173f51f..7df74292162 100644 --- a/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedSetterFromJava.test +++ b/idea/testData/quickfix/autoImports/importKotlinStaticPropertyOverloadedSetterFromJava.test @@ -17,7 +17,7 @@ public class Foo { package foo object Bar { - var variable: String; + var variable: String @JvmStatic set(value) { field = value } diff --git a/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt b/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt index 72bb892f67f..69cefbbd100 100644 --- a/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt +++ b/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt @@ -1,5 +1,5 @@ class aClass(){ - var myField: Int = 0; + var myField: Int = 0 set(value){ field=value } diff --git a/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt.after b/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt.after index 45a79136cc4..24eb8778b5f 100644 --- a/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt.after +++ b/idea/testData/refactoring/rename/simpleNameReference/renameFieldIdentifier.kt.after @@ -1,5 +1,5 @@ class aClass(){ - var anotherRenamed: Int = 0; + var anotherRenamed: Int = 0 set(value){ field=value }