16047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar/* 26047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * Copyright (C) 2016 The Android Open Source Project 36047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * 46047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 56047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * you may not use this file except in compliance with the License. 66047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * You may obtain a copy of the License at 76047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * 86047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 96047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * 106047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * Unless required by applicable law or agreed to in writing, software 116047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 126047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * See the License for the specific language governing permissions and 146047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * limitations under the License. 156047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar */ 166047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 176047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarpackage android.databinding.tool.writer 186047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 196047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.CallbackWrapper 206047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 216047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarfun CallbackWrapper.allArgsWithTypes() = 226047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar "int ${CallbackWrapper.SOURCE_ID} ${method.parameterTypes.withIndex().map { ", ${it.value.toJavaCode()} ${CallbackWrapper.ARG_PREFIX}${it.index}" }.joinToString("")}" 236047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 246047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarfun CallbackWrapper.argsWithTypes() = 256047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar method.parameterTypes.withIndex().map { "${it.value.toJavaCode()} ${CallbackWrapper.ARG_PREFIX}${it.index}" }.joinToString(", ") 266047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 276047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarfun CallbackWrapper.args() = 286047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar method.parameterTypes.withIndex().map { "${CallbackWrapper.ARG_PREFIX}${it.index}" }.joinToString(", ") 296047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 306047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarfun CallbackWrapper.allArgs() = 316047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar "mSourceId ${method.parameterTypes.withIndex().map { ", ${CallbackWrapper.ARG_PREFIX}${it.index}" }.joinToString("")}" 326047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 336047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar/** 346047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * For any listener type we see, we create a class that can wrap around it. This wrapper has an 356047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * interface which is implemented by the ViewDataBinding. 366047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar */ 376047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarpublic class CallbackWrapperWriter(val wrapper: CallbackWrapper) { 386047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 396047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar public fun write() = kcode("") { 406047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar with(wrapper) { 416047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Suppress("RemoveCurlyBracesFromTemplate") 426047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar app("package ${`package`};") 436047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar val extendsImplements = if (klass.isInterface) { 446047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar "implements" 456047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } else { 466047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar "extends" 476047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 486047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar block("public final class $className $extendsImplements ${klass.canonicalName}") { 496047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar // declare the actual listener interface 506047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("final $listenerInterfaceName mListener;") 516047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("final int mSourceId;") 526047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar block("public $className($listenerInterfaceName listener, int sourceId)") { 536047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("mListener = listener;") 546047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("mSourceId = sourceId;") 556047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 566047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("") 576047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("@Override") 586047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar block("public ${method.returnType.canonicalName} ${method.name}(${wrapper.argsWithTypes()})") { 596047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar val evaluate = "mListener.$listenerMethodName(${wrapper.allArgs()});" 606047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar if (method.returnType.isVoid) { 616047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("$evaluate") 626047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } else { 636047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("return $evaluate") 646047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 656047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 666047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("") 676047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar block("public interface $listenerInterfaceName") { 686047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar nl("${method.returnType} $listenerMethodName(${wrapper.allArgsWithTypes()});") 696047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 706047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 716047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 726047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar }.generate() 736047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar}