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