Revert "Rename Extension annotation to ExtensionFunctionType"

This reverts commit 460dad135c.

The old compiler will not see the new runtime correctly. Postponing this until
1.0
This commit is contained in:
Alexander Udalov
2015-11-30 19:23:13 +03:00
parent 745809c666
commit 877129340f
35 changed files with 66 additions and 81 deletions
+1 -5
View File
@@ -464,14 +464,10 @@ public abstract class Enum</*0*/ E : kotlin.Enum<E>> : kotlin.Comparable<E> {
} }
} }
@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 { @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.MustBeDocumented() public final annotation class Extension : kotlin.Annotation {
/*primary*/ public constructor Extension() /*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<kotlin.Float> { public final class Float : kotlin.Number, kotlin.Comparable<kotlin.Float> {
/*primary*/ private constructor Float() /*primary*/ private constructor Float()
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
@@ -6,8 +6,8 @@ fun foo(a: (String) -> Unit) {
interface A : (String) -> Unit {} interface A : (String) -> Unit {}
fun foo(a: @ExtensionFunctionType A) { fun foo(a: @Extension A) {
// @ExtensionFunctionType annotation on an unrelated type shouldn't have any effect on this diagnostic. // @Extension annotation on an unrelated type shouldn't have any effect on this diagnostic.
// Only kotlin.Function{n} type annotated with @ExtensionFunctionType should // Only kotlin.Function{n} type annotated with @Extension should
"".<!INVOKE_EXTENSION_ON_NOT_EXTENSION_FUNCTION!>a<!>() "".<!INVOKE_EXTENSION_ON_NOT_EXTENSION_FUNCTION!>a<!>()
} }
@@ -1,7 +1,7 @@
package package
public fun foo(/*0*/ a: (kotlin.String) -> kotlin.Unit): kotlin.Unit public fun foo(/*0*/ a: (kotlin.String) -> kotlin.Unit): kotlin.Unit
public fun foo(/*0*/ a: @kotlin.ExtensionFunctionType() A): kotlin.Unit public fun foo(/*0*/ a: @kotlin.Extension() A): kotlin.Unit
public interface A : (kotlin.String) -> kotlin.Unit { public interface A : (kotlin.String) -> kotlin.Unit {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -5,7 +5,7 @@ annotation class ann
interface Some { interface Some {
fun f1(): String.() -> Int fun f1(): String.() -> Int
fun f2(): @ExtensionFunctionType String.() -> Int fun f2(): @Extension String.() -> Int
fun f3(): @ann String.() -> Int fun f3(): @ann String.() -> Int
fun f4(): @ExtensionFunctionType @ann String.() -> Int fun f4(): @Extension @ann String.() -> Int
} }
@@ -3,9 +3,9 @@ package
public interface Some { public interface Some {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 f1(): kotlin.String.() -> kotlin.Int
public abstract fun f2(): @kotlin.ExtensionFunctionType() kotlin.String.() -> kotlin.Int public abstract fun f2(): @kotlin.Extension() kotlin.String.() -> kotlin.Int
public abstract fun f3(): @ann() kotlin.String.() -> kotlin.Int public abstract fun f3(): @ann() kotlin.String.() -> kotlin.Int
public abstract fun f4(): @kotlin.ExtensionFunctionType() @ann() kotlin.String.() -> kotlin.Int public abstract fun f4(): @kotlin.Extension() @ann() kotlin.String.() -> kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
@@ -12,7 +12,7 @@ operator fun <T, U, V> Function2<T, U, V>.get(index : Int) {
} }
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.get(index : Int) { operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.get(index : Int) {
} }
@@ -12,14 +12,14 @@ inline operator fun <T, U> Function1<T, U>.plusAssign(p: Function1<T, U>) {
<!USAGE_IS_NOT_INLINABLE!>p<!> -= <!USAGE_IS_NOT_INLINABLE!>this<!> <!USAGE_IS_NOT_INLINABLE!>p<!> -= <!USAGE_IS_NOT_INLINABLE!>this<!>
} }
operator fun <T, U, V> @ExtensionFunctionType Function2<T, U, V>.minusAssign(ext : @ExtensionFunctionType Function2<T, U, V>) {} operator fun <T, U, V> @Extension Function2<T, U, V>.minusAssign(ext : @Extension Function2<T, U, V>) {}
inline <!INAPPLICABLE_OPERATOR_MODIFIER!>operator<!> fun <T, U, V> @ExtensionFunctionType Function2<T, U, V>.modAssign(ext : @ExtensionFunctionType Function2<T, U, V>) = { inline <!INAPPLICABLE_OPERATOR_MODIFIER!>operator<!> fun <T, U, V> @Extension Function2<T, U, V>.modAssign(ext : @Extension Function2<T, U, V>) = {
this += ext this += ext
ext += this ext += this
} }
inline operator fun <T, U, V> @ExtensionFunctionType Function2<T, U, V>.plusAssign(ext : @ExtensionFunctionType Function2<T, U, V>) { inline operator fun <T, U, V> @Extension Function2<T, U, V>.plusAssign(ext : @Extension Function2<T, U, V>) {
<!USAGE_IS_NOT_INLINABLE!>this<!> -= <!USAGE_IS_NOT_INLINABLE!>ext<!> <!USAGE_IS_NOT_INLINABLE!>this<!> -= <!USAGE_IS_NOT_INLINABLE!>ext<!>
<!USAGE_IS_NOT_INLINABLE!>ext<!> -= <!USAGE_IS_NOT_INLINABLE!>this<!> <!USAGE_IS_NOT_INLINABLE!>ext<!> -= <!USAGE_IS_NOT_INLINABLE!>this<!>
} }
@@ -11,7 +11,7 @@ inline fun <T, U, V> inlineFunWithInvoke(s: (p: T) -> U) {
//noinline //noinline
operator fun <T, U, V> Function2<T, U, V>.compareTo(index : Function2<T, U, V>) = 1 operator fun <T, U, V> Function2<T, U, V>.compareTo(index : Function2<T, U, V>) = 1
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.compareTo(index : @ExtensionFunctionType Function3<T, U, V, W>) = 1 operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.compareTo(index : @Extension Function3<T, U, V, W>) = 1
inline fun <T, U, V, W> inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { inline fun <T, U, V, W> inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) {
<!USAGE_IS_NOT_INLINABLE!>s<!> < <!USAGE_IS_NOT_INLINABLE!>s<!> <!USAGE_IS_NOT_INLINABLE!>s<!> < <!USAGE_IS_NOT_INLINABLE!>s<!>
@@ -9,8 +9,8 @@ inline fun <T, U, V> inlineFunWithInvoke(s: (p: T) -> U) {
operator fun <T, U, V> Function2<T, U, V>.component1() = 1 operator fun <T, U, V> Function2<T, U, V>.component1() = 1
operator fun <T, U, V> Function2<T, U, V>.component2() = 2 operator fun <T, U, V> Function2<T, U, V>.component2() = 2
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.component1() = 1 operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.component1() = 1
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.component2() = 2 operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.component2() = 2
inline fun <T, U, V, W> inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { inline fun <T, U, V, W> inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) {
val (d1, e1) = <!USAGE_IS_NOT_INLINABLE, USAGE_IS_NOT_INLINABLE!>s<!> val (d1, e1) = <!USAGE_IS_NOT_INLINABLE, USAGE_IS_NOT_INLINABLE!>s<!>
@@ -13,7 +13,7 @@ inline fun <T, U, V> inlineFunWithInvoke(s: (p: T) -> U) {
operator fun <T, U, V> Function2<T, U, V>.contains(p: Function2<T, U, V>): Boolean = false operator fun <T, U, V> Function2<T, U, V>.contains(p: Function2<T, U, V>): Boolean = false
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.contains(ext: @ExtensionFunctionType Function3<T, U, V, W>): Boolean = false operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.contains(ext: @Extension Function3<T, U, V, W>): Boolean = false
inline fun <T, U, V> inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) { inline fun <T, U, V> inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) {
<!USAGE_IS_NOT_INLINABLE!>s<!> in <!USAGE_IS_NOT_INLINABLE!>s<!> <!USAGE_IS_NOT_INLINABLE!>s<!> in <!USAGE_IS_NOT_INLINABLE!>s<!>
@@ -3,7 +3,7 @@ operator fun <T, U> Function1<T, U>.minus(p: Function1<T, U>) {
} }
operator fun <T, U, V> @ExtensionFunctionType Function2<T, U, V>.minus(p: T.(p: U) -> V) { operator fun <T, U, V> @Extension Function2<T, U, V>.minus(p: T.(p: U) -> V) {
} }
@@ -11,7 +11,7 @@ inline operator fun <T, U> Function1<T, U>.plus(p: Function1<T, U>) {
<!USAGE_IS_NOT_INLINABLE!>this<!> - <!USAGE_IS_NOT_INLINABLE!>p<!> <!USAGE_IS_NOT_INLINABLE!>this<!> - <!USAGE_IS_NOT_INLINABLE!>p<!>
} }
inline operator fun <T, U, V> @ExtensionFunctionType Function2<T, U, V>.plus(p: T.(p: U) -> V) { inline operator fun <T, U, V> @Extension Function2<T, U, V>.plus(p: T.(p: U) -> V) {
<!USAGE_IS_NOT_INLINABLE!>this<!> - <!USAGE_IS_NOT_INLINABLE!>p<!> <!USAGE_IS_NOT_INLINABLE!>this<!> - <!USAGE_IS_NOT_INLINABLE!>p<!>
} }
@@ -29,6 +29,6 @@ inline fun <T, U> Function1<T, U>.submit() {
this + this this + this
} }
inline fun <T, U, V> @ExtensionFunctionType Function2<T, U, V>.submit() { inline fun <T, U, V> @Extension Function2<T, U, V>.submit() {
this + this this + this
} }
@@ -16,7 +16,7 @@ operator fun <T, U, V> Function2<T, U, V>.rangeTo(p: Function2<T, U, V>): Closed
return 1..2 return 1..2
} }
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.rangeTo(ext: @ExtensionFunctionType Function3<T, U, V, W>): ClosedRange<Int> { operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.rangeTo(ext: @Extension Function3<T, U, V, W>): ClosedRange<Int> {
return 1..2 return 1..2
} }
@@ -5,10 +5,10 @@ operator fun <T, V> Function1<T, V>.unaryMinus() = this
inline operator fun <T, V> Function1<T, V>.inc() = <!USAGE_IS_NOT_INLINABLE!>this<!> inline operator fun <T, V> Function1<T, V>.inc() = <!USAGE_IS_NOT_INLINABLE!>this<!>
operator fun <T, V> Function1<T, V>.dec() = this operator fun <T, V> Function1<T, V>.dec() = this
inline operator fun <T, V> @ExtensionFunctionType Function2<T, T, V>.unaryPlus(){} inline operator fun <T, V> @Extension Function2<T, T, V>.unaryPlus(){}
operator fun <T, V> @ExtensionFunctionType Function2<T, T, V>.unaryMinus(){} operator fun <T, V> @Extension Function2<T, T, V>.unaryMinus(){}
inline operator fun <T, V> @ExtensionFunctionType Function2<T, T, V>.inc() = <!USAGE_IS_NOT_INLINABLE!>this<!> inline operator fun <T, V> @Extension Function2<T, T, V>.inc() = <!USAGE_IS_NOT_INLINABLE!>this<!>
operator fun <T, V> @ExtensionFunctionType Function2<T, T, V>.dec() = this operator fun <T, V> @Extension Function2<T, T, V>.dec() = this
inline fun <T, V> inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { inline fun <T, V> inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) {
+s +s
@@ -11,7 +11,7 @@ operator fun <T, U, V> Function2<T, U, V>.not() : Boolean {
return !this return !this
} }
operator fun <T, U, V, W> @ExtensionFunctionType Function3<T, U, V, W>.not() : Boolean { operator fun <T, U, V, W> @Extension Function3<T, U, V, W>.not() : Boolean {
return !this return !this
} }
+3 -3
View File
@@ -5,18 +5,18 @@ var v4: Function1<Int, String>
var v4: (() -> Int, (String) -> Unit) -> String var v4: (() -> Int, (String) -> Unit) -> String
var v5: Int.() -> Int var v5: Int.() -> Int
var v6 : Int.(String, Int) -> Unit var v6 : Int.(String, Int) -> Unit
var v7 : @ExtensionFunctionType Function2<Int, String, Boolean> var v7 : @Extension Function2<Int, String, Boolean>
class F: Function0<Unit> class F: Function0<Unit>
var v8: F var v8: F
class EF: @ExtensionFunctionType Function1<String, Unit> class EF: @Extension Function1<String, Unit>
var v9: EF var v9: EF
class GF<T>: Function0<T> class GF<T>: Function0<T>
var v10: GF<Any> var v10: GF<Any>
class GEF<A, B>: @ExtensionFunctionType Function1<A, B> class GEF<A, B>: @Extension Function1<A, B>
var v11: GEF<Any, Any> var v11: GEF<Any, Any>
var v12: (() -> Unit).() -> Unit var v12: (() -> Unit).() -> Unit
@@ -9,5 +9,5 @@ Resolved call:
Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1
Explicit receiver kind = BOTH_RECEIVERS Explicit receiver kind = BOTH_RECEIVERS
Dispatch receiver = f {[@kotlin.ExtensionFunctionType] Function1<Int, Unit>} Dispatch receiver = f {[@kotlin.Extension] Function1<Int, Unit>}
Extension receiver = 1 {Int} Extension receiver = 1 {Int}
@@ -13,5 +13,5 @@ Resolved call:
Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1
Explicit receiver kind = BOTH_RECEIVERS Explicit receiver kind = BOTH_RECEIVERS
Dispatch receiver = foo {[@kotlin.ExtensionFunctionType] Function1<Int, Unit>} Dispatch receiver = foo {[@kotlin.Extension] Function1<Int, Unit>}
Extension receiver = 1 {Int} Extension receiver = 1 {Int}
@@ -11,5 +11,5 @@ Resolved call:
Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1
Explicit receiver kind = DISPATCH_RECEIVER Explicit receiver kind = DISPATCH_RECEIVER
Dispatch receiver = f {[@kotlin.ExtensionFunctionType] Function1<Int, Unit>} Dispatch receiver = f {[@kotlin.Extension] Function1<Int, Unit>}
Extension receiver = IntExt{fun Int.<anonymous>(): Unit defined in bar} Extension receiver = IntExt{fun Int.<anonymous>(): Unit defined in bar}
-5
View File
@@ -69,11 +69,6 @@ public enum class DeprecationLevel {
*/ */
@Target(TYPE) @Target(TYPE)
@MustBeDocumented @MustBeDocumented
public annotation class ExtensionFunctionType
@Target(TYPE)
@MustBeDocumented
@Deprecated("Use @ExtensionFunctionType instead.", replaceWith = ReplaceWith("@ExtensionFunctionType"))
public annotation class Extension public annotation class Extension
/** /**
@@ -139,7 +139,7 @@ public abstract class KotlinBuiltIns {
public final FqName throwable = fqName("Throwable"); public final FqName throwable = fqName("Throwable");
public final FqName deprecated = fqName("Deprecated"); public final FqName deprecated = fqName("Deprecated");
public final FqName extensionFunctionType = fqName("ExtensionFunctionType"); public final FqName extension = fqName("Extension");
public final FqName target = annotationName("Target"); public final FqName target = annotationName("Target");
public final FqName annotationTarget = annotationName("AnnotationTarget"); public final FqName annotationTarget = annotationName("AnnotationTarget");
public final FqName annotationRetention = annotationName("AnnotationRetention"); public final FqName annotationRetention = annotationName("AnnotationRetention");
@@ -156,9 +156,6 @@ public abstract class KotlinBuiltIns {
public final FqNameUnsafe kCallable = reflect("KCallable"); public final FqNameUnsafe kCallable = reflect("KCallable");
public final ClassId kProperty = ClassId.topLevel(reflect("KProperty").toSafe()); public final ClassId kProperty = ClassId.topLevel(reflect("KProperty").toSafe());
// TODO: remove in 1.0
public final FqName deprecatedExtensionAnnotation = fqName("Extension");
public final Map<FqNameUnsafe, PrimitiveType> fqNameToPrimitiveType; public final Map<FqNameUnsafe, PrimitiveType> fqNameToPrimitiveType;
public final Map<FqNameUnsafe, PrimitiveType> arrayClassFqNameToPrimitiveType; public final Map<FqNameUnsafe, PrimitiveType> arrayClassFqNameToPrimitiveType;
{ {
@@ -699,13 +696,12 @@ public abstract class KotlinBuiltIns {
@NotNull @NotNull
public AnnotationDescriptor createExtensionAnnotation() { public AnnotationDescriptor createExtensionAnnotation() {
return new AnnotationDescriptorImpl(getBuiltInClassByName(FQ_NAMES.extensionFunctionType.shortName()).getDefaultType(), return new AnnotationDescriptorImpl(getBuiltInClassByName(FQ_NAMES.extension.shortName()).getDefaultType(),
Collections.<ValueParameterDescriptor, ConstantValue<?>>emptyMap(), SourceElement.NO_SOURCE); Collections.<ValueParameterDescriptor, ConstantValue<?>>emptyMap(), SourceElement.NO_SOURCE);
} }
private static boolean isTypeAnnotatedWithExtension(@NotNull KotlinType type) { private static boolean isTypeAnnotatedWithExtension(@NotNull KotlinType type) {
return type.getAnnotations().findAnnotation(FQ_NAMES.extensionFunctionType) != null || return type.getAnnotations().findAnnotation(FQ_NAMES.extension) != null;
type.getAnnotations().findAnnotation(FQ_NAMES.deprecatedExtensionAnnotation) != null;
} }
@NotNull @NotNull
@@ -719,14 +715,14 @@ public abstract class KotlinBuiltIns {
int size = parameterTypes.size(); int size = parameterTypes.size();
ClassDescriptor classDescriptor = receiverType == null ? getFunction(size) : getExtensionFunction(size); ClassDescriptor classDescriptor = receiverType == null ? getFunction(size) : getExtensionFunction(size);
Annotations typeAnnotations = receiverType == null ? annotations : addExtensionFunctionTypeAnnotation(annotations); Annotations typeAnnotations = receiverType == null ? annotations : addExtensionAnnotation(annotations);
return KotlinTypeImpl.create(typeAnnotations, classDescriptor, false, arguments); return KotlinTypeImpl.create(typeAnnotations, classDescriptor, false, arguments);
} }
@NotNull @NotNull
private Annotations addExtensionFunctionTypeAnnotation(@NotNull Annotations annotations) { private Annotations addExtensionAnnotation(@NotNull Annotations annotations) {
if (annotations.findAnnotation(FQ_NAMES.extensionFunctionType) != null) return annotations; if (annotations.findAnnotation(FQ_NAMES.extension) != null) return annotations;
// TODO: preserve laziness of given annotations // TODO: preserve laziness of given annotations
return new AnnotationsImpl(plus(annotations, listOf(createExtensionAnnotation()))); return new AnnotationsImpl(plus(annotations, listOf(createExtensionAnnotation())));
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder
import com.google.protobuf.MessageLite import com.google.protobuf.MessageLite
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubElement
import com.intellij.util.SmartList
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -80,10 +81,7 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) {
val shouldBuildAsFunctionType = KotlinBuiltIns.isNumberedFunctionClassFqName(classId.asSingleFqName().toUnsafe()) val shouldBuildAsFunctionType = KotlinBuiltIns.isNumberedFunctionClassFqName(classId.asSingleFqName().toUnsafe())
&& type.getArgumentList().none { it.getProjection() == Projection.STAR } && type.getArgumentList().none { it.getProjection() == Projection.STAR }
if (shouldBuildAsFunctionType) { if (shouldBuildAsFunctionType) {
val extension = annotations.any { annotation -> val extension = annotations.any { annotation -> annotation.asSingleFqName() == KotlinBuiltIns.FQ_NAMES.extension }
val fqName = annotation.asSingleFqName()
fqName == KotlinBuiltIns.FQ_NAMES.extensionFunctionType || fqName == KotlinBuiltIns.FQ_NAMES.deprecatedExtensionAnnotation
}
createFunctionTypeStub(parent, type, extension) createFunctionTypeStub(parent, type, extension)
return return
} }
@@ -1,5 +1,5 @@
package somePackage package somePackage
class ExcludedClass class ExcludedClass
// Such strange name here needed to make completion prefix not intersecting with kotlin.ExtensionFunctionType // Such strange name here needed to make completion prefix not intersecting with kotlin.Extension
class ExctraClass class ExctraClass
@@ -1,6 +1,6 @@
package somePackage; package somePackage;
// Such strange name here needed to make completion prefix not intersecting with kotlin.ExtensionFunctionType // Such strange name here needed to make completion prefix not intersecting with kotlin.Extension
public class ExctraClass { public class ExctraClass {
} }
@@ -6,7 +6,7 @@ fun (() -> Unit)?.helloFun1() {
fun Function0<Unit>.helloFun2() { fun Function0<Unit>.helloFun2() {
} }
fun @ExtensionFunctionType Function1<String, Unit>.helloFun3() { fun @Extension Function1<String, Unit>.helloFun3() {
} }
fun Function1<String, Unit>.helloFun4() { fun Function1<String, Unit>.helloFun4() {
@@ -6,10 +6,10 @@ fun (String.() -> Unit)?.helloFun1() {
fun Function0<Unit>.helloFun2() { fun Function0<Unit>.helloFun2() {
} }
fun @ExtensionFunctionType Function1<String, Unit>.helloFun3() { fun @Extension Function1<String, Unit>.helloFun3() {
} }
fun @ExtensionFunctionType Function1<Int, Unit>.helloFun4() { fun @Extension Function1<Int, Unit>.helloFun4() {
} }
fun Function1<String, Unit>.helloFun5() { fun Function1<String, Unit>.helloFun5() {
@@ -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 f3(f: kotlin.Int.(kotlin.Int) -> kotlin.Unit): kotlin.Unit { /* compiled code */ }
public final fun f4(f: kotlin.List<@kotlin.ExtensionFunctionType kotlin.Function1<*, *>>): kotlin.Unit { /* compiled code */ } public final fun f4(f: kotlin.List<@kotlin.Extension kotlin.Function1<*, *>>): kotlin.Unit { /* compiled code */ }
public final fun <A> (A.(A) -> A)?.bar(): kotlin.Unit { /* compiled code */ } public final fun <A> (A.(A) -> A)?.bar(): kotlin.Unit { /* compiled code */ }
@@ -19,4 +19,4 @@ public final class FunctionTypes public constructor() {
public final fun <IP, R, P1> ((IP) -> R).compose2(f: (P1) -> IP): (P1) -> R { /* compiled code */ } public final fun <IP, R, P1> ((IP) -> R).compose2(f: (P1) -> IP): (P1) -> R { /* compiled code */ }
public final fun <A> (A.(A) -> A).foo(): kotlin.Unit { /* compiled code */ } public final fun <A> (A.(A) -> A).foo(): kotlin.Unit { /* compiled code */ }
} }
@@ -21,9 +21,9 @@ class FunctionTypes {
public fun f2(f: Function2<Int, *, String>) { public fun f2(f: Function2<Int, *, String>) {
} }
public fun f3(f: @ExtensionFunctionType Function2<Int, Int, Unit>) { public fun f3(f: @Extension Function2<Int, Int, Unit>) {
} }
public fun f4(f: List<@ExtensionFunctionType Function1<*, *>>) { public fun f4(f: List<@Extension Function1<*, *>>) {
} }
} }
+3 -3
View File
@@ -19,7 +19,7 @@ abstract class Types {
abstract val starList: List<*> abstract val starList: List<*>
abstract val starFun: Function1<*, *> abstract val starFun: Function1<*, *>
abstract val extFun: @ExtensionFunctionType Function2<Int, Int, Unit> abstract val extFun: @Extension Function2<Int, Int, Unit>
abstract val listExtStarFun: List<@ExtensionFunctionType Function1<*, *>> abstract val listExtStarFun: List<@Extension Function1<*, *>>
abstract val funTypeWithStarAndNonStar: Function1<*, Int> abstract val funTypeWithStarAndNonStar: Function1<*, Int>
} }
+2 -2
View File
@@ -252,13 +252,13 @@ PsiJetFileStubImpl[package=test]
TYPE_ARGUMENT_LIST: TYPE_ARGUMENT_LIST:
TYPE_PROJECTION:[projectionKind=NONE] TYPE_PROJECTION:[projectionKind=NONE]
TYPE_REFERENCE: TYPE_REFERENCE:
ANNOTATION_ENTRY:[hasValueArguments=false, shortName=ExtensionFunctionType] ANNOTATION_ENTRY:[hasValueArguments=false, shortName=Extension]
CONSTRUCTOR_CALLEE: CONSTRUCTOR_CALLEE:
TYPE_REFERENCE: TYPE_REFERENCE:
USER_TYPE:[isAbsoluteInRootPackage=false] USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false] USER_TYPE:[isAbsoluteInRootPackage=false]
REFERENCE_EXPRESSION:[referencedName=kotlin] REFERENCE_EXPRESSION:[referencedName=kotlin]
REFERENCE_EXPRESSION:[referencedName=ExtensionFunctionType] REFERENCE_EXPRESSION:[referencedName=Extension]
USER_TYPE:[isAbsoluteInRootPackage=false] USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false] USER_TYPE:[isAbsoluteInRootPackage=false]
REFERENCE_EXPRESSION:[referencedName=kotlin] REFERENCE_EXPRESSION:[referencedName=kotlin]
+1 -1
View File
@@ -4,4 +4,4 @@ val c: <selection>() -> String</selection> = { "" }
val d: () -> kotlin.String = { "" } val d: () -> kotlin.String = { "" }
val e: () -> Unit = { } val e: () -> Unit = { }
val f: Any.() -> String = { "" } val f: Any.() -> String = { "" }
val g: @ExtensionFunctionType Function1<String, String> = { "" } val g: @Extension Function1<String, String> = { "" }
+2 -2
View File
@@ -5,6 +5,6 @@ val d: (n: Int) -> kotlin.String = { "" }
val e: (String) -> Int = { 0 } val e: (String) -> Int = { 0 }
val f: () -> Int = { 0 } val f: () -> Int = { 0 }
val g: Int.() -> String = { "" } val g: Int.() -> String = { "" }
val h: @ExtensionFunctionType Function2<Int, Int, String> = { "" } val h: @Extension Function2<Int, Int, String> = { "" }
val i: (m: Int) -> kotlin.String = { "" } val i: (m: Int) -> kotlin.String = { "" }
val j: @ExtensionFunctionType Function1<Int, String> = { "" } val j: @Extension Function1<Int, String> = { "" }
+1 -1
View File
@@ -10,4 +10,4 @@ Int.() -> String
(m: Int) -> kotlin.String (m: Int) -> kotlin.String
@ExtensionFunctionType Function1<Int, String> @Extension Function1<Int, String>
+2 -2
View File
@@ -6,6 +6,6 @@ val e: (String) -> Int = { 0 }
val f: () -> Int = { 0 } val f: () -> Int = { 0 }
val g: Any.(Int) -> String = { "" } val g: Any.(Int) -> String = { "" }
val h: Int.(Any) -> String = { "" } val h: Int.(Any) -> String = { "" }
val i: @ExtensionFunctionType Function3<Any, Any, Int, String> = { a, b -> "" } val i: @Extension Function3<Any, Any, Int, String> = { a, b -> "" }
val j: (t: Any, u: Int) -> kotlin.String = { a, b -> "" } val j: (t: Any, u: Int) -> kotlin.String = { a, b -> "" }
val k: @ExtensionFunctionType Function2<Any, Int, String> = { "" } val k: @Extension Function2<Any, Int, String> = { "" }
+1 -1
View File
@@ -10,4 +10,4 @@ Any.(Int) -> String
(t: Any, u: Int) -> kotlin.String (t: Any, u: Int) -> kotlin.String
@ExtensionFunctionType Function2<Any, Int, String> @Extension Function2<Any, Int, String>
+2 -2
View File
@@ -23,7 +23,7 @@ Kotlin lambdas are translated to subclasses of this abstract class, passing the
## Extension functions ## Extension functions
Extension function type `T.(P) -> R` is now just a shorthand for `@ExtensionFunctionType Function2<T, P, R>`. Extension function type `T.(P) -> R` is now just a shorthand for `@Extension Function2<T, P, R>`.
`kotlin.extension` is a **type annotation** defined in built-ins. `kotlin.extension` is a **type annotation** defined in built-ins.
So effectively functions and extension functions now have the same type, 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. 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. 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, 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 `@ExtensionFunctionType`). but still should invoke them in the format which you specified in their type (with or without `@Extension`).
With this we'll get rid of classes `ExtensionFunction0`, `ExtensionFunction1`, ... With this we'll get rid of classes `ExtensionFunction0`, `ExtensionFunction1`, ...
and the rest of this article will deal only with usual functions. and the rest of this article will deal only with usual functions.