1 /* 2 * Copyright 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package sample.optin 18 19 import androidx.annotation.OptIn 20 21 @Suppress("unused", "MemberVisibilityCanBePrivate") 22 class UseJavaExperimentalFromKt { 23 24 /** Unsafe call into a field on an experimental class. */ unsafeExperimentalClassFieldnull25 fun unsafeExperimentalClassField(): Int { 26 val experimentalObject = AnnotatedJavaClass() 27 return experimentalObject.field 28 } 29 30 /** Unsafe call into a method on an experimental class. */ unsafeExperimentalClassMethodnull31 fun unsafeExperimentalClassMethod(): Int { 32 val experimentalObject = AnnotatedJavaClass() 33 return experimentalObject.method() 34 } 35 36 /** Unsafe call into a static field on an experimental class. */ unsafeExperimentalClassStaticFieldnull37 fun unsafeExperimentalClassStaticField(): Int { 38 return AnnotatedJavaClass.FIELD_STATIC 39 } 40 41 /** Unsafe call into a static method on an experimental class. */ unsafeExperimentalClassStaticMethodnull42 fun unsafeExperimentalClassStaticMethod(): Int { 43 return AnnotatedJavaClass.methodStatic() 44 } 45 46 /** Safe call due to propagation of experimental annotation. */ 47 @ExperimentalJavaAnnotation safePropagateMarkernull48 fun safePropagateMarker(): Int { 49 val experimentalObject = AnnotatedJavaClass() 50 return experimentalObject.method() 51 } 52 53 /** Safe call due to opting in to experimental annotation. */ 54 @OptIn(ExperimentalJavaAnnotation::class) safeOptInMarkernull55 fun safeOptInMarker(): Int { 56 val experimentalObject = AnnotatedJavaClass() 57 return experimentalObject.method() 58 } 59 60 /** Unsafe call into an experimental field on a stable class. */ unsafeExperimentalFieldnull61 fun unsafeExperimentalField(): Int { 62 val stableObject = AnnotatedJavaMembers() 63 return stableObject.field 64 } 65 66 /** Unsafe call into an experimental method on a stable class. */ unsafeExperimentalMethodnull67 fun unsafeExperimentalMethod(): Int { 68 val stableObject = AnnotatedJavaMembers() 69 return stableObject.method() 70 } 71 72 /** Unsafe call into an experimental static field on a stable class. */ unsafeExperimentalStaticFieldnull73 fun unsafeExperimentalStaticField(): Int { 74 return AnnotatedJavaMembers.FIELD_STATIC 75 } 76 77 /** Unsafe call into an experimental static method on a stable class. */ unsafeExperimentalStaticMethodnull78 fun unsafeExperimentalStaticMethod(): Int { 79 return AnnotatedJavaMembers.methodStatic() 80 } 81 82 /** Unsafe call into multiple experimental classes. */ 83 @ExperimentalJavaAnnotation unsafeMultipleExperimentalClassesnull84 fun unsafeMultipleExperimentalClasses(): Int { 85 val experimentalObject = AnnotatedJavaClass() 86 return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC 87 } 88 89 /** Safe call due to propagation of both annotations. */ 90 @ExperimentalJavaAnnotation 91 @ExperimentalJavaAnnotation2 safePropagateMultipleMarkersnull92 fun safePropagateMultipleMarkers(): Int { 93 val experimentalObject = AnnotatedJavaClass() 94 return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC 95 } 96 97 /** Safe call due to opt-in of one annotation and propagation of another. */ 98 @OptIn(ExperimentalJavaAnnotation::class) 99 @ExperimentalJavaAnnotation2 safePropagateAndOptInMarkersnull100 fun safePropagateAndOptInMarkers(): Int { 101 val experimentalObject = AnnotatedJavaClass() 102 return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC 103 } 104 105 /** Safe call due to opt-in of both annotations. */ 106 @OptIn(ExperimentalJavaAnnotation::class, ExperimentalJavaAnnotation2::class) safeOptInMultipleMarkersnull107 fun safeOptInMultipleMarkers(): Int { 108 val experimentalObject = AnnotatedJavaClass() 109 return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC 110 } 111 112 /** Unsafe references to experimental properties. */ unsafePropertyUsagenull113 fun unsafePropertyUsage(): Int { 114 AnnotatedJavaMembers().field = -1 115 val value = AnnotatedJavaMembers().field 116 AnnotatedJavaMembers().fieldWithSetMarker = -1 117 val value2 = AnnotatedJavaMembers().fieldWithSetMarker // safe 118 return value + value2 119 } 120 } 121