/******************************************************************************* Ċ * ĠCopyright Ġ 2 0 0 0 - 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ * Ċ * ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * Ġlimitations Ġunder Ġthe ĠLicense . Ċ * Ċ ************************************************************************ *******/ Ċ package Ġorg . jetbrains . kotlin . core . resolve Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġorg . jetbrains . kotlin . analyzer . Analysis Result Ċ import Ġorg . jetbrains . kotlin . builtins . jvm . Jvm Built Ins Ċ import Ġorg . jetbrains . kotlin . builtins . jvm . Jvm Built Ins Package Fragment Provider Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Cli Binding Trace Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Top Down Analyzer Facade For JVM Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Top Down Analyzer Facade For JVM . Source Or Binary Module Class Resolver Ċ import Ġorg . jetbrains . kotlin . config . Common Configuration Keys Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . container . Component Provider Ċ import Ġorg . jetbrains . kotlin . context . Context For New Module Ċ import Ġorg . jetbrains . kotlin . context . Mutable Module Context Ċ import Ġorg . jetbrains . kotlin . context . Project Context Ċ import Ġorg . jetbrains . kotlin . core . log . Kotlin Logger Ċ import Ġorg . jetbrains . kotlin . core . model . Kotlin Environment Ċ import Ġorg . jetbrains . kotlin . core . model . Kotlin Script Environment Ċ import Ġorg . jetbrains . kotlin . core . preferences . language Version Settings Ċ import Ġorg . jetbrains . kotlin . core . utils . Project Utils Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Package Fragment Provider Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Composite Package Fragment Provider Ċ import Ġorg . jetbrains . kotlin . frontend . java . di . init Jvm Built Ins For Top Down Analysis Ċ import Ġorg . jetbrains . kotlin . incremental . components . Lookup Tracker Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . resolve . Lazy Top Down Analyzer Ċ import Ġorg . jetbrains . kotlin . resolve . Top Down Analysis Mode Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Java Descriptor Resolver Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . extensions . Package Fragment Provider Extension Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . Kotlin Code Analyzer Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . declarations . Declaration Provider Factory Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . declarations . File Based Declaration Provider Factory Ċ import Ġorg . jetbrains . kotlin . storage . Storage Manager Ċ import Ġorg . jetbrains . kotlin . util . Kotlin Front End Exception Ċ import Ġjava . util .* Ċ import Ġorg . jetbrains . kotlin . frontend . java . di . create Container For Top Down Analyzer For Jvm Ġas Ġcreate Container For Script Ċ Ċ data Ġclass ĠAnalysis Result With Provider ( val Ġanalysis Result : ĠAnalysis Result , Ġval Ġcomponent Provider : ĠComponent Provider ?) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEMPTY Ġ= ĠAnalysis Result With Provider ( Analysis Result . EMPTY , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠEclipse Analyzer Facade For JVM Ġ{ ĊĠĠĠ Ġfun Ġanalyze Files With Java Integration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment : ĠKotlin Environment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles To Analyze : ĠCollection < Kt File >): ĠAnalysis Result With Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Set Ġ= Ġfiles To Analyze . toSet () ĊĠĠĠĠĠĠĠ Ġif Ġ( files Set . size Ġ!= Ġfiles To Analyze . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Logger . log Warning (" Analy zed Ġfiles Ġhave Ġduplicates ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġall Files Ġ= ĠLinked HashSet < Kt File >( files Set ) ĊĠĠĠĠĠĠĠ Ġval Ġadded Files Ġ= Ġfiles Set . map Ġ{ ĠgetPath ( it ) Ġ}. filter NotNull (). toSet () ĊĠĠĠĠĠĠĠ ĠProject Utils . getSource Files With Dependencies ( environment . java Project ). filter Not To ( all Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath ( it ) Ġin Ġadded Files ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġenvironment . project ĊĊĠĠĠĠĠĠĠ Ġval Ġj vm Target Ġ= Ġenvironment . compiler Properties . jvm Target ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġmodule Context Ġ= Ġcreate Module Context ( project , Ġenvironment . configuration , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġstorage Manager Ġ= Ġmodule Context . storage Manager ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġmodule Context . module ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġprovider Factory Ġ= ĠFile Based Declaration Provider Factory ( module Context . storage Manager , Ġall Files ) ĊĠĠĠĠĠĠĠ Ġval Ġtrace Ġ= ĠCli Binding Trace () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġsource Scope Ġ= ĠTop Down Analyzer Facade For JVM . new Module Search Scope ( project , Ġfiles To Analyze ) ĊĠĠĠĠĠĠĠ Ġval Ġmodule Class Resolver Ġ= ĠSource Or Binary Module Class Resolver ( source Scope ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlanguage Version Settings Ġ= Ġenvironment . compiler Properties . language Version Settings ĊĊĠĠĠĠĠĠĠ Ġval Ġoptional Built Ins Module Ġ= ĠJ vm Built Ins ( storage Manager ). apply Ġ{ Ġinitialize ( module , Ġtrue ) Ġ}. built Ins Module ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġdependency Module Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Context Ġ= ĠContext For New Module ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Context , ĠName . special ("< dependencies Ġof Ġ${ environment . configuration . get NotNull ( Common Configuration Keys . MODULE _ NAME )}> "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . built Ins , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Scope Ġ= ĠGlobal Search Scope . not Scope ( source Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Container Ġ= Ġcreate Container For Top Down Analyzer For Jvm ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDeclaration Provider Factory . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLookup Tracker . DO _ NOTH ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Package Part Provider ( environment ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Target , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Version Settings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Class Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . java Project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Class Resolver . compiled Code Resolver Ġ= Ġdependencies Container . get < Java Descriptor Resolver >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Context . set Dependencies ( listOf NotNull ( dependencies Context . module , Ġoptional Built Ins Module )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Context . initialize Module Contents ( Composite Package Fragment Provider ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Class Resolver . compiled Code Resolver . package Fragment Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Container . get < Jvm Built Ins Package Fragment Provider >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Context . module ĊĠĠĠĠĠĠĠ Ġ} Ċĉĉ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġcreate Container For Top Down Analyzer For Jvm ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLookup Tracker . DO _ NOTH ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Package Part Provider ( environment ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Target , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Version Settings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Class Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . java Project ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Jvm Built Ins For Top Down Analysis () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġmodule Class Resolver . sourceCode Resolver Ġ= Ġcontainer . get < Java Descriptor Resolver >() ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġadditional Providers Ġ= ĠArrayList < Package Fragment Provider >() ĊĠĠĠĠĠĠĠ Ġadditional Providers . add ( container . get < Java Descriptor Resolver >(). package Fragment Provider ) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ ĠPackage Fragment Provider Extension . get Instances ( project ). map NotNull To ( additional Providers ) Ġ{ Ġextension Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension . get Package Fragment Provider ( project , Ġmodule , Ġstorage Manager , Ġtrace , Ġnull , ĠLookup Tracker . DO _ NOTH ING ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġmodule . set Dependencies ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf NotNull ( module , Ġdependency Module , Ġoptional Built Ins Module ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( dependency Module ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmodule . initialize ( Composite Package Fragment Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( container . get < Kotlin Code Analyzer >(). package Fragment Provider ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Providers ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . get < Lazy Top Down Analyzer >(). analyze Declarations ( Top Down Analysis Mode . TopLevel Declarations , Ġfiles Set ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠKotlin Front End Exception ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠ ĠEditor Ġwill Ġbreak Ġif Ġwe Ġdo Ġnot Ġcatch Ġthis Ġexception Ċ // ĠĠĠĠĠĠĠĠĠ Ġand Ġwill Ġnot Ġbe Ġable Ġto Ġsave Ġcontent Ġwithout Ġreopen ing Ġit . Ċ // ĠĠĠĠĠĠĠĠĠ ĠIn ĠIDEA Ġthis Ġexception Ġthrows Ġonly Ġin ĠCLI ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Logger . log Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result With Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalysis Result . success ( trace . binding Context , Ġmodule ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġanalyze Script ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment : ĠKotlin Script Environment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript File : ĠK t File ): ĠAnalysis Result With Provider Ġ{ ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġif Ġ( environment . is Initializing Script Definitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġstart Ġresolve Ġwhen Ġscript Ġdefinitions Ġare Ġnot Ġinitialized ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result With Provider . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġtrace Ġ= ĠCli Binding Trace () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠTop Down Analyzer Facade For JVM . create Container ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( script File ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠKotlin Package Part Provider ( environment ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġstorage Manager : ĠStorage Manager , Ġfiles : ĠCollection < Kt File > Ġ-> ĠFile Based Declaration Provider Factory ( storage Manager , Ġfiles ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . get < Lazy Top Down Analyzer >(). analyze Declarations ( Top Down Analysis Mode . TopLevel Declarations , Ġset Of ( script File )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠKotlin Front End Exception ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠ ĠEditor Ġwill Ġbreak Ġif Ġwe Ġdo Ġnot Ġcatch Ġthis Ġexception Ċ // ĠĠĠĠĠĠĠĠĠ Ġand Ġwill Ġnot Ġbe Ġable Ġto Ġsave Ġcontent Ġwithout Ġreopen ing Ġit . Ċ // ĠĠĠĠĠĠĠĠĠ ĠIn ĠIDEA Ġthis Ġexception Ġthrows Ġonly Ġin ĠCLI ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Logger . log Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result With Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalysis Result . success ( trace . binding Context , Ġcontainer . get < Module Descriptor > ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetPath ( jet File : ĠK t File ): ĠString ? Ġ= Ġjet File . virtual File ?. path ĊĠĠĠĠĊĠĠĠ Ġprivate Ġfun Ġcreate Module Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration : ĠCompiler Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Built Ins From Module : ĠBoolean ĊĠĠĠ Ġ): ĠMutable Module Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= ĠProject Context ( project ) ĊĠĠĠĠĠĠĠ Ġval Ġbuilt Ins Ġ= ĠJ vm Built Ins ( project Context . storage Manager , Ġ! create Built Ins From Module ) ĊĠĠĠĠĠĠĠ Ġreturn ĠContext For New Module ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context , ĠName . special ("< ${ configuration . get NotNull ( Common Configuration Keys . MODULE _ NAME )}> "), Ġbuilt Ins , Ġnull ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( create Built Ins From Module ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilt Ins . built Ins Module Ġ= Ġmodule ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }