1e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar/*
2e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * Copyright (C) 2015 The Android Open Source Project
3e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar *
4e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * you may not use this file except in compliance with the License.
6e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * You may obtain a copy of the License at
7e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar *
8e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar *
10e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * Unless required by applicable law or agreed to in writing, software
11e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * See the License for the specific language governing permissions and
14e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * limitations under the License.
15e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar */
16e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
17e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyarpackage android.databinding.tool.expr;
18e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
19e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyarimport android.databinding.tool.reflection.ModelAnalyzer;
20e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyarimport android.databinding.tool.reflection.ModelClass;
21e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mountimport android.databinding.tool.writer.KCode;
22e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
23e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyarimport java.util.List;
24e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
25e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar/**
26e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * This is a special expression that is created when we have an adapter that has multiple
27e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * parameters.
28e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * <p>
29e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * When it is detected, we create a new binding with this argument list expression and merge N
30e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar * bindings into a new one so that rest of the code generation logic works as expected.
31e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar */
32e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyarpublic class ArgListExpr extends Expr {
33e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    private int mId;
34e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    public ArgListExpr(int id, Iterable<Expr> children) {
35e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar        super(children);
36e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar        mId = id;
37e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    }
38e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
39e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    @Override
40e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    protected String computeUniqueKey() {
41e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar        return "ArgList[" + mId + "]" + super.computeUniqueKey();
42e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    }
43e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
44e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    @Override
45d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    protected KCode generateCode(boolean expand) {
46e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount        throw new IllegalStateException("should never try to convert an argument expressions"
47e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount                + " into code");
48e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount    }
49e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount
50e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount    @Override
51e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
52e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar        return modelAnalyzer.findClass(Void.class);
53e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    }
54e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
55e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    @Override
56e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    protected List<Dependency> constructDependencies() {
57e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar        return super.constructDynamicChildrenDependencies();
58e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    }
59e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar
60e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    @Override
61e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    public boolean canBeEvaluatedToAVariable() {
62e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar        return false;
63e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar    }
64d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount
65d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    @Override
66d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    public String getInvertibleError() {
67d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount        return "Merged bindings are not invertible.";
68d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    }
69e9b33bac04bb1ce1444d7f1744fcec1ecd3a57daYigit Boyar}
70