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}