1958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar/*
2958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * Copyright (C) 2016 The Android Open Source Project
3958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar *
4958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * you may not use this file except in compliance with the License.
6958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * You may obtain a copy of the License at
7958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar *
8958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar *
10958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * Unless required by applicable law or agreed to in writing, software
11958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * See the License for the specific language governing permissions and
14958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * limitations under the License.
15958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar */
16bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.processor
17958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar
18bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.vo.Entity
19bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.vo.ShortcutQueryParameter
20958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport com.google.auto.common.MoreElements
21958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport com.google.auto.common.MoreTypes
22958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport javax.lang.model.element.AnnotationMirror
23958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport javax.lang.model.element.ExecutableElement
24958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport javax.lang.model.type.DeclaredType
25958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport javax.lang.model.type.TypeMirror
26958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyarimport kotlin.reflect.KClass
27958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar
28958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar/**
29958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar * Common functionality for shortcut method processors
30958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar */
316f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikasclass ShortcutMethodProcessor(baseContext: Context,
32958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar                              val containing: DeclaredType,
33aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                              val executableElement: ExecutableElement) {
34aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar    val context = baseContext.fork(executableElement)
35958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar    private val asMember = context.processingEnv.typeUtils.asMemberOf(containing, executableElement)
36958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar    private val executableType = MoreTypes.asExecutable(asMember)
37958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar
386f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikas    fun extractAnnotation(klass: KClass<out Annotation>,
396f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikas                          errorMsg: String): AnnotationMirror? {
40958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar        val annotation = MoreElements.getAnnotationMirror(executableElement,
41958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar                klass.java).orNull()
42958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar        context.checker.check(annotation != null, executableElement, errorMsg)
43958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar        return annotation
44958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar    }
45958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar
466f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikas    fun extractReturnType(): TypeMirror {
47958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar        return executableType.returnType
48958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar    }
49958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar
506f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikas    fun extractParams(
516f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikas            missingParamError: String
526f1f5567abe765d30fda9c8fedce5617ecdeda9cAurimas Liutikas    ): Pair<Map<String, Entity>, List<ShortcutQueryParameter>> {
53958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar        val params = executableElement.parameters
54aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                .map { ShortcutParameterProcessor(
55aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                        baseContext = context,
56aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                        containing = containing,
57aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                        element = it).process() }
58958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar        context.checker.check(params.isNotEmpty(), executableElement, missingParamError)
5986b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki        val entities = params
6086b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki                .filter { it.entityType != null }
6186b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki                .associateBy({ it.name }, {
6286b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki                    EntityProcessor(
6386b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki                            baseContext = context,
6486b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki                            element = MoreTypes.asTypeElement(it.entityType)).process()
6586b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki                })
6686b3f8d9bd637749668174e0736fe9fbecbcfb09Yuichi Araki        return Pair(entities, params)
67958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar    }
68958df7dd95c2cecf93cacef6998a4d7e8d39b7efYigit Boyar}
69