рддреЛ, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕реНрдХрд╛рд▓рд╛ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдзреЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдХреЛрдбред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХрд╛рд▓рд╛ рдкрд░, рдЖрдк рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рджреБрд░реНрдЧрдо рд╣реИрдВ: рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реА рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВред
рдЬрд┐рди рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди
рдХреЗ рджреМрд░рд╛рди
рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХрд╛ рд╕рдВрдХрд▓рди рд╣реИред рдпрд╣ рддрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдПрдХ рджреВрд░рд╕реНрде рд╕реНрд░реЛрдд рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рд╕реНрд╡-рд╕рдВрд╢реЛрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЗрдПрд╕ рдореЗрдВ eval рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧред
рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЗрд╡реИрдХ рдХреА рддрд░рд╣ рдПрдХ рджреЗрд╢реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐
рдЬрд╛рд░ рдлрд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрд╛рдиреА рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЬрд┐рд╕реЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╕реЗ рдЬреЗрд╡реАрдПрдо рдмрд╛рдпрдЯреЗрдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реИ: рдЬрдм рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛ рд▓реЗрдиреЗ рдФрд░ рдЙрд╕рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЬрд╛рд╡рд╛ рд░рд┐рдлрд╛рдЗрдирд░реА рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рди рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдХрд╣рд╛рдиреА рд╣реЛрдЧреАред рдореИрдВрдиреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдФрд░ рд╡рд┐рд╖рдпрдЧрдд рд╕рд╛рдЗрдЯреЛрдВ рд╕реЗ рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдПрдХрддреНрд░ рдХрд┐рдпрд╛ред
рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕
scala.tools.nsc.Global рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдХрд▓рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдиреЗрд╕реНрдЯреЗрдб рд░рди рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдФрд░ рд╕рдВрдХрд▓рди рд╕реНрд░реЛрдд рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
val compiler = new Global ( settings, reporter ) <br/>
new compiler. Run ( ) compileSources ( sources )
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рд╕реЗрдЯрд┐рдВрдЧреНрд╕) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рд░рд┐рдкреЛрд░реНрдЯрд░, рдЬреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рд╕реНрд░реЛрдд (рд╕реНрд░реЛрдд) рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдЧрд╛ред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рдХрд╛рд░
scala.tools.nsc.Settings рдХреЗ рд╣реИрдВ , рдореЗрд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░реНрдпрд╛рдкреНрдд рдереЗ: usejavacp, рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рд╕рдкреИрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рд╕реНрд░реЛрдд рдХреЛ рдЖрдк рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдмрд╛рд╣рд░реА рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рд▓рд┐рдВрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рддрд╛рд╡рд░рдг), рдФрд░ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдЙрдЯрдкреБрдЯрдбрд╛рдпрд░ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ, рдЬреЛ рдЧреНрд▓реЛрдмрд▓ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рд╕рдВрдХрд▓рд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдбрд┐рд╕реНрдХ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдорд┐рд▓рд╛, рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп, рд╡реИрд╕реЗ - рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдЖрднрд╛рд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореЗрд░рд╛ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
val settings = new Settings<br/>
<br/>
settings. usejavacp . value = true <br/>
<br/>
val directory = new VirtualDirectory ( "(memory)" , None ) <br/>
settings. outputDirs . setSingleOutput ( directory )
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд░рд┐рдкреЛрд░реНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ
scala.tools.nsc.reporters.StoreReporter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
val reporter = new StoreReporter ( )
рдпрд╣ рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рднреАрддрд░ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рди рдкреВрд░рд╛ рд╣реЛрддреЗ рд╣реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рд╕реНрд░реЛрдд рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рдХ
scala.tools.nsc.util.SourceFile рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИред рд▓рдШреБ рд╕реНрдХрд╛рд▓рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд░реВрдкрд╛рдВрддрд░рдг рд╕рд░рд▓ рд╣реИ:
val sources = List ( new BatchSourceFile ( "<source>" , source ) )
рд╣рдо рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рд╕реЛрд░реНрд╕ рдХреЛрдб рдбрд╛рд▓рддреЗ рд╣реИрдВред
рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЪреЗрдХ рдХрд░реЗрдВ: рд╣рдорд╛рд░реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╕рдВрдХрд▓рди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛:
if ( reporter. hasErrors ) { <br/>
throw new CompilationFailedException ( source,<br/>
reporter. infos . map ( info = > ( info. pos . line , info. msg ) ) ) <br/>
}
рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рдирд╣реАрдВ), рдореИрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХрд▓рди рдЕрд╕рдлрд▓ рд╣реИ, рдпрд╣ рдЕрдкрд╡рд╛рдж рд╣реИ:
class CompilationFailedException ( val programme: String , val messages: Iterable [ ( Int, String ) ] ) <br/>
extends Exception ( messages. map ( message = > message._1 + ". " + message._2 ) . mkString ( "n" ) )
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдХрдареНрдард╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рдпрд╣
рдХрд┐рд╕реА рднреА рддрд░рд╣ рдПрдХ рд╣реА рдЖрднрд╛рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ
scala.tools.nsc.interpreter.AbstractFileClassLoader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
val classLoader = new AbstractFileClassLoader ( directory, this . getClass . getClassLoader ( ) )
AbstractFileClassLoader рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирдП рд╕рдВрдХрд▓рди рдкрд░ рдПрдХ рдирдпрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рдпрджрд┐ рд╣рдо
рдХреБрдЫ рд╡рд░реНрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдЕрд╡рддрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХреЗ рдмрд┐рдирд╛, рджреВрд╕рд░реА рдмрд╛рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рдПрдХ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдВ; рдЬрдм рдЬреЗрд╡реАрдПрдо рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕реА рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреА, рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдХрдХреНрд╖рд╛рдПрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╣реЛрдВрдЧреА рдЬрд┐рдирдХрд╛ рдирд╛рдо ClassName $ InnerClassName.class рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдкрддрд╛ рдЪрд▓реЗ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕рд▓рд┐рдП, рдиреЗрд╕реНрдЯреЗрдб рд╡рд░реНрдЧ рдЬреЛ рдореБрдЦреНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдордореВрд▓реНрдп рдкрд░ рдЦрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдореЗрд░реЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ рдЕрдЧрд░ рдирд╛рдо рдореЗрдВ $ рд╕рд╛рдЗрди рд╣реИ:
for ( classFile < - directory ; if ( ! classFile. name . contains ( '$' ) ) ) yield { <br/>
<br/>
val path = classFile. path <br/>
val fullQualifiedName = path. substring ( path. indexOf ( '/' ) + 1 , path. lastIndexOf ( '.' ) ) . replace ( "/" , "." ) <br/>
<br/>
classLoader. loadClass ( fullQualifiedName ) <br/>
}
рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рд╕рдВрд░рдЪрдирд╛ рд╕рд╣рд┐рдд рдЙрдирдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдирд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рд╣реЗрд░рдлреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдЦреИрд░, рдЕрдм рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛рдПрдВ рднрд░реА рд╣реБрдИ рд╣реИрдВ рдФрд░ рдКрдкрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛ рджреЗрдЧрд╛ред
рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг, рдпрджреНрдпрдкрд┐ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп, рдХреЗрд╡рд▓ рдХреЛрдб рдХрд╛ рдПрдХ рдкреГрд╖реНрда рд▓рд┐рдЦрдХрд░ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдореА рдХрдХреНрд╖рд╛ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда:
/*!# Compiler<br/>
<br/>
This class is a wrapper over Scala Compiler API<br/>
which has simple interface just accepting the source code string.<br/>
<br/>
Compiles the source code assuming that it is a .scala source file content.<br/>
It used a classpath of the environment that called the `Compiler` class.<br/>
*/ <br/>
<br/>
import tools. nsc . { Global, Settings } <br/>
import tools.nsc.io._ <br/>
import tools.nsc.reporters.StoreReporter <br/>
import tools.nsc.interpreter.AbstractFileClassLoader <br/>
import tools.nsc.util._ <br/>
<br/>
class Compiler { <br/>
<br/>
def compile ( source: String ) : Iterable [ Class [ _ ] ] = { <br/>
<br/>
// prepare the code you want to compile <br/>
val sources = List ( new BatchSourceFile ( "<source>" , source ) ) <br/>
<br/>
// Setting the compiler settings <br/>
val settings = new Settings<br/>
<br/>
/*! Take classpath from currently running scala environment. */ <br/>
settings. usejavacp . value = true <br/>
<br/>
/*! Save class files for compiled classes into a virtual directory in memory. */ <br/>
val directory = new VirtualDirectory ( "(memory)" , None ) <br/>
settings. outputDirs . setSingleOutput ( directory ) <br/>
<br/>
val reporter = new StoreReporter ( ) <br/>
val compiler = new Global ( settings, reporter ) <br/>
new compiler. Run ( ) compileSources ( sources ) <br/>
<br/>
/*! After the compilation if errors occured, `CompilationFailedException`<br/>
is being thrown with a detailed message. */ <br/>
if ( reporter. hasErrors ) { <br/>
throw new CompilationFailedException ( source,<br/>
reporter. infos . map ( info = > ( info. pos . line , info. msg ) ) ) <br/>
} <br/>
<br/>
/*! Each time new `AbstractFileClassLoader` is created for loading classes<br/>
it gives an opportunity to treat same name classes loading well.<br/>
*/ <br/>
// Loading new compiled classes <br/>
val classLoader = new AbstractFileClassLoader ( directory, this . getClass . getClassLoader ( ) ) <br/>
<br/>
/*! When classes are loading inner classes are being skipped. */ <br/>
for ( classFile < - directory ; if ( ! classFile. name . contains ( '$' ) ) ) yield { <br/>
<br/>
/*! Each file name is being constructed from a path in the virtual directory. */ <br/>
val path = classFile. path <br/>
val fullQualifiedName = path. substring ( path. indexOf ( '/' ) + 1 ,path. lastIndexOf ( '.' ) ) . replace ( "/" , "." ) <br/>
<br/>
Console. println ( fullQualifiedName ) <br/>
<br/>
/*! Loaded classes are collecting into a returning collection with `yield`. */ <br/>
classLoader. loadClass ( fullQualifiedName ) <br/>
} <br/>
} <br/>
} <br/>
<br/>
/*!### Compilation exception<br/>
<br/>
Compilation exception is defined this way.<br/>
It contains program was compiling and error positions with messages<br/>
of what went wrong during compilation.<br/>
*/ <br/>
class CompilationFailedException ( val programme: String ,<br/>
val messages: Iterable [ ( Int, String ) ] ) <br/>
extends Exception ( messages. map ( message = > message._1 + ". " + message._2 ) . mkString ( "n" ) ) <br/>
рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдпрд╣
рд╕рд░реНрдХреНрдпреБрдореНрдлреНрд▓реЗрдХреНрд╕ рдбреЛрдХреЛ рд╣реИ , рдЬреЛ рджреГрд╢реНрдп рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдЧрд▓рдд рд╣реИ, рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдХреЛрдб рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ
2.9.0.1 рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рднреА
2.8.x рдФрд░
2.9.x рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред