package Ġcom . plugin . fre ge . ins pe ctions Ċ Ċ import Ġcom . intellij . code Insight . navigation . Navigation Util Ċ import Ġcom . intellij . code Inspection . Local Quick Fix Ċ import Ġcom . intellij . code Inspection . Problem Descriptor Ċ import Ġcom . intellij . ide . DataManager Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . openapi . action System . DataContext Ċ import Ġcom . intellij . openapi . command . Write Command Action Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . popup . JB Popup Factory Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . util . parent OfType Ċ import Ġcom . intellij . ui . Colo red List Cell Renderer Ċ import Ġcom . plugin . fre ge . psi .* Ċ import Ġcom . plugin . fre ge . psi . mixin . Fre ge Program Util . imports Ċ import Ġcom . plugin . fre ge . psi . util . Fre ge Name Ċ import Ġcom . plugin . fre ge . stubs . index . Fre ge MethodName Index Ċ import Ġcom . plugin . fre ge . stubs . index . Fre ge Short ClassName Index Ċ import Ġjavax . swing . J List Ċ Ċ class ĠFre ge Add Import Quick Fix Ġ: ĠLocal Quick Fix Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Family Name (): ĠString Ġ= Ġ" Import Ġmodule " ĊĊĠĠĠ Ġoverride Ġfun Ġapply Fix ( project : ĠProject , Ġdescriptor : ĠProblem Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdescriptor . psi Element ?. let Ġ{ Ġusage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( usage Ġ! is ĠFre ge Composite Element Ġ|| Ġusage Ġis ĠFre ge Named Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusage . parent OfType < Fre ge Program >() ?. let Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠFre ge Name ( usage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġfind Candidates ( name , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Prompt To Pick Candidate ( module , Ġname , Ġcandidates , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Candidates ( name : ĠFre ge Name , Ġproject : ĠProject ): ĠList < Fre ge Program > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= ĠFre ge MethodName Index . find ByName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . short Name , Ġproject , ĠGlobal Search Scope . everything Scope ( project ) ĊĠĠĠĠĠĠĠ Ġ). map NotNull Ġ{ Ġit . parent OfType < Fre ge Program >( true ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠFre ge Short ClassName Index . find ByName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . short Name , Ġproject , ĠGlobal Search Scope . everything Scope ( project ) ĊĠĠĠĠĠĠĠ Ġ). map NotNull Ġ{ Ġit . parent OfType < Fre ge Program >( true ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( methods Ġ+ Ġclasses ). distinct () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Prompt To Pick Candidate ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠFre ge Program , ĊĠĠĠĠĠĠĠ Ġname : ĠFre ge Name , ĊĠĠĠĠĠĠĠ Ġcandidates : ĠList < Fre ge Program >, ĊĠĠĠĠĠĠĠ Ġproject : ĠProject ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( candidates . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠData Manager . getInstance (). data Context From Focus Async . on Success Ġ{ Ġdata Context Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpicker Ġ= ĠImport Picker UI ( data Context , Ġname , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicker . pick ( candidates ) Ġ{ Ġcandidate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrite Command Action . run Write Command Action ( project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImport Ad der . add Import ( module , Ġcandidate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠImport Picker UI ( ĊĠĠĠ Ġprivate Ġval Ġdata Context : ĠData Context , ĊĠĠĠ Ġprivate Ġval Ġname : ĠFre ge Name , ĊĠĠĠ Ġprivate Ġval Ġproject : ĠProject Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġpick ( candidates : ĠList < Fre ge Program >, Ġcallback : Ġ( Fre ge Program ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpopup Ġ= ĠJ B Popup Factory . getInstance (). create Popup Chooser Builder ( candidates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Import Ġ'${ name . short Name }' Ġfrom Ġmodule :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setItem Ch osen Callback Ġ{ Ġcallback ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set N amer For Filtering Ġ{ Ġit . qualified Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Renderer ( Candidate Renderer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Popup () ĊĠĠĠĠĠĠĠ ĠNavigation Util . hide Popup If D umb Mode Starts ( popup , Ġproject ) ĊĠĠĠĠĠĠĠ Ġpopup . show In Best Position For ( data Context ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠC andidate Renderer Ġ: ĠCo lo red List Cell Renderer < Fre ge Program >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcustomize Cell Renderer ( ĊĠĠĠĠĠĠĠ Ġlist : ĠJ List < out ĠFre ge Program >, ĊĠĠĠĠĠĠĠ Ġvalue : ĠFre ge Program , ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġhas Focus : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . qualified Name ?. let Ġ{ Ġappend ( it ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠImport Ad der Ġ{ ĊĠĠĠ Ġfun Ġadd Import ( to Module : ĠFre ge Program , Ġmodule ToAdd : ĠFre ge Program ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqualified Name Ġ= Ġmodule ToAdd . qualified Name Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġto Module . project ĊĠĠĠĠĠĠĠ Ġval Ġnew Import Ġ= ĠFre ge Element Factory . create Top Decl ( project , Ġ" import Ġ$ qualified Name "). node ĊĠĠĠĠĠĠĠ Ġval Ġlast Import Ġ= Ġto Module . imports . last OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġnew Line Ġ= ĠFre ge Element Factory . create NewLine ( project ). node ĊĠĠĠĠĠĠĠ Ġif Ġ( last Import Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġget Insert Position After Import ( last Import ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Insert ( position , Ġnew Line , Ġnew Import ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġget Insert Position For First Import ( to Module ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Line 2 Ġ= ĠFre ge Element Factory . create NewLine ( project ). node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Insert ( position , Ġnew Line , Ġnew Line 2 , Ġnew Import ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Insert Position After Import ( import : ĠFre ge Import Decl ): ĠAST Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Decl Ġ= Ġimport . parent OfType < Fre ge Top Decl >() !! ĊĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġtop Decl . node ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! node . text Contains ('\ n ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode . tree Next !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . tree Next !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Insert Position For First Import ( module : ĠFre ge Program ): ĠAST Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodule . body ?. firstChild ?. node !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Insert ( insert Position : ĠAST Node , Ġvar arg Ġelements : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Node Ġ= Ġinsert Position ĊĠĠĠĠĠĠĠ Ġval Ġparent Node Ġ= Ġlast Node . tree Parent ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Node . addChild ( element , Ġlast Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Node Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ