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