package Ġcom . jetbrains . rd . util . string Ċ Ċ /** Ċ Ġ* ĠRecursive Ġname . ĠFor Ġconstructs Ġlike ĠA aaa . B bb :: CCC Ċ Ġ*/ Ċ class ĠR Name Ġprivate Ġconstructor ( val Ġparent : R Name ?, Ġval Ġlocal Name : ĠString , Ġval Ġseparator : ĠString ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEmpty Ġ= ĠR Name ( null , Ġ"", Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( local Name : ĠString ) Ġ: Ġthis ( Empty , Ġlocal Name , Ġ"") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSe parator Ġdoesn 't Ġcount Ġif Ġlocal Name Ġis Ġempty Ġor Ġparent Ġis Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsub ( local Name : ĠString , Ġseparator : ĠString ) Ġ= ĠR Name ( this , Ġlocal Name , Ġseparator ) ĊĊĠĠĠ Ġfun Ġget Non Empty Root (): ĠR Name Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull Ġ|| Ġparent Ġ== ĠEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn Ġparent . get Non Empty Root () ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġfun Ġdrop Non Empty Root (): ĠR Name Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull Ġ|| Ġparent Ġ== ĠEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEmpty ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġparent . drop Non Empty Root () ĊĠĠĠĠĠĠĠ Ġreturn Ġtail . sub ( local Name , Ġseparator ) ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparent ?. toString ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+ Ġseparator Ġ+ Ġlocal Name ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġlocal Name ĊĠĠĠ Ġ} ĊĊ Ċ }