Fix applicability of dsl-marker on function type

When marker is applied to function type it should work
like it's applied to receiver type

 #KT-23255 Fixed
This commit is contained in:
Denis Zharkov
2018-08-10 18:10:18 +07:00
parent 99fe6de52a
commit 117abb04aa
12 changed files with 259 additions and 11 deletions
@@ -0,0 +1,56 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
@Target(AnnotationTarget.TYPE)
@DslMarker
annotation class MyDsl
interface A {
fun foo()
}
interface B {
fun bar()
}
fun baz1(x: (@MyDsl A).() -> Unit) {}
fun baz2(x: (@MyDsl B).() -> Unit) {}
fun baz3(x: @MyDsl A.() -> Unit) {}
fun baz4(x: @MyDsl B.() -> Unit) {}
fun @MyDsl A.baz5() {
baz4 {
bar()
<!DSL_SCOPE_VIOLATION_WARNING!>foo<!>()
}
}
fun main(args: Array<String>) {
baz1 {
baz2 {
bar()
<!DSL_SCOPE_VIOLATION!>foo<!>()
}
}
baz3 {
baz2 {
bar()
<!DSL_SCOPE_VIOLATION_WARNING!>foo<!>()
}
}
baz1 {
baz4 {
bar()
<!DSL_SCOPE_VIOLATION_WARNING!>foo<!>()
}
}
baz3 {
baz4 {
bar()
<!DSL_SCOPE_VIOLATION_WARNING!>foo<!>()
}
}
}
@@ -0,0 +1,29 @@
package
public fun baz1(/*0*/ x: (@MyDsl A).() -> kotlin.Unit): kotlin.Unit
public fun baz2(/*0*/ x: (@MyDsl B).() -> kotlin.Unit): kotlin.Unit
public fun baz3(/*0*/ x: @MyDsl() (A.() -> kotlin.Unit)): kotlin.Unit
public fun baz4(/*0*/ x: @MyDsl() (B.() -> kotlin.Unit)): kotlin.Unit
public fun main(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
public fun @MyDsl A.baz5(): kotlin.Unit
public interface A {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface B {
public abstract fun bar(): kotlin.Unit
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
}
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.DslMarker public final annotation class MyDsl : kotlin.Annotation {
public constructor MyDsl()
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
}
@@ -0,0 +1,57 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !LANGUAGE: +DslMarkerOnFunctionTypeReceiver
@Target(AnnotationTarget.TYPE)
@DslMarker
annotation class MyDsl
interface A {
fun foo()
}
interface B {
fun bar()
}
fun baz1(x: (@MyDsl A).() -> Unit) {}
fun baz2(x: (@MyDsl B).() -> Unit) {}
fun baz3(x: @MyDsl A.() -> Unit) {}
fun baz4(x: @MyDsl B.() -> Unit) {}
fun @MyDsl A.baz5() {
baz4 {
bar()
<!DSL_SCOPE_VIOLATION!>foo<!>()
}
}
fun main(args: Array<String>) {
baz1 {
baz2 {
bar()
<!DSL_SCOPE_VIOLATION!>foo<!>()
}
}
baz3 {
baz2 {
bar()
<!DSL_SCOPE_VIOLATION!>foo<!>()
}
}
baz1 {
baz4 {
bar()
<!DSL_SCOPE_VIOLATION!>foo<!>()
}
}
baz3 {
baz4 {
bar()
<!DSL_SCOPE_VIOLATION!>foo<!>()
}
}
}
@@ -0,0 +1,29 @@
package
public fun baz1(/*0*/ x: (@MyDsl A).() -> kotlin.Unit): kotlin.Unit
public fun baz2(/*0*/ x: (@MyDsl B).() -> kotlin.Unit): kotlin.Unit
public fun baz3(/*0*/ x: @MyDsl() (A.() -> kotlin.Unit)): kotlin.Unit
public fun baz4(/*0*/ x: @MyDsl() (B.() -> kotlin.Unit)): kotlin.Unit
public fun main(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
public fun @MyDsl A.baz5(): kotlin.Unit
public interface A {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface B {
public abstract fun bar(): kotlin.Unit
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
}
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.DslMarker public final annotation class MyDsl : kotlin.Annotation {
public constructor MyDsl()
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
}