LayoutBinderWriter.kt revision 5bf3700759ff21696becadd4e6fcfe2c0db6cb83
1d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/* 2d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 3d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 4d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * you may not use this file except in compliance with the License. 5d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * You may obtain a copy of the License at 6d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 7d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Unless required by applicable law or agreed to in writing, software 8d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 9d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * See the License for the specific language governing permissions and 11d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * limitations under the License. 12d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */ 13d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 1443596c2b2997e40b709627419732100d78a62ff0Yigit Boyarpackage com.android.databinding.writer 15d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 1643596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.LayoutBinder 1743596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.Expr 1843596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ClassAnalyzer 19d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport kotlin.properties.Delegates 20d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport com.android.databinding.ext.joinToCamelCaseAsVar 2143596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.BindingTarget 2243596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.IdentifierExpr 23d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport com.android.databinding.util.Log 24d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.BitSet 25d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.HashSet 2643596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.util.L 27d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport org.apache.commons.lang3.NotImplementedException 2843596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.ExprModel 2943596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.writer.FlagSet 30d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.Arrays 31d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.lang 3243596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.TernaryExpr 3343596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ext.androidId 3443596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.FieldAccessExpr 3543596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.ComparisonExpr 3643596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.GroupExpr 3743596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.MathExpr 3843596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.MethodCallExpr 3943596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.StaticIdentifierExpr 4043596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.SymbolExpr 4143596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ext.androidId 4243596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ext.lazy 4343596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ext.br 4443596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ext.toJavaCode 4543596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.ext.isObservable 46c752a5f795baf6df435ef60881316cb748df407cGeorge Mountimport com.android.databinding.expr.ResourceExpr 475cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mountimport com.android.databinding.expr.BracketExpr 4843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar 4943596c2b2997e40b709627419732100d78a62ff0Yigit Boyarfun Expr.isObservable() = com.android.databinding.ClassAnalyzer.getInstance().isObservable(this.getResolvedType()) 50d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 51d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun String.stripNonJava() = this.split("[^a-zA-Z0-9]").map{ it.trim() }.joinToCamelCaseAsVar() 52d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 53d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarclass ExprModelExt { 54d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val usedFieldNames = hashSetOf<String>() 55d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val localizedFlags = arrayListOf<FlagSet>() 56d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 57d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun localizeFlag(set : FlagSet, name:String) : FlagSet { 58d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar localizedFlags.add(set) 59d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val result = getUniqueFieldName(name) 60d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar set.setLocalName(result) 61d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return set 62d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 63d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 64d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun getUniqueFieldName(base : String) : String { 65d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar var candidate = base 66d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar var i = 0 67d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar while (usedFieldNames.contains(candidate)) { 68d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar i ++ 69d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar candidate = base + i 70d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 71d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar usedFieldNames.add(candidate) 72d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return candidate 73d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 74d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 75d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 76d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval ExprModel.ext by Delegates.lazy { (target : ExprModel) -> 77d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar ExprModelExt() 78d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 79d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 80d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun ExprModel.getUniqueFieldName(base : String) : String = ext.getUniqueFieldName(base) 81d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 82d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun ExprModel.localizeFlag(set : FlagSet, base : String) : FlagSet = ext.localizeFlag(set, base) 83d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 84d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval BindingTarget.readableUniqueName by Delegates.lazy {(target: BindingTarget) -> 8543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val stripped = target.getId().androidId().stripNonJava() 86d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar target.getModel().ext.getUniqueFieldName(stripped) 87d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 887551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar 89d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval BindingTarget.fieldName by Delegates.lazy { (target : BindingTarget) -> 90d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "m${target.readableUniqueName.capitalize()}" 91d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 92d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 93d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval BindingTarget.getterName by Delegates.lazy { (target : BindingTarget) -> 94d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "get${target.readableUniqueName.capitalize()}" 95d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 96d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 97d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval BindingTarget.androidId by Delegates.lazy { (target : BindingTarget) -> 9843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar "R.id.${target.getId().androidId()}" 99d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 100d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 101d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.readableUniqueName by Delegates.lazy { (expr : Expr) -> 10243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Log.d { "readableUniqueName for ${expr.getUniqueKey()}" } 103d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val stripped = "${expr.getUniqueKey().stripNonJava()}" 104d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().ext.getUniqueFieldName(stripped) 105d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 106d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 107d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.fieldName by Delegates.lazy { (expr : Expr) -> 108d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "m${expr.readableUniqueName.capitalize()}" 109d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 110d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 111d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.hasFlag by Delegates.lazy { (expr : Expr) -> 112d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getId() < expr.getModel().getInvalidateableFieldLimit() 113d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 114d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 115d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.localName by Delegates.lazy { (expr : Expr) -> 116d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if(expr.isVariable()) expr.fieldName else "${expr.readableUniqueName}" 117d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 118d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 119d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.setterName by Delegates.lazy { (expr : Expr) -> 120d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "set${expr.readableUniqueName.capitalize()}" 121d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 122d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 123d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.onChangeName by Delegates.lazy { (expr : Expr) -> 124d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "onChange${expr.readableUniqueName.capitalize()}" 125d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 126d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 127d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.getterName by Delegates.lazy { (expr : Expr) -> 128d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "get${expr.readableUniqueName.capitalize()}" 129d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 130d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 131d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.staticFieldName by Delegates.lazy { (expr : Expr) -> 132d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "s${expr.readableUniqueName.capitalize()}" 133d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 134d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 135d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.dirtyFlagName by Delegates.lazy { (expr : Expr) -> 136d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlag${expr.readableUniqueName.capitalize()}" 137d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 138d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 139d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.shouldReadFlagName by Delegates.lazy { (expr : Expr) -> 140d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlagRead${expr.readableUniqueName.capitalize()}" 141d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 142d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 143d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.invalidateFlagName by Delegates.lazy { (expr : Expr) -> 144d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlag${expr.readableUniqueName.capitalize()}Invalid" 145d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 146d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 147d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.conditionalFlagPrefix by Delegates.lazy { (expr : Expr) -> 148d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlag${expr.readableUniqueName.capitalize()}Is" 149d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 150d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 151d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 152d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.toCode(full : Boolean = false) : KCode { 153d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val it = this 154d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (isDynamic() && !full) { 155d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return kcode(localName) 156d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 157d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return when (it) { 158d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is ComparisonExpr -> kcode("") { 159d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getLeft().toCode()) 160d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(it.getOp()) 161d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getRight().toCode()) 162d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 163d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is FieldAccessExpr -> kcode("") { 164d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getParent().toCode()) 16543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar if (it.getGetter().type == com.android.databinding.ClassAnalyzer.Callable.Type.FIELD) { 166d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(".", it.getGetter().name) 167d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } else { 168d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(".", it.getGetter().name).app("()") 169d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 170d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 171d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is GroupExpr -> kcode("(").app("", it.getWrapped().toCode()).app(")") 172d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is StaticIdentifierExpr -> kcode(it.getResolvedType().toJavaCode()) 173d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is IdentifierExpr -> kcode(it.localName) 174d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is MathExpr -> kcode("") { 175d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getLeft().toCode()) 176d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(it.getOp()) 177d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getRight().toCode()) 178d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 179d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is MethodCallExpr -> kcode("") { 180d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getTarget().toCode()) 181d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(".", it.getGetter().name) 182d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("(") 183d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar var first = true 184d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar it.getArgs().forEach { 185d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar apps(if (first) "" else ",", it.toCode()) 186d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar first = false 187d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 188d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(")") 189d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 190d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is SymbolExpr -> kcode(it.getText()) // TODO 191d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is TernaryExpr -> kcode("") { 192d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getPred().toCode()) 193d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("?", it.getIfTrue().toCode()) 194d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(":", it.getIfFalse().toCode()) 195d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 196c752a5f795baf6df435ef60881316cb748df407cGeorge Mount is ResourceExpr -> kcode("") { 197c752a5f795baf6df435ef60881316cb748df407cGeorge Mount app("", it.toJava()) 198c752a5f795baf6df435ef60881316cb748df407cGeorge Mount } 1995cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount is BracketExpr -> kcode("") { 2005cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("", it.getTarget().toCode()) 2015cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount val bracketType = it.getAccessor(); 2025cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount when (bracketType) { 2035cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount BracketExpr.BracketAccessor.ARRAY -> { 2045cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("[", it.getArg().toCode()) 2055cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("]") 2065cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2075cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount BracketExpr.BracketAccessor.LIST -> { 2085cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(".get(") 2095cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount if (it.argCastsInteger()) { 2105cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("(Integer)") 2115cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2125cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("", it.getArg().toCode()) 2135cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(")") 2145cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2155cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount BracketExpr.BracketAccessor.MAP -> { 2165cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(".get(", it.getArg().toCode()) 2175cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(")") 2185cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2195cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2205cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 221d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar else -> kcode("//NOT IMPLEMENTED YET") 222d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 223d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 224d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 225d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 226d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.isVariable() = this is IdentifierExpr && this.isDynamic() 227d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 228d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.conditionalFlagName(output : Boolean, suffix : String) = "${dirtyFlagName}_${output}$suffix" 229d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 230d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 231d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.dirtyFlagSet by Delegates.lazy { (expr : Expr) -> 232d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(expr.getInvalidFlags(), expr.getModel().getFlagBucketCount()) 233d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().localizeFlag(fs, expr.dirtyFlagName) 234d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 235d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 236d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.invalidateFlagSet by Delegates.lazy { (expr : Expr) -> 237d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(expr.getId()) 238d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().localizeFlag(fs, expr.invalidateFlagName) 239d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 240d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 241d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.shouldReadFlagSet by Delegates.lazy { (expr : Expr) -> 242d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(expr.getShouldReadFlags(), expr.getModel().getFlagBucketCount()) 243d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().localizeFlag(fs, expr.shouldReadFlagName) 244d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 245d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 246d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarval Expr.conditionalFlags by Delegates.lazy { (expr : Expr) -> 247d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val model = expr.getModel() 248d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar arrayListOf(model.localizeFlag(FlagSet(expr.getRequirementFlagIndex(false)), 249d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "${expr.conditionalFlagPrefix}False"), 250d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.localizeFlag(FlagSet(expr.getRequirementFlagIndex(true)), 251d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "${expr.conditionalFlagPrefix}True")) 252d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 253d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 254d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.getRequirementFlagSet(expected : Boolean) : FlagSet = conditionalFlags[if(expected) 1 else 0] 255d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 256d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.notEmpty(cb : (suffix : String, value : Long) -> Unit) { 257d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar buckets.withIndex().forEach { 258d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (it.value != 0L) { 259d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar cb(getWordSuffix(it.index), buckets[it.index]) 260d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 261d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 262d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 263d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 264d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.getBitSuffix(bitIndex : Int) : String { 265d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val word = bitIndex / FlagSet.sBucketSize 266d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return getWordSuffix(word) 267d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 268d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 269d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.getWordSuffix(wordIndex : Int) : String { 270d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return if(wordIndex == 0) "" else "_${wordIndex}" 271d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 272d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 273d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.localValue(bucketIndex : Int) = 274d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (getLocalName() == null) buckets[bucketIndex] 275d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar else "${getLocalName()}${getWordSuffix(bucketIndex)}" 276d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 277d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.or(other : FlagSet, cb : (suffix : String) -> Unit) { 278d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val min = Math.min(buckets.size(), other.buckets.size()) 279d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in 0..(min - 1)) { 280d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // if these two can match by any chance, call the callback 281d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (intersect(other, i)) { 282d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar cb(getWordSuffix(i)) 283d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 284d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 285d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 286d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 287d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun <T> FlagSet.mapOr(other : FlagSet, cb : (suffix : String, index : Int) -> T) : List<T> { 288d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val min = Math.min(buckets.size(), other.buckets.size()) 289d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val result = arrayListOf<T>() 290d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in 0..(min - 1)) { 291d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // if these two can match by any chance, call the callback 292d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (intersect(other, i)) { 293d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar result.add(cb(getWordSuffix(i), i)) 294d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 295d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 296d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return result 297d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 298d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 29943596c2b2997e40b709627419732100d78a62ff0Yigit Boyarclass LayoutBinderWriter(val layoutBinder : LayoutBinder) { 300d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val model = layoutBinder.getModel() 30143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val mDirtyFlags by Delegates.lazy { 30243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val fs = FlagSet(BitSet(), model.getFlagBucketCount()); 30343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Arrays.fill(fs.buckets, -1) 30443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar fs.setDynamic(true) 30543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar model.localizeFlag(fs, "mDirtyFlags") 30643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar fs 307d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 308d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 30943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val dynamics by Delegates.lazy { model.getExprMap().values().filter { it.isDynamic() } } 310d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val className = layoutBinder.getClassName() 311d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 31243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val identifiers by Delegates.lazy { 31343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar dynamics.filter { it is IdentifierExpr } 31443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 315d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 31643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val interfaceName = "${layoutBinder.getInterfaceName()}" 317d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 3187551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar val includedBinders by Delegates.lazy { 3197551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar layoutBinder.getBindingTargets().filter { it.isBinder() } 3207551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 3217551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar 32243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val variables by Delegates.lazy { 32343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar model.getExprMap().values().filterIsInstance(javaClass<IdentifierExpr>()).filter { it.isVariable() } 32443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 325d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 3265bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar val usedVariables by Delegates.lazy { 3275bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar variables.filter {it.isUsed()} 3285bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 329d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 3305bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar public fun write() : String { 3315bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar layoutBinder.resolveWhichExpressionsAreUsed() 3325bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar return kcode("package ${layoutBinder.getPackage()};") { 3335bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("import ${layoutBinder.getProjectPackage()}.R;") 3345bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("import android.view.View;") 3355bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("public class ${className} extends com.android.databinding.library.ViewDataBinder implements ${interfaceName} {") { 3365bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareViews()) 3375bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareVariables()) 3385bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareConstructor()) 3395bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareInvalidateAll()) 3405bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareLog()) 3415bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareSetVariable()) 3425bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(variableSettersAndGetters()) 3435bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(viewGetters()) 3445bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(onFieldChange()) 3455bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 3465bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(rebindDirty()) 3475bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 3485bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareDirtyFlags()) 3495bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 3505bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("}") 3515bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(flagMapping()) 3525bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("//end") 3535bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar }.generate() 3545bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 355d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareConstructor() = kcode("") { 3560fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("public ${className}(View root) {") { 357d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("super(root, ${model.getObservables().size()});") 3585bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar layoutBinder.getBindingTargets().filter{it.isUsed()}.forEach { 3597551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar if (it.isBinder()) { 3607551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar tab("this.${it.fieldName} = com.android.databinding.library.DataBinder.createBinder(root.findViewById(${it.androidId}), R.layout.${it.getIncludedLayout()});") 3617551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } else { 3627551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar tab("this.${it.fieldName} = (${it.getViewClass()}) root.findViewById(${it.androidId});") 3637551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 364d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 365d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("invalidateAll();"); 366d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 3670fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 368d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 369d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 370d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareInvalidateAll() = kcode("") { 3717551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar nl("@Override") 3727551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar nl("public void invalidateAll() {") { 373d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val bs = BitSet() 374d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar bs.set(0, model.getInvalidateableFieldLimit()) 375d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(bs, mDirtyFlags.buckets.size()) 376d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in (0..(mDirtyFlags.buckets.size() - 1))) { 377d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.localValue(i)} = ${fs.localValue(i)};") 378d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 3795bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar includedBinders.filter{it.isUsed()}.forEach { binder -> 3807551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar tab("${binder.fieldName}.invalidateAll();") 3817551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 382d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 3830fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 384d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 385d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 386d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareSetVariable() = kcode("") { 3870fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("public boolean setVariable(int variableId, Object variable) {") { 388d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("switch(variableId) {") { 3895bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar usedVariables.forEach { 39043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab ("case ${it.getName().br()} :") { 391d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${it.setterName}((${it.getResolvedType().toJavaCode()}) variable);") 392d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return true;") 393d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 394d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 395d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 396d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 397d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return false;") 398d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 3990fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 400d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 401d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 402d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareLog() = kcode("") { 4030fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private void log(String msg, long i) {") { 404d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("""android.util.Log.d("BINDER", msg + ":" + Long.toHexString(i));""") 4050fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 4060fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 407d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 408d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 409d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun variableSettersAndGetters() = kcode("") { 4105bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar variables.filterNot{it.isUsed()}.forEach { 4115bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("public void ${it.setterName}(${it.getResolvedType().toJavaCode()} ${it.readableUniqueName}) {") { 4125bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("// not used, ignore") 4135bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 4145bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("}") 4155bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("") 4165bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("public ${it.getResolvedType().toJavaCode()} ${it.getterName}() {") { 4175bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("return ${it.getDefaultValue()};") 4185bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 4195bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("}") 4205bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 4215bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar usedVariables.forEach { 4220fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("public void ${it.setterName}(${it.getResolvedType().toJavaCode()} ${it.readableUniqueName}) {") { 423d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (it.isObservable()) { 424d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("updateRegistration(${it.getId()}, ${it.readableUniqueName});"); 425d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 426d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("this.${it.fieldName} = ${it.readableUniqueName};") 427d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // set dirty flags! 428d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = it.invalidateFlagSet 429d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mDirtyFlags.mapOr(flagSet) { suffix, index -> 430d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.getLocalName()}$suffix |= ${flagSet.localValue(index)};") 431d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 432d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("super.requestRebind();") 433d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 4340fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 4350fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("") 4360fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("public ${it.getResolvedType().toJavaCode()} ${it.getterName}() {") { 437d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return ${it.fieldName};") 438d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 4390fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 440d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 441d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 442d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 443d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun onFieldChange() = kcode("") { 444d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("@Override") 445d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("protected boolean onFieldChange(int mLocalFieldId, Object object, int fieldId) {") { 446d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("switch (mLocalFieldId) {") { 447d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.getObservables().forEach { 448d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("case ${it.getId()} :") { 449d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return ${it.onChangeName}((${it.getResolvedType().toJavaCode()}) object, fieldId);") 450d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 451d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 452d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 453d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 454d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return false;") 455d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 456d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 457d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 458d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.getObservables().forEach { 459d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("private boolean ${it.onChangeName}(${it.getResolvedType().toJavaCode()} ${it.readableUniqueName}, int fieldId) {") { 460d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("switch (fieldId) {", { 461d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val accessedFields: List<FieldAccessExpr> = it.getParents().filterIsInstance(javaClass<FieldAccessExpr>()) 462d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar accessedFields.filter { it.canBeInvalidated() } 463d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .groupBy { it.getName() } 464d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .forEach { 46543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab("case ${it.key.br()}:") { 466d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val field = it.value.first() 467d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mDirtyFlags.mapOr(field.invalidateFlagSet) { suffix, index -> 468d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.localValue(index)} |= ${field.invalidateFlagSet.localValue(index)};") 469d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 470d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return true;") 471d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 472d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 473d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 47443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab("case ${"".br()}:") { 475d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = it.invalidateFlagSet 476d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mDirtyFlags.mapOr(flagSet) { suffix, index -> 477d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.getLocalName()}$suffix |= ${flagSet.localValue(index)};") 478d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 479d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return true;") 480d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 481d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 482d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }) 483d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 484d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return false;") 485d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 486d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 487d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 488d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 489d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 490d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareViews() = kcode("// views") { 4915bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar layoutBinder.getBindingTargets().filter{it.isUsed()}.forEach { 4920fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private ${it.getViewClass()} ${it.fieldName};") 493d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 494d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 495d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 496d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun viewGetters() = kcode("// view getters") { 497d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar layoutBinder.getBindingTargets().forEach { 4980fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("@Override") 4995bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("public ${it.getInterfaceType()} ${it.getterName}() {") { 5005bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar if (it.isUsed()) { 5015bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("return ${it.fieldName};") 5025bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } else { 5035bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("return null;") 5045bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 5055bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 506d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5070fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 508d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 509d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 510d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 511d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareVariables() = kcode("// variables") { 5125bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar usedVariables.forEach { 5130fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private ${it.getResolvedType().toJavaCode()} ${it.fieldName};") 514d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 515d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 516d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 517d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareDirtyFlags() = kcode("// dirty flag") { 518d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.ext.localizedFlags.forEach { flag -> 519d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar flag.notEmpty { (suffix, value) -> 5200fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private") 521d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(" ", if(flag.isDynamic()) null else "static final"); 522d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(" ", " ${flag.type} ${flag.getLocalName()}$suffix = $value;") 523d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 524d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 525d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 526d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 527d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun flagMapping() = kcode("/* flag mapping") { 528d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (model.getFlagMapping() != null) { 529d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val mapping = model.getFlagMapping() 530d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in mapping.indices) { 531d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("flag $i: ${mapping[i]}") 532d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 533d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 534d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar nl("flag mapping end*/") 535d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 536d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 537d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun rebindDirty() = kcode("") { 5380fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("@Override") 5390fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("public void rebindDirty() {") { 540d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val tmpDirtyFlags = FlagSet(mDirtyFlags.buckets) 541d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tmpDirtyFlags.setLocalName("dirtyFlags"); 542d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in (0..mDirtyFlags.buckets.size() - 1)) { 543d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${tmpDirtyFlags.type} ${tmpDirtyFlags.localValue(i)} = ${mDirtyFlags.localValue(i)};") 544d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.localValue(i)} = 0;") 545d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5462c86cdbaf189e2b1774af7f64a2974de9321673fGeorge Mount //tab("""log("dirty flags", mDirtyFlags);""") 547d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.getPendingExpressions().filterNot {it.isVariable()}.forEach { 548d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${it.getResolvedType().toJavaCode()} ${it.localName} = ${it.getDefaultValue()};") 549d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 550d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 551d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar do { 552d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val batch = model.filterShouldRead(model.getPendingExpressions()).toArrayList() 553d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val mJustRead = arrayListOf<Expr>() 554d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar while (!batch.none()) { 5550fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val readNow = batch.filter { it.shouldReadNow(mJustRead) } 556d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (readNow.isEmpty()) { 557d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar throw IllegalStateException("do not know what I can read. bailing out ${batch.joinToString("\n")}") 558d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 55943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Log.d { "new read now. batch size: ${batch.size()}, readNow size: ${readNow.size()}" } 560d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 561d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar readNow.forEach { 5620fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl(readWithDependants(it, mJustRead, batch, tmpDirtyFlags)) 563d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 564d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar batch.removeAll(mJustRead) 565d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5660fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("// batch finished") 567d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } while(model.markBitsRead()) 568d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 569d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // 5705bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar layoutBinder.getBindingTargets().filter { it.isUsed() } 571d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .flatMap { it.getBindings() } 572d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .groupBy { it.getExpr() } 573d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .forEach { 574d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = it.key.dirtyFlagSet 575d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("if (${tmpDirtyFlags.mapOr(flagSet){ suffix, index -> 576d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "(${tmpDirtyFlags.localValue(index)} & ${flagSet.localValue(index)}) != 0" 577d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }.joinToString(" || ") 578d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }) {") { 579d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar it.value.forEach { binding -> 580d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${binding.toJavaCode(binding.getTarget().fieldName, binding.getExpr().toCode().generate())};") 581d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 582d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 583d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 584d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5857551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar // 5865bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar includedBinders.filter{it.isUsed()}.forEach { binder -> 5877551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar tab("${binder.fieldName}.rebindDirty();") 5887551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 589d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5900fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 591d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 592d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 593d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 594d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun readWithDependants(expr : Expr, mJustRead : MutableList<Expr>, batch : MutableList<Expr>, tmpDirtyFlags : FlagSet) : KCode = kcode("") { 595d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mJustRead.add(expr) 59643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Log.d { expr.getUniqueKey() } 597d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = expr.shouldReadFlagSet 598d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("if (${tmpDirtyFlags.mapOr(flagSet){ suffix, index -> 59943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar "(${tmpDirtyFlags.localValue(index)} & ${flagSet.localValue(index)}) != 0" 60043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar }.joinToString(" || ") 601d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }) {") { 602d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (!expr.isVariable()) { 603d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // it is not a variable read it. 604d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("// read ${expr.getUniqueKey()}") 605d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // create an if case for all dependencies that might be null 606d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val nullables = expr.getDependencies().filter { 607dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar it.isMandatory() && 608dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar ClassAnalyzer.isNullable(it.getOther().getResolvedType()) 60943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 610d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .map { it.getOther() } 611d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (!expr.isEqualityCheck() && nullables.isNotEmpty()) { 612d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab ("if ( ${nullables.map { "${it.localName} != null" }.joinToString(" && ")}) {") { 613d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${expr.localName}").app(" = ", expr.toCode(true)).app(";") 6142c86cdbaf189e2b1774af7f64a2974de9321673fGeorge Mount //tab("""log("${expr}" + ${expr.localName},0);""") 615d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 616d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 617d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } else { 618d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${expr.localName}").app(" = ", expr.toCode(true)).app(";") 6192c86cdbaf189e2b1774af7f64a2974de9321673fGeorge Mount //tab("""log("${expr}" + ${expr.localName},0);""") 620d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 621d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (expr.getResolvedType().isObservable()) { 622d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("updateRegistration(${expr.getId()}, ${expr.localName});") 623d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 6240fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 625d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 6260fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar // if I am the condition for an expression, set its flag 6270fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val conditionals = expr.getDependants().filter { !it.isConditional() 6280fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar && it.getDependant() is TernaryExpr && (it.getDependant() as TernaryExpr).getPred() == expr } 6290fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar .map { it.getDependant() } 6300fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar if (conditionals.isNotEmpty()) { 6310fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("// setting conditional flags") 6320fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("if (${expr.localName}) {") { 6330fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar conditionals.forEach { 6340fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val set = it.getRequirementFlagSet(true) 6350fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar mDirtyFlags.mapOr(set) { suffix , index -> 6360fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("${tmpDirtyFlags.localValue(index)} |= ${set.localValue(index)};") 637d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 638d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 639d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 6400fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("} else {") { 6410fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar conditionals.forEach { 6420fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val set = it.getRequirementFlagSet(false) 6430fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar mDirtyFlags.mapOr(set) { suffix , index -> 6440fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("${tmpDirtyFlags.localValue(index)} |= ${set.localValue(index)};") 6450fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 6460fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 6470fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } tab("}") 648d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 6490fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar 650d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val chosen = expr.getDependants().filter { 6510fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar batch.contains(it.getDependant()) && it.getDependant().shouldReadNow(mJustRead) 652d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 653d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (chosen.isNotEmpty()) { 654d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar chosen.forEach { 655d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar nl(readWithDependants(it.getDependant(), mJustRead, batch, tmpDirtyFlags)) 656d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 657d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 658d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 659d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 660d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 66143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar 66243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar public fun writeInterface() : String = 66343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar kcode("package ${layoutBinder.getPackage()};") { 66443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar nl("import android.binding.Bindable;") 66543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar nl("import com.android.databinding.library.IViewDataBinder;") 66643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar 66743596c2b2997e40b709627419732100d78a62ff0Yigit Boyar nl("public interface ${interfaceName} extends IViewDataBinder {") 66843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar variables.forEach { 66943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab("@Bindable") 67043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab("public void ${it.setterName}(${it.getUserDefinedType()} ${it.readableUniqueName});") 67143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 67243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar layoutBinder.getBindingTargets().forEach { 6735bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("public ${it.getInterfaceType()} ${it.getterName}();") 67443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 67543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar nl("}") 67643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar }.generate() 677d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar}