Deprecate inlineOption in favor of crossinline modifier
This commit is contained in:
+1
-1
@@ -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(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);
|
MAP.put(RECURSION_IN_INLINE, "Inline-function ''{1}'' can't be recursive", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES);
|
||||||
//Inline non Locals
|
//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(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(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);
|
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 TAILREC_KEYWORD = JetModifierKeywordToken.softKeywordModifier("tailrec");
|
||||||
JetModifierKeywordToken EXTERNAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("external");
|
JetModifierKeywordToken EXTERNAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("external");
|
||||||
JetModifierKeywordToken ANNOTATION_KEYWORD = JetModifierKeywordToken.softKeywordModifier("annotation");
|
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,
|
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,
|
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,
|
FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD,
|
||||||
LATE_INIT_KEYWORD,
|
LATE_INIT_KEYWORD,
|
||||||
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_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,
|
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,
|
PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD,
|
||||||
REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_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
|
// Please synchronize this array with org.jetbrains.kotlin.descriptors.annotations.ANNOTATION_MODIFIERS_FQ_NAMES
|
||||||
JetModifierKeywordToken[] ANNOTATION_MODIFIERS_KEYWORDS_ARRAY = new JetModifierKeywordToken[] {
|
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);
|
TokenSet ANNOTATION_MODIFIERS_KEYWORDS = TokenSet.create(ANNOTATION_MODIFIERS_KEYWORDS_ARRAY);
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ public object ModifierCheckerCore {
|
|||||||
NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER),
|
NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER),
|
||||||
TAILREC_KEYWORD to EnumSet.of(FUNCTION),
|
TAILREC_KEYWORD to EnumSet.of(FUNCTION),
|
||||||
EXTERNAL_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER),
|
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!
|
// NOTE: redundant targets must be possible!
|
||||||
|
|||||||
@@ -66,7 +66,8 @@ public class InlineUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasOnlyLocalReturn(@NotNull ValueParameterDescriptor descriptor) {
|
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) {
|
private static boolean hasInlineOption(@NotNull ValueParameterDescriptor descriptor, @NotNull InlineOption option) {
|
||||||
|
|||||||
+5
-1
@@ -1252,6 +1252,10 @@ public object Unit {
|
|||||||
/*primary*/ private constructor 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 {
|
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.MustBeDocumented() kotlin.annotation.annotation() public final class data : kotlin.Annotation {
|
||||||
/*primary*/ public constructor data()
|
/*primary*/ public constructor data()
|
||||||
}
|
}
|
||||||
@@ -1264,7 +1268,7 @@ kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, Annotation
|
|||||||
/*primary*/ public constructor inline()
|
/*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>*/)
|
/*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 val value: kotlin.Array<out kotlin.InlineOption>
|
||||||
public final fun <get-value>(): kotlin.Array<out kotlin.InlineOption>
|
public final fun <get-value>(): kotlin.Array<out kotlin.InlineOption>
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
||||||
import kotlin.InlineOption.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
|
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
|
||||||
val s = object {
|
val s = object {
|
||||||
|
|
||||||
val z = p()
|
val z = p()
|
||||||
@@ -21,4 +21,4 @@ inline fun <R> inlineFun(p: () -> R) {
|
|||||||
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineFun(/*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
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
||||||
import kotlin.InlineOption.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
|
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
|
||||||
val s = object {
|
val s = object {
|
||||||
|
|
||||||
val z = p();
|
val z = p();
|
||||||
@@ -46,4 +46,4 @@ inline fun <R> inlineFun(p: () -> R) {
|
|||||||
|
|
||||||
inline fun <R> doCall(p: () -> R) {
|
inline fun <R> doCall(p: () -> R) {
|
||||||
p()
|
p()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,4 +2,4 @@ package
|
|||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> doCall(/*0*/ p: () -> R): kotlin.Unit
|
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> 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
|
||||||
|
|||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
import kotlin.InlineOption.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
inline fun <R> onlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
|
inline fun <R> onlyLocal(crossinline p: () -> R) {
|
||||||
inlineAll(p)
|
inlineAll(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <R> inlineAll(p: () -> R) {
|
inline fun <R> inlineAll(p: () -> R) {
|
||||||
p()
|
p()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineAll(/*0*/ p: () -> R): kotlin.Unit
|
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.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
inline fun <R> inlineFunWithAnnotation(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
|
inline fun <R> inlineFunWithAnnotation(crossinline p: () -> R) {
|
||||||
inlineFun {
|
inlineFun {
|
||||||
p()
|
p()
|
||||||
}
|
}
|
||||||
@@ -14,4 +14,4 @@ inline fun <R> inlineFun2(p: () -> R) {
|
|||||||
|
|
||||||
inline fun <R> inlineFun(p: () -> R) {
|
inline fun <R> inlineFun(p: () -> R) {
|
||||||
p()
|
p()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,4 +2,4 @@ package
|
|||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineFun(/*0*/ p: () -> R): kotlin.Unit
|
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> 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
|
||||||
|
|||||||
+2
-2
@@ -5,6 +5,6 @@ inline fun testSameCaptured(lambdaWithResultCaptured: () -> Unit) : String {
|
|||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <R> doWork(@inlineOptions(ONLY_LOCAL_RETURN) job: ()-> R) : R {
|
inline fun <R> doWork(crossinline job: ()-> R) : R {
|
||||||
return job()
|
return job()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package
|
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
|
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
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
||||||
import kotlin.InlineOption.*
|
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() {
|
<!NOT_YET_SUPPORTED_IN_INLINE!>fun a() {
|
||||||
val z = p()
|
val z = p()
|
||||||
}<!>
|
}<!>
|
||||||
@@ -13,4 +13,4 @@ inline fun <R> inlineFun(p: () -> R) {
|
|||||||
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
||||||
}<!>
|
}<!>
|
||||||
a()
|
a()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineFun(/*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
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
||||||
import kotlin.InlineOption.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
inline fun <R> inlineFunOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN)p: () -> R) {
|
inline fun <R> inlineFunOnlyLocal(crossinline p: () -> R) {
|
||||||
{
|
{
|
||||||
p()
|
p()
|
||||||
}()
|
}()
|
||||||
@@ -11,4 +11,4 @@ inline fun <R> inlineFun(p: () -> R) {
|
|||||||
{
|
{
|
||||||
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineFun(/*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
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
|
||||||
import kotlin.InlineOption.*
|
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 {
|
<!NOT_YET_SUPPORTED_IN_INLINE!>class A {
|
||||||
|
|
||||||
val z = p()
|
val z = p()
|
||||||
@@ -21,4 +21,4 @@ inline fun <R> inlineFun(p: () -> R) {
|
|||||||
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
<!NON_LOCAL_RETURN_NOT_ALLOWED!>p<!>()
|
||||||
}
|
}
|
||||||
}<!>
|
}<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineFun(/*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
|
||||||
|
|||||||
+2
-2
@@ -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()
|
p()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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> fun3ValueArgument(/*0*/ p: () -> R): kotlin.Unit
|
||||||
public fun </*0*/ R> fun4(/*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
|
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
|
||||||
|
|||||||
Vendored
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
import kotlin.InlineOption.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
class Z {
|
class Z {
|
||||||
inline fun <R> inlineFun(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
|
inline fun <R> inlineFun(crossinline p: () -> R) {
|
||||||
p()
|
p()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,4 +23,4 @@ fun <R> fun4(p: () -> R) {
|
|||||||
Z() inlineFun lambda@ {
|
Z() inlineFun lambda@ {
|
||||||
return@lambda p();
|
return@lambda p();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -8,6 +8,6 @@ public final class Z {
|
|||||||
public constructor 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
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
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import kotlin.InlineOption.*
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
inline fun <R> toOnlyLocal(@inlineOptions(ONLY_LOCAL_RETURN) p: () -> R) {
|
inline fun <R> toOnlyLocal(crossinline p: () -> R) {
|
||||||
p()
|
p()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
kotlin.inline() public fun </*0*/ R> inlineAll(/*0*/ p: () -> R): kotlin.Unit
|
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
|
||||||
|
|||||||
@@ -50,8 +50,17 @@ public annotation class inline
|
|||||||
@Target(AnnotationTarget.VALUE_PARAMETER)
|
@Target(AnnotationTarget.VALUE_PARAMETER)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
@MustBeDocumented
|
@MustBeDocumented
|
||||||
|
@Deprecated("Use 'crossinline' modifier instead of 'inlineOptions(InlineOption.ONLY_LOCAL_RETURN)'")
|
||||||
public annotation class inlineOptions(vararg val value: InlineOption)
|
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
|
* 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.
|
* passed as a parameter to an inline function.
|
||||||
|
|||||||
@@ -180,6 +180,7 @@ public class KotlinBuiltIns {
|
|||||||
public final FqName tailRecursiveDeprecated = fqName("tailRecursive");
|
public final FqName tailRecursiveDeprecated = fqName("tailRecursive");
|
||||||
public final FqName inline = fqName("inline");
|
public final FqName inline = fqName("inline");
|
||||||
public final FqName noinline = fqName("noinline");
|
public final FqName noinline = fqName("noinline");
|
||||||
|
public final FqName crossinline = fqName("crossinline");
|
||||||
public final FqName inlineOptions = fqName("inlineOptions");
|
public final FqName inlineOptions = fqName("inlineOptions");
|
||||||
public final FqName extension = fqName("Extension");
|
public final FqName extension = fqName("Extension");
|
||||||
public final FqName target = annotationName("Target");
|
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
|
// Please synchronize this set with JetTokens.ANNOTATION_MODIFIERS_KEYWORDS_ARRAY
|
||||||
public val ANNOTATION_MODIFIERS_FQ_NAMES: Set<FqName> =
|
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: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -45,5 +45,6 @@ class B {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
/*TODO*/
|
/*TODO*/
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -45,4 +45,5 @@ class A {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -45,5 +45,6 @@ var a : Int
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
/*TODO*/
|
/*TODO*/
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -43,4 +43,5 @@ public class Test {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -37,4 +37,5 @@ class TestClass {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -36,5 +36,6 @@ package Test
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
/*TODO*/
|
/*TODO*/
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -41,4 +41,5 @@ class Some {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -41,4 +41,5 @@ class Some {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -43,4 +43,5 @@ class Some {
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -35,5 +35,6 @@
|
|||||||
// EXIST: tailrec
|
// EXIST: tailrec
|
||||||
// EXIST: external
|
// EXIST: external
|
||||||
// EXIST: annotation
|
// EXIST: annotation
|
||||||
|
// EXIST: crossinline
|
||||||
/*TODO*/
|
/*TODO*/
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
Reference in New Issue
Block a user