1c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount/*
2c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * Copyright (C) 2015 The Android Open Source Project
3c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount *
4c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * Licensed under the Apache License, Version 2.0 (the "License");
5c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * you may not use this file except in compliance with the License.
6c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * You may obtain a copy of the License at
7c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount *
8c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount *      http://www.apache.org/licenses/LICENSE-2.0
9c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount *
10c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * Unless required by applicable law or agreed to in writing, software
11c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * distributed under the License is distributed on an "AS IS" BASIS,
12c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * See the License for the specific language governing permissions and
14c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount * limitations under the License.
15c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount */
16c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
17c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mountpackage android.databinding.tool.expr;
18c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
19c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mountimport android.databinding.tool.reflection.ModelAnalyzer;
20c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mountimport android.databinding.tool.reflection.ModelClass;
21e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mountimport android.databinding.tool.writer.KCode;
22c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
23c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mountimport java.util.List;
24c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
25c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mountpublic class InstanceOfExpr extends Expr {
26c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    final String mTypeStr;
27c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    ModelClass mType;
28c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
29c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    InstanceOfExpr(Expr left, String type) {
30c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        super(left);
31c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        mTypeStr = type;
32c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    }
33c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
34c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    @Override
35c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    protected String computeUniqueKey() {
362611838bffef5a009ca71e3e9e59a93f29b098edYigit Boyar        return join("instanceof", super.computeUniqueKey(), mTypeStr);
37c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    }
38c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
39c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    @Override
40bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    protected KCode generateCode() {
41e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount        return new KCode()
42bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount                .app("", getExpr().toCode())
43e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount                .app(" instanceof ")
44e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount                .app(getType().toJavaCode());
45e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount    }
46e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount
47e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount    @Override
48bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    public Expr cloneToModel(ExprModel model) {
49bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount        return model.instanceOfOp(getExpr().cloneToModel(model), mTypeStr);
50bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    }
51bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount
52bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    @Override
53c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
54c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        mType = modelAnalyzer.findClass(mTypeStr, getModel().getImports());
55c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        return modelAnalyzer.loadPrimitive("boolean");
56c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    }
57c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
58c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    @Override
59c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    protected List<Dependency> constructDependencies() {
60c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        return constructDynamicChildrenDependencies();
61c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    }
62c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
63c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    public Expr getExpr() {
64c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        return getChildren().get(0);
65c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    }
66c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount
67c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    public ModelClass getType() {
68c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount        return mType;
69c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount    }
70d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount
71d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    @Override
72d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    public String getInvertibleError() {
73d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount        return "two-way binding can't target a value with the 'instanceof' operator";
74d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount    }
75bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount
76bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    @Override
77bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    public String toString() {
78bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount        return getExpr().toString() + " instanceof " + mTypeStr;
79bb4a033fcd5cd20e5be46ef8ead442dc7db2454dGeorge Mount    }
80c6bcb7bf9cab139b3141c4644e5b3267deed5213George Mount}
81