/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . nj 2 k . conversions Ċ Ċ import Ġcom . intellij . psi . Java TokenType Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . nj 2 k . Conversion Context Ċ import Ġorg . jetbrains . kotlin . nj 2 k . kotlin Binary Expression Ċ import Ġorg . jetbrains . kotlin . nj 2 k . kotlin Post fix Expression Ċ import Ġorg . jetbrains . kotlin . nj 2 k . kotlin Prefix Expression Ċ import Ġorg . jetbrains . kotlin . nj 2 k . tree .* Ċ import Ġorg . jetbrains . kotlin . nj 2 k . tree . impl .* ĊĊ Ċ class ĠOperator Expression Conversion ( private Ġval Ġcontext : ĠConversion Context ) Ġ: ĠRecursive Applicable Conversion Base () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply To Element ( element : ĠJ K Tree Element ): ĠJ K Tree Element Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠJ K Operator Expression ) Ġreturn Ġrecurse ( element ) ĊĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= Ġelement . operator Ġas ? ĠJ K Java Operator Impl Ġ?: Ġreturn Ġrecurse ( element ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ K Binary Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Token Ġ= Ġoperator . token . to Kt Token () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġapply To Element ( element :: left . det ached ()) Ġas ĠJ K Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġapply To Element ( element :: right . det ached ()) Ġas ĠJ K Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecurse ( convert Binary Expression ( left , Ġright , Ġoperator Token ). with Non Code Elements From ( element )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ K Prefix Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperand Ġ= Ġapply To Element ( element :: expression . det ached ()) Ġas ĠJ K Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecurse ( convert Prefix Expression ( operand , Ġoperator )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ K Post fix Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Token Ġ= Ġoperator . token . to Kt Token () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperand Ġ= Ġapply To Element ( element :: expression . det ached ()) Ġas ĠJ K Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecurse ( kotlin Post fix Expression ( operand , Ġoperator Token , Ġcontext . symbol Provider )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( element . java Class . toString ()) ĊĠĠĠĠĠĠĠ Ġ}. with Non Code Elements From ( element ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġconvert Prefix Expression ( operand : ĠJ K Expression , Ġjava Operator : ĠJ K Java Operator Impl ) Ġ= ĊĠĠĠĠĠĠĠ Ġconvert T ilde Expression ( operand , Ġjava Operator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġkotlin Prefix Expression ( operand , Ġjava Operator . token . to Kt Token (), Ġcontext . symbol Provider ) ĊĊĠĠĠ Ġprivate Ġfun Ġconvert T ilde Expression ( operand : ĠJ K Expression , Ġjava Operator : ĠJ K Java Operator Impl ): ĠJ K Expression ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( java Operator . token . psi Token Ġ== ĠJava TokenType . T IL DE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinv Call Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ KK t Call Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . symbol Provider . provide By Fq Name (" kotlin . Int . inv "), // TODO Ġcheck Ġif ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ K ArgumentList Impl () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ K Qualified Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ K Parent hesized Expression Impl ( operand ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ KK t Qualifier Impl . DOT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinv Call ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Binary Expression ( left : ĠJ K Expression , Ġright : ĠJ K Expression , Ġtoken : ĠJ KK t Operator Token ): ĠJ K Binary Expression Ġ= ĊĠĠĠĠĠĠĠ Ġconvert String Implicit Concatenation ( left , Ġright , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġkotlin Binary Expression ( left , Ġright , Ġtoken , Ġcontext . symbol Provider ) ĊĊĊĠĠĠ Ġprivate Ġfun Ġconvert String Implicit Concatenation ( left : ĠJ K Expression , Ġright : ĠJ K Expression , Ġtoken : ĠJ KK t Operator Token ): ĠJ K Binary Expression ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( token Ġis ĠJ KK t Single Value Operator Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtoken . psi Token Ġ== ĠK t Tokens . PLUS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġright . type ( context . symbol Provider )?. isString Type () Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġleft . type ( context . symbol Provider )?. isString Type () Ġ== Ġfalse ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtoString Call Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ KK t Call Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . symbol Provider . provide By Fq Name (" kotlin . Any . toString "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ K ArgumentList Impl () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Call Ġ= ĠJ K Qualified Expression Impl ( left , ĠJ KK t Qualifier Impl . DOT , ĠtoString Call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Binary Expression ( qualified Call , Ġright , ĠK t Tokens . PLUS , Ġcontext . symbol Provider ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull Ċ }