LayoutBinderWriter.kt revision dea555cf42dc3583604699c8c018d22681f56166
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 14fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool.writer 15d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.LayoutBinder 17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.Expr 18d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport kotlin.properties.Delegates 19fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.ext.joinToCamelCaseAsVar 20fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.BindingTarget 21fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.IdentifierExpr 22fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.util.Log 23d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.BitSet 24fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.ExprModel 25d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.Arrays 26fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.TernaryExpr 27fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.FieldAccessExpr 28fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.ComparisonExpr 29fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.GroupExpr 30fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.MathExpr 31fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.MethodCallExpr 32fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.StaticIdentifierExpr 33fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.SymbolExpr 34fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.ext.androidId 35fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.ext.lazy 36fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.ext.br 37fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.ResourceExpr 38fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.BracketExpr 39fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.Callable 40fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.CastExpr 41fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.ModelAnalyzer 4234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mountimport java.util.HashMap 4343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar 44d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun String.stripNonJava() = this.split("[^a-zA-Z0-9]").map{ it.trim() }.joinToCamelCaseAsVar() 45d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 46d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarclass ExprModelExt { 47d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val usedFieldNames = hashSetOf<String>() 48d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val localizedFlags = arrayListOf<FlagSet>() 49d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 50d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun localizeFlag(set : FlagSet, name:String) : FlagSet { 51d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar localizedFlags.add(set) 52d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val result = getUniqueFieldName(name) 53d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar set.setLocalName(result) 54d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return set 55d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 56d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 57d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun getUniqueFieldName(base : String) : String { 58d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar var candidate = base 59d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar var i = 0 60d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar while (usedFieldNames.contains(candidate)) { 61d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar i ++ 62d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar candidate = base + i 63d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 64d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar usedFieldNames.add(candidate) 65d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return candidate 66d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 67d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 68d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 69de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval ExprModel.ext by Delegates.lazy { target : ExprModel -> 70d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar ExprModelExt() 71d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 72d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 73d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun ExprModel.getUniqueFieldName(base : String) : String = ext.getUniqueFieldName(base) 74d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 75d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun ExprModel.localizeFlag(set : FlagSet, base : String) : FlagSet = ext.localizeFlag(set, base) 76d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 77de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval BindingTarget.readableUniqueName by Delegates.lazy { target: BindingTarget -> 7800da715547ee7d5d38a3b8576090ca427a94daa5George Mount val variableName : String 7900da715547ee7d5d38a3b8576090ca427a94daa5George Mount if (target.getId() == null) { 8000da715547ee7d5d38a3b8576090ca427a94daa5George Mount variableName = "boundView" + target.getTag() 8100da715547ee7d5d38a3b8576090ca427a94daa5George Mount } else { 8200da715547ee7d5d38a3b8576090ca427a94daa5George Mount variableName = target.getId().androidId().stripNonJava() 8300da715547ee7d5d38a3b8576090ca427a94daa5George Mount } 8400da715547ee7d5d38a3b8576090ca427a94daa5George Mount target.getModel().ext.getUniqueFieldName(variableName) 85d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 867551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar 87de38dd3ef0577d25b2d59863603abe5750d0c231George Mountfun BindingTarget.superConversion(variable : String) : String { 88de38dd3ef0577d25b2d59863603abe5750d0c231George Mount if (isBinder()) { 89de38dd3ef0577d25b2d59863603abe5750d0c231George Mount return "${getViewClass()}.bind(${variable})" 90de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } else if (getResolvedType() != null && getResolvedType().extendsViewStub()) { 91de38dd3ef0577d25b2d59863603abe5750d0c231George Mount return "new android.databinding.ViewStubProxy((android.view.ViewStub) ${variable})" 92de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } else { 93de38dd3ef0577d25b2d59863603abe5750d0c231George Mount return "(${interfaceType}) ${variable}" 94de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } 95de38dd3ef0577d25b2d59863603abe5750d0c231George Mount} 96de38dd3ef0577d25b2d59863603abe5750d0c231George Mount 97de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval BindingTarget.fieldName by Delegates.lazy { target : BindingTarget -> 9834a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount if (target.getFieldName() == null) { 9934a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount if (target.getId() == null) { 10034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount target.setFieldName("m${target.readableUniqueName.capitalize()}") 10134a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } else { 10234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount target.androidId.stripNonJava(); 10334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount target.setFieldName(target.readableUniqueName); 10434a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 10534a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 10634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount target.getFieldName(); 107d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 108d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 109de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval BindingTarget.getterName by Delegates.lazy { target : BindingTarget -> 110d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "get${target.readableUniqueName.capitalize()}" 111d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 112d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 113de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval BindingTarget.androidId by Delegates.lazy { target : BindingTarget -> 11443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar "R.id.${target.getId().androidId()}" 115d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 116d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 117de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval BindingTarget.interfaceType by Delegates.lazy { target : BindingTarget -> 118de38dd3ef0577d25b2d59863603abe5750d0c231George Mount if (target.getResolvedType() != null && target.getResolvedType().extendsViewStub()) { 119de38dd3ef0577d25b2d59863603abe5750d0c231George Mount "android.databinding.ViewStubProxy" 120de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } else { 121de38dd3ef0577d25b2d59863603abe5750d0c231George Mount target.getInterfaceType() 122de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } 123de38dd3ef0577d25b2d59863603abe5750d0c231George Mount} 124de38dd3ef0577d25b2d59863603abe5750d0c231George Mount 125de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.readableUniqueName by Delegates.lazy { expr : Expr -> 12643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Log.d { "readableUniqueName for ${expr.getUniqueKey()}" } 127d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val stripped = "${expr.getUniqueKey().stripNonJava()}" 128d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().ext.getUniqueFieldName(stripped) 129d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 130d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 131de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.readableName by Delegates.lazy { expr : Expr -> 132de38dd3ef0577d25b2d59863603abe5750d0c231George Mount Log.d { "readableUniqueName for ${expr.getUniqueKey()}" } 133de38dd3ef0577d25b2d59863603abe5750d0c231George Mount "${expr.getUniqueKey().stripNonJava()}" 134de38dd3ef0577d25b2d59863603abe5750d0c231George Mount} 135de38dd3ef0577d25b2d59863603abe5750d0c231George Mount 136de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.fieldName by Delegates.lazy { expr : Expr -> 137de38dd3ef0577d25b2d59863603abe5750d0c231George Mount "m${expr.readableName.capitalize()}" 138d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 139d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 140de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.hasFlag by Delegates.lazy { expr : Expr -> 141d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getId() < expr.getModel().getInvalidateableFieldLimit() 142d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 143d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 144de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.localName by Delegates.lazy { expr : Expr -> 145d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if(expr.isVariable()) expr.fieldName else "${expr.readableUniqueName}" 146d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 147d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 148de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.setterName by Delegates.lazy { expr : Expr -> 149de38dd3ef0577d25b2d59863603abe5750d0c231George Mount "set${expr.readableName.capitalize()}" 150d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 151d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 152de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.onChangeName by Delegates.lazy { expr : Expr -> 153d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "onChange${expr.readableUniqueName.capitalize()}" 154d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 155d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 156de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.getterName by Delegates.lazy { expr : Expr -> 157de38dd3ef0577d25b2d59863603abe5750d0c231George Mount "get${expr.readableName.capitalize()}" 158d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 159d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 160de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.dirtyFlagName by Delegates.lazy { expr : Expr -> 161d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlag${expr.readableUniqueName.capitalize()}" 162d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 163d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 164de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.shouldReadFlagName by Delegates.lazy { expr : Expr -> 165d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlagRead${expr.readableUniqueName.capitalize()}" 166d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 167d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 168de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.invalidateFlagName by Delegates.lazy { expr : Expr -> 169d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlag${expr.readableUniqueName.capitalize()}Invalid" 170d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 171d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 172de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.conditionalFlagPrefix by Delegates.lazy { expr : Expr -> 173d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "sFlag${expr.readableUniqueName.capitalize()}Is" 174d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 175d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 176d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 177d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.toCode(full : Boolean = false) : KCode { 178d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val it = this 179d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (isDynamic() && !full) { 180d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return kcode(localName) 181d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 182d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return when (it) { 183d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is ComparisonExpr -> kcode("") { 184d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getLeft().toCode()) 185d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(it.getOp()) 186d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getRight().toCode()) 187d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 188d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is FieldAccessExpr -> kcode("") { 189a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount app("", it.getChild().toCode()) 190e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount if (it.getGetter().type == Callable.Type.FIELD) { 191d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(".", it.getGetter().name) 192d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } else { 193d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(".", it.getGetter().name).app("()") 194d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 195d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 196d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is GroupExpr -> kcode("(").app("", it.getWrapped().toCode()).app(")") 197d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is StaticIdentifierExpr -> kcode(it.getResolvedType().toJavaCode()) 198d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is IdentifierExpr -> kcode(it.localName) 199d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is MathExpr -> kcode("") { 200d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getLeft().toCode()) 201d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(it.getOp()) 202d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getRight().toCode()) 203d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 204d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is MethodCallExpr -> kcode("") { 205d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getTarget().toCode()) 206d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(".", it.getGetter().name) 207d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("(") 208d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar var first = true 209d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar it.getArgs().forEach { 210d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar apps(if (first) "" else ",", it.toCode()) 211d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar first = false 212d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 213d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(")") 214d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 215d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is SymbolExpr -> kcode(it.getText()) // TODO 216d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar is TernaryExpr -> kcode("") { 217d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("", it.getPred().toCode()) 218d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app("?", it.getIfTrue().toCode()) 219d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(":", it.getIfFalse().toCode()) 220d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 221c752a5f795baf6df435ef60881316cb748df407cGeorge Mount is ResourceExpr -> kcode("") { 222c752a5f795baf6df435ef60881316cb748df407cGeorge Mount app("", it.toJava()) 223c752a5f795baf6df435ef60881316cb748df407cGeorge Mount } 2245cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount is BracketExpr -> kcode("") { 2255cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("", it.getTarget().toCode()) 2265cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount val bracketType = it.getAccessor(); 2275cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount when (bracketType) { 2285cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount BracketExpr.BracketAccessor.ARRAY -> { 2295cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("[", it.getArg().toCode()) 2305cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("]") 2315cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2325cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount BracketExpr.BracketAccessor.LIST -> { 2335cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(".get(") 2345cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount if (it.argCastsInteger()) { 2355cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("(Integer)") 2365cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2375cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app("", it.getArg().toCode()) 2385cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(")") 2395cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2405cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount BracketExpr.BracketAccessor.MAP -> { 2415cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(".get(", it.getArg().toCode()) 2425cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount app(")") 2435cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2445cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 2455cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount } 246e4b93061ac703e48fc2c9994c9059ed016f05559George Mount is CastExpr -> kcode("") { 247e4b93061ac703e48fc2c9994c9059ed016f05559George Mount app("(", it.getCastType()) 248e4b93061ac703e48fc2c9994c9059ed016f05559George Mount app(") ", it.getCastExpr().toCode()) 249e4b93061ac703e48fc2c9994c9059ed016f05559George Mount } 250d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar else -> kcode("//NOT IMPLEMENTED YET") 251d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 252d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 253d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 254d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 255d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.isVariable() = this is IdentifierExpr && this.isDynamic() 256d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 257d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.conditionalFlagName(output : Boolean, suffix : String) = "${dirtyFlagName}_${output}$suffix" 258d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 259d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 260de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.dirtyFlagSet by Delegates.lazy { expr : Expr -> 261d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(expr.getInvalidFlags(), expr.getModel().getFlagBucketCount()) 262d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().localizeFlag(fs, expr.dirtyFlagName) 263d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 264d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 265de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.invalidateFlagSet by Delegates.lazy { expr : Expr -> 266d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(expr.getId()) 267d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().localizeFlag(fs, expr.invalidateFlagName) 268d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 269d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 270de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.shouldReadFlagSet by Delegates.lazy { expr : Expr -> 271d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(expr.getShouldReadFlags(), expr.getModel().getFlagBucketCount()) 272d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar expr.getModel().localizeFlag(fs, expr.shouldReadFlagName) 273d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 274d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 275de38dd3ef0577d25b2d59863603abe5750d0c231George Mountval Expr.conditionalFlags by Delegates.lazy { expr : Expr -> 276d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val model = expr.getModel() 277d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar arrayListOf(model.localizeFlag(FlagSet(expr.getRequirementFlagIndex(false)), 278d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "${expr.conditionalFlagPrefix}False"), 279d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.localizeFlag(FlagSet(expr.getRequirementFlagIndex(true)), 280d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "${expr.conditionalFlagPrefix}True")) 281d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 282d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 283d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun Expr.getRequirementFlagSet(expected : Boolean) : FlagSet = conditionalFlags[if(expected) 1 else 0] 284d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 285d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.notEmpty(cb : (suffix : String, value : Long) -> Unit) { 286d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar buckets.withIndex().forEach { 287d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (it.value != 0L) { 288d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar cb(getWordSuffix(it.index), buckets[it.index]) 289d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 290d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 291d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 292d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 293d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.getBitSuffix(bitIndex : Int) : String { 294d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val word = bitIndex / FlagSet.sBucketSize 295d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return getWordSuffix(word) 296d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 297d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 298d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.getWordSuffix(wordIndex : Int) : String { 299d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return if(wordIndex == 0) "" else "_${wordIndex}" 300d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 301d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 302d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.localValue(bucketIndex : Int) = 303d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (getLocalName() == null) buckets[bucketIndex] 304d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar else "${getLocalName()}${getWordSuffix(bucketIndex)}" 305d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 306d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun FlagSet.or(other : FlagSet, cb : (suffix : String) -> Unit) { 307d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val min = Math.min(buckets.size(), other.buckets.size()) 308d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in 0..(min - 1)) { 309d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // if these two can match by any chance, call the callback 310d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (intersect(other, i)) { 311d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar cb(getWordSuffix(i)) 312d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 313d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 314d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 315d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 316d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarfun <T> FlagSet.mapOr(other : FlagSet, cb : (suffix : String, index : Int) -> T) : List<T> { 317d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val min = Math.min(buckets.size(), other.buckets.size()) 318d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val result = arrayListOf<T>() 319d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in 0..(min - 1)) { 320d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // if these two can match by any chance, call the callback 321d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (intersect(other, i)) { 322d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar result.add(cb(getWordSuffix(i), i)) 323d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 324d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 325d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar return result 326d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 327d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 32843596c2b2997e40b709627419732100d78a62ff0Yigit Boyarclass LayoutBinderWriter(val layoutBinder : LayoutBinder) { 329d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val model = layoutBinder.getModel() 33034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount val indices = HashMap<BindingTarget, kotlin.Int>() 33143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val mDirtyFlags by Delegates.lazy { 33243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val fs = FlagSet(BitSet(), model.getFlagBucketCount()); 33343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Arrays.fill(fs.buckets, -1) 33443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar fs.setDynamic(true) 33543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar model.localizeFlag(fs, "mDirtyFlags") 33643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar fs 337d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 338d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 33943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val dynamics by Delegates.lazy { model.getExprMap().values().filter { it.isDynamic() } } 340dea555cf42dc3583604699c8c018d22681f56166George Mount val className = layoutBinder.getImplementationName() 341d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 34243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val identifiers by Delegates.lazy { 34343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar dynamics.filter { it is IdentifierExpr } 34443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 345d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 346dea555cf42dc3583604699c8c018d22681f56166George Mount val baseClassName = "${layoutBinder.getClassName()}" 347d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 3487551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar val includedBinders by Delegates.lazy { 3497551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar layoutBinder.getBindingTargets().filter { it.isBinder() } 3507551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 3517551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar 35243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar val variables by Delegates.lazy { 35343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar model.getExprMap().values().filterIsInstance(javaClass<IdentifierExpr>()).filter { it.isVariable() } 35443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 355d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 3565bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar val usedVariables by Delegates.lazy { 3575bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar variables.filter {it.isUsed()} 3585bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 359d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 3605bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar public fun write() : String { 3615bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar layoutBinder.resolveWhichExpressionsAreUsed() 36234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount calculateIndices(); 3635bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar return kcode("package ${layoutBinder.getPackage()};") { 364a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar nl("import ${layoutBinder.getModulePackage()}.R;") 365a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar nl("import ${layoutBinder.getModulePackage()}.BR;") 3665bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("import android.view.View;") 367dea555cf42dc3583604699c8c018d22681f56166George Mount val classDeclaration : String 368dea555cf42dc3583604699c8c018d22681f56166George Mount if (layoutBinder.hasVariations()) { 369dea555cf42dc3583604699c8c018d22681f56166George Mount classDeclaration = "${className} extends ${baseClassName}" 370dea555cf42dc3583604699c8c018d22681f56166George Mount } else { 371dea555cf42dc3583604699c8c018d22681f56166George Mount classDeclaration = "${className} extends android.databinding.ViewDataBinding" 372dea555cf42dc3583604699c8c018d22681f56166George Mount } 373dea555cf42dc3583604699c8c018d22681f56166George Mount nl("public class ${classDeclaration} {") { 3744c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab(declareIncludeViews()) 3755bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareViews()) 3765bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareVariables()) 3775bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareConstructor()) 3785bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareInvalidateAll()) 3795bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareLog()) 3805bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareSetVariable()) 3815bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(variableSettersAndGetters()) 3825bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(onFieldChange()) 3835bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 3844c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab(executePendingBindings()) 3855bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 3865bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(declareDirtyFlags()) 387dea555cf42dc3583604699c8c018d22681f56166George Mount if (!layoutBinder.hasVariations()) { 388dea555cf42dc3583604699c8c018d22681f56166George Mount tab(declareFactories()) 389dea555cf42dc3583604699c8c018d22681f56166George Mount } 3905bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 3915bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("}") 3925bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab(flagMapping()) 3935bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("//end") 3945bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar }.generate() 3955bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 39634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount fun calculateIndices() : Unit { 39734a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount val numTaggedViews = layoutBinder.getBindingTargets(). 39834a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount filter{it.isUsed() && !it.isBinder()}.count() 39934a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount layoutBinder.getBindingTargets().filter{ it.isUsed() && it.getTag() != null }.forEach { 40034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount indices.put(it, Integer.parseInt(it.getTag())); 40134a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 40234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount layoutBinder.getBindingTargets().filter{ it.isUsed() && it.isBinder()}.withIndex().forEach { 40334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount indices.put(it.value, it.index + numTaggedViews); 40434a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 40534a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 4064c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount fun declareIncludeViews() = kcode("") { 4074c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("private static final android.util.SparseIntArray sIncludes;") 4084c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("private static final android.util.SparseIntArray sViewsWithIds;") 4094c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("static {") { 4104c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount val hasBinders = layoutBinder.getBindingTargets().firstOrNull{ it.isUsed() && it.isBinder()} != null 4114c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount if (!hasBinders) { 4124c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("sIncludes = null;") 41300da715547ee7d5d38a3b8576090ca427a94daa5George Mount } else { 4144c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("sIncludes = new android.util.SparseIntArray();") 41534a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount layoutBinder.getBindingTargets().filter{ it.isUsed() && it.isBinder()}.forEach { 41634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount tab("sIncludes.put(${it.androidId}, ${indices.get(it)});") 4174c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 41800da715547ee7d5d38a3b8576090ca427a94daa5George Mount } 4194c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount val hasViewsWithIds = layoutBinder.getBindingTargets().firstOrNull{ it.isUsed() && !it.supportsTag()} != null 4204c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount if (!hasViewsWithIds) { 4214c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("sViewsWithIds = null;") 42200da715547ee7d5d38a3b8576090ca427a94daa5George Mount } else { 4234c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("sViewsWithIds = new android.util.SparseIntArray();") 4244c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount layoutBinder.getBindingTargets().filter{ it.isUsed() && !it.supportsTag() }. 4254c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount forEach { 42634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount tab("sViewsWithIds.put(${it.androidId}, ${indices.get(it)});") 4274c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 42800da715547ee7d5d38a3b8576090ca427a94daa5George Mount } 4294c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 4304c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("}") 4314c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 4324c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount fun declareConstructor() = kcode("") { 433dea555cf42dc3583604699c8c018d22681f56166George Mount val viewCount = layoutBinder.getBindingTargets().filter{it.isUsed()}.count() 434dea555cf42dc3583604699c8c018d22681f56166George Mount if (layoutBinder.hasVariations()) { 435dea555cf42dc3583604699c8c018d22681f56166George Mount nl("") 436dea555cf42dc3583604699c8c018d22681f56166George Mount nl("public ${className}(View root) {") { 437dea555cf42dc3583604699c8c018d22681f56166George Mount tab("this(root, mapChildViews(root, ${viewCount}, sIncludes, sViewsWithIds));") 438dea555cf42dc3583604699c8c018d22681f56166George Mount } 439dea555cf42dc3583604699c8c018d22681f56166George Mount nl("}") 440dea555cf42dc3583604699c8c018d22681f56166George Mount nl("private ${className}(View root, View[] views) {") { 441dea555cf42dc3583604699c8c018d22681f56166George Mount tab("super(root, ${model.getObservables().size()}") { 442dea555cf42dc3583604699c8c018d22681f56166George Mount layoutBinder.getBindingTargets().filter { it.getId() != null }.forEach { 443dea555cf42dc3583604699c8c018d22681f56166George Mount tab(", ${fieldConversion(it)}") 44434a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 445dea555cf42dc3583604699c8c018d22681f56166George Mount tab(");") 44634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 44734a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 448dea555cf42dc3583604699c8c018d22681f56166George Mount } else { 449dea555cf42dc3583604699c8c018d22681f56166George Mount nl("${baseClassName}(View root) {") { 450dea555cf42dc3583604699c8c018d22681f56166George Mount tab("super(root, ${model.getObservables().size()});") 451dea555cf42dc3583604699c8c018d22681f56166George Mount tab("final View[] views = mapChildViews(root, ${viewCount}, sIncludes, sViewsWithIds);") 452dea555cf42dc3583604699c8c018d22681f56166George Mount } 453dea555cf42dc3583604699c8c018d22681f56166George Mount } 454dea555cf42dc3583604699c8c018d22681f56166George Mount val taggedViews = layoutBinder.getBindingTargets().filter{it.isUsed()} 455dea555cf42dc3583604699c8c018d22681f56166George Mount taggedViews.forEach { 456dea555cf42dc3583604699c8c018d22681f56166George Mount if (!layoutBinder.hasVariations() || it.getId() == null) { 457dea555cf42dc3583604699c8c018d22681f56166George Mount tab("this.${it.fieldName} = ${fieldConversion(it)};") 458dea555cf42dc3583604699c8c018d22681f56166George Mount } 459dea555cf42dc3583604699c8c018d22681f56166George Mount if (!it.isBinder()) { 460de38dd3ef0577d25b2d59863603abe5750d0c231George Mount if (it.getResolvedType() != null && it.getResolvedType().extendsViewStub()) { 461de38dd3ef0577d25b2d59863603abe5750d0c231George Mount tab("this.${it.fieldName}.setContainingBinding(this);") 462de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } 463dea555cf42dc3583604699c8c018d22681f56166George Mount if (it.supportsTag() && it.getTag() != null) { 464dea555cf42dc3583604699c8c018d22681f56166George Mount val originalTag = it.getOriginalTag(); 465dea555cf42dc3583604699c8c018d22681f56166George Mount var tagValue = "null" 466dea555cf42dc3583604699c8c018d22681f56166George Mount if (originalTag != null) { 467dea555cf42dc3583604699c8c018d22681f56166George Mount tagValue = "\"${originalTag}\"" 468dea555cf42dc3583604699c8c018d22681f56166George Mount if (originalTag.startsWith("@")) { 469dea555cf42dc3583604699c8c018d22681f56166George Mount var packageName = layoutBinder.getModulePackage() 470dea555cf42dc3583604699c8c018d22681f56166George Mount if (originalTag.startsWith("@android:")) { 471dea555cf42dc3583604699c8c018d22681f56166George Mount packageName = "android" 47200da715547ee7d5d38a3b8576090ca427a94daa5George Mount } 473dea555cf42dc3583604699c8c018d22681f56166George Mount val slashIndex = originalTag.indexOf('/') 474dea555cf42dc3583604699c8c018d22681f56166George Mount val resourceId = originalTag.substring(slashIndex + 1) 475dea555cf42dc3583604699c8c018d22681f56166George Mount tagValue = "root.getResources().getString(${packageName}.R.string.${resourceId})" 47600da715547ee7d5d38a3b8576090ca427a94daa5George Mount } 47700da715547ee7d5d38a3b8576090ca427a94daa5George Mount } 478dea555cf42dc3583604699c8c018d22681f56166George Mount tab("this.${it.fieldName}.setTag(${tagValue});") 4797551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 480d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 481d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 482dea555cf42dc3583604699c8c018d22681f56166George Mount tab("invalidateAll();"); 4830fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 484d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 485d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 486dea555cf42dc3583604699c8c018d22681f56166George Mount fun fieldConversion(target : BindingTarget) : String { 487dea555cf42dc3583604699c8c018d22681f56166George Mount val index = indices.get(target) 488dea555cf42dc3583604699c8c018d22681f56166George Mount if (!target.isUsed()) { 489dea555cf42dc3583604699c8c018d22681f56166George Mount return "null" 490dea555cf42dc3583604699c8c018d22681f56166George Mount } else { 491dea555cf42dc3583604699c8c018d22681f56166George Mount val variableName: String 492dea555cf42dc3583604699c8c018d22681f56166George Mount if (index == null) { 493dea555cf42dc3583604699c8c018d22681f56166George Mount variableName = "root"; 494dea555cf42dc3583604699c8c018d22681f56166George Mount } else { 495dea555cf42dc3583604699c8c018d22681f56166George Mount variableName = "views[${index}]" 496dea555cf42dc3583604699c8c018d22681f56166George Mount } 497dea555cf42dc3583604699c8c018d22681f56166George Mount return target.superConversion(variableName) 498dea555cf42dc3583604699c8c018d22681f56166George Mount } 499dea555cf42dc3583604699c8c018d22681f56166George Mount } 500dea555cf42dc3583604699c8c018d22681f56166George Mount 501d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareInvalidateAll() = kcode("") { 5027551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar nl("@Override") 5037551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar nl("public void invalidateAll() {") { 504d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val bs = BitSet() 505d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar bs.set(0, model.getInvalidateableFieldLimit()) 506d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val fs = FlagSet(bs, mDirtyFlags.buckets.size()) 507d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in (0..(mDirtyFlags.buckets.size() - 1))) { 508d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.localValue(i)} = ${fs.localValue(i)};") 509d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5105bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar includedBinders.filter{it.isUsed()}.forEach { binder -> 5117551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar tab("${binder.fieldName}.invalidateAll();") 5127551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 513d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5140fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 515d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 516d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 517d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareSetVariable() = kcode("") { 5180fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("public boolean setVariable(int variableId, Object variable) {") { 519d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("switch(variableId) {") { 5205bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar usedVariables.forEach { 52143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab ("case ${it.getName().br()} :") { 522d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${it.setterName}((${it.getResolvedType().toJavaCode()}) variable);") 523d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return true;") 524d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 525d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 526d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 527d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 528d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return false;") 529d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 5300fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 531d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 532d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 533d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareLog() = kcode("") { 5340fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private void log(String msg, long i) {") { 535d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("""android.util.Log.d("BINDER", msg + ":" + Long.toHexString(i));""") 5360fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 5370fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 538d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 539d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 540d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun variableSettersAndGetters() = kcode("") { 5415bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar variables.filterNot{it.isUsed()}.forEach { 5425bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("public void ${it.setterName}(${it.getResolvedType().toJavaCode()} ${it.readableUniqueName}) {") { 5435bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("// not used, ignore") 5445bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 5455bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("}") 5465bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("") 5475bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("public ${it.getResolvedType().toJavaCode()} ${it.getterName}() {") { 5485bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar tab("return ${it.getDefaultValue()};") 5495bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 5505bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar nl("}") 5515bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 5525bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar usedVariables.forEach { 55318243f6f1b7527272ef4feccdf4327d80d9f2241George Mount if (it.getUserDefinedType() != null) { 55418243f6f1b7527272ef4feccdf4327d80d9f2241George Mount nl("public void ${it.setterName}(${it.getResolvedType().toJavaCode()} ${it.readableUniqueName}) {") { 55518243f6f1b7527272ef4feccdf4327d80d9f2241George Mount if (it.isObservable()) { 55618243f6f1b7527272ef4feccdf4327d80d9f2241George Mount tab("updateRegistration(${it.getId()}, ${it.readableUniqueName});"); 55718243f6f1b7527272ef4feccdf4327d80d9f2241George Mount } 55818243f6f1b7527272ef4feccdf4327d80d9f2241George Mount tab("this.${it.fieldName} = ${it.readableUniqueName};") 55918243f6f1b7527272ef4feccdf4327d80d9f2241George Mount // set dirty flags! 56018243f6f1b7527272ef4feccdf4327d80d9f2241George Mount val flagSet = it.invalidateFlagSet 56118243f6f1b7527272ef4feccdf4327d80d9f2241George Mount mDirtyFlags.mapOr(flagSet) { suffix, index -> 56218243f6f1b7527272ef4feccdf4327d80d9f2241George Mount tab("${mDirtyFlags.getLocalName()}$suffix |= ${flagSet.localValue(index)};") 56318243f6f1b7527272ef4feccdf4327d80d9f2241George Mount } 56418243f6f1b7527272ef4feccdf4327d80d9f2241George Mount tab("super.requestRebind();") 565d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 56618243f6f1b7527272ef4feccdf4327d80d9f2241George Mount nl("}") 56718243f6f1b7527272ef4feccdf4327d80d9f2241George Mount nl("") 56818243f6f1b7527272ef4feccdf4327d80d9f2241George Mount nl("public ${it.getResolvedType().toJavaCode()} ${it.getterName}() {") { 56918243f6f1b7527272ef4feccdf4327d80d9f2241George Mount tab("return ${it.fieldName};") 570d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 57118243f6f1b7527272ef4feccdf4327d80d9f2241George Mount nl("}") 572d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 573d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 574d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 575d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 576d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun onFieldChange() = kcode("") { 57734a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("@Override") 57834a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("protected boolean onFieldChange(int localFieldId, Object object, int fieldId) {") { 5794c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("switch (localFieldId) {") { 580d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.getObservables().forEach { 581d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("case ${it.getId()} :") { 582d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return ${it.onChangeName}((${it.getResolvedType().toJavaCode()}) object, fieldId);") 583d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 584d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 585d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 586d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 587d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return false;") 588d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 58934a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("}") 59034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("") 591d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 592d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.getObservables().forEach { 59334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("private boolean ${it.onChangeName}(${it.getResolvedType().toJavaCode()} ${it.readableUniqueName}, int fieldId) {") { 594d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("switch (fieldId) {", { 595d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val accessedFields: List<FieldAccessExpr> = it.getParents().filterIsInstance(javaClass<FieldAccessExpr>()) 596d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar accessedFields.filter { it.canBeInvalidated() } 597d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .groupBy { it.getName() } 598d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .forEach { 59943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab("case ${it.key.br()}:") { 600d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val field = it.value.first() 601d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mDirtyFlags.mapOr(field.invalidateFlagSet) { suffix, index -> 602d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.localValue(index)} |= ${field.invalidateFlagSet.localValue(index)};") 603d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 604d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return true;") 605d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 606d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 607d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 60843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar tab("case ${"".br()}:") { 609d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = it.invalidateFlagSet 610d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mDirtyFlags.mapOr(flagSet) { suffix, index -> 611d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.getLocalName()}$suffix |= ${flagSet.localValue(index)};") 612d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 613d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return true;") 614d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 615d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 616d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }) 617d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 618d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("return false;") 619d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 62034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("}") 62134a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("") 622d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 623d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 624d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 625d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareViews() = kcode("// views") { 626dea555cf42dc3583604699c8c018d22681f56166George Mount val oneLayout = !layoutBinder.hasVariations(); 627dea555cf42dc3583604699c8c018d22681f56166George Mount layoutBinder.getBindingTargets().filter {it.isUsed() && (oneLayout || it.getId() == null)}.forEach { 628dea555cf42dc3583604699c8c018d22681f56166George Mount val access : String 629dea555cf42dc3583604699c8c018d22681f56166George Mount if (oneLayout && it.getId() != null) { 630dea555cf42dc3583604699c8c018d22681f56166George Mount access = "public" 631dea555cf42dc3583604699c8c018d22681f56166George Mount } else { 632dea555cf42dc3583604699c8c018d22681f56166George Mount access = "private" 633dea555cf42dc3583604699c8c018d22681f56166George Mount } 634dea555cf42dc3583604699c8c018d22681f56166George Mount nl("${access} final ${it.interfaceType} ${it.fieldName};") 635d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 636d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 637d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 638d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareVariables() = kcode("// variables") { 6395bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar usedVariables.forEach { 6400fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private ${it.getResolvedType().toJavaCode()} ${it.fieldName};") 641d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 642d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 643d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 644d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun declareDirtyFlags() = kcode("// dirty flag") { 645d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.ext.localizedFlags.forEach { flag -> 646de38dd3ef0577d25b2d59863603abe5750d0c231George Mount flag.notEmpty { suffix, value -> 6470fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("private") 648d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(" ", if(flag.isDynamic()) null else "static final"); 649d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar app(" ", " ${flag.type} ${flag.getLocalName()}$suffix = $value;") 650d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 651d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 652d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 653d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 654d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun flagMapping() = kcode("/* flag mapping") { 655d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (model.getFlagMapping() != null) { 656d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val mapping = model.getFlagMapping() 657d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in mapping.indices) { 658d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("flag $i: ${mapping[i]}") 659d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 660d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 661d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar nl("flag mapping end*/") 662d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 663d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 6644c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount fun executePendingBindings() = kcode("") { 6650fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("@Override") 6664c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("public void executePendingBindings() {") { 667d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val tmpDirtyFlags = FlagSet(mDirtyFlags.buckets) 668d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tmpDirtyFlags.setLocalName("dirtyFlags"); 669d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar for (i in (0..mDirtyFlags.buckets.size() - 1)) { 670d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${tmpDirtyFlags.type} ${tmpDirtyFlags.localValue(i)} = ${mDirtyFlags.localValue(i)};") 671d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${mDirtyFlags.localValue(i)} = 0;") 672d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 6732c86cdbaf189e2b1774af7f64a2974de9321673fGeorge Mount //tab("""log("dirty flags", mDirtyFlags);""") 674d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar model.getPendingExpressions().filterNot {it.isVariable()}.forEach { 675d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${it.getResolvedType().toJavaCode()} ${it.localName} = ${it.getDefaultValue()};") 676d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 677d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 678d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar do { 679d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val batch = model.filterShouldRead(model.getPendingExpressions()).toArrayList() 680d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val mJustRead = arrayListOf<Expr>() 681d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar while (!batch.none()) { 6820fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val readNow = batch.filter { it.shouldReadNow(mJustRead) } 683d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (readNow.isEmpty()) { 684d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar throw IllegalStateException("do not know what I can read. bailing out ${batch.joinToString("\n")}") 685d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 68643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Log.d { "new read now. batch size: ${batch.size()}, readNow size: ${readNow.size()}" } 687d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 688d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar readNow.forEach { 6890fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl(readWithDependants(it, mJustRead, batch, tmpDirtyFlags)) 690d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 691d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar batch.removeAll(mJustRead) 692d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 6930fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("// batch finished") 694d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } while(model.markBitsRead()) 695d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 696d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // 6975bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar layoutBinder.getBindingTargets().filter { it.isUsed() } 698d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .flatMap { it.getBindings() } 699d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .groupBy { it.getExpr() } 700d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .forEach { 701d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = it.key.dirtyFlagSet 702d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("if (${tmpDirtyFlags.mapOr(flagSet){ suffix, index -> 703d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar "(${tmpDirtyFlags.localValue(index)} & ${flagSet.localValue(index)}) != 0" 704d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }.joinToString(" || ") 705d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }) {") { 706d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar it.value.forEach { binding -> 70797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar tab("// api target ${binding.getMinApi()}") 70834a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount val fieldName : String 70934a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount if (binding.getTarget().getViewClass(). 71034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount equals(binding.getTarget().getInterfaceType())) { 71134a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount fieldName = "this.${binding.getTarget().fieldName}" 71234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } else { 71334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount fieldName = "((${binding.getTarget().getViewClass()}) this.${binding.getTarget().fieldName})" 71434a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 71534a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount val bindingCode = binding.toJavaCode(fieldName, binding.getExpr().toCode().generate()) 71697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if (binding.getMinApi() > 1) { 7174c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("if(getBuildSdkInt() >= ${binding.getMinApi()}) {") { 71897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar tab("$bindingCode;") 71997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 72097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar tab("}") 72197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } else { 72297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar tab("$bindingCode;") 72397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 724d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 725d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 726d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 727d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 7287551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar // 7295bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar includedBinders.filter{it.isUsed()}.forEach { binder -> 7304c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("${binder.fieldName}.executePendingBindings();") 7317551861a29997eac7eaf6318e4d9f1cebd8b81d6Yigit Boyar } 732de38dd3ef0577d25b2d59863603abe5750d0c231George Mount layoutBinder.getBindingTargets().filter{ 733de38dd3ef0577d25b2d59863603abe5750d0c231George Mount it.isUsed() && it.getResolvedType() != null && it.getResolvedType().extendsViewStub() 734de38dd3ef0577d25b2d59863603abe5750d0c231George Mount }.forEach { 735de38dd3ef0577d25b2d59863603abe5750d0c231George Mount tab("if (${it.fieldName}.getBinding() != null) {") { 736de38dd3ef0577d25b2d59863603abe5750d0c231George Mount tab("${it.fieldName}.getBinding().executePendingBindings();") 737de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } 738de38dd3ef0577d25b2d59863603abe5750d0c231George Mount tab("}") 739de38dd3ef0577d25b2d59863603abe5750d0c231George Mount } 740d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 7410fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar nl("}") 742d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 743d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 744d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar fun readWithDependants(expr : Expr, mJustRead : MutableList<Expr>, batch : MutableList<Expr>, tmpDirtyFlags : FlagSet) : KCode = kcode("") { 745d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mJustRead.add(expr) 74643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar Log.d { expr.getUniqueKey() } 747d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val flagSet = expr.shouldReadFlagSet 748d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("if (${tmpDirtyFlags.mapOr(flagSet){ suffix, index -> 74943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar "(${tmpDirtyFlags.localValue(index)} & ${flagSet.localValue(index)}) != 0" 75043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar }.joinToString(" || ") 751d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar }) {") { 752d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (!expr.isVariable()) { 753d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // it is not a variable read it. 754d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("// read ${expr.getUniqueKey()}") 755d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar // create an if case for all dependencies that might be null 756d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val nullables = expr.getDependencies().filter { 757e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount it.isMandatory() && it.getOther().getResolvedType().isNullable() 75843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 759d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar .map { it.getOther() } 760d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (!expr.isEqualityCheck() && nullables.isNotEmpty()) { 761d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab ("if ( ${nullables.map { "${it.localName} != null" }.joinToString(" && ")}) {") { 762d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${expr.localName}").app(" = ", expr.toCode(true)).app(";") 7632c86cdbaf189e2b1774af7f64a2974de9321673fGeorge Mount //tab("""log("${expr}" + ${expr.localName},0);""") 764d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 765d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 766d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } else { 767d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("${expr.localName}").app(" = ", expr.toCode(true)).app(";") 7682c86cdbaf189e2b1774af7f64a2974de9321673fGeorge Mount //tab("""log("${expr}" + ${expr.localName},0);""") 769d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 7707920e17f7b501d5792e7e3250e9dbb69eca86adeGeorge Mount if (expr.isObservable()) { 771d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("updateRegistration(${expr.getId()}, ${expr.localName});") 772d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 7730fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 774d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 7750fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar // if I am the condition for an expression, set its flag 7760fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val conditionals = expr.getDependants().filter { !it.isConditional() 7770fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar && it.getDependant() is TernaryExpr && (it.getDependant() as TernaryExpr).getPred() == expr } 7780fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar .map { it.getDependant() } 7790fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar if (conditionals.isNotEmpty()) { 7800fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("// setting conditional flags") 7810fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("if (${expr.localName}) {") { 7820fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar conditionals.forEach { 7830fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val set = it.getRequirementFlagSet(true) 7840fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar mDirtyFlags.mapOr(set) { suffix , index -> 7850fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("${tmpDirtyFlags.localValue(index)} |= ${set.localValue(index)};") 786d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 787d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 788d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 7890fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("} else {") { 7900fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar conditionals.forEach { 7910fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar val set = it.getRequirementFlagSet(false) 7920fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar mDirtyFlags.mapOr(set) { suffix , index -> 7930fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar tab("${tmpDirtyFlags.localValue(index)} |= ${set.localValue(index)};") 7940fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 7950fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 7960fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } tab("}") 797d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 7980fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar 799d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar val chosen = expr.getDependants().filter { 8000fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar batch.contains(it.getDependant()) && it.getDependant().shouldReadNow(mJustRead) 801d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 802d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar if (chosen.isNotEmpty()) { 803d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar chosen.forEach { 804d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar nl(readWithDependants(it.getDependant(), mJustRead, batch, tmpDirtyFlags)) 805d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 806d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 807d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 808d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar tab("}") 809d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 81043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar 811dea555cf42dc3583604699c8c018d22681f56166George Mount fun declareFactories() = kcode("") { 812dea555cf42dc3583604699c8c018d22681f56166George Mount nl("public static ${baseClassName} inflate(android.view.ViewGroup root) {") { 813dea555cf42dc3583604699c8c018d22681f56166George Mount tab("return bind(android.view.LayoutInflater.from(root.getContext()).inflate(${layoutBinder.getModulePackage()}.R.layout.${layoutBinder.getLayoutname()}, root, true));") 814dea555cf42dc3583604699c8c018d22681f56166George Mount } 815dea555cf42dc3583604699c8c018d22681f56166George Mount nl("}") 816dea555cf42dc3583604699c8c018d22681f56166George Mount nl("public static ${baseClassName} inflate(android.content.Context context) {") { 817dea555cf42dc3583604699c8c018d22681f56166George Mount tab("return bind(android.view.LayoutInflater.from(context).inflate(${layoutBinder.getModulePackage()}.R.layout.${layoutBinder.getLayoutname()}, null, false));") 818dea555cf42dc3583604699c8c018d22681f56166George Mount } 819dea555cf42dc3583604699c8c018d22681f56166George Mount nl("}") 820dea555cf42dc3583604699c8c018d22681f56166George Mount nl("public static ${baseClassName} bind(android.view.View view) {") { 821dea555cf42dc3583604699c8c018d22681f56166George Mount tab("if (!\"${layoutBinder.getId()}\".equals(view.getTag())) {") { 822dea555cf42dc3583604699c8c018d22681f56166George Mount tab("throw new RuntimeException(\"view tag doesn't isn't correct on view\");") 823dea555cf42dc3583604699c8c018d22681f56166George Mount } 824dea555cf42dc3583604699c8c018d22681f56166George Mount tab("}") 825dea555cf42dc3583604699c8c018d22681f56166George Mount tab("return new ${baseClassName}(view);") 826dea555cf42dc3583604699c8c018d22681f56166George Mount } 827dea555cf42dc3583604699c8c018d22681f56166George Mount nl("}") 828dea555cf42dc3583604699c8c018d22681f56166George Mount } 829dea555cf42dc3583604699c8c018d22681f56166George Mount 8304c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount public fun writeBaseClass() : String = 83143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar kcode("package ${layoutBinder.getPackage()};") { 832fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount nl("import android.databinding.Bindable;") 833fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount nl("import android.databinding.DataBindingUtil;") 834fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount nl("import android.databinding.ViewDataBinding;") 8354c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("public abstract class ${baseClassName} extends ViewDataBinding {") 83634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount layoutBinder.getBindingTargets().filter{it.getId() != null}.forEach { 837de38dd3ef0577d25b2d59863603abe5750d0c231George Mount tab("public final ${it.interfaceType} ${it.fieldName};") 83834a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 83934a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount nl("") 84034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount tab("protected ${baseClassName}(android.view.View root_, int localFieldCount") { 84134a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount layoutBinder.getBindingTargets().filter{it.getId() != null}.forEach { 842de38dd3ef0577d25b2d59863603abe5750d0c231George Mount tab(", ${it.interfaceType} ${it.readableUniqueName}") 84334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 84434a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 84534a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount tab(") {") { 84634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount tab("super(root_, localFieldCount);") 84734a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount layoutBinder.getBindingTargets().filter{it.getId() != null}.forEach { 84834a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount tab("this.${it.fieldName} = ${it.readableUniqueName};") 84934a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 8504c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 8514c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("}") 8524c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount nl("") 85343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar variables.forEach { 85418243f6f1b7527272ef4feccdf4327d80d9f2241George Mount if (it.getUserDefinedType() != null) { 855895b618d9c6e3deb56465d0759cda57f50c46214Yigit Boyar //it.getExpandedUserDefinedType(ModelAnalyzer.getInstance()); 856895b618d9c6e3deb56465d0759cda57f50c46214Yigit Boyar val type = ModelAnalyzer.getInstance().applyImports(it.getUserDefinedType(), model.getImports()) 8574c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("public abstract void ${it.setterName}(${type} ${it.readableUniqueName});") 85818243f6f1b7527272ef4feccdf4327d80d9f2241George Mount } 85943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 8604c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("public static ${baseClassName} inflate(android.view.ViewGroup root) {") { 861a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar tab("return DataBindingUtil.<${baseClassName}>inflate(root.getContext(), ${layoutBinder.getModulePackage()}.R.layout.${layoutBinder.getLayoutname()}, root, true);") 86243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar } 8634c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("}") 8644c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("public static ${baseClassName} inflate(android.content.Context context) {") { 865a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar tab("return DataBindingUtil.<${baseClassName}>inflate(context, ${layoutBinder.getModulePackage()}.R.layout.${layoutBinder.getLayoutname()}, null, false);") 8664c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 8674c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("}") 8684c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("public static ${baseClassName} bind(android.view.View view) {") { 869a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar tab("return (${baseClassName})DataBindingUtil.bindTo(view, ${layoutBinder.getModulePackage()}.R.layout.${layoutBinder.getLayoutname()});") 8704c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount } 8714c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount tab("}") 87243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar nl("}") 87343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar }.generate() 874dea555cf42dc3583604699c8c018d22681f56166George Mount} 875