package Ġorg . elm . ide . ins pe ctions . import Ċ Ċ import Ġcom . intellij . code Insight . int ention . Priority Action . Priority Ċ import Ġcom . intellij . code Insight . navigation . Navigation Util Ċ import Ġcom . intellij . ide . DataManager Ċ import Ġcom . intellij . openapi . action System . DataContext Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . popup . JB Popup Factory Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . ui . Colo red List Cell Renderer Ċ import Ġcom . intellij . ui . Simple Text Attributes Ċ import Ġcom . intellij . util . text . Edit Distance Ċ import Ġorg . elm . ide . ins pe ctions . Named Quick Fix Ċ import Ġorg . elm . lang . core . imports . Import Ad der . Import Ċ import Ġorg . elm . lang . core . imports . Import Ad der . add Import Ċ import Ġorg . elm . lang . core . lookup . Elm Lookup Ċ import Ġorg . elm . lang . core . psi . Elm Ex posable Tag Ċ import Ġorg . elm . lang . core . psi . Elm File Ċ import Ġorg . elm . lang . core . psi . Elm Psi Element Ċ import Ġorg . elm . lang . core . psi . elements .* Ċ import Ġorg . elm . lang . core . psi . parent OfType Ċ import Ġorg . elm . lang . core . resolve . Elm Reference Element Ċ import Ġorg . elm . lang . core . resolve . reference . Elm Reference Ċ import Ġorg . elm . lang . core . resolve . reference . Qualified Reference Ċ import Ġorg . elm . openapi ext . is UnitTest Mode Ċ import Ġorg . elm . openapi ext . run Write Command Action Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġjavax . swing . J List ĊĊ Ċ interface ĠImport Picker UI Ġ{ ĊĠĠĠ Ġfun Ġchoose ( candidates : ĠList < Import >, Ġcallback : Ġ( Import ) Ġ-> ĠUnit ) Ċ } Ċ Ċ private Ġvar ĠMOCK : ĠImport Picker UI ? Ġ= Ġnull Ċ Ċ @ Test Only Ċ fun Ġwith Mock Import Picker UI ( mock Ui : ĠImport Picker UI , Ġaction : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠMOCK Ġ= Ġmock Ui ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ ĠMOCK Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAdd Import Fix Ġ: ĠNamed Quick Fix (" Import ", ĠPriority . HIGH ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠContext ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidates : ĠList < Import >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Qualified : ĠBoolean ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfind Applicable Context ( psi Element : ĠPsi Element ): ĠContext ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġpsi Element Ġas ? ĠEl m Psi Element Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . parent OfType < Elm Import Clause >() Ġ!= Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Element Ġ= Ġelement . parent OfType < Elm Reference Element >( strict Ġ= Ġfalse ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġref Element . reference ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġcan 't Ġimport Ġthe Ġfunction Ġwe 're Ġannot ating ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ref Element Ġis ĠEl m Type Annotation ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Allowed Ġ= Ġelement Ġis ĠEl m Type Ref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġref Element . reference Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= ĠEl m Lookup . find ByName < Elm Ex posable Tag >( name , Ġref Element . elm File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Type Ġ= Ġit Ġis ĠEl m Type Declaration Ġ|| Ġit Ġis ĠEl m Type Alias Declaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Allowed Ġ== Ġis Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġfrom Ex posable Element ( it , Ġref ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( reference Comparator ( ref )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidates . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠContext ( name , Ġcandidates , Ġref Ġis ĠQual ified Reference ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġreference Comparator ( ref : ĠEl m Reference ): ĠComparator < Import > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualifier Ġ= Ġ( ref Ġas ? ĠQual ified Reference )?. qual ifier Prefix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomparator Ġ= Ġcompare By < Import , ĠString ? >( null s First ()) Ġ{ Ġit . module Alias Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWith Ġno Ġqualifier , Ġjust Ġsort Ġlex ico graph ically ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualifier . isNull Or Blank () Ġ-> Ġcomparator . then By Ġ{ Ġit . moduleName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcomparator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort Ġby Ġmodules Ġcontaining Ġthe Ġqualifier Ġexactly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then By Descending Ġ{ Ġqualifier Ġin Ġit . moduleName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġsort Ġby Ġthe Ġcase - ins ensitive Ġedit Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then By Ġ{ ĠEdit Distance . lev ens ht ein ( qual ifier , Ġit . moduleName , Ġ/* case Sensitive =*/ false ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinally Ġsort Ġby Ġcase - sensitive Ġedit Ġdistance , Ġso Ġexact Ġcase Ġmatches Ġsort Ġhigher ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then By Ġ{ ĠEdit Distance . lev ens ht ein ( qual ifier , Ġit . moduleName , Ġ/* case Sensitive =*/ true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Fix ( element : ĠPsi Element , Ġproject : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠEl m Psi Element ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġelement . elm File ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġfind Applicable Context ( element ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġwhen Ġ( context . candidates . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġerror (" should Ġnot Ġhappen : Ġmust Ġbe Ġat Ġleast Ġone Ġcandidate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= Ġcontext . candidates . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNorm ally Ġwe Ġwould Ġjust Ġdirectly Ġperform Ġthe Ġimport Ġhere Ġwithout Ġpromp ting , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġif Ġit 's Ġan Ġalias - based Ġimport , Ġwe Ġshould Ġshow Ġthe Ġuser Ġsome ĠUI Ġso Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthey Ġknow Ġwhat Ġthey 're Ġgetting Ġinto . ĠSee Ġhttps :// github . com / kl az uka / intellij - elm / issues / 3 0 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate . module Alias Ġ!= Ġnull Ġ-> Ġprompt To Select Candidate ( project , Ġcontext , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġproject . run Write Command Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Import ( candidate , Ġfile , Ġcontext . is Qualified ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprompt To Select Candidate ( project , Ġcontext , Ġfile ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprompt To Select Candidate ( project : ĠProject , Ġcontext : ĠContext , Ġfile : ĠEl m File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( context . candidates . isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠData Manager . getInstance (). data Context From Focus Async . on Success Ġ{ Ġdata Context Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpicker Ġ= Ġif Ġ( is UnitTest Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMOCK Ġ?: Ġerror (" You Ġmust Ġset Ġmock ĠUI Ġvia Ġ` with Mock Import Picker UI ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReal Import Picker UI ( data Context , Ġcontext . ref Name , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicker . choose ( context . candidates ) Ġ{ Ġcandidate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . run Write Command Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Import ( candidate , Ġfile , Ġcontext . is Qualified ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠReal Import Picker UI ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdata Context : ĠData Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġref Name : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġproject : ĠProject Ċ ) Ġ: ĠImport Picker UI Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġchoose ( candidates : ĠList < Import >, Ġcallback : Ġ( Import ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpopup Ġ= ĠJ B Popup Factory . getInstance (). create Popup Chooser Builder ( candidates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Import Ġ'$ ref Name ' Ġfrom Ġmodule :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setItem Ch osen Callback Ġ{ Ġcallback ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set N amer For Filtering Ġ{ Ġit . moduleName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. 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 < Import >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcustomize Cell Renderer ( list : ĠJ List < out ĠImport >, Ġvalue : ĠImport , Ġindex : ĠInt , Ġselected : ĠBoolean , Ġhas Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġset Ġthe Ġbackground Ġcolor Ġbased Ġon Ġproject Ġvs Ġtests Ġvs Ġlibrary ĊĠĠĠĠĠĠĠ Ġappend ( value . moduleName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( value . module Alias Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ-> ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSimple Text Attributes . GRAY ED _ ATTRIBUTES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġas Ġ${ value . module Alias }", Ġattr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠReturns Ġa Ġcandidate Ġif Ġthe Ġelement Ġis Ġexposed Ġby Ġits Ġcontaining Ġmodule Ċ Ġ*/ Ċ private Ġfun Ġfrom Ex posable Element ( element : ĠEl m Ex posable Tag , Ġref : ĠEl m Reference ): ĠImport ? Ġ{ ĊĠĠĠ Ġval Ġmodule Decl Ġ= Ġelement . elm File . getModule Decl () Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġexposing List Ġ= Ġmodule Decl . ex posing List Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġif Ġ(! ex posing List . ex poses ( element )) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġname ToBe Ex posed Ġ= Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠEl m Union Variant Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġelement . parent OfType < Elm Type Declaration >() !!. name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName (.. )" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠEl m In fix Declaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" (${ element . name })" ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġalias Ġ= Ġinfer Module Alias ( ref , Ġmodule Decl ) ĊĠĠĠ Ġif Ġ( alias Ġ!= Ġnull Ġ&& Ġalias . contains ('. ')) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinvalid Ġcandidate Ġbecause Ġthe Ġalias Ġwould Ġvi olate ĠEl m Ġsyntax ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠImport ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName Ġ= Ġmodule Decl . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Alias Ġ= Ġalias , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname ToBe Ex posed Ġ= Ġname ToBe Ex posed ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAttempt Ġto Ġinfer Ġan Ġalias Ġto Ġbe Ġused Ġwhen Ġimporting Ġthis Ġmodule . Ċ Ġ*/ Ċ private Ġfun Ġinfer Module Alias ( ref : ĠEl m Reference , Ġmodule Decl : ĠEl m Module Declaration ): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( ref Ġis ĠQual ified Reference Ġ&& Ġref . qual ifier Prefix Ġ!= Ġmodule Decl . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . qual ifier Prefix ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ċ