ext.kt revision 59229481aec5a284d322a2ca80dff836485feb0c
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *      http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
12 */
13
14package android.databinding.tool.ext
15
16import android.databinding.tool.expr.VersionProvider
17import kotlin.properties.ReadOnlyProperty
18import kotlin.reflect.KProperty
19
20private class LazyExt<K, T>(private val initializer: (k : K) -> T) : ReadOnlyProperty<K, T> {
21    private val mapping = hashMapOf<K, T>()
22    override fun getValue(thisRef: K, property: kotlin.reflect.KProperty<*>): T {
23        val t = mapping[thisRef]
24        if (t != null) {
25            return t
26        }
27        val result = initializer(thisRef)
28        mapping.put(thisRef, result)
29        return result
30    }
31}
32
33private class VersionedLazyExt<K, T>(private val initializer: (k : K) -> T) : ReadOnlyProperty<K, T> {
34    private val mapping = hashMapOf<K, VersionedResult<T>>()
35
36    override fun getValue(thisRef: K, property: KProperty<*>): T {
37        val t = mapping[thisRef]
38        val version = if(thisRef is VersionProvider) thisRef.version else 1
39        if (t != null && version == t.version) {
40            return t.result
41        }
42        val result = initializer(thisRef)
43        mapping.put(thisRef, VersionedResult(version, result))
44        return result
45    }
46}
47
48data class VersionedResult<T>(val version : Int, val result : T)
49
50fun <K, T> lazyProp(initializer: (k : K) -> T): ReadOnlyProperty<K, T> = LazyExt(initializer)
51fun <K, T> versionedLazy(initializer: (k : K) -> T): ReadOnlyProperty<K, T> = VersionedLazyExt(initializer)
52
53public fun Class<*>.toJavaCode() : String {
54    if (name.startsWith('[')) {
55        val numArray = name.lastIndexOf('[') + 1;
56        val componentType : String;
57        when (name[numArray]) {
58            'Z' -> componentType = "boolean"
59            'B' -> componentType = "byte"
60            'C' -> componentType = "char"
61            'L' -> componentType = name.substring(numArray + 1, name.length - 1).replace('$', '.');
62            'D' -> componentType = "double"
63            'F' -> componentType = "float"
64            'I' -> componentType = "int"
65            'J' -> componentType = "long"
66            'S' -> componentType = "short"
67            else -> componentType = name.substring(numArray)
68        }
69        val arrayComp = name.substring(0, numArray).replace("[", "[]");
70        return componentType + arrayComp;
71    } else {
72        return name.replace("$", ".")
73    }
74}
75
76public fun String.androidId() : String = this.split("/")[1]
77
78public fun String.toCamelCase() : String {
79    val split = this.split("_")
80    if (split.size == 0) return ""
81    if (split.size == 1) return split[0].capitalize()
82    return split.joinToCamelCase()
83}
84
85public fun String.toCamelCaseAsVar() : String {
86    val split = this.split("_")
87    if (split.size == 0) return ""
88    if (split.size == 1) return split[0]
89    return split.joinToCamelCaseAsVar()
90}
91
92public fun String.br() : String =
93    "BR.${if (this == "") "_all" else this}"
94