// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . completion . n gram Ċ Ċ import Ġcom . intellij . code Insight . completion . Completion Parameters Ċ import Ġcom . intellij . completion . n gram . s lp . modeling . Model Ċ import Ġcom . intellij . completion . n gram . s lp . modeling . n gram . JM Model Ċ import Ġcom . intellij . completion . n gram . s lp . modeling . runners . Model Runner Ċ import Ġcom . intellij . completion . n gram . s lp . trans lating . Vocab ulary Ċ import Ġcom . intellij . lang . Language Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Comment Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Syntax Tra verser Ċ import Ġkotlin . math . max ĊĊ Ċ object ĠNG ram Ġ{ ĊĠ Ġinternal Ġval ĠN GRAM _ SC OR ER _ KEY : ĠKey < Sc oring Function > Ġ= ĠKey . create (" N GRAM _ SC OR ER ") ĊĠ Ġprivate Ġval ĠSUPPORT ED _ L ANGU AGES Ġ= Ġset Of ( ĊĠĠĠ Ġ" ec mas cript Ġ 6 ", ĊĠĠĠ Ġ" go ", ĊĠĠĠ Ġ" java ", ĊĠĠĠ Ġ" kotlin ", ĊĠĠĠ Ġ" php ", ĊĠĠĠ Ġ" python ", ĊĠĠĠ Ġ" ruby ", ĊĠĠĠ Ġ" scala ", ĊĠĠĠ Ġ" shell Ġscript " ĊĠĠĠ Ġ) ĊĊĠ Ġprivate Ġfun Ġis Supported ( language : ĠLanguage ): ĠBoolean Ġ= Ġlanguage . id . toLowerCase () Ġin ĠSUPPORT ED _ L ANGU AGES ĊĊĠ Ġfun Ġget NG ram Prefix ( parameters : ĠCompletion Parameters , Ġorder : ĠInt ): ĠArray < String > Ġ{ ĊĠĠĠ Ġval Ġpreceding Tokens Ġ= ĠSyntax Tra verser . rev Psi Tra verser () ĊĠĠĠĠĠ Ġ. with Root ( parameters . original File ) ĊĠĠĠĠĠ Ġ. on Range ( Text Range ( 0 , Ġmax ( 0 , Ġparameters . offset Ġ- Ġ 1 ))) ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġshould Lex ( it ) Ġ} ĊĠĠĠĠĠ Ġ. take ( order ) ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . text Ġ} ĊĠĠĠĠĠ Ġ. reversed () ĊĠĠĠ Ġif Ġ( pre ced ing Tokens . isEmpty ()) Ġreturn Ġempty Array () ĊĠĠĠĠĠ Ġreturn Ġwith ( pre ced ing Tokens ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( last () Ġ== Ġparameters . original Position ?. text Ġ?: Ġ"") Ġdrop Last ( 1 ) Ġelse Ġdrop ( 1 ) ĊĠĠĠĠĠ Ġ}. to Typed Array () ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Sc oring Function ( parameters : ĠCompletion Parameters , Ġorder : ĠInt ): ĠS cor ing Function ? Ġ{ ĊĠĠĠ Ġif Ġ(! is Supported ( parameters . original File . language )) Ġreturn Ġnull ĊĠĠĠ Ġval Ġmodel Runner Ġ= Ġcreate Model Runner () ĊĠĠĠ Ġ// model Runner . set Self Testing ( true ) ĊĠĠĠ Ġmodel Runner . learn Psi File ( parameters . original File ) ĊĠĠĠ Ġval Ġprefix Ġ= Ġget NG ram Prefix ( parameters , Ġorder ) ĊĠĠĠ Ġreturn ĠS cor ing Function ( prefix , Ġmodel Runner ) ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Model Runner ( ĊĠĠĠ Ġvocabulary : ĠV ocab ulary Ġ= ĠV ocab ulary (), ĊĠĠĠ Ġmodel : ĠModel Ġ= ĠJ M Model () ĊĠ Ġ): ĠModel Runner Ġ= ĠModel Runner ( model , Ġvocabulary ) ĊĊĠ Ġfun Ġscore ( model Runner : ĠModel Runner , Ġtokens : ĠList < String >): ĠDouble Ġ{ ĊĠĠĠ Ġreturn Ġwith ( model Runner ) Ġ{ ĊĠĠĠĠĠ Ġval Ġquery Indices Ġ= Ġvocabulary . to Indices ( tokens ). filter NotNull () ĊĠĠĠĠĠ Ġif Ġ( this . get Self Testing ()) Ġmodel . forget ( query Indices ) ĊĠĠĠĠĠ Ġval Ġprobability Ġ= Ġmodel . model Token ( query Indices , Ġquery Indices . size Ġ- Ġ 1 ). first ĊĠĠĠĠĠ Ġif Ġ( this . get Self Testing ()) Ġmodel . learn ( query Indices ) ĊĠĠĠĠĠ Ġprobability ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠModel Runner . learn Psi File ( file : ĠPsi File ) Ġ{ ĊĠĠĠ Ġmodel . learn ( vocabulary . to Indices ( lex Psi File ( file )). filter NotNull ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġlex Psi File ( file : ĠPsi File ): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn ĠSyntax Tra verser . psi Tra verser () ĊĠĠĠĠĠ Ġ. with Root ( file ) ĊĠĠĠĠĠ Ġ. on Range ( Text Range ( 0 , Ġ 6 4 Ġ* Ġ 1 0 2 4 )) Ġ// Ġfirst Ġ 1 2 8 ĠKB Ġof Ġchars ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġshould Lex ( it ) Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . text Ġ} ĊĠĠĠĠĠ Ġ. toList () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshould Lex ( element : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġelement . firstChild Ġ== Ġnull Ġ// Ġis Ġleaf ĊĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! element . text . isBlank () ĊĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġelement Ġ! is ĠPsi Comment ĊĠ Ġ} ĊĊĠ Ġclass ĠS cor ing Function ( prefix : ĠArray < String >, Ġprivate Ġval Ġmodel Runner : ĠModel Runner ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtokens : ĠMutable List < String > Ġ= Ġmutable ListOf (* prefix , Ġ"! placeholder !") ĊĊĠĠĠ Ġfun Ġscore ( value : ĠString ): ĠDouble Ġ{ ĊĠĠĠĠĠ Ġtokens [ tokens . last Index ] Ġ= Ġvalue ĊĠĠĠĠĠ Ġreturn Ġscore ( model Runner , Ġ( tokens )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }