MethodCallExpr.java revision fa9fe12980ef1103fabe33bf5ff0e2f53042a204
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 21fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mountimport com.android.databinding.reflection.Callable.Type; 2279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport com.android.databinding.reflection.ModelAnalyzer; 23e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mountimport com.android.databinding.reflection.Callable; 2479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport com.android.databinding.reflection.ModelClass; 25fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mountimport com.android.databinding.reflection.ModelMethod; 26fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mountimport com.android.databinding.util.L; 27d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 28d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.ArrayList; 29d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.Arrays; 30d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.List; 31d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 32d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarpublic class MethodCallExpr extends Expr { 33d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar final String mName; 34d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 35e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount Callable mGetter; 36d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 37d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar MethodCallExpr(Expr target, String name, List<Expr> args) { 38d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar super(Iterables.concat(Arrays.asList(target), args)); 39d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mName = name; 40d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 41d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 42d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar @Override 4318243f6f1b7527272ef4feccdf4327d80d9f2241George Mount public void updateExpr(ModelAnalyzer modelAnalyzer) { 4418243f6f1b7527272ef4feccdf4327d80d9f2241George Mount resolveType(modelAnalyzer); 4518243f6f1b7527272ef4feccdf4327d80d9f2241George Mount super.updateExpr(modelAnalyzer); 4618243f6f1b7527272ef4feccdf4327d80d9f2241George Mount } 4718243f6f1b7527272ef4feccdf4327d80d9f2241George Mount 4818243f6f1b7527272ef4feccdf4327d80d9f2241George Mount @Override 4979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) { 50d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (mGetter == null) { 51895b618d9c6e3deb56465d0759cda57f50c46214Yigit Boyar List<ModelClass> args = new ArrayList<ModelClass>(); 527920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount for (Expr expr : getArgs()) { 53d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar args.add(expr.getResolvedType()); 54d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5518243f6f1b7527272ef4feccdf4327d80d9f2241George Mount 5618243f6f1b7527272ef4feccdf4327d80d9f2241George Mount Expr target = getTarget(); 57a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount boolean isStatic = target instanceof StaticIdentifierExpr; 58fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount ModelMethod method = target.getResolvedType().getMethod(mName, args, isStatic); 59fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount if (method == null) { 60fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount String message = "cannot find method '" + mName + "' in class " + 61fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount target.getResolvedType().toJavaCode(); 62fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount IllegalArgumentException e = new IllegalArgumentException(message); 63fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount L.e(e, "cannot find method %s in class %s", mName, 64fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount target.getResolvedType().toJavaCode()); 65fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount throw e; 66fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount } 67fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount mGetter = new Callable(Type.METHOD, method.getName(), method.getReturnType(args), true, 68fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount false); 69d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 70d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return mGetter.resolvedType; 71d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 72d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 73d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar @Override 74d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar protected List<Dependency> constructDependencies() { 75dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar final List<Dependency> dependencies = constructDynamicChildrenDependencies(); 76dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar for (Dependency dependency : dependencies) { 777920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount if (dependency.getOther() == getTarget()) { 78dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar dependency.setMandatory(true); 79dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar } 80dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar } 81dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar return dependencies; 82d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 83d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 84d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar @Override 85d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar protected String computeUniqueKey() { 867920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount return sUniqueKeyJoiner.join(getTarget().computeUniqueKey(), mName, 877920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount super.computeUniqueKey()); 88d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 89d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 90d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar public Expr getTarget() { 917920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount return getChildren().get(0); 92d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 93d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 94d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar public String getName() { 95d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return mName; 96d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 97d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 98d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar public List<Expr> getArgs() { 997920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount return getChildren().subList(1, getChildren().size()); 100d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 101d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 102e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount public Callable getGetter() { 103d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return mGetter; 104d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 105d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 106