// ĠCopyright Ġ 2 0 1 7 ĠS our cer er ĠInc . ĠAll ĠRights ĠReserved . Ċ // ĠAuthor : ĠLi ub ov ĠY aron sk aya Ġ( ly aron sk aya @ s our cer er . io ) Ċ // ĠAuthor : ĠAn at oly ĠK is lov Ġ( an at oly @ s our cer er . io ) Ċ Ċ package Ġapp . extract ors Ċ Ċ import Ġapp . model . Commit Stats Ċ import Ġapp . model . Diff File Ċ Ċ class ĠCpp Extractor Ġ: ĠExtract or Interface Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLANGUAGE _ NAME Ġ= ĠLang . CPP ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEMPLATE Ġ= Ġ" template " ĊĠĠĠĠĠĠĠ Ġval Ġimport Regex Ġ= ĠRegex (""" ^ ([ ^\ n ]* # include )\ s [^\ n ]* """) ĊĠĠĠĠĠĠĠ Ġval Ġcomment Regex Ġ= ĠRegex (""" ^ ([ ^\ n ]* // )[ ^\ n ]* """) ĊĠĠĠĠĠĠĠ Ġval Ġextract Import Regex Ġ= ĠRegex (""" # include \ s + [" < ]( \ w + [ /\ w + ]* (\ .\ w + )? )[ "> ] """) ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Regex Ġ= ĠRegex (""" template \ s *< """) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract Imports ( file Content : ĠList < String >): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠĠĠĠĠ Ġfile Content . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġextract Import Regex . find ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Lib Ġ= Ġres . group Values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. last Ġ{ Ġ! it . startsWith (".") Ġ&& Ġit Ġ!= Ġ"" } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimports . add ( line Lib ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġimports . toSet (). toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract ( files : ĠList < Diff File >): ĠList < Commit Stats > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= Ġsuper . extract ( files ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTemplates Ġfun Ġfact . ĊĠĠĠĠĠĠĠ Ġval Ġall Added Ġ= Ġfiles . map { Ġfile Ġ-> Ġfile . getAll Added () Ġ}. flatten () ĊĠĠĠĠĠĠĠ Ġval Ġall Deleted Ġ= Ġfiles . map { Ġfile Ġ-> Ġfile . getAll Deleted () Ġ}. flatten () ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate All Added Ġ= Ġall Added . filter Ġ{ Ġis Template ( it ) Ġ}. size ĊĠĠĠĠĠĠĠ Ġval Ġtemplate All Deleted Ġ= Ġall Deleted . filter Ġ{ Ġis Template ( it ) Ġ}. size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( template All Added Ġ> Ġ 0 Ġ|| Ġtemplate All Deleted Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats . add ( Commit Stats ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate All Added , Ġtemplate All Deleted , ĠExtract or Interface . TYPE _ SY NTAX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtech Ġ= ĠLANGUAGE _ NAME Ġ+ ĠExtract or Interface . SEPARATOR Ġ+ ĠTEMPLATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstats ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtokenize ( line : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnew Line Ġ= Ġimport Regex . replace ( line , Ġ"") ĊĠĠĠĠĠĠĠ Ġnew Line Ġ= Ġcomment Regex . replace ( new Line , Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . tokenize ( new Line ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmap Import To Index ( import : ĠString , Ġlang : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart sWith : ĠBoolean ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . map Import To Index ( import , Ġlang , Ġstart sWith Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Language Name (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLANGUAGE _ NAME ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Template ( line : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġline . contains ( template Regex ) ĊĠĠĠ Ġ} Ċ } Ċ