Deprecate inlineOption in favor of crossinline modifier

This commit is contained in:
Denis Zharkov
2015-09-09 12:35:19 +03:00
parent 9b8540543f
commit c449c0d080
41 changed files with 68 additions and 40 deletions
@@ -629,7 +629,7 @@ public class DefaultErrorMessages {
MAP.put(NULLABLE_INLINE_PARAMETER, "Inline-parameter ''{0}'' of ''{1}'' must not be nullable. Annotate the parameter with [noinline] or make not nullable", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES);
MAP.put(RECURSION_IN_INLINE, "Inline-function ''{1}'' can't be recursive", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES);
//Inline non Locals
MAP.put(NON_LOCAL_RETURN_NOT_ALLOWED, "Can''t inline ''{0}'' here: it may contain non-local returns. Annotate parameter declaration ''{0}'' with ''inlineOptions(ONLY_LOCAL_RETURN)''", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(NON_LOCAL_RETURN_NOT_ALLOWED, "Can''t inline ''{0}'' here: it may contain non-local returns. Add ''crossinline'' modifier to parameter declaration ''{0}''", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(INLINE_CALL_CYCLE, "The ''{0}'' invocation is a part of inline cycle", NAME);
MAP.put(NON_LOCAL_RETURN_IN_DISABLED_INLINE, "Non-local returns are not allowed with inlining disabled");
MAP.put(ACCESS_TO_PRIVATE_TOP_LEVEL_FROM_ANOTHER_FILE, "Access to private top-level declarations from another file will soon be forbidden: ''{0}'' is ''{1}'' in ''{2}''", NAME, TO_STRING, RENDER_FILE);
@@ -176,6 +176,7 @@ public interface JetTokens {
JetModifierKeywordToken TAILREC_KEYWORD = JetModifierKeywordToken.softKeywordModifier("tailrec");
JetModifierKeywordToken EXTERNAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("external");
JetModifierKeywordToken ANNOTATION_KEYWORD = JetModifierKeywordToken.softKeywordModifier("annotation");
JetModifierKeywordToken CROSSINLINE_KEYWORD = JetModifierKeywordToken.softKeywordModifier("crossinline");
TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD,
THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
@@ -194,7 +195,7 @@ public interface JetTokens {
FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD,
LATE_INIT_KEYWORD,
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD,
ANNOTATION_KEYWORD
ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD
);
/*
@@ -207,12 +208,12 @@ public interface JetTokens {
ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD,
PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD,
REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_KEYWORD,
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD
};
// Please synchronize this array with org.jetbrains.kotlin.descriptors.annotations.ANNOTATION_MODIFIERS_FQ_NAMES
JetModifierKeywordToken[] ANNOTATION_MODIFIERS_KEYWORDS_ARRAY = new JetModifierKeywordToken[] {
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD
};
TokenSet ANNOTATION_MODIFIERS_KEYWORDS = TokenSet.create(ANNOTATION_MODIFIERS_KEYWORDS_ARRAY);
@@ -63,7 +63,8 @@ public object ModifierCheckerCore {
NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER),
TAILREC_KEYWORD to EnumSet.of(FUNCTION),
EXTERNAL_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER),
ANNOTATION_KEYWORD to EnumSet.of(ANNOTATION_CLASS)
ANNOTATION_KEYWORD to EnumSet.of(ANNOTATION_CLASS),
CROSSINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER)
)
// NOTE: redundant targets must be possible!
@@ -66,7 +66,8 @@ public class InlineUtil {
}
public static boolean hasOnlyLocalReturn(@NotNull ValueParameterDescriptor descriptor) {
return hasInlineOption(descriptor, InlineOption.ONLY_LOCAL_RETURN);
return hasInlineOption(descriptor, InlineOption.ONLY_LOCAL_RETURN)
|| descriptor.getAnnotations().findAnnotation(KotlinBuiltIns.FQ_NAMES.crossinline) != null;
}
private static boolean hasInlineOption(@NotNull ValueParameterDescriptor descriptor, @NotNull InlineOption option) {
+5 -1
View File
@@ -1252,6 +1252,10 @@ public object Unit {
/*primary*/ private constructor Unit()
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) kotlin.annotation.MustBeDocumented() kotlin.annotation.annotation() public final class crossinline : kotlin.Annotation {
/*primary*/ public constructor crossinline()
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.MustBeDocumented() kotlin.annotation.annotation() public final class data : kotlin.Annotation {
/*primary*/ public constructor data()
}
@@ -1264,7 +1268,7 @@ kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, Annotation
/*primary*/ public constructor inline()
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) kotlin.annotation.MustBeDocumented() kotlin.annotation.annotation() public final class inlineOptions : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) kotlin.annotation.MustBeDocumented() kotlin.Deprecated(value = "Use 'crossinline' modifier instead of 'inlineOptions(InlineOption.ONLY_LOCAL_RETURN)'") kotlin.annotation.annotation() public final class inlineOptions : kotlin.Annotation {
/*primary*/ public constructor inlineOptions(/*0*/ vararg value: kotlin.InlineOption /*kotlin.Array<out kotlin.InlineOption>*/)
public final val value: kotlin.Array<out kotlin.InlineOption>
public final fun <get-value>(): kotlin.Array<out kotlin.InlineOption>
@@ -1,7 +1,7 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
import kotlin.InlineOption.*
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
val s = object {
val z = p()
@@ -21,4 +21,4 @@ inline fun <R> inlineFun(p: () -> R) {
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
}
}
}
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -1,7 +1,7 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
import kotlin.InlineOption.*
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
val s = object {
val z = p();
@@ -46,4 +46,4 @@ inline fun <R> inlineFun(p: () -> R) {
inline fun <R> doCall(p: () -> R) {
p()
}
}
@@ -2,4 +2,4 @@ package
kotlin.inline() public fun </*0*/ R> doCall(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -1,9 +1,9 @@
import kotlin.InlineOption.*
inline fun <R> onlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> onlyLocal(crossinline p: () -> R) {
inlineAll(p)
}
inline fun <R> inlineAll(p: () -> R) {
p()
}
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> inlineAll(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> onlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> onlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -1,6 +1,6 @@
import kotlin.InlineOption.*
inline fun <R> inlineFunWithAnnotation(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
inline fun <R> inlineFunWithAnnotation(crossinline p: () -> R) {
inlineFun {
p()
}
@@ -14,4 +14,4 @@ inline fun <R> inlineFun2(p: () -> R) {
inline fun <R> inlineFun(p: () -> R) {
p()
}
}
@@ -2,4 +2,4 @@ package
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFun2(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunWithAnnotation(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunWithAnnotation(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -5,6 +5,6 @@ inline fun testSameCaptured(lambdaWithResultCaptured: () -> Unit) : String {
return "OK"
}
inline fun <R> doWork(@inlineOptions(ONLY_LOCAL_RETURN) job: ()-> R) : R {
inline fun <R> doWork(crossinline job: ()-> R) : R {
return job()
}
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> doWork(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) job: () -> R): R
kotlin.inline() public fun </*0*/ R> doWork(/*0*/ kotlin.crossinline() job: () -> R): R
kotlin.inline() public fun testSameCaptured(/*0*/ lambdaWithResultCaptured: () -> kotlin.Unit): kotlin.String
@@ -1,7 +1,7 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
import kotlin.InlineOption.*
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
<!NOT_YET_SUPPORTED_IN_INLINE!>fun a() {
val z = p()
}<!>
@@ -13,4 +13,4 @@ inline fun <R> inlineFun(p: () -> R) {
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
}<!>
a()
}
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -1,7 +1,7 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
import kotlin.InlineOption.*
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
{
p()
}()
@@ -11,4 +11,4 @@ inline fun <R> inlineFun(p: () -> R) {
{
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
}()
}
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -1,7 +1,7 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
import kotlin.InlineOption.*
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
<!NOT_YET_SUPPORTED_IN_INLINE!>class A {
val z = p()
@@ -21,4 +21,4 @@ inline fun <R> inlineFun(p: () -> R) {
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
}
}<!>
}
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFunOnlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -39,6 +39,6 @@ fun <R> fun4ValueArgument(p: () -> R) {
}
inline fun <R> inlineFun(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
inline fun <R> inlineFun(crossinline p: () -> R) {
p()
}
}
@@ -6,4 +6,4 @@ public fun </*0*/ R> fun3(/*0*/ p: () -> R): kotlin.Unit
public fun </*0*/ R> fun3ValueArgument(/*0*/ p: () -> R): kotlin.Unit
public fun </*0*/ R> fun4(/*0*/ p: () -> R): kotlin.Unit
public fun </*0*/ R> fun4ValueArgument(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
@@ -2,7 +2,7 @@
import kotlin.InlineOption.*
class Z {
inline fun <R> inlineFun(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
inline fun <R> inlineFun(crossinline p: () -> R) {
p()
}
}
@@ -23,4 +23,4 @@ fun <R> fun4(p: () -> R) {
Z() inlineFun lambda@ {
return@lambda p();
}
}
}
@@ -8,6 +8,6 @@ public final class Z {
public constructor Z()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
kotlin.inline() public final fun </*0*/ R> inlineFun(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public final fun </*0*/ R> inlineFun(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,6 +1,6 @@
import kotlin.InlineOption.*
inline fun <R> toOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
inline fun <R> toOnlyLocal(crossinline p: () -> R) {
p()
}
@@ -1,4 +1,4 @@
package
kotlin.inline() public fun </*0*/ R> inlineAll(/*0*/ p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> toOnlyLocal(/*0*/ kotlin.inlineOptions(value = {InlineOption.ONLY_LOCAL_RETURN}) p: () -> R): kotlin.Unit
kotlin.inline() public fun </*0*/ R> toOnlyLocal(/*0*/ kotlin.crossinline() p: () -> R): kotlin.Unit
+9
View File
@@ -50,8 +50,17 @@ public annotation class inline
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Deprecated("Use 'crossinline' modifier instead of 'inlineOptions(InlineOption.ONLY_LOCAL_RETURN)'")
public annotation class inlineOptions(vararg val value: InlineOption)
/**
* Forbids use of non-local control flow statements within lambdas passed as arguments for this parameter.
*/
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
public annotation class crossinline
/**
* Specifies the control flow statements which are allowed to be used for non-local control flow transfer in a lambda
* passed as a parameter to an inline function.
@@ -180,6 +180,7 @@ public class KotlinBuiltIns {
public final FqName tailRecursiveDeprecated = fqName("tailRecursive");
public final FqName inline = fqName("inline");
public final FqName noinline = fqName("noinline");
public final FqName crossinline = fqName("crossinline");
public final FqName inlineOptions = fqName("inlineOptions");
public final FqName extension = fqName("Extension");
public final FqName target = annotationName("Target");
@@ -20,4 +20,4 @@ import org.jetbrains.kotlin.name.FqName
// Please synchronize this set with JetTokens.ANNOTATION_MODIFIERS_KEYWORDS_ARRAY
public val ANNOTATION_MODIFIERS_FQ_NAMES: Set<FqName> =
arrayOf("data", "inline", "noinline", "tailrec", "external", "annotation.annotation").map { FqName("kotlin.$it") }.toSet()
arrayOf("data", "inline", "noinline", "tailrec", "external", "annotation.annotation", "crossinline").map { FqName("kotlin.$it") }.toSet()
@@ -42,4 +42,5 @@ class MouseMovedEventArgs
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
@@ -45,5 +45,6 @@ class B {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
/*TODO*/
// NOTHING_ELSE
+1
View File
@@ -45,4 +45,5 @@ class A {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
@@ -45,5 +45,6 @@ var a : Int
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
/*TODO*/
// NOTHING_ELSE
@@ -43,4 +43,5 @@ public class Test {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
@@ -37,4 +37,5 @@ class TestClass {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
@@ -36,5 +36,6 @@ package Test
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
/*TODO*/
// NOTHING_ELSE
@@ -41,4 +41,5 @@ class Some {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
@@ -41,4 +41,5 @@ class Some {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
@@ -43,4 +43,5 @@ class Some {
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
// NOTHING_ELSE
+1
View File
@@ -35,5 +35,6 @@
// EXIST: tailrec
// EXIST: external
// EXIST: annotation
// EXIST: crossinline
/*TODO*/
// NOTHING_ELSE