Add warning for initializers with obsolete syntax

Expected 'init' keyword before class initializer
This commit is contained in:
Denis Zharkov
2015-02-18 12:05:26 +03:00
parent 0dc155d8c9
commit f07566d30d
61 changed files with 175 additions and 131 deletions
@@ -159,6 +159,7 @@ public interface Errors {
DiagnosticFactory0<JetSecondaryConstructor> SECONDARY_CONSTRUCTOR_IN_OBJECT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<JetSecondaryConstructor> SECONDARY_CONSTRUCTOR_IN_OBJECT = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetDelegatorToSuperCall> SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<JetDelegatorToSuperCall> SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetConstructorDelegationCall> PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<JetConstructorDelegationCall> PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<PsiElement> INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED = DiagnosticFactory0.create(WARNING);
// Trait-specific // Trait-specific
@@ -418,6 +418,8 @@ public class DefaultErrorMessages {
MAP.put(SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR, "Supertype initialization is impossible without primary constructor"); MAP.put(SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR, "Supertype initialization is impossible without primary constructor");
MAP.put(PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED, "Primary constructor call expected"); MAP.put(PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED, "Primary constructor call expected");
MAP.put(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED, "Expecting 'init' keyword before class initializer");
MAP.put(ILLEGAL_SELECTOR, "Expression ''{0}'' cannot be a selector (occur after a dot)", STRING); MAP.put(ILLEGAL_SELECTOR, "Expression ''{0}'' cannot be a selector (occur after a dot)", STRING);
MAP.put(NO_TAIL_CALLS_FOUND, "A function is marked as tail-recursive but no tail calls are found"); MAP.put(NO_TAIL_CALLS_FOUND, "A function is marked as tail-recursive but no tail calls are found");
@@ -20,6 +20,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.lexer.JetTokens;
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub; import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes; import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
@@ -49,4 +50,14 @@ public class JetClassInitializer extends JetDeclarationStub<KotlinPlaceHolderStu
JetExpression body = getBody(); JetExpression body = getBody();
return (body instanceof JetBlockExpression) ? ((JetBlockExpression) body).getLBrace() : null; return (body instanceof JetBlockExpression) ? ((JetBlockExpression) body).getLBrace() : null;
} }
@NotNull
public PsiElement getOpenBraceNodeOrSelf() {
PsiElement result = getOpenBraceNode();
return result != null ? result : this;
}
public boolean hasInitKeyword() {
return findChildByType(JetTokens.INIT_KEYWORD) != null;
}
} }
@@ -451,6 +451,10 @@ public class BodyResolver {
@NotNull JetClassInitializer anonymousInitializer, @NotNull JetClassInitializer anonymousInitializer,
@NotNull ClassDescriptorWithResolutionScopes classDescriptor @NotNull ClassDescriptorWithResolutionScopes classDescriptor
) { ) {
if (!anonymousInitializer.hasInitKeyword()) {
trace.report(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED.on(anonymousInitializer.getOpenBraceNodeOrSelf()));
}
JetScope scopeForInitializers = classDescriptor.getScopeForInitializerResolution(); JetScope scopeForInitializers = classDescriptor.getScopeForInitializerResolution();
if (!classDescriptor.getConstructors().isEmpty()) { if (!classDescriptor.getConstructors().isEmpty()) {
expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, c.getOuterDataFlowInfo(), trace); expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, c.getOuterDataFlowInfo(), trace);
@@ -4,7 +4,7 @@ fun box(): String {
var accessedFromConstructor: Class<*>? = null var accessedFromConstructor: Class<*>? = null
class MyClass() { class MyClass() {
{ init {
accessedFromConstructor = javaClass<MyClass>() accessedFromConstructor = javaClass<MyClass>()
} }
} }
@@ -3,7 +3,7 @@
class A(w: Int) { class A(w: Int) {
var c = w var c = w
{ init {
c = 81 c = 81
} }
} }
@@ -1,18 +1,18 @@
trait NoC { trait NoC {
<!ANONYMOUS_INITIALIZER_IN_TRAIT!>{ <!ANONYMOUS_INITIALIZER_IN_TRAIT!>init {
}<!> }<!>
val a : Int get() = 1 val a : Int get() = 1
<!ANONYMOUS_INITIALIZER_IN_TRAIT!>{ <!ANONYMOUS_INITIALIZER_IN_TRAIT!>init {
}<!> }<!>
} }
class WithC() { class WithC() {
val x : Int val x : Int
{ init {
$x = 1 $x = 1
<!UNRESOLVED_REFERENCE!>$y<!> = 2 <!UNRESOLVED_REFERENCE!>$y<!> = 2
val <!UNUSED_VARIABLE!>b<!> = x val <!UNUSED_VARIABLE!>b<!> = x
@@ -21,7 +21,7 @@ class WithC() {
val a : Int get() = 1 val a : Int get() = 1
{ init {
val <!UNUSED_VARIABLE!>z<!> = <!UNRESOLVED_REFERENCE!>b<!> val <!UNUSED_VARIABLE!>z<!> = <!UNRESOLVED_REFERENCE!>b<!>
val <!UNUSED_VARIABLE!>zz<!> = x val <!UNUSED_VARIABLE!>zz<!> = x
val <!UNUSED_VARIABLE!>zzz<!> = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!> val <!UNUSED_VARIABLE!>zzz<!> = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!>
@@ -6,7 +6,7 @@ open class `$`() {
} }
open class `$$`(`$$$$` : `$$$$$`?) : `$`() { open class `$$`(`$$$$` : `$$$$$`?) : `$`() {
val `$$$` : `$$$$$`? val `$$$` : `$$$$$`?
{ init {
$`$$$` = `$$$$` $`$$$` = `$$$$`
} }
open public fun `$$$$$$`() : `$$$$$`? { open public fun `$$$$$$`() : `$$$$$`? {
@@ -16,7 +16,7 @@ class Test() {
var a : Int = 111 var a : Int = 111
var b : Int get() = $a; set(x) {a = x; $a = x} var b : Int get() = $a; set(x) {a = x; $a = x}
{ init {
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!> = $a <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!> = $a
$a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!> $a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!>
a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!> a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!>
@@ -1,11 +1,11 @@
class C(a: Int, b: Int, c: Int, d: Int, <!UNUSED_PARAMETER!>e<!>: Int = d, val f: String) { class C(a: Int, b: Int, c: Int, d: Int, <!UNUSED_PARAMETER!>e<!>: Int = d, val f: String) {
{ init {
a + a a + a
} }
val g = b val g = b
{ init {
c + c c + c
} }
} }
@@ -38,7 +38,7 @@ class MyTest() {
$a = v $a = v
} }
{ init {
a = "rr" a = "rr"
} }
@@ -133,7 +133,7 @@ fun testObject() : Trait {
fun testBackingFieldsNotMarked() { fun testBackingFieldsNotMarked() {
val <!UNUSED_VARIABLE!>a<!> = object { val <!UNUSED_VARIABLE!>a<!> = object {
val x : Int val x : Int
{ init {
$x = 1 $x = 1
} }
} }
@@ -15,7 +15,7 @@ annotation class Annotation5() <!ANNOTATION_CLASS_WITH_BODY!>{
}<!> }<!>
annotation class Annotation6() <!ANNOTATION_CLASS_WITH_BODY!>{ annotation class Annotation6() <!ANNOTATION_CLASS_WITH_BODY!>{
{} init {}
}<!> }<!>
annotation class Annotation1() <!ANNOTATION_CLASS_WITH_BODY!>{}<!> annotation class Annotation1() <!ANNOTATION_CLASS_WITH_BODY!>{}<!>
@@ -1,15 +1,15 @@
class A { class A {
ann {} ann init {}
[ann] {} [ann] init {}
<!UNRESOLVED_REFERENCE!>aaa<!> {} <!UNRESOLVED_REFERENCE!>aaa<!> init {}
[<!UNRESOLVED_REFERENCE!>aaa<!>] {} [<!UNRESOLVED_REFERENCE!>aaa<!>] init {}
} }
trait T { trait T {
<!ANONYMOUS_INITIALIZER_IN_TRAIT!>ann {}<!> <!ANONYMOUS_INITIALIZER_IN_TRAIT!>ann init {}<!>
<!ANONYMOUS_INITIALIZER_IN_TRAIT!>[ann] {}<!> <!ANONYMOUS_INITIALIZER_IN_TRAIT!>[ann] init {}<!>
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!UNRESOLVED_REFERENCE!>aaa<!> {}<!> <!ANONYMOUS_INITIALIZER_IN_TRAIT!><!UNRESOLVED_REFERENCE!>aaa<!> init {}<!>
<!ANONYMOUS_INITIALIZER_IN_TRAIT!>[<!UNRESOLVED_REFERENCE!>aaa<!>] {}<!> <!ANONYMOUS_INITIALIZER_IN_TRAIT!>[<!UNRESOLVED_REFERENCE!>aaa<!>] init {}<!>
} }
annotation class ann annotation class ann
@@ -1,5 +1,5 @@
class ReadForward() { class ReadForward() {
{ init {
val <!UNUSED_VARIABLE!>x<!> = <!UNINITIALIZED_VARIABLE!>$a<!> val <!UNUSED_VARIABLE!>x<!> = <!UNINITIALIZED_VARIABLE!>$a<!>
} }
@@ -1,6 +1,6 @@
class ReadByAnotherPropertyInitializer() { class ReadByAnotherPropertyInitializer() {
val a = 1 val a = 1
{ init {
val <!UNUSED_VARIABLE!>x<!> = $a val <!UNUSED_VARIABLE!>x<!> = $a
} }
} }
@@ -1,7 +1,7 @@
abstract class ReadNonexistent() { abstract class ReadNonexistent() {
abstract val aa: Int abstract val aa: Int
{ init {
val <!UNUSED_VARIABLE!>x<!> = <!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$aa<!> val <!UNUSED_VARIABLE!>x<!> = <!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$aa<!>
} }
} }
@@ -2,7 +2,7 @@ class ReadNonexistent() {
val a: Int val a: Int
get() = 1 get() = 1
{ init {
val <!UNUSED_VARIABLE!>x<!> = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!> val <!UNUSED_VARIABLE!>x<!> = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!>
} }
} }
@@ -1,5 +1,5 @@
class Cl() { class Cl() {
{ init {
val <!UNUSED_VARIABLE!>x<!> = <!UNRESOLVED_REFERENCE!>$a<!> val <!UNUSED_VARIABLE!>x<!> = <!UNRESOLVED_REFERENCE!>$a<!>
} }
} }
@@ -1,7 +1,7 @@
val y = 1 val y = 1
class A() { class A() {
{ init {
<!INACCESSIBLE_BACKING_FIELD!>$y<!> = 1 <!INACCESSIBLE_BACKING_FIELD!>$y<!> = 1
} }
} }
@@ -5,23 +5,23 @@ package kt462
abstract class TestInitializationWithoutBackingField() { abstract class TestInitializationWithoutBackingField() {
val valWithBackingField : Int val valWithBackingField : Int
{ init {
valWithBackingField = 2 valWithBackingField = 2
} }
val valWithoutBackingField : Int val valWithoutBackingField : Int
get() = 42 get() = 42
{ init {
<!VAL_REASSIGNMENT!>valWithoutBackingField<!> = 45 <!VAL_REASSIGNMENT!>valWithoutBackingField<!> = 45
} }
var finalDefaultVar : Int var finalDefaultVar : Int
{ init {
finalDefaultVar = 3 finalDefaultVar = 3
} }
open var openVar : Int open var openVar : Int
{ init {
<!INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER!>openVar<!> = 4 <!INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER!>openVar<!> = 4
} }
@@ -29,42 +29,42 @@ abstract class TestInitializationWithoutBackingField() {
set(v: Int) { set(v: Int) {
$varWithCustomSetter = v $varWithCustomSetter = v
} }
{ init {
<!INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER!>varWithCustomSetter<!> = 3 <!INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER!>varWithCustomSetter<!> = 3
} }
var varWithoutBackingField : Int var varWithoutBackingField : Int
get() = 3 get() = 3
set(v: Int) {} set(v: Int) {}
{ init {
varWithoutBackingField = 4 varWithoutBackingField = 4
} }
abstract var abstractVar : Int abstract var abstractVar : Int
{ init {
abstractVar = 34 abstractVar = 34
} }
} }
abstract class TestInitializationThroughBackingField() { abstract class TestInitializationThroughBackingField() {
val valWithBackingField : Int val valWithBackingField : Int
{ init {
$valWithBackingField = 2 $valWithBackingField = 2
} }
val valWithoutBackingField : Int val valWithoutBackingField : Int
get() = 42 get() = 42
{ init {
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$valWithoutBackingField<!> = 45 <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$valWithoutBackingField<!> = 45
} }
var finalDefaultVar : Int var finalDefaultVar : Int
{ init {
$finalDefaultVar = 3 $finalDefaultVar = 3
} }
open var openVar : Int open var openVar : Int
{ init {
$openVar = 4 $openVar = 4
} }
@@ -72,26 +72,26 @@ abstract class TestInitializationThroughBackingField() {
set(v: Int) { set(v: Int) {
$varWithCustomSetter = v $varWithCustomSetter = v
} }
{ init {
$varWithCustomSetter = 3 $varWithCustomSetter = 3
} }
var varWithoutBackingField : Int var varWithoutBackingField : Int
get() = 3 get() = 3
set(v: Int) {} set(v: Int) {}
{ init {
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$varWithoutBackingField<!> = 4 <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$varWithoutBackingField<!> = 4
} }
abstract var abstractVar : Int abstract var abstractVar : Int
{ init {
<!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$abstractVar<!> = 34 <!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$abstractVar<!> = 34
} }
} }
class TestBackingFieldsVisibility() { class TestBackingFieldsVisibility() {
var a : Int = 712 var a : Int = 712
{ init {
$a = 37 $a = 37
this.$a = 357 this.$a = 357
} }
@@ -122,7 +122,7 @@ val topLevelVar = 11
class T() { class T() {
val z : Int get() = 42 val z : Int get() = 42
{ init {
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>this.$z<!> = 34 <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>this.$z<!> = 34
} }
@@ -132,7 +132,7 @@ class T() {
val a = object { val a = object {
val x = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$z<!> val x = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$z<!>
{ init {
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$z<!> = 23 <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$z<!> = 23
} }
} }
@@ -140,7 +140,7 @@ class T() {
var x: Int = 2 var x: Int = 2
get() { get() {
val <!UNUSED_VARIABLE!>o<!> = object { val <!UNUSED_VARIABLE!>o<!> = object {
{ init {
$x = 34 $x = 34
} }
fun foo() { fun foo() {
@@ -164,7 +164,7 @@ class T() {
$x = 34 $x = 34
val <!UNUSED_VARIABLE!>o<!> = object { val <!UNUSED_VARIABLE!>o<!> = object {
val y = $x val y = $x
{ init {
$x = 422 $x = 422
} }
} }
@@ -112,7 +112,7 @@ val y = 10
val z = 10 val z = 10
class AnonymousInitializers(var a: String, val b: String) { class AnonymousInitializers(var a: String, val b: String) {
{ init {
$a = "30" $a = "30"
a = "s" a = "s"
@@ -121,11 +121,11 @@ class AnonymousInitializers(var a: String, val b: String) {
} }
val i: Int val i: Int
{ init {
$i = 121 $i = 121
} }
{ init {
x = 11 x = 11
<!VAL_REASSIGNMENT!>z<!> = 10 <!VAL_REASSIGNMENT!>z<!> = 10
} }
@@ -133,14 +133,14 @@ class AnonymousInitializers(var a: String, val b: String) {
val j: Int val j: Int
get() = 20 get() = 20
{ init {
<!VAL_REASSIGNMENT!>$i<!> = 13 <!VAL_REASSIGNMENT!>$i<!> = 13
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$j<!> = 30 <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$j<!> = 30
<!VAL_REASSIGNMENT!>j<!> = 34 <!VAL_REASSIGNMENT!>j<!> = 34
} }
val k: String val k: String
{ init {
if (1 < 3) { if (1 < 3) {
k = "a" k = "a"
} }
@@ -150,7 +150,7 @@ class AnonymousInitializers(var a: String, val b: String) {
} }
val l: String val l: String
{ init {
if (1 < 3) { if (1 < 3) {
$l = "a" $l = "a"
} }
@@ -160,7 +160,7 @@ class AnonymousInitializers(var a: String, val b: String) {
} }
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val o: String<!> <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val o: String<!>
{ init {
if (1 < 3) { if (1 < 3) {
$o = "a" $o = "a"
} }
@@ -168,13 +168,13 @@ class AnonymousInitializers(var a: String, val b: String) {
var m: Int = 30 var m: Int = 30
{ init {
$m = 400 $m = 400
} }
val n: Int val n: Int
{ init {
while (<!UNINITIALIZED_VARIABLE!>n<!> == 0) { while (<!UNINITIALIZED_VARIABLE!>n<!> == 0) {
} }
$n = 10 $n = 10
@@ -183,7 +183,7 @@ class AnonymousInitializers(var a: String, val b: String) {
} }
var p = 1 var p = 1
{ init {
p++ p++
} }
} }
@@ -197,7 +197,7 @@ open class Open(<!UNUSED_PARAMETER!>a<!>: Int, <!UNUSED_PARAMETER!>w<!>: Int) {}
class LocalValsVsProperties(val a: Int, w: Int) : Open(a, w) { class LocalValsVsProperties(val a: Int, w: Int) : Open(a, w) {
val x : Int val x : Int
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!> <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!>
{ init {
$x = 1 $x = 1
val <!UNUSED_VARIABLE!>b<!> = x val <!UNUSED_VARIABLE!>b<!> = x
} }
@@ -212,7 +212,7 @@ class LocalValsVsProperties(val a: Int, w: Int) : Open(a, w) {
} }
var xx = w var xx = w
var yy : Int var yy : Int
{ init {
<!VAL_REASSIGNMENT!>w<!> += 1 <!VAL_REASSIGNMENT!>w<!> += 1
$yy = w $yy = w
} }
@@ -222,13 +222,13 @@ class Outer() {
val a : Int val a : Int
var b : Int var b : Int
{ init {
$a = 1 $a = 1
$b = 1 $b = 1
} }
inner class Inner() { inner class Inner() {
{ init {
<!VAL_REASSIGNMENT!>a<!>++ <!VAL_REASSIGNMENT!>a<!>++
b++ b++
} }
@@ -250,7 +250,7 @@ class ClassObject() {
default object { default object {
val x : Int val x : Int
{ init {
$x = 1 $x = 1
} }
@@ -267,7 +267,7 @@ fun foo() {
val x : Int val x : Int
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!> <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!>
val z : Int val z : Int
{ init {
$x = 1 $x = 1
$z = 3 $z = 3
} }
@@ -284,7 +284,7 @@ class TestObjectExpression() {
val <!UNUSED_VARIABLE!>a<!> = object { val <!UNUSED_VARIABLE!>a<!> = object {
val x : Int val x : Int
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!> <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!>
{ init {
if (true) if (true)
x = 12 x = 12
else else
@@ -307,7 +307,7 @@ class TestObjectExpression() {
object TestObjectDeclaration { object TestObjectDeclaration {
val x : Int val x : Int
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!> <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val y : Int<!>
{ init {
$x = 1 $x = 1
} }
@@ -325,7 +325,7 @@ fun func() {
val b = 1 val b = 1
val <!UNUSED_VARIABLE!>a<!> = object { val <!UNUSED_VARIABLE!>a<!> = object {
val x = b val x = b
{ init {
<!VAL_REASSIGNMENT!>b<!> = 4 <!VAL_REASSIGNMENT!>b<!> = 4
<!UNRESOLVED_REFERENCE!>$b<!> = 3 <!UNRESOLVED_REFERENCE!>$b<!> = 3
} }
@@ -9,7 +9,7 @@ class P {
val other = P(); val other = P();
{ init {
x = 23 x = 23
other.x = 4 other.x = 4
} }
@@ -33,7 +33,7 @@ fun foo() {
class R { class R {
val p = P(); val p = P();
{ init {
<!INVISIBLE_SETTER!>p.x<!> = 42 <!INVISIBLE_SETTER!>p.x<!> = 42
} }
@@ -14,7 +14,7 @@ val closure = {
} }
class A { class A {
{ init {
fun foo(): Int { fun foo(): Int {
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!> <!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,7 +4,7 @@ package kt510
public open class Identifier1() { public open class Identifier1() {
var field : Boolean var field : Boolean
{ init {
field = false; // error field = false; // error
} }
} }
@@ -12,7 +12,7 @@ public open class Identifier1() {
public open class Identifier2() { public open class Identifier2() {
var field : Boolean var field : Boolean
{ init {
this.field = false; this.field = false;
} }
} }
@@ -3,17 +3,17 @@
package kt897 package kt897
class A() { class A() {
{ init {
<!INITIALIZATION_BEFORE_DECLARATION!>i<!> = 11 <!INITIALIZATION_BEFORE_DECLARATION!>i<!> = 11
} }
val i : Int? = null // must be an error val i : Int? = null // must be an error
{ init {
<!INITIALIZATION_BEFORE_DECLARATION!>j<!> = 1 <!INITIALIZATION_BEFORE_DECLARATION!>j<!> = 1
} }
var j : Int = 2 var j : Int = 2
{ init {
<!INITIALIZATION_BEFORE_DECLARATION!>k<!> = 3 <!INITIALIZATION_BEFORE_DECLARATION!>k<!> = 3
} }
val k : Int val k : Int
@@ -2,7 +2,7 @@ package f
fun f() { fun f() {
class LocalClass() { class LocalClass() {
{ init {
val <!UNUSED_VARIABLE!>x1<!> = "" // ok: unused val <!UNUSED_VARIABLE!>x1<!> = "" // ok: unused
fun loc1(): Int { fun loc1(): Int {
@@ -12,7 +12,7 @@ open class A(val a: A)
class TestObjectLiteral { class TestObjectLiteral {
val obj: A = object: A(<!UNINITIALIZED_VARIABLE!>obj<!>) { val obj: A = object: A(<!UNINITIALIZED_VARIABLE!>obj<!>) {
{ init {
val x = <!UNINITIALIZED_VARIABLE!>obj<!> val x = <!UNINITIALIZED_VARIABLE!>obj<!>
} }
fun foo() { fun foo() {
@@ -20,7 +20,7 @@ class TestObjectLiteral {
} }
} }
val obj1: A = @l ( object: A(<!UNINITIALIZED_VARIABLE!>obj1<!>) { val obj1: A = @l ( object: A(<!UNINITIALIZED_VARIABLE!>obj1<!>) {
{ init {
val x = <!UNINITIALIZED_VARIABLE!>obj1<!> val x = <!UNINITIALIZED_VARIABLE!>obj1<!>
} }
fun foo() = obj1 fun foo() = obj1
@@ -1,5 +1,5 @@
class AnonymousInitializers(var a: String) { class AnonymousInitializers(var a: String) {
{ init {
a = "s" a = "s"
} }
} }
@@ -5,7 +5,7 @@ fun test(x: Any) {
fun foo(y: Any) { fun foo(y: Any) {
if (y !is String) return if (y !is String) return
class Local { class Local {
{ init {
<!DEBUG_INFO_SMARTCAST!>x<!>.length() <!DEBUG_INFO_SMARTCAST!>x<!>.length()
<!DEBUG_INFO_SMARTCAST!>y<!>.length() <!DEBUG_INFO_SMARTCAST!>y<!>.length()
} }
@@ -3,7 +3,7 @@
fun f(a: Any?) { fun f(a: Any?) {
if (a is B) { if (a is B) {
class C : X(<!DEBUG_INFO_SMARTCAST!>a<!>) { class C : X(<!DEBUG_INFO_SMARTCAST!>a<!>) {
{ init {
<!DEBUG_INFO_SMARTCAST!>a<!>.foo() <!DEBUG_INFO_SMARTCAST!>a<!>.foo()
} }
} }
@@ -3,7 +3,7 @@ fun test(x: Any) {
class LocalOuter { class LocalOuter {
inner class Local { inner class Local {
{ init {
<!DEBUG_INFO_SMARTCAST!>x<!>.length() <!DEBUG_INFO_SMARTCAST!>x<!>.length()
} }
} }
@@ -11,7 +11,7 @@ class Foo {
private val privateProperty = object : MyClass(), MyTrait {} private val privateProperty = object : MyClass(), MyTrait {}
{ init {
privateProperty.f1() privateProperty.f1()
privateProperty.f2() privateProperty.f2()
} }
@@ -27,7 +27,7 @@ class Foo {
private fun privateFunction() = object : MyClass(), MyTrait {} private fun privateFunction() = object : MyClass(), MyTrait {}
{ init {
privateFunction().f1() privateFunction().f1()
privateFunction().f2() privateFunction().f2()
} }
@@ -45,7 +45,7 @@ class Foo {
class FooInner { class FooInner {
private val privatePropertyInner = object : MyClass(), MyTrait {} private val privatePropertyInner = object : MyClass(), MyTrait {}
{ init {
privatePropertyInner.f1() privatePropertyInner.f1()
privatePropertyInner.f2() privatePropertyInner.f2()
} }
@@ -61,7 +61,7 @@ class Foo {
private fun privateFunctionInner() = object : MyClass(), MyTrait {} private fun privateFunctionInner() = object : MyClass(), MyTrait {}
{ init {
privateFunctionInner().f1() privateFunctionInner().f1()
privateFunctionInner().f2() privateFunctionInner().f2()
} }
@@ -1,8 +1,8 @@
class Foo() { class Foo() {
private val builder = StringBuilder("sdfsd"); private val builder = StringBuilder("sdfsd")
{ init {
} }
} }
@@ -50,7 +50,7 @@ class TestPCParameters(w : Int, <!UNUSED_PARAMETER!>x<!> : Int, val y : Int, var
val xx = w val xx = w
{ init {
w + 1 w + 1
} }
@@ -6,7 +6,7 @@ inline fun <R> inlineFunOnlyLocal(inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
val z = p(); val z = p();
{ init {
doCall { doCall {
p() p()
} }
@@ -25,9 +25,9 @@ inline fun <R> inlineFunOnlyLocal(inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> inlineFun(p: () -> R) { inline fun <R> inlineFun(p: () -> R) {
val s = object { val s = object {
val z = <!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>(); val z = <!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
{ init {
doCall { doCall {
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>() <!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
} }
@@ -3,7 +3,7 @@
fun f() { fun f() {
class MyClass() { class MyClass() {
{ init {
val x: MyClass = MyClass() val x: MyClass = MyClass()
} }
@@ -13,7 +13,7 @@ fun f() {
} }
<!LOCAL_OBJECT_NOT_ALLOWED!>object MyObject<!> { <!LOCAL_OBJECT_NOT_ALLOWED!>object MyObject<!> {
{ init {
val obj: MyObject = MyObject val obj: MyObject = MyObject
} }
} }
@@ -23,7 +23,7 @@ fun f() {
val closure = { val closure = {
class MyClass { class MyClass {
{ init {
val x: MyClass = MyClass() val x: MyClass = MyClass()
} }
} }
@@ -69,15 +69,15 @@ abstract class IllegalModifiers5() {
//Check illegal modifiers on anonymous initializers //Check illegal modifiers on anonymous initializers
abstract class IllegalModifiers6() { abstract class IllegalModifiers6() {
<!ILLEGAL_MODIFIER!>public<!> {} <!ILLEGAL_MODIFIER!>public<!> init {}
<!ILLEGAL_MODIFIER!>private<!> {} <!ILLEGAL_MODIFIER!>private<!> init {}
<!ILLEGAL_MODIFIER!>protected<!> {} <!ILLEGAL_MODIFIER!>protected<!> init {}
<!ILLEGAL_MODIFIER!>vararg<!> {} <!ILLEGAL_MODIFIER!>vararg<!> init {}
<!ILLEGAL_MODIFIER!>abstract<!> {} <!ILLEGAL_MODIFIER!>abstract<!> init {}
<!ILLEGAL_MODIFIER!>open<!> {} <!ILLEGAL_MODIFIER!>open<!> init {}
<!ILLEGAL_MODIFIER!>final<!> {} <!ILLEGAL_MODIFIER!>final<!> init {}
<!ILLEGAL_MODIFIER!>public<!> annotated {} <!ILLEGAL_MODIFIER!>public<!> annotated init {}
<!ILLEGAL_MODIFIER!>private<!> <!NOT_AN_ANNOTATION_CLASS!>IllegalModifiers6()<!> {} <!ILLEGAL_MODIFIER!>private<!> <!NOT_AN_ANNOTATION_CLASS!>IllegalModifiers6()<!> init {}
} }
@@ -14,7 +14,7 @@ fun f(s: String?) {
// more tests // more tests
class A(a: String?) { class A(a: String?) {
val b = if (a != null) <!DEBUG_INFO_SMARTCAST!>a<!>.length() else 1 val b = if (a != null) <!DEBUG_INFO_SMARTCAST!>a<!>.length() else 1
{ init {
if (a != null) { if (a != null) {
val <!UNUSED_VARIABLE!>c<!> = <!DEBUG_INFO_SMARTCAST!>a<!>.length() val <!UNUSED_VARIABLE!>c<!> = <!DEBUG_INFO_SMARTCAST!>a<!>.length()
} }
@@ -22,7 +22,7 @@ class A(a: String?) {
val i : Int val i : Int
{ init {
if (a is String) { if (a is String) {
i = <!DEBUG_INFO_SMARTCAST!>a<!>.length() i = <!DEBUG_INFO_SMARTCAST!>a<!>.length()
} }
@@ -19,7 +19,7 @@ package toplevelObjectDeclarations
val x = A.foo() val x = A.foo()
val y = object : Foo(x) { val y = object : Foo(x) {
{ init {
x + 12 x + 12
} }
@@ -15,7 +15,7 @@ object A {
class Test2 { class Test2 {
private val a = object { private val a = object {
{ init {
<!UNINITIALIZED_VARIABLE, DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> 1 <!UNINITIALIZED_VARIABLE, DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> 1
} }
val x = <!UNINITIALIZED_VARIABLE, DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!> val x = <!UNINITIALIZED_VARIABLE, DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>
@@ -3,7 +3,7 @@ package test
import javax.swing.JFrame import javax.swing.JFrame
class KFrame() : JFrame() { class KFrame() : JFrame() {
{ init {
val <!UNUSED_VARIABLE!>x<!> = this.rootPaneCheckingEnabled // make sure field is visible val <!UNUSED_VARIABLE!>x<!> = this.rootPaneCheckingEnabled // make sure field is visible
} }
} }
@@ -7,7 +7,7 @@ class A {
class B { class B {
class D { class D {
{ init {
A().bar { A().bar {
this.foo() this.foo()
foo() foo()
@@ -11,7 +11,7 @@ class Creature() {
object A { object A {
var bbb : Int var bbb : Int
{ init {
$bbb = 1 $bbb = 1
} }
} }
@@ -19,12 +19,12 @@ class Creature() {
class C() { class C() {
var ccc : Int var ccc : Int
{ init {
$ccc = 2 $ccc = 2
} }
} }
{ init {
Creature.numCreated++ // Error Creature.numCreated++ // Error
A.bbb++ A.bbb++
C().ccc++ C().ccc++
@@ -7,7 +7,7 @@ class A {
} }
class B() { class B() {
{ init {
A().<!INVISIBLE_MEMBER!>a<!> = "Hello" A().<!INVISIBLE_MEMBER!>a<!> = "Hello"
} }
} }
@@ -4,7 +4,7 @@ package kt37
class C() { class C() {
private var f: Int private var f: Int
{ init {
f = 610 f = 610
} }
} }
@@ -0,0 +1,10 @@
class A {
val x: Int
val y: Int
<!INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED!>{<!>
x = 1
}
init {
y = 1
}
}
@@ -0,0 +1,10 @@
package
internal final class A {
public constructor A()
internal final val x: kotlin.Int
internal final val y: 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
}
@@ -1,6 +1,6 @@
class Test { class Test {
private var x = object {}; private var x = object {};
{ init {
x = <!TYPE_MISMATCH!>object<!> {} x = <!TYPE_MISMATCH!>object<!> {}
} }
} }
@@ -1,5 +1,5 @@
class A(vararg t : Int) { class A(vararg t : Int) {
{ init {
val <!UNUSED_VARIABLE!>t1<!> : IntArray = t val <!UNUSED_VARIABLE!>t1<!> : IntArray = t
} }
} }
@@ -1,5 +1,5 @@
class A(vararg val t : Int) { class A(vararg val t : Int) {
{ init {
val <!UNUSED_VARIABLE!>t1<!> : IntArray = t val <!UNUSED_VARIABLE!>t1<!> : IntArray = t
} }
} }
@@ -7,7 +7,7 @@ class Test<in I> {
fun apply(<!UNUSED_PARAMETER!>i<!>: I) {} fun apply(<!UNUSED_PARAMETER!>i<!>: I) {}
{ init {
foo() foo()
this.foo() this.foo()
} }
@@ -4,7 +4,7 @@ fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
class Test<in I, out O> { class Test<in I, out O> {
private val i: I = getT() private val i: I = getT()
;{ init {
apply(i) apply(i)
apply(this.i) apply(this.i)
} }
@@ -5,7 +5,7 @@ class Test<in I, out O> {
private var i: I = getT() private var i: I = getT()
private val j: I private val j: I
;{ init {
j = getT() j = getT()
i = getT() i = getT()
this.i = getT() this.i = getT()
@@ -3,7 +3,7 @@ fun <T> getT(): T = null!!
class A<in I>(init: I) { class A<in I>(init: I) {
private val i: I private val i: I
{ init {
i = getT() i = getT()
} }
@@ -12,7 +12,7 @@ class A<in I>(init: I) {
private var i4 = getT<I>() private var i4 = getT<I>()
;{ init {
i2 = getT() i2 = getT()
i3 = init i3 = init
i4 = i3 i4 = i3
@@ -10469,6 +10469,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("expectedInitKeywordOnInitializer.kt")
public void testExpectedInitKeywordOnInitializer() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/expectedInitKeywordOnInitializer.kt");
doTest(fileName);
}
@TestMetadata("expectedPrimaryConstructorCall.kt") @TestMetadata("expectedPrimaryConstructorCall.kt")
public void testExpectedPrimaryConstructorCall() throws Exception { public void testExpectedPrimaryConstructorCall() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/expectedPrimaryConstructorCall.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/expectedPrimaryConstructorCall.kt");
@@ -1,18 +1,18 @@
trait NoC { trait NoC {
<error>{ <error>init {
}</error> }</error>
val a : Int get() = 1 val a : Int get() = 1
<error>{ <error>init {
}</error> }</error>
} }
class WithC() { class WithC() {
val x : Int val x : Int
{ init {
$x = 1 $x = 1
<error>$y</error> = 2 <error>$y</error> = 2
val <warning>b</warning> = x val <warning>b</warning> = x
@@ -21,7 +21,7 @@ class WithC() {
val a : Int get() = 1 val a : Int get() = 1
{ init {
val <warning>z</warning> = <error>b</error> val <warning>z</warning> = <error>b</error>
val <warning>zz</warning> = x val <warning>zz</warning> = x
val <warning>zzz</warning> = <error>$a</error> val <warning>zzz</warning> = <error>$a</error>
+1 -1
View File
@@ -18,7 +18,7 @@ package toplevelObjectDeclarations
val x = A.foo() val x = A.foo()
val y = object : Foo(x) { val y = object : Foo(x) {
{ init {
x + 12 x + 12
} }
+1 -1
View File
@@ -16,7 +16,7 @@ class Test() {
var a : Int = 111 var a : Int = 111
var b : Int get() = $a; set(x) {a = x; $a = x} var b : Int get() = $a; set(x) {a = x; $a = x}
{ init {
<error>$b</error> = $a <error>$b</error> = $a
$a = <error>$b</error> $a = <error>$b</error>
a = <error>$b</error> a = <error>$b</error>
@@ -46,7 +46,7 @@ class TestPCParameters(w : Int, <warning>x</warning> : Int, val <info>y</info> :
val <info>xx</info> = w val <info>xx</info> = w
{ <info>init</info> {
w + 1 w + 1
} }
@@ -1,5 +1,5 @@
class Foo(var bar : Int, var barr : Int, var barrr : Int) { class Foo(var bar : Int, var barr : Int, var barrr : Int) {
{ init {
bar = 1 bar = 1
barr = 1 barr = 1
barrr = 1 barrr = 1
@@ -7,7 +7,7 @@
this : Foo this : Foo
} }
{ init {
bar = 1 bar = 1
this.bar this.bar
1 : Int 1 : Int
@@ -6,7 +6,7 @@
class A { class A {
default object { default object {
{ init {
val t: Int = <caret>foo val t: Int = <caret>foo
} }
} }