import Ġcom . squareup . kotlin po et . ClassName Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . provider . List Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġorg . intellij . lang . annotations . Language Ċ import Ġjava . nio . file . Path Ċ Ċ abstract Ġclass ĠGenerate Logger Functions Task Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġabstract Ġval Ġ` package `: ĠProperty < String > ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġabstract Ġval Ġlog Levels : ĠList Property < String > ĊĊĠĠĠ Ġprivate Ġval Ġoutput Dir Ġ= Ġproject . build Dir ĊĠĠĠĠĠĠĠ Ġ. to Path () ĊĠĠĠĠĠĠĠ Ġ. resolve Paths (" generated ", Ġ" src ") ĊĊĠĠĠ Ġ@ Suppress (" Private PropertyName ") ĊĠĠĠ Ġprivate Ġval ĠK Logger Ġ= ĠClass Name (" mu ", Ġ" K Logger ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġoutputs . dir ( output Dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate File (" common Main ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Levels . get (). forEach Ġ{ Ġlevel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Name Ġ= Ġ"${ level } In lined " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Level In lined ( function Name , Ġlevel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Level In lined With Throwable ( function Name , Ġlevel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate File (" jvm Main ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Logger Functions Ġ{ Ġlevel , Ġfunction Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġe . g Ġdebug Ġ-> Ġis Debug Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenabled PropertyName Ġ= Ġ" is ${ level [ 0 ]. toUpperCase ()} ${ level . drop ( 1 )} Enabled " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Level In lined ( function Name , Ġlevel , ĠK Modifier . ACT UAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ($ enabled PropertyName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ level ( message ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Level In lined With Throwable ( function Name , Ġlevel , ĠK Modifier . ACT UAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ($ enabled PropertyName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomputed Message Ġ= Ġmessage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ level ( throwable ) Ġ{ Ġcomputed Message Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Non SL F 4 J File (" js Main ") ĊĠĠĠĠĠĠĠ Ġgenerate Non SL F 4 J File (" native Main ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Non SL F 4 J File ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate File ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Import (" mu ", Ġ" Kotlin Logging Level ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Import (" mu ", Ġ" is Logging Enabled ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Logger Functions Ġ{ Ġlevel , Ġfunction Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Language (" kotlin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcode ( call : ĠString ) Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Kotlin Logging Level .${ level . toUpperCase ()}. is Logging Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomputed Log Message Ġ= Ġmessage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Level In lined ( function Name , Ġlevel , ĠK Modifier . ACT UAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( code ("$ level Ġ{ Ġcomputed Log Message Ġ} ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Level In lined With Throwable ( function Name , Ġlevel , ĠK Modifier . ACT UAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( code ("$ level ( throwable ) Ġ{ Ġcomputed Log Message Ġ} ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġgenerate Logger Functions ( on Function : Ġ( level : ĠString , Ġfunction Name : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Levels . get (). forEach Ġ{ Ġlevel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Name Ġ= Ġ"${ level } In lined " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Function ( level , Ġfunction Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate File ( source Set : ĠString , Ġblock : ĠFile Spec . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile Spec . builder (` package `. get (), Ġ" In lined Logger ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Imports () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġfile . writeTo ( output Dir . resolve ( source Set )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFile Spec . Builder . debug Level In lined ( ĊĠĠĠĠĠĠĠ Ġfunction Name : ĠString , ĊĠĠĠĠĠĠĠ Ġlevel : ĠString ?, ĊĠĠĠĠĠĠĠ Ġmp p Modifier : ĠK Modifier Ġ= ĠK Modifier . EXPECT , ĊĠĠĠĠĠĠĠ Ġcode : ĠFun Spec . Builder . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Function ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder ( function Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( K Logger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc (""" Inline Ġversion Ġof Ġ[ K Logger .$ level ] Ġso Ġit Ġcan Ġcall Ġsuspend Ġfunctions """) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK Modifier . PUBLIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK Modifier . INLINE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp p Modifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder (" message ", ĠClass Name (` package `. get (), Ġ" Lazy Log Message ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFile Spec . Builder . debug Level In lined With Throwable ( ĊĠĠĠĠĠĠĠ Ġfunction Name : ĠString , ĊĠĠĠĠĠĠĠ Ġlevel : ĠString ?, ĊĠĠĠĠĠĠĠ Ġmp p Modifier : ĠK Modifier Ġ= ĠK Modifier . EXPECT , ĊĠĠĠĠĠĠĠ Ġcode : ĠFun Spec . Builder . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdebug Level In lined ( function Name , Ġlevel , Ġmp p Modifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder (" throwable ", ĠThrowable :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. defaultValue ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠFile Spec . Builder . common Imports () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Import ( K Logger . packageName , ĠK Logger . simple Name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠPath . resolve Paths ( var arg Ġrelative : ĠString ) Ġ= ĊĠĠĠ Ġrelative . toList (). fold ( this ) Ġ{ Ġparent , Ġcurrent Relative Ġ-> Ġparent . resolve ( current Relative ) Ġ} Ċ