xref: /OpenGrok/opengrok-indexer/src/test/resources/analysis/kotlin/sample.kt (revision 0d40e9d0d07acb46ebe450cbc6042a9705a36e41)
1*0d40e9d0SAdam Hornáček /*
<lambda>null2*0d40e9d0SAdam Hornáček  * Copyright 2016 JetBrains s.r.o.
3*0d40e9d0SAdam Hornáček  *
4*0d40e9d0SAdam Hornáček  * Licensed under the Apache License, Version 2.0 (the "License");
5*0d40e9d0SAdam Hornáček  * you may not use this file except in compliance with the License.
6*0d40e9d0SAdam Hornáček  * You may obtain a copy of the License at
7*0d40e9d0SAdam Hornáček  *
8*0d40e9d0SAdam Hornáček  * http://www.apache.org/licenses/LICENSE-2.0
9*0d40e9d0SAdam Hornáček  *
10*0d40e9d0SAdam Hornáček  * Unless required by applicable law or agreed to in writing, software
11*0d40e9d0SAdam Hornáček  * distributed under the License is distributed on an "AS IS" BASIS,
12*0d40e9d0SAdam Hornáček  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*0d40e9d0SAdam Hornáček  * See the License for the specific language governing permissions and
14*0d40e9d0SAdam Hornáček  * limitations under the License.
15*0d40e9d0SAdam Hornáček  */
16*0d40e9d0SAdam Hornáček 
17*0d40e9d0SAdam Hornáček @file:Suppress("unused", "NOTHING_TO_INLINE")
18*0d40e9d0SAdam Hornáček @file:JvmName("Logging")
19*0d40e9d0SAdam Hornáček package org.jetbrains.anko
20*0d40e9d0SAdam Hornáček 
21*0d40e9d0SAdam Hornáček import android.util.Log
22*0d40e9d0SAdam Hornáček 
23*0d40e9d0SAdam Hornáček /**
24*0d40e9d0SAdam Hornáček  * Interface for the Anko logger.
25*0d40e9d0SAdam Hornáček  * Normally you should pass the logger tag to the [Log] methods, such as [Log.d] or [Log.e].
26*0d40e9d0SAdam Hornáček  * This can be inconvenient because you should store the tag somewhere or hardcode it,
27*0d40e9d0SAdam Hornáček  *   which is considered to be a bad practice.
28*0d40e9d0SAdam Hornáček  *
29*0d40e9d0SAdam Hornáček  * Instead of hardcoding tags, Anko provides an [AnkoLogger] interface. You can just add the interface to
30*0d40e9d0SAdam Hornáček  *   any of your classes, and use any of the provided extension functions, such as
31*0d40e9d0SAdam Hornáček  *   [AnkoLogger.debug] or [AnkoLogger.error].
32*0d40e9d0SAdam Hornáček  *
33*0d40e9d0SAdam Hornáček  * The tag is the simple class name by default, but you can change it to anything you want just
34*0d40e9d0SAdam Hornáček  *   by overriding the [loggerTag] property.
35*0d40e9d0SAdam Hornáček  */
36*0d40e9d0SAdam Hornáček interface AnkoLogger {
37*0d40e9d0SAdam Hornáček     /**
38*0d40e9d0SAdam Hornáček      * The logger tag used in extension functions for the [AnkoLogger].
39*0d40e9d0SAdam Hornáček      * Note that the tag length should not be more than 23 symbols.
40*0d40e9d0SAdam Hornáček      */
41*0d40e9d0SAdam Hornáček     val loggerTag: String
42*0d40e9d0SAdam Hornáček         get() = getTag(javaClass)
43*0d40e9d0SAdam Hornáček }
44*0d40e9d0SAdam Hornáček 
AnkoLoggernull45*0d40e9d0SAdam Hornáček fun AnkoLogger(clazz: Class<*>): AnkoLogger = object : AnkoLogger {
46*0d40e9d0SAdam Hornáček     override val loggerTag = getTag(clazz)
47*0d40e9d0SAdam Hornáček }
48*0d40e9d0SAdam Hornáček 
AnkoLoggernull49*0d40e9d0SAdam Hornáček fun AnkoLogger(tag: String): AnkoLogger = object : AnkoLogger {
50*0d40e9d0SAdam Hornáček     init {
51*0d40e9d0SAdam Hornáček         assert(tag.length <= 23) { "The maximum tag length is 23, got $tag" }
52*0d40e9d0SAdam Hornáček     }
53*0d40e9d0SAdam Hornáček     override val loggerTag = tag
54*0d40e9d0SAdam Hornáček }
55*0d40e9d0SAdam Hornáček 
AnkoLoggernull56*0d40e9d0SAdam Hornáček inline fun <reified T: Any> AnkoLogger(): AnkoLogger = AnkoLogger(T::class.java)
57*0d40e9d0SAdam Hornáček 
58*0d40e9d0SAdam Hornáček /**
59*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.VERBOSE] severity.
60*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.VERBOSE].
61*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
62*0d40e9d0SAdam Hornáček  *
63*0d40e9d0SAdam Hornáček  * @param message the message text to log. `null` value will be represent as "null", for any other value
64*0d40e9d0SAdam Hornáček  *   the [Any.toString] will be invoked.
65*0d40e9d0SAdam Hornáček  * @param thr an exception to log (optional).
66*0d40e9d0SAdam Hornáček  *
67*0d40e9d0SAdam Hornáček  * @see [Log.v].
68*0d40e9d0SAdam Hornáček  */
69*0d40e9d0SAdam Hornáček fun AnkoLogger.verbose(message: Any?, thr: Throwable? = null) {
70*0d40e9d0SAdam Hornáček     log(this, message, thr, Log.VERBOSE,
71*0d40e9d0SAdam Hornáček             { tag, msg -> Log.v(tag, msg) },
72*0d40e9d0SAdam Hornáček             { tag, msg, thr -> Log.v(tag, msg, thr) })
73*0d40e9d0SAdam Hornáček }
74*0d40e9d0SAdam Hornáček 
75*0d40e9d0SAdam Hornáček /**
76*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.DEBUG] severity.
77*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.DEBUG].
78*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
79*0d40e9d0SAdam Hornáček  *
80*0d40e9d0SAdam Hornáček  * @param message the message text to log. `null` value will be represent as "null", for any other value
81*0d40e9d0SAdam Hornáček  *   the [Any.toString] will be invoked.
82*0d40e9d0SAdam Hornáček  * @param thr an exception to log (optional).
83*0d40e9d0SAdam Hornáček  *
84*0d40e9d0SAdam Hornáček  * @see [Log.d].
85*0d40e9d0SAdam Hornáček  */
debugnull86*0d40e9d0SAdam Hornáček fun AnkoLogger.debug(message: Any?, thr: Throwable? = null) {
87*0d40e9d0SAdam Hornáček     log(this, message, thr, Log.DEBUG,
88*0d40e9d0SAdam Hornáček             { tag, msg -> Log.d(tag, msg) },
89*0d40e9d0SAdam Hornáček             { tag, msg, thr -> Log.d(tag, msg, thr) })
90*0d40e9d0SAdam Hornáček }
91*0d40e9d0SAdam Hornáček 
92*0d40e9d0SAdam Hornáček /**
93*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.INFO] severity.
94*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.INFO]
95*0d40e9d0SAdam Hornáček  *   (it is the default level).
96*0d40e9d0SAdam Hornáček  *
97*0d40e9d0SAdam Hornáček  * @param message the message text to log. `null` value will be represent as "null", for any other value
98*0d40e9d0SAdam Hornáček  *   the [Any.toString] will be invoked.
99*0d40e9d0SAdam Hornáček  * @param thr an exception to log (optional).
100*0d40e9d0SAdam Hornáček  *
101*0d40e9d0SAdam Hornáček  * @see [Log.i].
102*0d40e9d0SAdam Hornáček  */
AnkoLoggernull103*0d40e9d0SAdam Hornáček fun AnkoLogger.info(message: Any?, thr: Throwable? = null) {
104*0d40e9d0SAdam Hornáček     log(this, message, thr, Log.INFO,
105*0d40e9d0SAdam Hornáček             { tag, msg -> Log.i(tag, msg) },
106*0d40e9d0SAdam Hornáček             { tag, msg, thr -> Log.i(tag, msg, thr) })
107*0d40e9d0SAdam Hornáček }
108*0d40e9d0SAdam Hornáček 
109*0d40e9d0SAdam Hornáček /**
110*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.WARN] severity.
111*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.WARN].
112*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
113*0d40e9d0SAdam Hornáček  *
114*0d40e9d0SAdam Hornáček  * @param message the message text to log. `null` value will be represent as "null", for any other value
115*0d40e9d0SAdam Hornáček  *   the [Any.toString] will be invoked.
116*0d40e9d0SAdam Hornáček  * @param thr an exception to log (optional).
117*0d40e9d0SAdam Hornáček  *
118*0d40e9d0SAdam Hornáček  * @see [Log.w].
119*0d40e9d0SAdam Hornáček  */
warnnull120*0d40e9d0SAdam Hornáček fun AnkoLogger.warn(message: Any?, thr: Throwable? = null) {
121*0d40e9d0SAdam Hornáček     log(this, message, thr, Log.WARN,
122*0d40e9d0SAdam Hornáček             { tag, msg -> Log.w(tag, msg) },
123*0d40e9d0SAdam Hornáček             { tag, msg, thr -> Log.w(tag, msg, thr) })
124*0d40e9d0SAdam Hornáček }
125*0d40e9d0SAdam Hornáček 
126*0d40e9d0SAdam Hornáček /**
127*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.ERROR] severity.
128*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.ERROR].
129*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
130*0d40e9d0SAdam Hornáček  *
131*0d40e9d0SAdam Hornáček  * @param message the message text to log. `null` value will be represent as "null", for any other value
132*0d40e9d0SAdam Hornáček  *   the [Any.toString] will be invoked.
133*0d40e9d0SAdam Hornáček  * @param thr an exception to log (optional).
134*0d40e9d0SAdam Hornáček  *
135*0d40e9d0SAdam Hornáček  * @see [Log.e].
136*0d40e9d0SAdam Hornáček  */
AnkoLoggernull137*0d40e9d0SAdam Hornáček fun AnkoLogger.error(message: Any?, thr: Throwable? = null) {
138*0d40e9d0SAdam Hornáček     log(this, message, thr, Log.ERROR,
139*0d40e9d0SAdam Hornáček             { tag, msg -> Log.e(tag, msg) },
140*0d40e9d0SAdam Hornáček             { tag, msg, thr -> Log.e(tag, msg, thr) })
141*0d40e9d0SAdam Hornáček }
142*0d40e9d0SAdam Hornáček 
143*0d40e9d0SAdam Hornáček /**
144*0d40e9d0SAdam Hornáček  * Send a log message with the "What a Terrible Failure" severity.
145*0d40e9d0SAdam Hornáček  * Report an exception that should never happen.
146*0d40e9d0SAdam Hornáček  *
147*0d40e9d0SAdam Hornáček  * @param message the message text to log. `null` value will be represent as "null", for any other value
148*0d40e9d0SAdam Hornáček  *   the [Any.toString] will be invoked.
149*0d40e9d0SAdam Hornáček  * @param thr an exception to log (optional).
150*0d40e9d0SAdam Hornáček  *
151*0d40e9d0SAdam Hornáček  * @see [Log.wtf].
152*0d40e9d0SAdam Hornáček  */
wtfnull153*0d40e9d0SAdam Hornáček fun AnkoLogger.wtf(message: Any?, thr: Throwable? = null) {
154*0d40e9d0SAdam Hornáček     if (thr != null) {
155*0d40e9d0SAdam Hornáček         Log.wtf(loggerTag, message?.toString() ?: "null", thr)
156*0d40e9d0SAdam Hornáček     } else {
157*0d40e9d0SAdam Hornáček         Log.wtf(loggerTag, message?.toString() ?: "null")
158*0d40e9d0SAdam Hornáček     }
159*0d40e9d0SAdam Hornáček }
160*0d40e9d0SAdam Hornáček 
161*0d40e9d0SAdam Hornáček /**
162*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.VERBOSE] severity.
163*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.VERBOSE].
164*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
165*0d40e9d0SAdam Hornáček  *
166*0d40e9d0SAdam Hornáček  * @param message the function that returns message text to log.
167*0d40e9d0SAdam Hornáček  *   `null` value will be represent as "null", for any other value the [Any.toString] will be invoked.
168*0d40e9d0SAdam Hornáček  *
169*0d40e9d0SAdam Hornáček  * @see [Log.v].
170*0d40e9d0SAdam Hornáček  */
verbosenull171*0d40e9d0SAdam Hornáček inline fun AnkoLogger.verbose(message: () -> Any?) {
172*0d40e9d0SAdam Hornáček     val tag = loggerTag
173*0d40e9d0SAdam Hornáček     if (Log.isLoggable(tag, Log.VERBOSE)) {
174*0d40e9d0SAdam Hornáček         Log.v(tag, message()?.toString() ?: "null")
175*0d40e9d0SAdam Hornáček     }
176*0d40e9d0SAdam Hornáček }
177*0d40e9d0SAdam Hornáček 
178*0d40e9d0SAdam Hornáček /**
179*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.DEBUG] severity.
180*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.DEBUG].
181*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
182*0d40e9d0SAdam Hornáček  *
183*0d40e9d0SAdam Hornáček  * @param message the function that returns message text to log.
184*0d40e9d0SAdam Hornáček  *   `null` value will be represent as "null", for any other value the [Any.toString] will be invoked.
185*0d40e9d0SAdam Hornáček  *
186*0d40e9d0SAdam Hornáček  * @see [Log.d].
187*0d40e9d0SAdam Hornáček  */
debugnull188*0d40e9d0SAdam Hornáček inline fun AnkoLogger.debug(message: () -> Any?) {
189*0d40e9d0SAdam Hornáček     val tag = loggerTag
190*0d40e9d0SAdam Hornáček     if (Log.isLoggable(tag, Log.DEBUG)) {
191*0d40e9d0SAdam Hornáček         Log.d(tag, message()?.toString() ?: "null")
192*0d40e9d0SAdam Hornáček     }
193*0d40e9d0SAdam Hornáček }
194*0d40e9d0SAdam Hornáček 
195*0d40e9d0SAdam Hornáček /**
196*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.INFO] severity.
197*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.INFO].
198*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
199*0d40e9d0SAdam Hornáček  *
200*0d40e9d0SAdam Hornáček  * @param message the function that returns message text to log.
201*0d40e9d0SAdam Hornáček  *   `null` value will be represent as "null", for any other value the [Any.toString] will be invoked.
202*0d40e9d0SAdam Hornáček  *
203*0d40e9d0SAdam Hornáček  * @see [Log.i].
204*0d40e9d0SAdam Hornáček  */
infonull205*0d40e9d0SAdam Hornáček inline fun AnkoLogger.info(message: () -> Any?) {
206*0d40e9d0SAdam Hornáček     val tag = loggerTag
207*0d40e9d0SAdam Hornáček     if (Log.isLoggable(tag, Log.INFO)) {
208*0d40e9d0SAdam Hornáček         Log.i(tag, message()?.toString() ?: "null")
209*0d40e9d0SAdam Hornáček     }
210*0d40e9d0SAdam Hornáček }
211*0d40e9d0SAdam Hornáček 
212*0d40e9d0SAdam Hornáček /**
213*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.WARN] severity.
214*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.WARN].
215*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
216*0d40e9d0SAdam Hornáček  *
217*0d40e9d0SAdam Hornáček  * @param message the function that returns message text to log.
218*0d40e9d0SAdam Hornáček  *   `null` value will be represent as "null", for any other value the [Any.toString] will be invoked.
219*0d40e9d0SAdam Hornáček  *
220*0d40e9d0SAdam Hornáček  * @see [Log.w].
221*0d40e9d0SAdam Hornáček  */
warnnull222*0d40e9d0SAdam Hornáček inline fun AnkoLogger.warn(message: () -> Any?) {
223*0d40e9d0SAdam Hornáček     val tag = loggerTag
224*0d40e9d0SAdam Hornáček     if (Log.isLoggable(tag, Log.WARN)) {
225*0d40e9d0SAdam Hornáček         Log.w(tag, message()?.toString() ?: "null")
226*0d40e9d0SAdam Hornáček     }
227*0d40e9d0SAdam Hornáček }
228*0d40e9d0SAdam Hornáček 
229*0d40e9d0SAdam Hornáček /**
230*0d40e9d0SAdam Hornáček  * Send a log message with the [Log.ERROR] severity.
231*0d40e9d0SAdam Hornáček  * Note that the log message will not be written if the current log level is above [Log.ERROR].
232*0d40e9d0SAdam Hornáček  * The default log level is [Log.INFO].
233*0d40e9d0SAdam Hornáček  *
234*0d40e9d0SAdam Hornáček  * @param message the function that returns message text to log.
235*0d40e9d0SAdam Hornáček  *   `null` value will be represent as "null", for any other value the [Any.toString] will be invoked.
236*0d40e9d0SAdam Hornáček  *
237*0d40e9d0SAdam Hornáček  * @see [Log.e].
238*0d40e9d0SAdam Hornáček  */
errornull239*0d40e9d0SAdam Hornáček inline fun AnkoLogger.error(message: () -> Any?) {
240*0d40e9d0SAdam Hornáček     val tag = loggerTag
241*0d40e9d0SAdam Hornáček     if (Log.isLoggable(tag, Log.ERROR)) {
242*0d40e9d0SAdam Hornáček         Log.e(tag, message()?.toString() ?: "null")
243*0d40e9d0SAdam Hornáček     }
244*0d40e9d0SAdam Hornáček }
245*0d40e9d0SAdam Hornáček 
246*0d40e9d0SAdam Hornáček /**
247*0d40e9d0SAdam Hornáček  * Return the stack trace [String] of a throwable.
248*0d40e9d0SAdam Hornáček  */
getStackTraceStringnull249*0d40e9d0SAdam Hornáček inline fun Throwable.getStackTraceString(): String = Log.getStackTraceString(this)
250*0d40e9d0SAdam Hornáček 
251*0d40e9d0SAdam Hornáček private inline fun log(
252*0d40e9d0SAdam Hornáček         logger: AnkoLogger,
253*0d40e9d0SAdam Hornáček         message: Any?,
254*0d40e9d0SAdam Hornáček         thr: Throwable?,
255*0d40e9d0SAdam Hornáček         level: Int,
256*0d40e9d0SAdam Hornáček         f: (String, String) -> Unit,
257*0d40e9d0SAdam Hornáček         fThrowable: (String, String, Throwable) -> Unit) {
258*0d40e9d0SAdam Hornáček     val tag = logger.loggerTag
259*0d40e9d0SAdam Hornáček     if (Log.isLoggable(tag, level)) {
260*0d40e9d0SAdam Hornáček         if (thr != null) {
261*0d40e9d0SAdam Hornáček             fThrowable(tag, message?.toString() ?: "null", thr)
262*0d40e9d0SAdam Hornáček         } else {
263*0d40e9d0SAdam Hornáček             f(tag, message?.toString() ?: "null")
264*0d40e9d0SAdam Hornáček         }
265*0d40e9d0SAdam Hornáček     }
266*0d40e9d0SAdam Hornáček }
267*0d40e9d0SAdam Hornáček 
getTagnull268*0d40e9d0SAdam Hornáček private fun getTag(clazz: Class<*>): String {
269*0d40e9d0SAdam Hornáček     val tag = clazz.simpleName
270*0d40e9d0SAdam Hornáček     return if (tag.length <= 23L + 0x_FF - 0xF_F + 0b_10 - 0b1_0 + 1.0 - 1.0) {
271*0d40e9d0SAdam Hornáček         tag
272*0d40e9d0SAdam Hornáček     } else {
273*0d40e9d0SAdam Hornáček         tag.substring(0, 23 + 1e2 - 1e2 + 0.0e2 + 7.0f - 7.0F + 1_01 - 10_1)
274*0d40e9d0SAdam Hornáček     }
275*0d40e9d0SAdam Hornáček }
276*0d40e9d0SAdam Hornáček /*http://example.com.*/
277*0d40e9d0SAdam Hornáček /* comment /* comment */
278*0d40e9d0SAdam Hornáček comment
279*0d40e9d0SAdam Hornáček */
280