// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ċ package Ġorg . jetbrains . kotlin . idea . ins pe ctions Ċ Ċ import Ġcom . intellij . code Inspection .* Ċ import Ġcom . intellij . code Inspection . ui . Single Checkbox Options Panel Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Visitor Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Declaration Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Bundle Ċ import Ġorg . jetbrains . kotlin . idea . analysis . analyze As Replacement Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . core . Short en References Ċ import Ġorg . jetbrains . kotlin . idea . core . compare Descriptors Ċ import Ġorg . jetbrains . kotlin . idea . core . unwrap If Fake Override Ċ import Ġorg . jetbrains . kotlin . idea . imports . import able Fq Name Ċ import Ġorg . jetbrains . kotlin . idea . intent ions . is Reference To BuiltIn Enum Function Ċ import Ġorg . jetbrains . kotlin . idea . references . main Reference Ċ import Ġorg . jetbrains . kotlin . idea . references . resolve To Descriptors Ċ import Ġorg . jetbrains . kotlin . idea . util . get Resolution Scope Ċ import Ġorg . jetbrains . kotlin . idea . util . has Not Receiver Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Imported From Object Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Safe Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . is Companion Object Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . findFirst Classifier With De precation Status Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ import Ġjavax . swing . J Component Ċ Ċ class ĠRemove Red undant Qualifier Name Inspection Ġ: ĠAbstract Kotlin Inspection (), ĠCleanup Local Inspection Tool Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIn Ġorder Ġto Ġdetect Ġthat Ġ` foo ()` Ġand Ġ` Grand Base . foo ()` Ġpoint Ġto Ġthe Ġsame Ġmethod , ĊĠĠĠĠ Ġ* Ġwe Ġneed Ġto Ġunwrap Ġfake Ġoverrides Ġfrom Ġdescriptors . ĠIf Ġwe Ġdon 't Ġdo Ġthat , Ġthey Ġwill ĊĠĠĠĠ Ġ* Ġhave Ġdifferent Ġ` fq Name ` s , Ġand Ġthe Ġinspection Ġwill Ġnot Ġdetect Ġ` Grand Base ` Ġas Ġa ĊĠĠĠĠ Ġ* Ġredundant Ġqualifier . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġunwrap Fake Overrides : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Options Panel (): ĠJ Component Ġ= ĊĠĠĠĠĠĠĠ ĠSingle Checkbox Options Panel ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Bundle . message (" red undant . qual ifier . un necessary . non . direct . parent . class . qual ifier "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: unwrap Fake Overrides . name ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Visitor ( holder : ĠPro blems Holder , Ġis On The Fly : ĠBoolean ): ĠPsi Element Visitor Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠK t Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dot Qualified Expression ( expression : ĠK t Dot Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Parent Ġ= Ġexpression . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Parent Ġis ĠK t Dot Qualified Expression Ġ|| Ġexpression Parent Ġis ĠK t Package Directive Ġ|| Ġexpression Parent Ġis ĠK t Import Directive ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression For Analyze Ġ= Ġexpression . first Expression Without Receiver () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression For Analyze . selector Expression ?. text Ġ== Ġexpression Parent . get Non Strict Parent OfType < Kt Property >() ?. name ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Expression : ĠK t Expression Ġ= Ġexpression For Analyze . parent Ġas ? ĠK t Class Literal Expression Ġ?: Ġexpression For Analyze ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Reference Ġ= Ġexpression For Analyze . receiver Expression . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . safe As < Kt Qualified Expression >() ?. receiver Expression Ġ?: Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. main Reference ?. resolve () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Enum Entry Ġ= Ġexpression For Analyze . get Strict Parent OfType < Kt Enum Entry >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Enum Entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompanion Object Ġ= Ġ( receiver Reference Ġas ? ĠK t Object Declaration )?. take If Ġ{ Ġit . is Companion () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comp anion Object ?. containing Class () Ġ== Ġparent Enum Entry . get Strict Parent OfType < Kt Class >()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Reference ?. safe As < Kt Class >() ?. is Enum () Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġexpression For Analyze . getParent Of Types And Predicate ( true , ĠK t Class :: class . java ) Ġ{ Ġit . is Enum () Ġ} Ġ!= Ġreceiver Reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( expression For Analyze . is Reference To BuiltIn Enum Function () Ġ|| Ġexpression For Analyze . is Companion Object Reference ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġoriginal Expression . analyze () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Descriptor Ġ= Ġexpression For Analyze . get Qualified Element Selector () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . main Reference ?. resolve To Descriptors ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplicable Expression Ġ= Ġexpression For Analyze . first Applicable Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator Ġ= Ġ{ Ġapplicable Expression ( original Expression , Ġcontext , Ġoriginal Descriptor , Ġunwrap Fake Overrides ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator Ġ= Ġ{ Ġfirst Child Ġas ? ĠK t Dot Qualified Expression Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Problem ( holder , Ġapplicable Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit User Type ( type : ĠK t User Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . parent Ġis ĠK t User Type ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġtype . analyze () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplicable Expression Ġ= Ġtype . first Applicable Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator Ġ= Ġ{ Ġapplicable Expression ( context ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator Ġ= Ġ{ Ġfirst Child Ġas ? ĠK t User Type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Problem ( holder , Ġapplicable Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠK t Dot Qualified Expression . is Companion Object Reference (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselector Ġ= Ġreceiver Expression . safe As < Kt Dot Qualified Expression >() ?. selector Expression Ġ?: Ġselector Expression ĊĠĠĠĠĠĠĠ Ġreturn Ġselector ?. reference Expression ()?. main Reference ?. resolve ()?. safe As < Kt Object Declaration >() ?. is Companion () Ġ== Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġtail rec Ġfun ĠK t Dot Qualified Expression . first Expression Without Receiver (): ĠK t Dot Qualified Expression ? Ġ= Ġif Ġ( has Not Receiver ()) ĊĠĠĠ Ġthis Ċ else ĊĠĠĠ Ġ( receiver Expression Ġas ? ĠK t Dot Qualified Expression )?. first Expression Without Receiver () Ċ Ċ private Ġtail rec Ġfun Ġ< T Ġ: ĠK t Element > ĠT . first Applicable Expression ( validator : ĠT . () Ġ-> ĠT ?, Ġgenerator : ĠT . () Ġ-> ĠT ?): ĠT ? Ġ{ ĊĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠ Ġreturn Ġvalidator () Ġ?: Ġgenerator ()?. first Applicable Expression ( validator , Ġgenerator ) Ċ } Ċ Ċ private Ġfun ĠK t Dot Qualified Expression . applic able Expression ( ĊĠĠĠ Ġoriginal Expression : ĠK t Expression , ĊĠĠĠ Ġold Context : ĠBinding Context , ĊĠĠĠ Ġoriginal Descriptor : ĠDeclaration Descriptor , ĊĠĠĠ Ġunwrap Fake Overrides : ĠBoolean Ċ ): ĠK t Dot Qualified Expression ? Ġ{ ĊĠĠĠ Ġif Ġ(! receiver Expression . is Applicable Receiver ( old Context ) Ġ|| Ġ! Short en References . can Be Possible To Drop Receiver ( this , Ġold Context )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexpression Text Ġ= Ġoriginal Expression . text . substring ( last Child . start Offset Ġ- Ġoriginal Expression . start Offset ) ĊĠĠĠ Ġval Ġnew Expression Ġ= ĠK t Psi Factory ( original Expression ). create Expression If Possible ( expression Text ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġnew Context Ġ= Ġnew Expression . analyze As Replacement ( original Expression , Ġold Context ) ĊĠĠĠ Ġval Ġnew Descriptor Ġ= Ġnew Expression . selector () ĊĠĠĠĠĠĠĠ Ġ? . main Reference ?. resolve To Descriptors ( new Context ) ĊĠĠĠĠĠĠĠ Ġ? . first OrNull () Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġfun ĠDeclaration Descriptor . unwrap Fake Override If Ne cessary (): ĠDeclaration Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( unwrap Fake Overrides ) Ġthis . unwrap If Fake Override () Ġelse Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoriginal Descriptor Fq Name Ġ= Ġoriginal Descriptor . unwrap Fake Override If Ne cessary (). fq Name Safe ĊĠĠĠ Ġval Ġnew Descriptor Fq Name Ġ= Ġnew Descriptor . unwrap Fake Override If Ne cessary (). fq Name Safe ĊĠĠĠ Ġif Ġ( original Descriptor Fq Name Ġ!= Ġnew Descriptor Fq Name ) Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġthis . take If Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( new Descriptor Ġis ĠImport ed From Object Callable Descriptor <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompare Descriptors ( project , Ġnew Descriptor . callable From Object , Ġoriginal Descriptor ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompare Descriptors ( project , Ġnew Descriptor , Ġoriginal Descriptor ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠK t Expression . selector (): ĠK t Element ? Ġ= Ġif Ġ( this Ġis ĠK t Class Literal Expression ) Ġreceiver Expression ?. get Qualified Element Selector () Ċ else Ġget Qualified Element Selector () Ċ Ċ private Ġfun ĠK t Expression . is Applicable Receiver ( context : ĠBinding Context ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠK t Instance Expression With Label ) Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġreference Ġ= Ġget Qualified Element Selector () ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġreference ?. main Reference ?. resolve To Descriptors ( context )?. first OrNull () Ġ?: Ġreturn Ġfalse ĊĊĠĠĠ Ġreturn Ġif Ġ(! descriptor . is Companion Object ()) Ġtrue ĊĠĠĠ Ġelse Ġdescriptor . name . asString () Ġ!= Ġreference . text Ċ } Ċ Ċ private Ġfun ĠK t User Type . applic able Expression ( context : ĠBinding Context ): ĠK t User Type ? Ġ{ ĊĠĠĠ Ġif Ġ( firstChild Ġ! is ĠK t User Type ) Ġreturn Ġnull ĊĠĠĠ Ġval Ġreference Expression Ġ= Ġreference Expression Ġas ? ĠK t Name Reference Expression Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġoriginal Descriptor Ġ= Ġreference Expression . main Reference . resolve To Descriptors ( context ). first OrNull () Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġif Ġ( original Descriptor Ġis ĠClass Descriptor ĊĠĠĠĠĠĠĠ Ġ&& Ġoriginal Descriptor . is Inner ĊĠĠĠĠĠĠĠ Ġ&& Ġ( original Descriptor . containing Declaration Ġas ? ĠClass Descriptor )?. type Constructor Ġ!= Ġnull ĊĠĠĠ Ġ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġshort Name Ġ= Ġoriginal Descriptor . import able Fq Name ?. short Name () Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġscope Ġ= Ġreference Expression . get Resolution Scope ( context ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġscope . findFirst Classifier With De precation Status ( short Name , ĠNo Lookup Location . FROM _ IDE )?. descriptor Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġif Ġ( descriptor Ġ== Ġoriginal Descriptor ) Ġthis Ġelse Ġnull Ċ } Ċ Ċ private Ġfun Ġreport Problem ( holder : ĠPro blems Holder , Ġelement : ĠK t Element ) Ġ{ ĊĠĠĠ Ġval Ġfirst Child Ġ= Ġelement . firstChild ĊĠĠĠ Ġholder . register Problem ( ĊĠĠĠĠĠĠĠ Ġelement , ĊĠĠĠĠĠĠĠ ĠKotlin Bundle . message (" red undant . qual ifier . name "), ĊĠĠĠĠĠĠĠ ĠProblem Highlight Type . LIKE _ UNUSED _ SYMBOL , ĊĠĠĠĠĠĠĠ ĠText Range . from ( firstChild . start Offset In Parent , Ġfirst Child . text Length Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠ ĠRemove Red undant Qualifier Name Quick Fix () ĊĠĠĠ Ġ) Ċ } Ċ Ċ class ĠRemove Red undant Qualifier Name Quick Fix Ġ: ĠLocal Quick Fix Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetName () Ġ= ĠKotlin Bundle . message (" remove . red undant . qual ifier . name . quick . fix . text ") ĊĠĠĠ Ġoverride Ġfun Ġget Family Name () Ġ= Ġname ĊĊĠĠĠ Ġoverride Ġfun Ġapply Fix ( project : ĠProject , Ġdescriptor : ĠProblem Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdescriptor . psi Element . containing File Ġas ĠK t File ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġwhen Ġ( val Ġelement Ġ= Ġdescriptor . psi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t User Type Ġ-> ĠInt Range ( element . start Offset , Ġelement . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> ĠInt Range ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getLast Parent OfType In Row With Self < Kt Dot Qualified Expression >() ?. get Qualified Element Selector ()?. end Offset Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠInt Range . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsubstring Ġ= Ġfile . text . substring ( range . first , Ġrange . last ) ĊĠĠĠĠĠĠĠ ĠRegex . from Literal ( substring ). findAll ( file . text , Ġfile . import List ?. end Offset Ġ?: Ġ 0 ). toList (). as Re versed (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShort en References . DEFAULT . process ( file , Ġit . range . first , Ġit . range . last Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ