MethodCallExpr.java revision 79fc7f3727815ab35bb1bb2e060bfb7db3176eed
1d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/*
2d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
4d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * you may not use this file except in compliance with the License.
6d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * You may obtain a copy of the License at
7d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
8d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
10d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * See the License for the specific language governing permissions and
14d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * limitations under the License.
15d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */
16d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
1743596c2b2997e40b709627419732100d78a62ff0Yigit Boyarpackage com.android.databinding.expr;
18d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
19d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport com.google.common.collect.Iterables;
20d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
2179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport com.android.databinding.reflection.ModelAnalyzer;
22e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mountimport com.android.databinding.reflection.Callable;
2379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport com.android.databinding.reflection.ModelClass;
24d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
25d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.ArrayList;
26d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.Arrays;
27d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.List;
28d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
29d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarpublic class MethodCallExpr extends Expr {
30d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    final String mName;
31d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
32e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount    Callable mGetter;
33d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
34d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    MethodCallExpr(Expr target, String name, List<Expr> args) {
35d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        super(Iterables.concat(Arrays.asList(target), args));
36d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mName = name;
37d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
38d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
39d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Override
4079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
41d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        if (mGetter == null) {
4279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount            List<ModelClass> args = new ArrayList<>();
437920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount            for (Expr expr : getArgs()) {
44d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar                args.add(expr.getResolvedType());
45d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            }
4679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount            mGetter = modelAnalyzer.findMethod(getTarget().getResolvedType(), mName, args);
47d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        }
48d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mGetter.resolvedType;
49d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
50d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
51d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Override
52d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    protected List<Dependency> constructDependencies() {
53dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        final List<Dependency> dependencies = constructDynamicChildrenDependencies();
54dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        for (Dependency dependency : dependencies) {
557920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount            if (dependency.getOther() == getTarget()) {
56dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar                dependency.setMandatory(true);
57dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar            }
58dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        }
59dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        return dependencies;
60d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
61d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
62d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Override
63d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    protected String computeUniqueKey() {
647920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount        return sUniqueKeyJoiner.join(getTarget().computeUniqueKey(), mName,
657920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount                super.computeUniqueKey());
66d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
67d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
68d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public Expr getTarget() {
697920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount        return getChildren().get(0);
70d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
71d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
72d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public String getName() {
73d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mName;
74d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
75d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
76d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public List<Expr> getArgs() {
777920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount        return getChildren().subList(1, getChildren().size());
78d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
79d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
80e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount    public Callable getGetter() {
81d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mGetter;
82d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
83d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar}
84