1 /*
2  * Copyright (C) 2017 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 androidx.lifecycle
18 
19 import com.google.auto.common.MoreElements
20 import javax.lang.model.element.Element
21 import javax.lang.model.element.ExecutableElement
22 import javax.lang.model.element.Modifier
23 import javax.lang.model.element.PackageElement
24 import javax.lang.model.element.TypeElement
25 import javax.lang.model.util.ElementFilter
26 
getPackagenull27 fun Element.getPackage(): PackageElement = MoreElements.getPackage(this)
28 
29 fun Element.getPackageQName() = getPackage().qualifiedName.toString()
30 
31 fun ExecutableElement.name() = simpleName.toString()
32 
33 fun ExecutableElement.isPackagePrivate() =
34     !modifiers.any { it == Modifier.PUBLIC || it == Modifier.PROTECTED || it == Modifier.PRIVATE }
35 
isProtectednull36 fun ExecutableElement.isProtected() = modifiers.contains(Modifier.PROTECTED)
37 
38 fun TypeElement.methods(): List<ExecutableElement> = ElementFilter.methodsIn(enclosedElements)
39 
40 private const val SYNTHETIC = "__synthetic_"
41 
42 fun syntheticName(method: ExecutableElement) = "$SYNTHETIC${method.simpleName}"
43 
44 fun isSyntheticMethod(method: ExecutableElement) = method.name().startsWith(SYNTHETIC)
45