From 460dad135c684127617d96c10ecd5c324098205f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 25 Nov 2015 19:29:20 +0300 Subject: [PATCH] Rename Extension annotation to ExtensionFunctionType --- compiler/testData/builtin-classes.txt | 6 +++++- .../tests/FreeFunctionCalledAsExtension.kt | 8 ++++---- .../tests/FreeFunctionCalledAsExtension.txt | 2 +- .../tests/annotations/extensionFunctionType.kt | 4 ++-- .../tests/annotations/extensionFunctionType.txt | 4 ++-- .../inline/binaryExpressions/arrayAccess.kt | 2 +- .../inline/binaryExpressions/assignment.kt | 6 +++--- .../inline/binaryExpressions/comparison.kt | 2 +- .../inline/binaryExpressions/componentAccess.kt | 4 ++-- .../tests/inline/binaryExpressions/contains.kt | 2 +- .../inline/binaryExpressions/mathOperations.kt | 6 +++--- .../tests/inline/binaryExpressions/rangeTo.kt | 2 +- .../inline/unaryExpressions/mathOperation.kt | 8 ++++---- .../inline/unaryExpressions/notOperation.kt | 2 +- compiler/testData/renderer/FunctionTypes.kt | 6 +++--- .../invokeForExtensionFunctionType.txt | 2 +- .../valOfExtensionFunctionTypeInvoke.txt | 2 +- .../invoke/implicitReceiverForInvoke.txt | 2 +- core/builtins/src/kotlin/Annotations.kt | 5 +++++ .../kotlin/builtins/KotlinBuiltIns.java | 17 ++++++++++------- .../stubBuilder/TypeClsStubBuilder.kt | 6 ++++-- .../ExcludedClass/ExcludedClass.dependency.kt | 4 ++-- .../somePackage/ExctraClass.java | 4 ++-- .../NotImportedExtensionFunction2.dependency.kt | 2 +- .../NotImportedExtensionFunction3.dependency.kt | 4 ++-- .../decompiledText/FunctionTypes.expected.kt | 4 ++-- .../FunctionTypes/FunctionTypes.kt | 4 ++-- .../decompiler/stubBuilder/Types/Types.kt | 6 +++--- .../decompiler/stubBuilder/Types/Types.txt | 4 ++-- .../unifier/equivalence/types/function0.kt | 2 +- .../unifier/equivalence/types/function1.kt | 4 ++-- .../equivalence/types/function1.kt.match | 2 +- .../unifier/equivalence/types/function2.kt | 4 ++-- .../equivalence/types/function2.kt.match | 2 +- spec-docs/function-types.md | 4 ++-- 35 files changed, 81 insertions(+), 67 deletions(-) diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 5b6774a4179..d0324184d1e 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -456,10 +456,14 @@ public abstract class Enum> : kotlin.Comparable { } } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.MustBeDocumented() public final annotation class Extension : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.MustBeDocumented() @kotlin.Deprecated(message = "Use @ExtensionFunctionType instead.", replaceWith = kotlin.ReplaceWith(expression = "@ExtensionFunctionType", imports = {})) public final annotation class Extension : kotlin.Annotation { /*primary*/ public constructor Extension() } +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.MustBeDocumented() public final annotation class ExtensionFunctionType : kotlin.Annotation { + /*primary*/ public constructor ExtensionFunctionType() +} + public final class Float : kotlin.Number, kotlin.Comparable { /*primary*/ private constructor Float() public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.kt b/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.kt index 2d89ffd77b2..bc7fb23ce4d 100644 --- a/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.kt +++ b/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.kt @@ -6,8 +6,8 @@ fun foo(a: (String) -> Unit) { interface A : (String) -> Unit {} -fun foo(a: @Extension A) { - // @Extension annotation on an unrelated type shouldn't have any effect on this diagnostic. - // Only kotlin.Function{n} type annotated with @Extension should +fun foo(a: @ExtensionFunctionType A) { + // @ExtensionFunctionType annotation on an unrelated type shouldn't have any effect on this diagnostic. + // Only kotlin.Function{n} type annotated with @ExtensionFunctionType should "".a() -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt b/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt index 7dc7b460d80..9ea07923568 100644 --- a/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt +++ b/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt @@ -1,7 +1,7 @@ package public fun foo(/*0*/ a: (kotlin.String) -> kotlin.Unit): kotlin.Unit -public fun foo(/*0*/ a: @kotlin.Extension() A): kotlin.Unit +public fun foo(/*0*/ a: @kotlin.ExtensionFunctionType() A): kotlin.Unit public interface A : (kotlin.String) -> kotlin.Unit { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt index 563a3e5e867..1eb372ce86c 100644 --- a/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt +++ b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt @@ -5,7 +5,7 @@ annotation class ann interface Some { fun f1(): String.() -> Int - fun f2(): @Extension String.() -> Int + fun f2(): @ExtensionFunctionType String.() -> Int fun f3(): @ann String.() -> Int - fun f4(): @Extension @ann String.() -> Int + fun f4(): @ExtensionFunctionType @ann String.() -> Int } diff --git a/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt index ce3b233ff88..1dfc3b0743c 100644 --- a/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt +++ b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt @@ -3,9 +3,9 @@ package public interface Some { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public abstract fun f1(): kotlin.String.() -> kotlin.Int - public abstract fun f2(): @kotlin.Extension() kotlin.String.() -> kotlin.Int + public abstract fun f2(): @kotlin.ExtensionFunctionType() kotlin.String.() -> kotlin.Int public abstract fun f3(): @ann() kotlin.String.() -> kotlin.Int - public abstract fun f4(): @kotlin.Extension() @ann() kotlin.String.() -> kotlin.Int + public abstract fun f4(): @kotlin.ExtensionFunctionType() @ann() kotlin.String.() -> kotlin.Int 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/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt index 4a13385ee75..19a60b6e122 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt @@ -12,7 +12,7 @@ operator fun Function2.get(index : Int) { } -operator fun @Extension Function3.get(index : Int) { +operator fun @ExtensionFunctionType Function3.get(index : Int) { } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt index 438b43cc618..da2dcab7eab 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt @@ -12,14 +12,14 @@ inline operator fun Function1.plusAssign(p: Function1) { p -= this } -operator fun @Extension Function2.minusAssign(ext : @Extension Function2) {} +operator fun @ExtensionFunctionType Function2.minusAssign(ext : @ExtensionFunctionType Function2) {} -inline operator fun @Extension Function2.modAssign(ext : @Extension Function2) = { +inline operator fun @ExtensionFunctionType Function2.modAssign(ext : @ExtensionFunctionType Function2) = { this += ext ext += this } -inline operator fun @Extension Function2.plusAssign(ext : @Extension Function2) { +inline operator fun @ExtensionFunctionType Function2.plusAssign(ext : @ExtensionFunctionType Function2) { this -= ext ext -= this } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt index 1233c32f4f2..6166c6656d8 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt @@ -11,7 +11,7 @@ inline fun inlineFunWithInvoke(s: (p: T) -> U) { //noinline operator fun Function2.compareTo(index : Function2) = 1 -operator fun @Extension Function3.compareTo(index : @Extension Function3) = 1 +operator fun @ExtensionFunctionType Function3.compareTo(index : @ExtensionFunctionType Function3) = 1 inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { s < s diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt index 0403652b44e..52baa63c0d5 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt @@ -9,8 +9,8 @@ inline fun inlineFunWithInvoke(s: (p: T) -> U) { operator fun Function2.component1() = 1 operator fun Function2.component2() = 2 -operator fun @Extension Function3.component1() = 1 -operator fun @Extension Function3.component2() = 2 +operator fun @ExtensionFunctionType Function3.component1() = 1 +operator fun @ExtensionFunctionType Function3.component2() = 2 inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { val (d1, e1) = s diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt index 0cde2e63426..6f77e98b20a 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt @@ -13,7 +13,7 @@ inline fun inlineFunWithInvoke(s: (p: T) -> U) { operator fun Function2.contains(p: Function2): Boolean = false -operator fun @Extension Function3.contains(ext: @Extension Function3): Boolean = false +operator fun @ExtensionFunctionType Function3.contains(ext: @ExtensionFunctionType Function3): Boolean = false inline fun inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) { s in s diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt index 105bbd25dbb..9a1fd2023c8 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt @@ -3,7 +3,7 @@ operator fun Function1.minus(p: Function1) { } -operator fun @Extension Function2.minus(p: T.(p: U) -> V) { +operator fun @ExtensionFunctionType Function2.minus(p: T.(p: U) -> V) { } @@ -11,7 +11,7 @@ inline operator fun Function1.plus(p: Function1) { this - p } -inline operator fun @Extension Function2.plus(p: T.(p: U) -> V) { +inline operator fun @ExtensionFunctionType Function2.plus(p: T.(p: U) -> V) { this - p } @@ -29,6 +29,6 @@ inline fun Function1.submit() { this + this } -inline fun @Extension Function2.submit() { +inline fun @ExtensionFunctionType Function2.submit() { this + this } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt index e2042693f2f..508750fb971 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt @@ -16,7 +16,7 @@ operator fun Function2.rangeTo(p: Function2): Closed return 1..2 } -operator fun @Extension Function3.rangeTo(ext: @Extension Function3): ClosedRange { +operator fun @ExtensionFunctionType Function3.rangeTo(ext: @ExtensionFunctionType Function3): ClosedRange { return 1..2 } diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt index c53f05d9a4d..66d725de038 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt @@ -5,10 +5,10 @@ operator fun Function1.unaryMinus() = this inline operator fun Function1.inc() = this operator fun Function1.dec() = this -inline operator fun @Extension Function2.unaryPlus(){} -operator fun @Extension Function2.unaryMinus(){} -inline operator fun @Extension Function2.inc() = this -operator fun @Extension Function2.dec() = this +inline operator fun @ExtensionFunctionType Function2.unaryPlus(){} +operator fun @ExtensionFunctionType Function2.unaryMinus(){} +inline operator fun @ExtensionFunctionType Function2.inc() = this +operator fun @ExtensionFunctionType Function2.dec() = this inline fun inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { +s diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt index 75a7c46794b..143083b00d7 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt @@ -11,7 +11,7 @@ operator fun Function2.not() : Boolean { return !this } -operator fun @Extension Function3.not() : Boolean { +operator fun @ExtensionFunctionType Function3.not() : Boolean { return !this } diff --git a/compiler/testData/renderer/FunctionTypes.kt b/compiler/testData/renderer/FunctionTypes.kt index a5c456ee35d..5e88d258255 100644 --- a/compiler/testData/renderer/FunctionTypes.kt +++ b/compiler/testData/renderer/FunctionTypes.kt @@ -5,18 +5,18 @@ var v4: Function1 var v4: (() -> Int, (String) -> Unit) -> String var v5: Int.() -> Int var v6 : Int.(String, Int) -> Unit -var v7 : @Extension Function2 +var v7 : @ExtensionFunctionType Function2 class F: Function0 var v8: F -class EF: @Extension Function1 +class EF: @ExtensionFunctionType Function1 var v9: EF class GF: Function0 var v10: GF -class GEF: @Extension Function1 +class GEF: @ExtensionFunctionType Function1 var v11: GEF var v12: (() -> Unit).() -> Unit diff --git a/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt b/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt index a95394fb538..6778d757371 100644 --- a/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt +++ b/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt @@ -9,5 +9,5 @@ Resolved call: Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Explicit receiver kind = BOTH_RECEIVERS -Dispatch receiver = f {[@kotlin.Extension] Function1} +Dispatch receiver = f {[@kotlin.ExtensionFunctionType] Function1} Extension receiver = 1 {Int} diff --git a/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt b/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt index 37cb35e51f2..e42f0beaec4 100644 --- a/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt +++ b/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt @@ -13,5 +13,5 @@ Resolved call: Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Explicit receiver kind = BOTH_RECEIVERS -Dispatch receiver = foo {[@kotlin.Extension] Function1} +Dispatch receiver = foo {[@kotlin.ExtensionFunctionType] Function1} Extension receiver = 1 {Int} diff --git a/compiler/testData/resolvedCalls/invoke/implicitReceiverForInvoke.txt b/compiler/testData/resolvedCalls/invoke/implicitReceiverForInvoke.txt index 93fe2fb97fe..33d2bf46d5e 100644 --- a/compiler/testData/resolvedCalls/invoke/implicitReceiverForInvoke.txt +++ b/compiler/testData/resolvedCalls/invoke/implicitReceiverForInvoke.txt @@ -11,5 +11,5 @@ Resolved call: Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Explicit receiver kind = DISPATCH_RECEIVER -Dispatch receiver = f {[@kotlin.Extension] Function1} +Dispatch receiver = f {[@kotlin.ExtensionFunctionType] Function1} Extension receiver = IntExt{fun Int.(): Unit defined in bar} diff --git a/core/builtins/src/kotlin/Annotations.kt b/core/builtins/src/kotlin/Annotations.kt index 468b5bed1de..9d913f6e976 100644 --- a/core/builtins/src/kotlin/Annotations.kt +++ b/core/builtins/src/kotlin/Annotations.kt @@ -69,6 +69,11 @@ public enum class DeprecationLevel { */ @Target(TYPE) @MustBeDocumented +public annotation class ExtensionFunctionType + +@Target(TYPE) +@MustBeDocumented +@Deprecated("Use @ExtensionFunctionType instead.", replaceWith = ReplaceWith("@ExtensionFunctionType")) public annotation class Extension /** diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 351d439ee1a..62fd9e0f6f1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -139,8 +139,7 @@ public abstract class KotlinBuiltIns { public final FqName throwable = fqName("Throwable"); public final FqName deprecated = fqName("Deprecated"); - public final FqName tailRecursive = fqName("tailrec"); - public final FqName extension = fqName("Extension"); + public final FqName extensionFunctionType = fqName("ExtensionFunctionType"); public final FqName target = annotationName("Target"); public final FqName annotationTarget = annotationName("AnnotationTarget"); public final FqName annotationRetention = annotationName("AnnotationRetention"); @@ -157,6 +156,9 @@ public abstract class KotlinBuiltIns { public final FqNameUnsafe kCallable = reflect("KCallable"); public final ClassId kProperty = ClassId.topLevel(reflect("KProperty").toSafe()); + // TODO: remove in 1.0 + public final FqName deprecatedExtensionAnnotation = fqName("Extension"); + public final Map fqNameToPrimitiveType; public final Map arrayClassFqNameToPrimitiveType; { @@ -697,12 +699,13 @@ public abstract class KotlinBuiltIns { @NotNull public AnnotationDescriptor createExtensionAnnotation() { - return new AnnotationDescriptorImpl(getBuiltInClassByName(FQ_NAMES.extension.shortName()).getDefaultType(), + return new AnnotationDescriptorImpl(getBuiltInClassByName(FQ_NAMES.extensionFunctionType.shortName()).getDefaultType(), Collections.>emptyMap(), SourceElement.NO_SOURCE); } private static boolean isTypeAnnotatedWithExtension(@NotNull KotlinType type) { - return type.getAnnotations().findAnnotation(FQ_NAMES.extension) != null; + return type.getAnnotations().findAnnotation(FQ_NAMES.extensionFunctionType) != null || + type.getAnnotations().findAnnotation(FQ_NAMES.deprecatedExtensionAnnotation) != null; } @NotNull @@ -716,14 +719,14 @@ public abstract class KotlinBuiltIns { int size = parameterTypes.size(); ClassDescriptor classDescriptor = receiverType == null ? getFunction(size) : getExtensionFunction(size); - Annotations typeAnnotations = receiverType == null ? annotations : addExtensionAnnotation(annotations); + Annotations typeAnnotations = receiverType == null ? annotations : addExtensionFunctionTypeAnnotation(annotations); return KotlinTypeImpl.create(typeAnnotations, classDescriptor, false, arguments); } @NotNull - private Annotations addExtensionAnnotation(@NotNull Annotations annotations) { - if (annotations.findAnnotation(FQ_NAMES.extension) != null) return annotations; + private Annotations addExtensionFunctionTypeAnnotation(@NotNull Annotations annotations) { + if (annotations.findAnnotation(FQ_NAMES.extensionFunctionType) != null) return annotations; // TODO: preserve laziness of given annotations return new AnnotationsImpl(plus(annotations, listOf(createExtensionAnnotation()))); diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt index 93e614d8809..1e84b49c1bb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder import com.google.protobuf.MessageLite import com.intellij.psi.PsiElement import com.intellij.psi.stubs.StubElement -import com.intellij.util.SmartList import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens @@ -81,7 +80,10 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { val shouldBuildAsFunctionType = KotlinBuiltIns.isNumberedFunctionClassFqName(classId.asSingleFqName().toUnsafe()) && type.getArgumentList().none { it.getProjection() == Projection.STAR } if (shouldBuildAsFunctionType) { - val extension = annotations.any { annotation -> annotation.asSingleFqName() == KotlinBuiltIns.FQ_NAMES.extension } + val extension = annotations.any { annotation -> + val fqName = annotation.asSingleFqName() + fqName == KotlinBuiltIns.FQ_NAMES.extensionFunctionType || fqName == KotlinBuiltIns.FQ_NAMES.deprecatedExtensionAnnotation + } createFunctionTypeStub(parent, type, extension) return } diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt b/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt index 48876406d8c..9c158cd19a9 100644 --- a/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt +++ b/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt @@ -1,5 +1,5 @@ package somePackage class ExcludedClass -// Such strange name here needed to make completion prefix not intersecting with kotlin.Extension -class ExctraClass \ No newline at end of file +// Such strange name here needed to make completion prefix not intersecting with kotlin.ExtensionFunctionType +class ExctraClass diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExctraClass.java b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExctraClass.java index b1cda98a37b..91c938f629b 100644 --- a/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExctraClass.java +++ b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExctraClass.java @@ -1,6 +1,6 @@ package somePackage; -// Such strange name here needed to make completion prefix not intersecting with kotlin.Extension +// Such strange name here needed to make completion prefix not intersecting with kotlin.ExtensionFunctionType public class ExctraClass { -} \ No newline at end of file +} diff --git a/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction2/NotImportedExtensionFunction2.dependency.kt b/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction2/NotImportedExtensionFunction2.dependency.kt index e7a45fcbefd..8f11ef2651d 100644 --- a/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction2/NotImportedExtensionFunction2.dependency.kt +++ b/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction2/NotImportedExtensionFunction2.dependency.kt @@ -6,7 +6,7 @@ fun (() -> Unit)?.helloFun1() { fun Function0.helloFun2() { } -fun @Extension Function1.helloFun3() { +fun @ExtensionFunctionType Function1.helloFun3() { } fun Function1.helloFun4() { diff --git a/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction3/NotImportedExtensionFunction3.dependency.kt b/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction3/NotImportedExtensionFunction3.dependency.kt index c418879227e..d55d4b4675c 100644 --- a/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction3/NotImportedExtensionFunction3.dependency.kt +++ b/idea/idea-completion/testData/basic/multifile/NotImportedExtensionFunction3/NotImportedExtensionFunction3.dependency.kt @@ -6,10 +6,10 @@ fun (String.() -> Unit)?.helloFun1() { fun Function0.helloFun2() { } -fun @Extension Function1.helloFun3() { +fun @ExtensionFunctionType Function1.helloFun3() { } -fun @Extension Function1.helloFun4() { +fun @ExtensionFunctionType Function1.helloFun4() { } fun Function1.helloFun5() { diff --git a/idea/testData/decompiler/decompiledText/FunctionTypes.expected.kt b/idea/testData/decompiler/decompiledText/FunctionTypes.expected.kt index c4a07d88f6a..d6ff09810bf 100644 --- a/idea/testData/decompiler/decompiledText/FunctionTypes.expected.kt +++ b/idea/testData/decompiler/decompiledText/FunctionTypes.expected.kt @@ -10,7 +10,7 @@ public final class FunctionTypes public constructor() { public final fun f3(f: kotlin.Int.(kotlin.Int) -> kotlin.Unit): kotlin.Unit { /* compiled code */ } - public final fun f4(f: kotlin.List<@kotlin.Extension kotlin.Function1<*, *>>): kotlin.Unit { /* compiled code */ } + public final fun f4(f: kotlin.List<@kotlin.ExtensionFunctionType kotlin.Function1<*, *>>): kotlin.Unit { /* compiled code */ } public final fun (A.(A) -> A)?.bar(): kotlin.Unit { /* compiled code */ } @@ -19,4 +19,4 @@ public final class FunctionTypes public constructor() { public final fun ((IP) -> R).compose2(f: (P1) -> IP): (P1) -> R { /* compiled code */ } public final fun (A.(A) -> A).foo(): kotlin.Unit { /* compiled code */ } -} \ No newline at end of file +} diff --git a/idea/testData/decompiler/decompiledText/FunctionTypes/FunctionTypes.kt b/idea/testData/decompiler/decompiledText/FunctionTypes/FunctionTypes.kt index dbc4041dd83..fba30f2e6d5 100644 --- a/idea/testData/decompiler/decompiledText/FunctionTypes/FunctionTypes.kt +++ b/idea/testData/decompiler/decompiledText/FunctionTypes/FunctionTypes.kt @@ -21,9 +21,9 @@ class FunctionTypes { public fun f2(f: Function2) { } - public fun f3(f: @Extension Function2) { + public fun f3(f: @ExtensionFunctionType Function2) { } - public fun f4(f: List<@Extension Function1<*, *>>) { + public fun f4(f: List<@ExtensionFunctionType Function1<*, *>>) { } } diff --git a/idea/testData/decompiler/stubBuilder/Types/Types.kt b/idea/testData/decompiler/stubBuilder/Types/Types.kt index 4b92c32a0b5..6d91e6fcdff 100644 --- a/idea/testData/decompiler/stubBuilder/Types/Types.kt +++ b/idea/testData/decompiler/stubBuilder/Types/Types.kt @@ -19,7 +19,7 @@ abstract class Types { abstract val starList: List<*> abstract val starFun: Function1<*, *> - abstract val extFun: @Extension Function2 - abstract val listExtStarFun: List<@Extension Function1<*, *>> + abstract val extFun: @ExtensionFunctionType Function2 + abstract val listExtStarFun: List<@ExtensionFunctionType Function1<*, *>> abstract val funTypeWithStarAndNonStar: Function1<*, Int> -} \ No newline at end of file +} diff --git a/idea/testData/decompiler/stubBuilder/Types/Types.txt b/idea/testData/decompiler/stubBuilder/Types/Types.txt index b3b7f3fac0f..8fb79fb06a7 100644 --- a/idea/testData/decompiler/stubBuilder/Types/Types.txt +++ b/idea/testData/decompiler/stubBuilder/Types/Types.txt @@ -252,13 +252,13 @@ PsiJetFileStubImpl[package=test] TYPE_ARGUMENT_LIST: TYPE_PROJECTION:[projectionKind=NONE] TYPE_REFERENCE: - ANNOTATION_ENTRY:[hasValueArguments=false, shortName=Extension] + ANNOTATION_ENTRY:[hasValueArguments=false, shortName=ExtensionFunctionType] CONSTRUCTOR_CALLEE: TYPE_REFERENCE: USER_TYPE:[isAbsoluteInRootPackage=false] USER_TYPE:[isAbsoluteInRootPackage=false] REFERENCE_EXPRESSION:[referencedName=kotlin] - REFERENCE_EXPRESSION:[referencedName=Extension] + REFERENCE_EXPRESSION:[referencedName=ExtensionFunctionType] USER_TYPE:[isAbsoluteInRootPackage=false] USER_TYPE:[isAbsoluteInRootPackage=false] REFERENCE_EXPRESSION:[referencedName=kotlin] diff --git a/idea/testData/unifier/equivalence/types/function0.kt b/idea/testData/unifier/equivalence/types/function0.kt index 039b31f2fff..3ba48fd2994 100644 --- a/idea/testData/unifier/equivalence/types/function0.kt +++ b/idea/testData/unifier/equivalence/types/function0.kt @@ -4,4 +4,4 @@ val c: () -> String = { "" } val d: () -> kotlin.String = { "" } val e: () -> Unit = { } val f: Any.() -> String = { "" } -val g: @Extension Function1 = { "" } +val g: @ExtensionFunctionType Function1 = { "" } diff --git a/idea/testData/unifier/equivalence/types/function1.kt b/idea/testData/unifier/equivalence/types/function1.kt index f62fb7dc609..80c3db320b5 100644 --- a/idea/testData/unifier/equivalence/types/function1.kt +++ b/idea/testData/unifier/equivalence/types/function1.kt @@ -5,6 +5,6 @@ val d: (n: Int) -> kotlin.String = { "" } val e: (String) -> Int = { 0 } val f: () -> Int = { 0 } val g: Int.() -> String = { "" } -val h: @Extension Function2 = { "" } +val h: @ExtensionFunctionType Function2 = { "" } val i: (m: Int) -> kotlin.String = { "" } -val j: @Extension Function1 = { "" } +val j: @ExtensionFunctionType Function1 = { "" } diff --git a/idea/testData/unifier/equivalence/types/function1.kt.match b/idea/testData/unifier/equivalence/types/function1.kt.match index 9c50410998c..a75481cc86d 100644 --- a/idea/testData/unifier/equivalence/types/function1.kt.match +++ b/idea/testData/unifier/equivalence/types/function1.kt.match @@ -10,4 +10,4 @@ Int.() -> String (m: Int) -> kotlin.String -@Extension Function1 +@ExtensionFunctionType Function1 diff --git a/idea/testData/unifier/equivalence/types/function2.kt b/idea/testData/unifier/equivalence/types/function2.kt index 31f21c5aecb..2aaf150181b 100644 --- a/idea/testData/unifier/equivalence/types/function2.kt +++ b/idea/testData/unifier/equivalence/types/function2.kt @@ -6,6 +6,6 @@ val e: (String) -> Int = { 0 } val f: () -> Int = { 0 } val g: Any.(Int) -> String = { "" } val h: Int.(Any) -> String = { "" } -val i: @Extension Function3 = { a, b -> "" } +val i: @ExtensionFunctionType Function3 = { a, b -> "" } val j: (t: Any, u: Int) -> kotlin.String = { a, b -> "" } -val k: @Extension Function2 = { "" } +val k: @ExtensionFunctionType Function2 = { "" } diff --git a/idea/testData/unifier/equivalence/types/function2.kt.match b/idea/testData/unifier/equivalence/types/function2.kt.match index 2fa4558f6dd..fd9b5475119 100644 --- a/idea/testData/unifier/equivalence/types/function2.kt.match +++ b/idea/testData/unifier/equivalence/types/function2.kt.match @@ -10,4 +10,4 @@ Any.(Int) -> String (t: Any, u: Int) -> kotlin.String -@Extension Function2 +@ExtensionFunctionType Function2 diff --git a/spec-docs/function-types.md b/spec-docs/function-types.md index 7a3e11a822b..2bc6ac06cd8 100644 --- a/spec-docs/function-types.md +++ b/spec-docs/function-types.md @@ -23,7 +23,7 @@ Kotlin lambdas are translated to subclasses of this abstract class, passing the ## Extension functions -Extension function type `T.(P) -> R` is now just a shorthand for `@kotlin.extension Function2`. +Extension function type `T.(P) -> R` is now just a shorthand for `@ExtensionFunctionType Function2`. `kotlin.extension` is a **type annotation** defined in built-ins. So effectively functions and extension functions now have the same type, which means that everything which takes a function will work with an extension function and vice versa. @@ -40,7 +40,7 @@ or an extension function expression where a function is expected and vice versa. If you really want to do that, change the shape, assign literal to a variable or use the `as` operator. So basically you can now safely coerce values between function and extension function types, -but still should invoke them in the format which you specified in their type (with or without `@Extension`). +but still should invoke them in the format which you specified in their type (with or without `@ExtensionFunctionType`). With this we'll get rid of classes `ExtensionFunction0`, `ExtensionFunction1`, ... and the rest of this article will deal only with usual functions.