1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.databinding.tool.expr; 18 19 import android.databinding.tool.reflection.ModelAnalyzer; 20 import android.databinding.tool.reflection.ModelClass; 21 22 import java.util.ArrayList; 23 import java.util.BitSet; 24 import java.util.List; 25 26 public class TernaryExpr extends Expr { 27 TernaryExpr(Expr pred, Expr ifTrue, Expr ifFalse) { 28 super(pred, ifTrue, ifFalse); 29 } 30 31 public Expr getPred() { 32 return getChildren().get(0); 33 } 34 35 public Expr getIfTrue() { 36 return getChildren().get(1); 37 } 38 39 public Expr getIfFalse() { 40 return getChildren().get(2); 41 } 42 43 @Override 44 protected String computeUniqueKey() { 45 return "?:" + super.computeUniqueKey(); 46 } 47 48 @Override 49 protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) { 50 return modelAnalyzer.findCommonParentOf(getIfTrue().getResolvedType(), 51 getIfFalse().getResolvedType()); 52 } 53 54 @Override 55 protected List<Dependency> constructDependencies() { 56 List<Dependency> deps = new ArrayList<>(); 57 Expr predExpr = getPred(); 58 if (predExpr.isDynamic()) { 59 final Dependency pred = new Dependency(this, predExpr); 60 pred.setMandatory(true); 61 deps.add(pred); 62 } 63 Expr ifTrueExpr = getIfTrue(); 64 if (ifTrueExpr.isDynamic()) { 65 deps.add(new Dependency(this, ifTrueExpr, predExpr, true)); 66 } 67 Expr ifFalseExpr = getIfFalse(); 68 if (ifFalseExpr.isDynamic()) { 69 deps.add(new Dependency(this, ifFalseExpr, predExpr, false)); 70 } 71 return deps; 72 } 73 74 @Override 75 protected BitSet getPredicateInvalidFlags() { 76 return getPred().getInvalidFlags(); 77 } 78 79 @Override 80 public boolean isConditional() { 81 return true; 82 } 83 } 84