@ file : Jvm Name (" Task Ext ") Ċ Ċ package Ġcom . jetbrains . edu . learning . course Format . ext Ċ Ċ import Ġcom . intellij . ide . file Templates . File Template Manager Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . openapi . vfs . V fs Util Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . jetbrains . edu . learning . E du Names Ċ import Ġcom . jetbrains . edu . learning . E du Utils Ċ import Ġcom . jetbrains . edu . learning . course Format .* Ċ import Ġcom . jetbrains . edu . learning . course Format . tasks . Task Ċ import Ġjava . util . ArrayList Ċ import Ġkotlin . collections . HashSet Ċ import Ġkotlin . collections . component 1 Ċ import Ġkotlin . collections . component 2 Ċ Ċ val ĠTask . project : ĠProject ? Ġget () Ġ= Ġcourse . project Ċ Ċ val ĠTask . source Dir : ĠString ? Ġget () Ġ= Ġcourse . source Dir Ċ val ĠTask . test Dirs : ĠList < String > Ġget () Ġ= Ġcourse . test Dirs Ċ Ċ val ĠTask . is Framework Task : ĠBoolean Ġget () Ġ= Ġlesson Ġis ĠFramework Lesson Ċ Ċ val ĠTask . dir Name : ĠString Ġget () Ġ= Ġif Ġ( is Framework Task Ġ&& Ġcourse . is Study ) ĠE du Names . TASK Ġelse Ġname Ċ Ċ fun ĠTask . find Source Dir ( task Dir : ĠVirtual File ): ĠVirtual File ? Ġ{ ĊĠ Ġval Ġsource Dir Ġ= Ġsource Dir Ġ?: Ġreturn Ġnull ĊĠ Ġreturn Ġtask Dir . find File By RelativePath ( source Dir ) Ċ } Ċ Ċ fun ĠTask . find Test Dirs ( task Dir : ĠVirtual File ): ĠList < Virtual File > Ġ= Ġtest Dirs . map NotNull Ġ{ Ġtask Dir . find File By RelativePath ( it ) Ġ} Ċ Ċ fun ĠTask . find Test Dirs ( project : ĠProject ): ĠList < Virtual File > Ġ{ ĊĠ Ġval Ġtask Dir Ġ= Ġget Dir ( project ) Ġ?: Ġreturn Ġempty List () ĊĠ Ġreturn Ġfind Test Dirs ( task Dir ) Ċ } Ċ Ċ val ĠTask . placeholder Dependencies : ĠList < Answer Placeholder Dependency > ĊĠ Ġget () Ġ= Ġtask Files . values . flatMap Ġ{ Ġit . answer Place holders . map NotNull Ġ{ Ġit . placeholder Dependency Ġ} Ġ} Ċ Ċ fun ĠTask . getUn solved Task Dependencies (): ĠList < Task > Ġ{ ĊĠ Ġreturn Ġplaceholder Dependencies ĊĠĠĠ Ġ. map NotNull Ġ{ Ġit . resolve ( course )?. task File ?. task Ġ} ĊĠĠĠ Ġ. filter Ġ{ Ġit . status Ġ!= ĠCheck Status . S olved Ġ} ĊĠĠĠ Ġ. distinct () Ċ } Ċ Ċ fun ĠTask . get Dependent Tasks (): ĠSet < Task > Ġ{ ĊĠ Ġval Ġcourse Ġ= Ġcourse ĊĠ Ġreturn Ġcourse . items . flatMap Ġ{ Ġitem Ġ-> ĊĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠ Ġis ĠLess on Ġ-> Ġitem . get TaskList () ĊĠĠĠĠĠ Ġis ĠSection Ġ-> Ġitem . lessons . flatMap Ġ{ Ġit . task List Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ}. filter To ( HashSet ()) Ġ{ Ġtask Ġ-> ĊĠĠĠ Ġtask . placeholder Dependencies . any Ġ{ Ġit . resolve ( course )?. task File ?. task Ġ== Ġthis Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun ĠTask . has Changed Files ( project : ĠProject ): ĠBoolean Ġ{ ĊĠ Ġfor Ġ( task File Ġin Ġtask Files . values ) Ġ{ ĊĠĠĠ Ġval Ġdocument Ġ= Ġtask File . getDocument ( project ) Ġ?: Ġcontinue ĊĠĠĠ Ġif Ġ( document . text Ġ!= Ġtask File . getText ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠTask . save Student Answers IfNeeded ( project : ĠProject ) Ġ{ ĊĠ Ġif Ġ( lesson Ġ! is ĠFramework Lesson ) Ġreturn ĊĊĠ Ġval Ġtask Dir Ġ= Ġget Task Dir ( project ) Ġ?: Ġreturn ĊĠ Ġfor Ġ(( _, Ġtask File ) Ġin Ġtask Files ) Ġ{ ĊĠĠĠ Ġval Ġvirtual File Ġ= ĠE du Utils . find Task File In Dir ( task File , Ġtask Dir ) Ġ?: Ġcontinue ĊĠĠĠ Ġval Ġdocument Ġ= ĠFile Document Manager . getInstance (). getDocument ( virtual File ) Ġ?: Ġcontinue ĊĠĠĠ Ġfor Ġ( placeholder Ġin Ġtask File . answer Place holders ) Ġ{ ĊĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġplaceholder . offset ĊĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġstart Offset Ġ+ Ġplaceholder . real Length ĊĠĠĠĠĠ Ġplaceholder . student Answer Ġ= Ġdocument . getText ( Text Range . create ( start Offset , Ġend Offset )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun ĠTask . add Default Task Description () Ġ{ ĊĠ Ġval Ġformat Ġ= ĠE du Utils . getDefault Task Description Format () ĊĠ Ġval ĠfileName Ġ= Ġformat . description FileName ĊĠ Ġval Ġtemplate Ġ= ĠFile Template Manager . getDefaultInstance (). get Internal Template ( fileName ) Ġ?: Ġreturn ĊĠ Ġdescription Text Ġ= Ġtemplate . text ĊĠ Ġdescription Format Ġ= Ġformat Ċ } Ċ Ċ fun ĠTask . getDescription File ( project : ĠProject ): ĠVirtual File ? Ġ{ ĊĠ Ġval Ġtask Dir Ġ= Ġget Task Dir ( project ) Ġ?: Ġreturn Ġnull ĊĠ Ġreturn Ġtask Dir . find Child ( description Format . description FileName ) Ċ } Ċ Ċ fun ĠTask . has Task Files Not Inside Source Dir ( project : ĠProject ): ĠBoolean Ġ{ ĊĠ Ġval Ġtask Dir Ġ= Ġget Dir ( project ) Ġ?: Ġerror (" Directory Ġfor Ġtask Ġ$ name Ġnot Ġfound ") ĊĠ Ġval Ġsource Dir Ġ= Ġfind Source Dir ( task Dir ) Ġ?: Ġreturn Ġfalse ĊĠ Ġreturn Ġtask Files . values . any Ġ{ ĊĠĠĠ Ġval Ġvirtual File Ġ= Ġit . get Virtual File ( project ) ĊĠĠĠ Ġif Ġ( virtual File Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠLogger . getInstance ( Task :: class . java ). error (" Virtual File Ġfor Ġ${ it . name } Ġnot Ġfound ") ĊĠĠĠĠĠ Ġreturn @ any Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġ! V fs Util . is Ancestor ( source Dir , Ġvirtual File , Ġtrue ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠTask File . can Show Solution () Ġ= ĊĠ Ġanswer Place holders . isNotEmpty () Ġ&& Ġanswer Place holders . all Ġ{ Ġit . possible Answer . isNotEmpty () Ġ} Ċ Ċ fun ĠTask . can Show Solution () Ġ= Ġtask Files . values . any Ġ{ Ġit . can Show Solution () Ġ} Ċ Ċ fun ĠTask . task Description Hint Blocks (): ĠString Ġ{ ĊĠ Ġval Ġtext Ġ= ĠStringBuffer () ĊĠ Ġval Ġhints Ġ= ĠArrayList < String >() ĊĠ Ġfor Ġ( value Ġin Ġtask Files . values ) Ġ{ ĊĠĠĠ Ġfor Ġ( placeholder Ġin Ġvalue . answer Place holders ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! placeholder . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfor Ġ( hint Ġin Ġplaceholder . hints ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! hint . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhints . add ( hint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġif Ġ( hints . isEmpty ()) Ġ{ ĊĠĠĠ Ġreturn Ġ"" ĊĠ Ġ} ĊĊĠ Ġtext . append ("< br >") ĊĠ Ġtext . append ("\ n ") ĊĠ Ġfor Ġ( hint Ġin Ġhints ) Ġ{ ĊĠĠĠ Ġtext . append ("< div Ġclass =' hint '> ") ĊĠĠĠĠĠ Ġ. append ( hint ) ĊĠĠĠĠĠ Ġ. append ("</ div >") ĊĠĠĠĠĠ Ġ. append ("\ n ") ĊĠ Ġ} ĊĠ Ġtext . append ("< br >") ĊĠ Ġtext . append ("\ n ") ĊĊĠ Ġreturn Ġtext . toString () Ċ }