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 Boyarpackage android.databinding.tool.expr; 176047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 186047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.CallbackWrapper; 196047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.processing.ErrorMessages; 206047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.reflection.ModelAnalyzer; 216047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.reflection.ModelClass; 226047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.util.Preconditions; 236047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.tool.writer.KCode; 246047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 256047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport java.util.Collections; 266047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport java.util.List; 276047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 286047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar/** 296047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * This expressions that are used to reference arguments in callbacks. 306047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * <p 316047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * While the callback is being parsed, they get whatever the variable user defined in the lambda. 326047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * When the code is being generated, they get simple enumarated names so that multiple callbacks 336047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * can be handled in the same method. 346047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar */ 356047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarpublic class CallbackArgExpr extends IdentifierExpr { 366047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 376047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar private int mArgIndex; 386047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 396047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar private String mName; 406047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 416047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar private ModelClass mClassFromCallback; 426047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 436047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar public CallbackArgExpr(int argIndex, String name) { 446047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar super(name); 456047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar mArgIndex = argIndex; 466047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar mName = name; 476047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 486047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 496047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Override 506047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar public boolean isDynamic() { 516047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return false; 526047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 536047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 546047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar public void setClassFromCallback(ModelClass modelClass) { 556047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar mClassFromCallback = modelClass; 566047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 576047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 586047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Override 596047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) { 606047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar Preconditions 616047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar .checkNotNull(mClassFromCallback, ErrorMessages.UNDEFINED_CALLBACK_ARGUMENT, mName); 626047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return mClassFromCallback; 636047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 646047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 656047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Override 666047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar protected List<Dependency> constructDependencies() { 676047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return Collections.emptyList(); 686047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 696047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 706047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Override 71bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount protected KCode generateCode() { 726047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return new KCode(CallbackWrapper.ARG_PREFIX + mArgIndex); 736047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 746047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 756047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Override 766047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar protected String computeUniqueKey() { 776047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return CallbackWrapper.ARG_PREFIX + mArgIndex; 786047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 796047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 806047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar @Override 816047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar public String getInvertibleError() { 826047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return "Callback arguments cannot be inverted"; 836047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 846047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar 856047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar public String getName() { 866047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar return mName; 876047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar } 88bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount 89bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount @Override 90bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount public Expr cloneToModel(ExprModel model) { 91bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount return new CallbackArgExpr(mArgIndex, mName); 92bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount } 936047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar} 94