Ċ Ċ package Ġapp . extract ors Ċ Ċ class ĠCr ystal Extractor Ġ: ĠExtract or Interface Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLANGUAGE _ NAME Ġ= ĠLang . CR Y ST AL ĊĠĠĠĠĠĠĠ Ġval Ġimport Regex Ġ= ĠRegex (""" require \ s + \" (\ w +)\ """ ") ĊĠĠĠĠĠĠĠ Ġval Ġcomment Regex Ġ= ĠRegex (""" ^ ([ ^\ n ]* # )[ ^\ n ]* """) ĊĠĠĠĠĠĠĠ Ġval Ġextract Import Regex Ġ= ĠRegex (""" require \ s + \" (. +)\ """ ") ĊĠĠĠĠĠĠĠ Ġval Ġinclude Regex Ġ= ĠRegex (""" include \ s + (\ w +) :: .+ """) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 Ġ!= Ġ"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimports . add ( line Lib ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( imports . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Content . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġinclude Regex . find ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimports . add ( res . group Values . last (). toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimports . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ĊĠĠĠ Ġ} Ċ } Ċ