CallbackArgExpr.java revision bb4a033fcd5cd20e5be46ef8ead442dc7db2454d
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