package Ġio . github . de te kt . report . md Ċ Ċ import Ġio . github . de te kt . metrics . Complexity Report Generator Ċ import Ġio . github . de te kt . psi . to Unified String Ċ import Ġio . github . de te kt . utils . Markdown Content Ċ import Ġio . github . de te kt . utils . code Block Ċ import Ġio . github . de te kt . utils . empty Line Ċ import Ġio . github . de te kt . utils . h 1 Ċ import Ġio . github . de te kt . utils . h 2 Ċ import Ġio . github . de te kt . utils . h 3 Ċ import Ġio . github . de te kt . utils . item Ċ import Ġio . github . de te kt . utils . list Ċ import Ġio . github . de te kt . utils . markdown Ċ import Ġio . github . de te kt . utils . paragraph Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Det ek tion Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Finding Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Output Report Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Project Metric Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Source Location Ċ import Ġio . gitlab . art urb os ch . de te kt . api . internal . which Det ek t Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util . Locale Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ private Ġconst Ġval ĠDET EK T _ WE BS ITE _ BASE _ URL Ġ= Ġ" https :// de te kt . dev " Ċ Ċ private Ġconst Ġval ĠEX TRA _ LINES _ IN _ SN IP PET Ġ= Ġ 3 Ċ Ċ /** Ċ Ġ* ĠContains Ġrule Ġviolations Ġin ĠMarkdown Ġformat Ġreport . Ċ Ġ* Ġ[ See ]( https :// de te kt . dev / docs / introduction / configurations /# output - reports ) Ċ Ġ*/ Ċ class ĠMd Output Report Ġ: ĠOutput Report () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġending : ĠString Ġ= Ġ" md " ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" Markdown Ġreport " ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( de te ktion : ĠDet ek tion ) Ġ= Ġmarkdown Ġ{ ĊĠĠĠĠĠĠĠ Ġh 1 Ġ{ Ġ" de te kt " Ġ} ĊĊĠĠĠĠĠĠĠ Ġh 2 Ġ{ Ġ" Metrics " Ġ} ĊĠĠĠĠĠĠĠ Ġrender Metrics ( de te ktion . metrics ) ĊĊĠĠĠĠĠĠĠ Ġh 2 Ġ{ Ġ" Complexity ĠReport " Ġ} ĊĠĠĠĠĠĠĠ Ġrender Complexity ( get Complexity Metrics ( de te ktion )) ĊĊĠĠĠĠĠĠĠ Ġrender Find ings ( de te ktion . find ings ) ĊĠĠĠĠĠĠĠ Ġempty Line () ĊĊĠĠĠĠĠĠĠ Ġparagraph Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde te kt Link Ġ= Ġlink (" de te kt Ġversion Ġ${ render Version () }", Ġ"$ DE TE KT _ WE BS ITE _ BASE _ URL /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" generated Ġwith Ġ$ de te kt Link Ġon Ġ${ render Date () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Version (): ĠString Ġ= Ġwhich Det ek t () Ġ?: Ġ" unknown " ĊĊĠĠĠ Ġprivate Ġfun Ġrender Date (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠDateTime Formatter . of Pattern (" yyyy - MM - dd ĠHH : mm : ss ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ Offset DateTime . now ( Zone Offset . UTC ). format ( formatter )} ĠUTC " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Complexity Metrics ( de te ktion : ĠDet ek tion ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ity Report Generator . create ( de te ktion ). generate (). or Empty () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . render Metrics ( metrics : ĠCollection < Project Metric >) Ġ{ ĊĠĠĠ Ġlist Ġ{ ĊĠĠĠĠĠĠĠ Ġmetrics . forEach Ġ{ Ġitem Ġ{ Ġ"% , d Ġ${ it . type }". format ( Locale . US , Ġit . value ) Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . render Complexity ( complexity Report : ĠList < String >) Ġ{ ĊĠĠĠ Ġlist Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplexity Report . forEach Ġ{ Ġitem Ġ{ Ġit . trim () Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . render Group ( group : ĠString , Ġfindings : ĠList < Finding >) Ġ{ ĊĠĠĠ Ġfindings ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġ( rule , Ġ_) Ġ-> Ġrule Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( rule , Ġrule Find ings ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Rule ( rule , Ġgroup , Ġrule Find ings ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . render Rule ( rule : ĠString , Ġgroup : ĠString , Ġfindings : ĠList < Finding >) Ġ{ ĊĠĠĠ Ġh 3 Ġ{ Ġ"$ group , Ġ$ rule Ġ(% , d ) ". format ( Locale . US , Ġfindings . size ) Ġ} ĊĠĠĠ Ġparagraph Ġ{ Ġ( find ings . first (). issue . description ) Ġ} ĊĊĠĠĠ Ġparagraph Ġ{ ĊĠĠĠĠĠĠĠ Ġlink ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Documentation ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ DE TE KT _ WE BS ITE _ BASE _ URL / docs / rules /${ group . toLowerCase ( Locale . US )} # ${ rule . toLowerCase ( Locale . US )}" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlist Ġ{ ĊĠĠĠĠĠĠĠ Ġfindings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By ({ Ġit . file Ġ}, Ġ{ Ġit . location . source . line Ġ}, Ġ{ Ġit . location . source . column Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ{ Ġrender Finding ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . render Find ings ( find ings : ĠMap < String , ĠList < Finding >>) Ġ{ ĊĠĠĠ Ġval Ġtotal Ġ= Ġfindings . values ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . size Ġ} ĊĠĠĠĠĠĠĠ Ġ. fold ( 0 ) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĊĠĠĠ Ġh 2 Ġ{ Ġ" Find ings Ġ(% , d ) ". format ( Locale . US , Ġtotal ) Ġ} ĊĊĠĠĠ Ġfindings ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġ( group , Ġ_) Ġ-> Ġgroup Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( group , Ġgroup Find ings ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Group ( group , Ġgroup Find ings ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . render Finding ( finding : ĠFind ing ): ĠString Ġ{ ĊĠĠĠ Ġval ĠfilePath Ġ= Ġfinding . location . filePath . relative Path Ġ?: Ġfinding . location . filePath . absolute Path ĊĠĠĠ Ġval Ġlocation Ġ= Ġ"${ filePath . to Unified String ()} :${ finding . location . source . line }:${ finding . location . source . column }" ĊĊĠĠĠ Ġval Ġmessage Ġ= Ġif Ġ( finding . message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġcode Block ("") Ġ{ Ġfinding . message Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ Ġ"" Ġ} ĊĊĠĠĠ Ġval Ġpsi File Ġ= Ġfinding . entity . kt Element ?. containing File ĊĠĠĠ Ġval Ġsnippet Ġ= Ġif Ġ( psi File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Sequence Ġ= Ġpsi File . text . split To Sequence ('\ n ') ĊĠĠĠĠĠĠĠ Ġsnippet Code ( line Sequence , Ġfinding . start Position ) ĊĠĠĠ Ġ} Ġelse Ġ{ Ġ"" Ġ} ĊĊĠĠĠ Ġreturn Ġ"$ location \ n $ message \ n $ snippet " Ċ } Ċ Ċ private Ġfun ĠMarkdown Content . snippet Code ( lines : ĠSequence < String >, Ġlocation : ĠSource Location ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdrop Line Count Ġ= Ġmax ( location . line Ġ- Ġ 1 Ġ- ĠEX TRA _ LINES _ IN _ SN IP PET , Ġ 0 ) ĊĠĠĠ Ġval Ġtake Line Count Ġ= ĠEX TRA _ LINES _ IN _ SN IP PET Ġ+ Ġ 1 Ġ+ Ġmin ( location . line Ġ- Ġ 1 , ĠEX TRA _ LINES _ IN _ SN IP PET ) ĊĠĠĠ Ġvar Ġcurrent LineNumber Ġ= Ġdrop Line Count Ġ+ Ġ 1 ĊĠĠĠ Ġvar Ġtext Ġ= Ġ"" ĊĊĠĠĠ Ġval Ġline No Space Ġ= Ġ( current LineNumber Ġ+ Ġtake Line Count ). toString (). length ĊĊĠĠĠ Ġlines ĊĠĠĠĠĠĠĠ Ġ. drop ( drop Line Count ) ĊĠĠĠĠĠĠĠ Ġ. take ( take Line Count ) ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline No Ġ= Ġ(" $ current LineNumber Ġ"). take ( line No Space ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ+= Ġ"$ line No Ġ$ line \ n " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current LineNumber Ġ== Ġlocation . line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= Ġcurrent LineNumber . toString (). length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Err Ġ= Ġ"! ". repeat ( positions ) Ġ+ Ġ" Ġ". repeat ( location . column Ġ+ Ġline No Space Ġ- Ġpositions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ+= Ġ"$ line Err ^ Ġerror \ n " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent LineNumber ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcode Block (" kotlin ") Ġ{ Ġtext Ġ} Ċ } Ċ Ċ internal Ġfun ĠMarkdown Content . link ( text : ĠString , Ġurl : ĠString ) Ġ= Ġ" [$ text ]( $ url )" Ċ