/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* Ġ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 . fir . analysis . diagnostics Ċ Ċ import Ġorg . jetbrains . kotlin . Kt Node Types Ċ import Ġorg . jetbrains . kotlin . fir . F ir Fake Source Element Kind Ċ import Ġorg . jetbrains . kotlin . fir . F ir Source Element Ċ import Ġorg . jetbrains . kotlin . fir . analysis . getChild Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Simple Function Ċ import Ġorg . jetbrains . kotlin . fir . declarations . isIn fix Ċ import Ġorg . jetbrains . kotlin . fir . declarations . is Operator Ċ import Ġorg . jetbrains . kotlin . fir . diagnostics .* Ċ import Ġorg . jetbrains . kotlin . fir . resolve . calls .* Ċ import Ġorg . jetbrains . kotlin . fir . resolve . diagnostics .* Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Backing Field Symbol Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . resolve . calls . tower . is Success Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ Ċ private Ġfun ĠC one Diagnostic . to F ir Diagnostic ( ĊĠĠĠ Ġsource : ĠF ir Source Element , ĊĠĠĠ Ġqualified Access Source : ĠF ir Source Element ? Ċ ): ĠF ir Diagnostic < F ir Source Element >? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠC one Un resolved Reference Error Ġ-> ĠF ir Errors . UN RESOL VED _ REFERENCE . on ( source , Ġthis . name ?. asString () Ġ?: Ġ"< No Ġname >") ĊĠĠĠ Ġis ĠC one Un resolved Symbol Error Ġ-> ĠF ir Errors . UN RESOL VED _ REFERENCE . on ( source , Ġthis . class Id . asString ()) ĊĠĠĠ Ġis ĠC one Un resolved Name Error Ġ-> ĠF ir Errors . UN RESOL VED _ REFERENCE . on ( source , Ġthis . name . asString ()) ĊĠĠĠ Ġis ĠC one Un resolved Qualifier Error Ġ-> ĠF ir Errors . UN RESOL VED _ REFERENCE . on ( source , Ġthis . qual ifier ) ĊĠĠĠ Ġis ĠC one Hidden Candidate Error Ġ-> ĠF ir Errors . HIDDEN . on ( source , Ġthis . candidate Symbol ) ĊĠĠĠ Ġis ĠC one Amb iguity Error Ġ-> Ġif Ġ(! this . applic ability . is Success ) Ġ{ ĊĠĠĠĠĠĠĠ ĠF ir Errors . NONE _ AP PL IC ABLE . on ( source , Ġthis . candidates ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠF ir Errors . OVERLOAD _ RESOL UTION _ AM BIG U ITY . on ( source , Ġthis . candidates ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠC one Operator Amb iguity Error Ġ-> ĠF ir Errors . ASSIGN _ OPERATOR _ AM BIG U ITY . on ( source , Ġthis . candidates ) ĊĠĠĠ Ġis ĠC one Variable Expected Error Ġ-> ĠF ir Errors . VARIABLE _ EXPECTED . on ( source ) ĊĠĠĠ Ġis ĠC one Val Re assignment Error Ġ-> Ġwhen Ġ( val Ġsymbol Ġ= Ġthis . variable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠF ir Backing Field Symbol Ġ-> ĠF ir Errors . VAL _ RE ASSIGN MENT _ V IA _ BACK ING _ FIELD _ ERROR . on ( source , Ġsymbol . fir . symbol ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠF ir Errors . VAL _ RE ASSIGN MENT . on ( source , Ġsymbol ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠC one Type Mismatch Error Ġ-> ĠF ir Errors . TYPE _ MIS MATCH . on ( qualified Access Source Ġ?: Ġsource , Ġthis . expected Type , Ġthis . actual Type ) ĊĠĠĠ Ġis ĠC one Unexpected Type Arguments Error Ġ-> ĠF ir Errors . TYPE _ ARGUMENT S _ NOT _ ALLOWED . on ( this . source . safe As () Ġ?: Ġsource ) ĊĠĠĠ Ġis ĠC one Illegal Annotation Error Ġ-> ĠF ir Errors . NOT _ AN _ AN NOT ATION _ CLASS . on ( source , Ġthis . name . asString ()) ĊĠĠĠ Ġis ĠC one Wrong NumberOf Type Arguments Error Ġ-> ĊĠĠĠĠĠĠĠ ĠF ir Errors . WRONG _ NUMBER _ OF _ TYPE _ ARGUMENT S . on ( qualified Access Source Ġ?: Ġsource , Ġthis . desired Count , Ġthis . type ) ĊĠĠĠ Ġis ĠC one No Type Arguments OnR hs Error Ġ-> ĊĠĠĠĠĠĠĠ ĠF ir Errors . NO _ TYPE _ ARGUMENT S _ ON _ RHS . on ( qualified Access Source Ġ?: Ġsource , Ġthis . desired Count , Ġthis . type ) ĊĠĠĠ Ġis ĠC one Simple Diagnostic Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġsource . kind Ġis ĠF ir Fake Source Element Kind Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . get Factory (). on ( qualified Access Source Ġ?: Ġsource ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠC one Instance Access Before Super Call Ġ-> ĠF ir Errors . INSTANCE _ ACCESS _ BEFORE _ SUPER _ CALL . on ( source , Ġthis . target ) ĊĠĠĠ Ġis ĠC one Stub Diagnostic Ġ-> Ġnull ĊĠĠĠ Ġis ĠC one Intermediate Diagnostic Ġ-> Ġnull ĊĠĠĠ Ġis ĠC one Contract Description Error Ġ-> ĠF ir Errors . ERROR _ IN _ CONTRACT _ DESCRIPTION . on ( source , Ġthis . reason ) ĊĠĠĠ Ġis ĠC one Type Parameter Sup ertype Ġ-> ĠF ir Errors . SUPER TYPE _ NOT _ A _ CLASS _ OR _ INTERFACE . on ( source , Ġthis . reason ) ĊĠĠĠ Ġis ĠC one Type Parameter In Qualified Access Ġ-> Ġnull Ġ// Ġreported Ġin Ġvarious Ġcheck ers Ġinstead ĊĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġdiagnostic Ġtype : Ġ${ this . java Class }") Ċ } Ċ Ċ fun ĠC one Diagnostic . to F ir Diagnostics ( ĊĠĠĠ Ġsource : ĠF ir Source Element , ĊĠĠĠ Ġqualified Access Source : ĠF ir Source Element ? Ċ ): ĠList < F ir Diagnostic < F ir Source Element >> Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠC one In applic able Candidate Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap In applic able Candidate Error ( this , Ġsource , Ġqualified Access Source ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠlistOf NotNull ( to F ir Diagnostic ( source , Ġqualified Access Source )) Ċ } Ċ Ċ private Ġfun ĠC one Kotlin Type . is Effect ively NotNull (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠC one Class Like Type Ġ-> Ġ! is Marked Nullable ĊĠĠĠĠĠĠĠ Ġis ĠC one Type ParameterType Ġ-> Ġ! is Marked Nullable Ġ&& Ġlookup Tag . type Parameter Symbol . fir . bounds . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . cone Type Safe < Con e Kotlin Type >() ?. is Effect ively NotNull () Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġmap Unsafe Call Error ( ĊĠĠĠ Ġdiagnostic : ĠC one In applic able Candidate Error , ĊĠĠĠ Ġsource : ĠF ir Source Element , ĊĠĠĠ Ġroot Cause : ĠResolution Diagnostic ?, ĊĠĠĠ Ġqualified Access Source : ĠF ir Source Element ?, Ċ ): ĠF ir Diagnostic < *> ? Ġ{ ĊĠĠĠ Ġif Ġ( root Cause Ġ! is ĠIn applic able Wrong Receiver ) Ġreturn Ġnull ĊĠĠĠ Ġval Ġactual Type Ġ= Ġroot Cause . actual Type Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġexpected Type Ġ= Ġroot Cause . expected Type ĊĠĠĠ Ġif Ġ( actual Type . is Nullable Ġ&& Ġ( expected Type Ġ== Ġnull Ġ|| Ġexpected Type . is Effect ively NotNull ())) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( diagnostic . candidate . call Info . is Implicit Invoke ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Errors . UN SAFE _ IMP LICIT _ IN VOKE _ CALL . on ( source , Ġactual Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidate Function Ġ= Ġdiagnostic . candidate . symbol . fir Ġas ? ĠF ir Simple Function ĊĠĠĠĠĠĠĠ Ġval Ġcandidate FunctionName Ġ= Ġcandidate Function ?. name ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġdiagnostic . candidate . call Info . explicit Receiver ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġdiagnostic . candidate . call Info . argument List . arguments . single OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ!= Ġnull Ġ&& Ġright Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . elementType Ġ== ĠK t Node Types . OPERATION _ REFERENCE Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( candidate Function ?. is Operator Ġ== Ġtrue Ġ|| Ġcandidate Function ?. isIn fix Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Token Ġ= Ġsource . getChild ( Kt Tokens . IDENTIFIER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate Function . isIn fix Ġ&& Ġoperation Token ?. elementType Ġ== ĠK t Tokens . IDENTIFIER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Errors . UN SAFE _ IN FIX _ CALL . on ( source , Ġleft , Ġcandidate FunctionName !!. asString (), Ġright ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate Function . is Operator Ġ&& Ġoperation Token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Errors . UN SAFE _ OPERATOR _ CALL . on ( source , Ġleft , Ġcandidate FunctionName !!. asString (), Ġright ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( source . kind Ġ== ĠF ir Fake Source Element Kind . Array Access Name Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Errors . UN SAFE _ CALL . on ( source , Ġactual Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Errors . UN SAFE _ CALL . on ( qualified Access Source Ġ?: Ġsource , Ġactual Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġfun Ġmap In applic able Candidate Error ( ĊĠĠĠ Ġdiagnostic : ĠC one In applic able Candidate Error , ĊĠĠĠ Ġsource : ĠF ir Source Element , ĊĠĠĠ Ġqualified Access Source : ĠF ir Source Element ?, Ċ ): ĠList < F ir Diagnostic < F ir Source Element >> Ġ{ ĊĠĠĠ Ġ// ĠTODO : ĠNeed Ġto Ġdistinguish ĠSM ART CAST _ IMP OSS IBLE ĊĠĠĠ Ġreturn Ġdiagnostic . candidate . diagnostics . filter Ġ{ Ġit . applic ability Ġ== Ġdiagnostic . applic ability Ġ}. map NotNull Ġ{ Ġroot Cause Ġ-> ĊĠĠĠĠĠĠĠ Ġmap Unsafe Call Error ( diagnostic , Ġsource , Ġroot Cause , Ġqualified Access Source )?. let Ġ{ Ġreturn @ map NotNull Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( root Cause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVar arg Argument Outside Parent heses Ġ-> ĠF ir Errors . VAR ARG _ OUT SIDE _ PARENT HE SES . on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Cause . argument . source Ġ?: Ġqualified Access Source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNamed Argument Not Allowed Ġ-> ĠF ir Errors . NAMED _ ARGUMENT S _ NOT _ ALLOWED . on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Cause . argument . source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Cause . for bidden Named Arguments Target ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNon Var arg Spread Ġ-> ĠF ir Errors . NON _ VAR ARG _ SP READ . on ( root Cause . argument . source ?. getChild ( Kt Tokens . MUL , Ġdepth Ġ= Ġ 1 ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArgument Passed Tw ice Ġ-> ĠF ir Errors . ARGUMENT _ PAS SED _ TW ICE . on ( root Cause . argument . source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠToo Many Arguments Ġ-> ĠF ir Errors . TOO _ MAN Y _ ARGUMENT S . on ( root Cause . argument . source Ġ?: Ġsource , Ġroot Cause . function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Value For Parameter Ġ-> ĠF ir Errors . NO _ VALUE _ FOR _ PARAMETER . on ( qualified Access Source Ġ?: Ġsource , Ġroot Cause . value Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. if Empty Ġ{ ĠlistOf ( F ir Errors . IN AP PL IC ABLE _ C AND ID ATE . on ( source , Ġdiagnostic . candidate . symbol )) Ġ} Ċ } Ċ Ċ private Ġfun ĠC one Simple Diagnostic . get Factory (): ĠF ir Diagnostic Factory 0 < F ir Source Element , Ġ*> Ġ{ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġreturn Ġwhen Ġ( kind ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Syntax Ġ-> ĠF ir Errors . SY NTAX ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Return Not Allowed Ġ-> ĠF ir Errors . RETURN _ NOT _ ALLOWED ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Un resolved Label Ġ-> ĠF ir Errors . UN RESOL VED _ LABEL ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . No This Ġ-> ĠF ir Errors . NO _ THIS ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Illegal Const Expression Ġ-> ĠF ir Errors . IL LEG AL _ CONST _ EXPRESSION ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Illegal Un ders core Ġ-> ĠF ir Errors . IL LEG AL _ UNDER SCORE ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Deserialization Error Ġ-> ĠF ir Errors . DE SERIAL IZATION _ ERROR ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Inference Error Ġ-> ĠF ir Errors . IN FER ENCE _ ERROR ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Enum As Sup ertype Ġ-> ĠF ir Errors . ENUM _ AS _ SUPER TYPE ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Recursion In Sup ert ypes Ġ-> ĠF ir Errors . REC UR SION _ IN _ SUPER TYPES ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Recursion In Implicit Types Ġ-> ĠF ir Errors . REC UR SION _ IN _ IMP LICIT _ TYPES ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Java Ġ-> ĠF ir Errors . ERROR _ FROM _ JAVA _ RESOL UTION ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Super Not Allowed Ġ-> ĠF ir Errors . SUPER _ IS _ NOT _ AN _ EXPRESSION ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Expression Required Ġ-> ĠF ir Errors . EXPRESSION _ REQUIRED ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Jump Outside Loop Ġ-> ĠF ir Errors . BREAK _ OR _ CONTINUE _ OUT SIDE _ A _ LOOP ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Not Loop Label Ġ-> ĠF ir Errors . NOT _ A _ LOOP _ LABEL ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Variable Expected Ġ-> ĠF ir Errors . VARIABLE _ EXPECTED ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Value Parameter With No Type Annotation Ġ-> ĠF ir Errors . VALUE _ PARAMETER _ WITH _ NO _ TYPE _ AN NOT ATION ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Unknown Callable Kind Ġ-> ĠF ir Errors . UNKNOWN _ CALL ABLE _ KIND ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Illegal Projection Usage Ġ-> ĠF ir Errors . IL LEG AL _ PRO JECTION _ USAGE ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Missing Std lib Class Ġ-> ĠF ir Errors . MISSING _ STD LIB _ CLASS ĊĠĠĠĠĠĠĠ ĠDiagnostic Kind . Other Ġ-> ĠF ir Errors . OTHER _ ERROR ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġdiagnostic Ġkind : Ġ$ kind Ġat Ġ$ java Class ") ĊĠĠĠ Ġ} Ċ } Ċ