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