/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 Ġ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 . idea . quick fix . expect actual Ċ Ċ import Ġcom . intellij . code Insight . int ention . Int ention Action Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Factory Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . idea . cache s . project . implemented Modules Ċ import Ġorg . jetbrains . kotlin . idea . core . to Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . quick fix . Kotlin Int ention Actions Factory Ċ import Ġorg . jetbrains . kotlin . idea . util . lift To Expected Ċ import Ġorg . jetbrains . kotlin . idea . util . module Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . containing Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . create Smart Pointer Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . has Actual Modifier Ċ Ċ sealed Ġclass ĠCreate Expected Fix < D Ġ: ĠK t Named Declaration >( ĊĠĠĠ Ġdeclaration : ĠD , ĊĠĠĠ Ġtarget Expected Class : ĠK t Class Or Object ?, ĊĠĠĠ Ġcommon Module : ĠModule , ĊĠĠĠ Ġgenerate It : ĠK t Psi Factory .( Project , ĠD ) Ġ-> ĠD ? Ċ ) Ġ: ĠAbstract Create Declaration Fix < D >( declaration , Ġcommon Module , Ġgenerate It ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtarget Expected Class Pointer Ġ= Ġtarget Expected Class ?. create Smart Pointer () ĊĊĠĠĠ Ġoverride Ġfun ĠgetText () Ġ= Ġ" Create Ġexpected Ġ$ elementType Ġin Ġcommon Ġmodule Ġ${ module . name }" ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġeditor : ĠEditor ?, Ġfile : ĠK t File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Expected Class Ġ= Ġtarget Expected Class Pointer ?. element ĊĠĠĠĠĠĠĠ Ġval Ġexpected File Ġ= Ġtarget Expected Class ?. containing Kt File Ġ?: Ġget OrCreate Implementation File () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġdo Generate ( project , Ġeditor , Ġoriginal File Ġ= Ġfile , Ġtarget File Ġ= Ġexpected File , Ġtarget Class Ġ= Ġtarget Expected Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Existing File To Create Declaration ( ĊĠĠĠĠĠĠĠ Ġoriginal File : ĠK t File , ĊĠĠĠĠĠĠĠ Ġoriginal Declaration : ĠK t Named Declaration ĊĠĠĠ Ġ): ĠK t File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( other Declaration Ġin Ġoriginal File . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Declaration Ġ=== Ġoriginal Declaration ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! other Declaration . has Actual Modifier ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Declaration Ġ= Ġother Declaration . lift To Expected () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpected Declaration . containing Kt File ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠKotlin Int ention Actions Factory () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Create Actions ( diagnostic : ĠDiagnostic ): ĠList < Int ention Action > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠDiagnostic Factory . cast ( diagnostic , ĠErrors . ACT UAL _ WITHOUT _ EXPECT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġd . psi Element Ġas ? ĠK t Named Declaration Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompatibility Ġ= Ġd . b ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġfunction Ġwe Ġallow Ġit , Ġbecause Ġover loads Ġare Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compatibility . isNotEmpty () Ġ&& Ġdeclaration Ġ! is ĠK t Function ) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Class Ġ= Ġdeclaration . containing Class Or Object ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Containing Class Ġ= Ġcontaining Class ?. lift To Expected () Ġas ? ĠK t Class Or Object ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( containing Class Ġ!= Ġnull Ġ&& Ġexpected Containing Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġcase Ġfix Ġshould Ġbe Ġinvoked Ġon Ġcontaining Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġalready Ġan Ġexpected Ġclass , Ġwe Ġsuggest Ġonly Ġfor Ġits Ġmodule , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġwe Ġsuggest Ġfor Ġall Ġrelevant Ġexpected Ġmodules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Modules Ġ= Ġexpected Containing Class ?. module ?. let Ġ{ ĠlistOf ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdeclaration . module ?. implemented Modules ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġexpected Modules . map Ġ{ ĠCreate Expected Class Fix ( declaration , Ġexpected Containing Class , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> Ġexpected Modules . map Ġ{ ĠCreate Expected Function Fix ( declaration , Ġexpected Containing Class , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property , Ġis ĠK t Parameter Ġ-> Ġexpected Modules . map Ġ{ ĠCreate Expected Property Fix ( declaration , Ġexpected Containing Class , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCreate Expected Class Fix ( ĊĠĠĠ Ġklass : ĠK t Class Or Object , ĊĠĠĠ Ġouter Expected Class : ĠK t Class Or Object ?, ĊĠĠĠ Ġcommon Module : ĠModule Ċ ) Ġ: ĠCreate Expected Fix < Kt Class Or Object >( klass , Ġouter Expected Class , Ġcommon Module , Ġ{ Ġproject , Ġelement Ġ-> ĊĠĠĠ Ġgenerate Class Or Object ( project , Ġtrue , Ġelement , ĠlistOf NotNull ( outer Expected Class )) Ċ }) Ċ Ċ class ĠCreate Expected Property Fix ( ĊĠĠĠ Ġproperty : ĠK t Named Declaration , ĊĠĠĠ Ġtarget Expected Class : ĠK t Class Or Object ?, ĊĠĠĠ Ġcommon Module : ĠModule Ċ ) Ġ: ĠCreate Expected Fix < Kt Named Declaration >( property , Ġtarget Expected Class , Ġcommon Module , Ġ{ Ġproject , Ġelement Ġ-> ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġelement . to Descriptor () Ġas ? ĠProperty Descriptor ĊĠĠĠ Ġdescriptor ?. let Ġ{ Ġgenerate Property ( project , Ġtrue , Ġelement , Ġdescriptor , Ġtarget Expected Class ) Ġ} Ċ }) Ċ Ċ class ĠCreate Expected Function Fix ( ĊĠĠĠ Ġfunction : ĠK t Function , ĊĠĠĠ Ġtarget Expected Class : ĠK t Class Or Object ?, ĊĠĠĠ Ġcommon Module : ĠModule Ċ ) Ġ: ĠCreate Expected Fix < Kt Function >( function , Ġtarget Expected Class , Ġcommon Module , Ġ{ Ġproject , Ġelement Ġ-> ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġelement . to Descriptor () Ġas ? ĠFunction Descriptor ĊĠĠĠ Ġdescriptor ?. let Ġ{ Ġgenerate Function ( project , Ġtrue , Ġelement , Ġdescriptor , Ġtarget Expected Class ) Ġ} Ċ }) ĊĊ