/* Ċ Ġ* Ġ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 . check ers . declaration Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . fir . F ir Source Element Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . context . Checker Context Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . modal ity Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . Diagnostic Reporter Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . F ir Errors Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . report On Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . impl . F ir Default Property Accessor Ċ import Ġorg . jetbrains . kotlin . fir . types . F ir Implicit Type Ref Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ Ċ internal Ġfun Ġis Inside Expect Class ( containing Class : ĠF ir Regular Class , Ġcontext : ĠCheck er Context ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Inside Specific Class ( containing Class , Ġcontext ) Ġ{ Ġklass Ġ-> Ġklass . is Expect Ġ} Ċ } Ċ Ċ internal Ġfun Ġis Inside External Class ( containing Class : ĠF ir Regular Class , Ġcontext : ĠCheck er Context ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Inside Specific Class ( containing Class , Ġcontext ) Ġ{ Ġklass Ġ-> Ġklass . is External Ġ} Ċ } Ċ Ċ // ĠNote Ġthat Ġthe Ġclass Ġthat Ġcontains Ġthe Ġcurrently Ġvisit ing Ġdeclaration Ġwill Ġ* not * Ġbe Ġin Ġthe Ġcontext 's Ġcontaining Ġdeclarations Ġ* yet *. Ċ private Ġinline Ġfun Ġis Inside Specific Class ( ĊĠĠĠ Ġcontaining Class : ĠF ir Regular Class , ĊĠĠĠ Ġcontext : ĠCheck er Context , ĊĠĠĠ Ġpredicate : Ġ( F ir Regular Class ) Ġ-> ĠBoolean Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġpredicate . invoke ( containing Class ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . containing Declarations . as Re versed (). any Ġ{ Ġit Ġis ĠF ir Regular Class Ġ&& Ġpredicate . invoke ( it ) Ġ} Ċ } Ċ Ċ internal Ġfun ĠF ir Member Declaration . is Effect ively Expect ( ĊĠĠĠ Ġcontaining Class : ĠF ir Regular Class ?, ĊĠĠĠ Ġcontext : ĠCheck er Context , Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this . is Expect ) Ġreturn Ġtrue ĊĊĠĠĠ Ġreturn Ġcontaining Class Ġ!= Ġnull Ġ&& Ġis Inside Expect Class ( containing Class , Ġcontext ) Ċ } Ċ Ċ internal Ġfun ĠF ir Member Declaration . is Effect ively External ( ĊĠĠĠ Ġcontaining Class : ĠF ir Regular Class ?, ĊĠĠĠ Ġcontext : ĠCheck er Context , Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this . is External ) Ġreturn Ġtrue ĊĊĠĠĠ Ġ// ĠNB : Ġ[ Member Descriptor . is Effect ively External ] Ġchecks Ġproperty Ġaccessors Ġfor Ġproperty Ġand Ġvice Ġvers a . ĊĠĠĠ Ġ// ĠBut , Ġraw ĠFIR Ġcreation Ġalready Ġdid Ġsuch Ġup ward / down ward Ġpropagation Ġof Ġmodifiers . ĊĊĠĠĠ Ġreturn Ġcontaining Class Ġ!= Ġnull Ġ&& Ġis Inside External Class ( containing Class , Ġcontext ) Ċ } Ċ Ċ // ĠTODO : Ġcheck Ġclass Ġtoo Ċ internal Ġfun Ġcheck Expect Declaration Visibility And Body ( ĊĠĠĠ Ġdeclaration : ĠF ir Member Declaration , ĊĠĠĠ Ġsource : ĠF ir Source Element , ĊĠĠĠ Ġreporter : ĠDiagnostic Reporter , ĊĠĠĠ Ġcontext : ĠCheck er Context Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( declaration . is Expect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Vis ibilities . is Private ( declaration . visibility )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( source , ĠF ir Errors . EXPECTED _ PRIVATE _ DECL AR ATION , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠF ir Simple Function Ġ&& Ġdeclaration . has Body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( source , ĠF ir Errors . EXPECTED _ DECL AR ATION _ WITH _ BODY , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠMat ched ĠFE Ġ 1 . 0 's Ġ[ Declarations Checker # check Property Initializer ]. Ċ internal Ġfun Ġcheck Property Initializer ( ĊĠĠĠ Ġcontaining Class : ĠF ir Regular Class ?, ĊĠĠĠ Ġproperty : ĠF ir Property , ĊĠĠĠ Ġmodifier List : ĠF ir Modifier List ?, ĊĠĠĠ Ġis Initialized : ĠBoolean , ĊĠĠĠ Ġreporter : ĠDiagnostic Reporter , ĊĠĠĠ Ġcontext : ĠCheck er Context Ċ ) Ġ{ ĊĠĠĠ Ġval Ġin Interface Ġ= Ġcontaining Class ?. is Interface Ġ== Ġtrue ĊĠĠĠ Ġval Ġhas Abstract Modifier Ġ= Ġmodifier List ?. modifiers ?. any Ġ{ Ġit . token Ġ== ĠK t Tokens . AB STR ACT _ KEYWORD Ġ} Ġ== Ġtrue ĊĠĠĠ Ġval Ġis Abstract Ġ= Ġproperty . is Abstract Ġ|| Ġhas Abstract Modifier ĊĠĠĠ Ġif Ġ( is Abstract ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( property . initializer Ġ== Ġnull Ġ&& Ġproperty . delegate Ġ== Ġnull Ġ&& Ġproperty . returnType Ref Ġis ĠF ir Implicit Type Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . source ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . PROPERTY _ WITH _ NO _ TYPE _ NO _ INITIAL IZER , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbacking Field Required Ġ= Ġproperty . has Backing Field ĊĠĠĠ Ġif Ġ( in Interface Ġ&& Ġbacking Field Required Ġ&& Ġproperty . has Accessor Implementation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproperty . source ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . BACK ING _ FIELD _ IN _ INTERFACE , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Expect Ġ= Ġproperty . is Effect ively Expect ( containing Class , Ġcontext ) ĊĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġproperty . initializer Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . initializer ?. source ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Interface Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . PROPERTY _ INITIAL IZER _ IN _ INTERFACE , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . EXPECTED _ PROPERTY _ INITIAL IZER , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! back ing Field Required Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . PROPERTY _ INITIAL IZER _ NO _ BACK ING _ FIELD , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . receiver Type Ref Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . EXTENSION _ PROPERTY _ WITH _ BACK ING _ FIELD , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproperty . delegate Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . delegate ?. source ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Interface Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . DE LEG ATED _ PROPERTY _ IN _ INTERFACE , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . EXPECTED _ DE LEG ATED _ PROPERTY , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Source Ġ= Ġproperty . source Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis External Ġ= Ġproperty . is Effect ively External ( containing Class , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( back ing Field Required Ġ&& Ġ! in Interface Ġ&& Ġ! property . is Late Init Ġ&& Ġ! is Expect Ġ&& Ġ! isInitialized Ġ&& Ġ! is External ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . receiver Type Ref Ġ!= Ġnull Ġ&& Ġ! property . has Accessor Implementation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( property Source , ĠF ir Errors . EXTENSION _ PROPERTY _ MUST _ HAVE _ ACCESS ORS _ OR _ BE _ AB STR ACT , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠTODO : Ġcan Ġbe Ġsupp ressed Ġnot Ġto Ġreport Ġdiagnostics Ġabout Ġno Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( containing Class Ġ== Ġnull Ġ|| Ġproperty . has Accessor Implementation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( property Source , ĠF ir Errors . MUST _ BE _ INITIAL IZED , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( property Source , ĠF ir Errors . MUST _ BE _ INITIAL IZED _ OR _ BE _ AB STR ACT , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . is Late Init ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Expect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( property Source , ĠF ir Errors . EXPECTED _ LATE INIT _ PROPERTY , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġlike Ġ[ Binding Context . MUST _ BE _ LATE INIT ], Ġwe Ġshould Ġconsider Ġvariable Ġwith Ġun initialized Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( back ing Field Required Ġ&& Ġ! in Interface Ġ&& Ġis Initialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( property Source , ĠF ir Errors . UN NE C ESS ARY _ LATE INIT , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġcheck Property Accessors ( ĊĠĠĠ Ġproperty : ĠF ir Property , ĊĠĠĠ Ġreporter : ĠDiagnostic Reporter , ĊĠĠĠ Ġcontext : ĠCheck er Context Ċ ) Ġ{ ĊĠĠĠ Ġproperty . setter ?. source ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( property . is Val ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( it , ĠF ir Errors . VAL _ WITH _ SET TER , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠF ir Property . has Accessor Implementation : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġ( getter Ġ! is ĠF ir Default Property Accessor Ġ&& Ġgetter ?. has Body Ġ== Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( setter Ġ! is ĠF ir Default Property Accessor Ġ&& Ġsetter ?. has Body Ġ== Ġtrue ) Ċ Ċ internal Ġval ĠF ir Class <* >. can Have Open Members : ĠBoolean Ġget () Ġ= Ġmod ality () Ġ!= ĠMod ality . FINAL Ġ|| Ġclass Kind Ġ== ĠClass Kind . ENUM _ CLASS Ċ Ċ internal Ġfun ĠF ir Regular Class . is Inline Or Value Class (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this . class Kind Ġ!= ĠClass Kind . CLASS ) Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġmodifier List Ġ= Ġwith ( F ir Modifier List ) Ġ{ Ġsource . get Modifier List () Ġ} ĊĠĠĠ Ġreturn Ġis Inline Ġ|| Ġmodifier List ?. modifiers ?. any Ġ{ Ġit . token Ġ== ĠK t Tokens . VALUE _ KEYWORD Ġ} Ġ== Ġtrue Ċ } Ċ