IdentifierExpr.java revision 2611838bffef5a009ca71e3e9e59a93f29b098ed
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.databinding.tool.expr;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.databinding.tool.reflection.ModelAnalyzer;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.databinding.tool.reflection.ModelClass;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.databinding.tool.util.L;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.databinding.tool.util.Preconditions;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2413656743cc21bac43676568314366497346713eeRomain Guyimport java.util.ArrayList;
2513656743cc21bac43676568314366497346713eeRomain Guyimport java.util.List;
2613656743cc21bac43676568314366497346713eeRomain Guy
2713656743cc21bac43676568314366497346713eeRomain Guypublic class IdentifierExpr extends Expr {
2813656743cc21bac43676568314366497346713eeRomain Guy    String mName;
2913656743cc21bac43676568314366497346713eeRomain Guy    String mUserDefinedType;
3013656743cc21bac43676568314366497346713eeRomain Guy    IdentifierExpr(String name) {
3113656743cc21bac43676568314366497346713eeRomain Guy        mName = name;
3213656743cc21bac43676568314366497346713eeRomain Guy    }
3313656743cc21bac43676568314366497346713eeRomain Guy
3413656743cc21bac43676568314366497346713eeRomain Guy    public String getName() {
3513656743cc21bac43676568314366497346713eeRomain Guy        return mName;
3613656743cc21bac43676568314366497346713eeRomain Guy    }
3713656743cc21bac43676568314366497346713eeRomain Guy
3813656743cc21bac43676568314366497346713eeRomain Guy    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this is root, its type should be set while parsing the XML document
4013656743cc21bac43676568314366497346713eeRomain Guy     * @param userDefinedType The type of this identifier
4113656743cc21bac43676568314366497346713eeRomain Guy     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setUserDefinedType(String userDefinedType) {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUserDefinedType = userDefinedType;
4413656743cc21bac43676568314366497346713eeRomain Guy    }
4513656743cc21bac43676568314366497346713eeRomain Guy
4613656743cc21bac43676568314366497346713eeRomain Guy    @Override
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected String computeUniqueKey() {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return join(mName, super.computeUniqueKey());
4913656743cc21bac43676568314366497346713eeRomain Guy    }
5013656743cc21bac43676568314366497346713eeRomain Guy
5113656743cc21bac43676568314366497346713eeRomain Guy    public String getUserDefinedType() {
5213656743cc21bac43676568314366497346713eeRomain Guy        return mUserDefinedType;
5313656743cc21bac43676568314366497346713eeRomain Guy    }
5413656743cc21bac43676568314366497346713eeRomain Guy
5513656743cc21bac43676568314366497346713eeRomain Guy    public String getExpandedUserDefinedType(ModelAnalyzer modelAnalyzer) {
5613656743cc21bac43676568314366497346713eeRomain Guy        Preconditions.checkNotNull(mUserDefinedType,
5713656743cc21bac43676568314366497346713eeRomain Guy                "Identifiers must have user defined types from the XML file. %s is missing it",
5813656743cc21bac43676568314366497346713eeRomain Guy                mName);
59f559326b182e321f51ab9711614d3e37fefa603aChris Craik        final String expanded = modelAnalyzer
60f559326b182e321f51ab9711614d3e37fefa603aChris Craik                .applyImports(mUserDefinedType, getModel().getImports());
6113656743cc21bac43676568314366497346713eeRomain Guy        L.d("expanded version of %s is %s", mUserDefinedType, expanded);
6213656743cc21bac43676568314366497346713eeRomain Guy        return expanded;
6313656743cc21bac43676568314366497346713eeRomain Guy    }
6413656743cc21bac43676568314366497346713eeRomain Guy
6513656743cc21bac43676568314366497346713eeRomain Guy    @Override
6613656743cc21bac43676568314366497346713eeRomain Guy    public boolean isDynamic() {
6713656743cc21bac43676568314366497346713eeRomain Guy        return true;
6813656743cc21bac43676568314366497346713eeRomain Guy    }
6913656743cc21bac43676568314366497346713eeRomain Guy
7013656743cc21bac43676568314366497346713eeRomain Guy    @Override
7113656743cc21bac43676568314366497346713eeRomain Guy    protected ModelClass resolveType(final ModelAnalyzer modelAnalyzer) {
72f559326b182e321f51ab9711614d3e37fefa603aChris Craik        Preconditions.checkNotNull(mUserDefinedType,
73f559326b182e321f51ab9711614d3e37fefa603aChris Craik                "Identifiers must have user defined types from the XML file. %s is missing it", mName);
7413656743cc21bac43676568314366497346713eeRomain Guy        return modelAnalyzer.findClass(mUserDefinedType, getModel().getImports());
7513656743cc21bac43676568314366497346713eeRomain Guy    }
7613656743cc21bac43676568314366497346713eeRomain Guy
7713656743cc21bac43676568314366497346713eeRomain Guy    @Override
7813656743cc21bac43676568314366497346713eeRomain Guy    protected List<Dependency> constructDependencies() {
7913656743cc21bac43676568314366497346713eeRomain Guy        return new ArrayList<>();
8013656743cc21bac43676568314366497346713eeRomain Guy    }
8113656743cc21bac43676568314366497346713eeRomain Guy
8213656743cc21bac43676568314366497346713eeRomain Guy    @Override
8313656743cc21bac43676568314366497346713eeRomain Guy    protected String asPackage() {
8413656743cc21bac43676568314366497346713eeRomain Guy        return mUserDefinedType == null ? mName : null;
85f559326b182e321f51ab9711614d3e37fefa603aChris Craik    }
86f559326b182e321f51ab9711614d3e37fefa603aChris Craik}
8713656743cc21bac43676568314366497346713eeRomain Guy