08. 共通きょうつうeditor serviceと診断しんだん

方針ほうしん

一度宣言いちどせんげんしたgrammar/binding/style情報じょうほうからeditor機能きのう導出どうしゅつする。専用せんようparserもおなじfactsをかえして支援しえんける。共通分類きょうつうぶんるいをプログラミング言語げんご要素ようそ限定げんていしない。

1. AnalysisSnapshotの入力にゅうりょく同一性どういつせい

入力にゅうりょくはSourceSnapshot集合しゅうごう、profile/package revision集合しゅうごう明示的めいじてきなresource/schema環境かんきょう解析かいせきoptions。結果けっかはParsed tree、内部ないぶviews、Scope/Entity/Occurrence、typed Relations、Diagnostics、ExpectedAt、Dependencies。

全結果ぜんけっかにSnapshotIdとanalysis keyをける。keyには言語げんご/reader/providerのrevision、context、操作そうさoptionsをふくむ。spanのある結果けっか意味値いみちだけのcacheから再利用さいりようしない。

Binding の prepared request は AnalysisKey の treeDigest、profileDigest、executionDigest、requestDigest を固定こていする。treeDigest は局所きょくしょnodeを正準化せいじゅんかした完全かんぜんな ParseTree の NDF/1 CBORにもとづき、明示めいじsourceのidentity・URI・もとbytes、payload、環境かんきょう各選択かくせんたくcontextをふくむ。profileDigest は解決済かいけつずみProfileの意味いみidentityで、選択せんたくschema、provider実装じっそう、resource、既定きていlimitsをふくむ。executionDigest はalias名順めいじゅんじつpackage execution identityひょうもとづき、おな意味いみでもことなるarena配置はいち区別くべつする。requestDigest はanalysis ID、型付かたつきBindingOptions、有効ゆうこう操作そうさLimitsをふくむ。現在げんざいのBindingOptionsはくうrecordであり、未実装みじっそう意味いみoptionをだまってれない。

treeDigest・executionDigest・requestDigestは SHA-256(domain || canonical NDF/1 CBOR(value)) とし、tree・execution・requestのdomainはそれぞれ nepl3.analysis.tree/1nepl3.analysis.execution/1nepl3.analysis.request/1終端しゅうたんzero byteをける。profileDigestは既存きそん解決済かいけつずみProfile identityアルゴリズムにしたがう。codecは正準化せいじゅんかとhashのWork・割当わりあて出力量しゅつりょくりょう操作そうさBudgetへ計上けいじょうする。SourceSnapshotを内包ないほうしたあたいのhash計算けいさんだけであらたなsource lookup権限けんげん付与ふよしない。

prepareは明示的めいじてきわたされたBudgetとSourceAdmissionで要求ようきゅう検査けんさし、keyを算出さんしゅつする。実行じっこうLimitsはProfileの上限じょうげんえられず、executeのBudgetのLimitsは要求ようきゅう完全一致かんぜんいっちしなければならない。prepareと実行じっこう独立どくりつした操作予算そうさよさん使つかうことも、同一どういつpipelineの累積るいせきBudget/SourceAdmissionを共有きょうゆうすることもできるが、使用済しようずりょうはらもどさない。keyは有効上限ゆうこうじょうげん保持ほじし、開始時かいしじ残量ざんりょうやtransportの観測かんそくUsageを認証にんしょうするあたいではない。途中停止結果とちゅうていしけっかから完了かんりょうproofを生成せいせいしない。

初回しょかいBindingRequest decoderはもとのRust要求ようきゅうたず、明示めいじsourceを受信じゅしんtreeと選択済せんたくずみProfileからkeyを再計算さいけいさんする。自己申告じこしんこくkeyやLimitsを通信認証つうしんにんしょう・hostの実行許可じっこうきょか昇格しょうかくしない。受信じゅしんraw要求ようきゅうのprepareでも再計算さいけいさん一致検査いっちけんさおこない、そのあいだ変更へんこうされたtree/contextや条件じょうけん拒否きょひする。BoundBindingReplyは全結果枝ぜんけっかえだのkeyと通常つうじょうBindingReplyを保持ほじする。raw返信へんしんdecoderの一致検査いっちけんさ意味いみproofの発行はっこうではなく、完了かんりょうproofはじつBindingPlanの実行じっこうからのみる。

BoundBindingReply.for_source はhostが現在要求げんざいようきゅうしているAnalysisKeyとの完全一致かんぜんいっちとSourceRefのrevision/digestを検査けんさしてから、完了かんりょうしたBindingAnalysisを公開こうかいする。これは定義ていぎ参照検索さんしょうけんさく前提ぜんていとなる照合入口しょうごういりぐちであり、positionからの対象選択たいしょうせんたく定義ていぎジャンプ、参照検索さんしょうけんさく、renameのアルゴリズム完成かんせい意味いみしない。既存きそんのunkeyed analyzeのFactSet.analysis_idだけを、editorようのstale判定はんていとして使つかわない。

2. 自動じどうられる機能きのう

schemaのform/leaf/fieldとreader captureから構文こうぶんハイライト、構造的こうぞうてきselection、expected categoryの補完ほかん提供ていきょうする。binding/reference/export/importから定義ていぎジャンプ、参照検索さんしょうけんさく未定義みていぎ/重複診断じゅうふくしんだん、scopeない候補補完こうほほかん提供ていきょうする。name fieldとenclosing rangeからoutlineをつくる。ドキュメントfieldを宣言せんげんすればhoverにす。

型推論かたすいろん回路幅かいろはば数値計算結果等すうちけいさんけっかなどはdomain factsの追加ついか精度せいどげる。grammarだけから任意にんいdomainの意味いみ推測すいそくしたと主張しゅちょうしない。

手書てがきreaderにはview/factsのおなじcontractを要求ようきゅうする。内部ないぶviewなしならtoken全体ぜんたいのfallbackだけ。すべてのcustom readerへ精密せいみつ内部支援ないぶしえん自動生成じどうせいせいできるとはしない。

3. regionの選択せんたく

source positionから、同一どういつsnapshotじょう包含ほうがんする最小さいしょうのfield/elementをえらぶ。grammar priority、最内側さいうちがわ宣言順せんげんじゅんでtie-breakを固定こていする。sentenceないのreadingをわせたらsentence token全体ぜんたいよりreading viewを優先ゆうせんする。

現在げんざいanalysis::region::regions はprepared Binding入力にゅうりょく検査済けんさずみtree/Profileと、明示めいじReaderFactBatch sidecarをける。RegionKey既存きそんAnalysisKeyとsidecarのdigestのくみである。sidecarは RegionSidecar { facts: Option<List<ReaderFactBatch>> }正準せいじゅんNDF/1 CBORへ符号化ふごうかし、SHA-256("nepl3.region.reader-facts/1\0" || bytes)識別しきべつする。Foreign pathとnodeはtreeの正準せいじゅんDFS番号ばんごううつし、batch/fact/triviaの順序じゅんじょ保存ほぞんする。NoneはSyntaxOnly、Some(空列くうれつふくむ)はReaderFactsとして区別くべつし、入力にゅうりょくしなかったCaptureをViewめいから推測すいそくしない。

sidecarのentryは所有しょゆうbundle/nodeの保存ほぞんselectionと照合しょうごうする。nodeのあるbatchのtriviaはToken.leadingTriviaの完全かんぜん再掲さいけいであり、べつtokenをSkippedと名乗なのって混入こんにゅうできない。Captureは所有しょゆうbundleの宣言せんげんSourceMapを使つかい、token headまたは正式せいしきなskip triviaへの包含ほうがん検査けんさする。Presentation/Relationは通常つうじょうreader契約けいやくどおり明示めいじsource/schemaの整合せいごう検査けんさし、消費範囲しょうひはんいへの包含条件ほうがんじょうけん追加ついかしない。所有しょゆうbundleのsource/map不足ふそくをForeignの別表べっぴょうおぎなわない。これらは構造こうぞう出自参照しゅつじさんしょう検査けんさであり、raw sidecarがじつproviderからかえされたことを認証にんしょうしない。

RegionRequestはRegionKey、SourceRef、byte offsetをつ。key/revision/digestとUTF-8 scalar境界きょうかい照合しょうごうし、範囲はんい半開区間はんかいくかんとする。かえすSourceRegionは正準せいじゅんbundle/node、field/element番号ばんごうまたはtoken所有しょゆうViewのroot/field/child path、表示ひょうじsource span、もとのlogical span、priority、depth、宣言順せんげんじゅん、PresentationClassを保持ほじする。nodeなしの末尾まつび/skip-only batchはnode=Noneであり、架空かくうのroot所有しょゆうnodeをつくらない。通常つうじょうnode/field/headのdepthはその宣言せんげんownerのふかさ、Viewはそのownerに内部ないぶfield/childのふかさをくわえる。nodeはおやfieldより内側うちがわとなる。

おなながさならpriority降順こうじゅん、depth降順こうじゅん宣言順せんげんじゅんえらぶ。宣言順せんげんじゅんはrootからfieldじゅんのDFSとViewの宣言順せんげんじゅんで、arenaの保存順ほぞんじゅんとは区別くべつする。共有きょうゆうDAGのおな対象たいしょうには最初さいしょ宣言順せんげんじゅん実際じっさい最深到達経路さいしんとうたつけいろ保持ほじする。回復かいふくnodeはRecoveryとして区別くべつし、UnknownHeadのUnparsed範囲はんい推測すいそくした追加ついかしない。MissingのくうanchorやEOFを直前ちょくぜん名前なまえ吸着きゅうちゃくさせない。

表示用ひょうじようSourceMap投影とうえい領域りょういきownerの明示表めいじひょうだけをたどる。隣接りんせつExact区間くかんおなじsourceとbyte変位へんい連続被覆れんぞくひふくとして結合けつごうし、区間分割くかんぶんかつ表順ひょうじゅん結果けっかえない。完全かんぜんExact、部分被覆ぶぶんひふくExactFragment、保守的ほしゅてきなTransformedを区別くべつし、多義的たぎてき表示候補ひょうじこうほ保持ほじする。この表示情報ひょうじじょうほうはrenameの一意逆写像いちいぎゃくしゃぞう位置単位いちたんい名前解決なまえかいけつ証明しょうめいしない。Foreign fieldの子位置こいちにはbundleのひょう使つかい、guestだけにあるmapをhost nodeへ適用てきようしない。map探索たんさくふかさは構文こうぶん/View ownerのふかさに合成ごうせいして計量けいりょうする。

RegionReplyは全表示ぜんひょうじregionと選択せんたくindex、またはtyped Invalid/Stopped、Usage-only Report、明示めいじsource閉包へいほうかえす。停止ていし候補途中列こうほとちゅうれつ公開こうかいしない。初回しょかいtree/sidecar/request復元ふくげんもとRust要求ようきゅうやambient sourceによる補完ほかん必要ひつようとしない。返信へんしんのCompleteは対応たいおうする準備入力じゅんびにゅうりょくから構造選択こうぞうせんたく予算付よさんつきで再計算さいけいさんして照合しょうごうする。これはreader実行認証じっこうにんしょう、Binding完了かんりょうproof、べつprocess費用計測ひようけいそくわりではない。一般いっぱんregionをもちいるdefinition/references入口いりぐち次節じせつのRegionQueryであり、既存きそんのOccurrenceベース入口いりぐち動作どうさ変更へんこうしない。

型付かたつきregionれつ構築こうちくはWork・Nodes・Depth・AllocationUnitsとsource受入うけいれ計上けいじょうし、まだ生成せいせいしていないserializationのbyteすうをOutputBytesへ推計加算すいけいかさんしない。native返信へんしんのReportはその計算終了時点けいさんしゅうりょうじてんのUsageである。じつNDF/1 CBOR encodeはおな操作予算そうさよさん実出力じつしゅつりょくのOutputBytesを生成前せいせいまえ課金かきんする。したがってnativeのOutputBytes上限じょうげん0で型付かたつ結果けっかられることと、じつencodeがOutputLimitで停止ていしすることはべつ境界きょうかいであり、返信中へんしんちゅうのUsageをそののserializationや外部がいぶtransportまでふく総費用そうひようあつかわない。

highlightは内部ないぶregionへ分割ぶんかつし、leafにちか具体的ぐたいてきclassを優先ゆうせんする。overlapをもとデータは保存ほぞんするが、LSPへは非重複ひじゅうふく・sourceじゅん単一行たんいつぎょう正規化せいきかしたspanれつかえす。いろはthemeにゆだねる。

4. definitionとrelationsのあつか

Occurrenceベースの analysis::query::query は、完了かんりょうしたBoundBindingReplyとQueryRequest(key, SourceRef, byte offset, kind)をける。SourceRefのrevision/digestと現在要求げんざいようきゅうするkeyを照合しょうごうし、UTF-8 scalar境界きょうかい検査けんさする。範囲はんい半開区間はんかいくかんで、終端しゅうたんbyteや空白くうはく直前ちょくぜん名前なまえ吸着きゅうちゃくさせない。包含ほうがんするOccurrence.spanのうち最小さいしょうのものをえらび、同長どうちょうなら確定かくていfactsの発行順はっこうじゅん使つかう。

一般いっぱんregionを使つかanalysis::region::query::query は、おな準備入力じゅんびにゅうりょくじつBinding完了結果かんりょうけっかたいするRegionQueryRequest(region:RegionRequest, kind:QueryKind)をける。まず3せつのpriorityをふく構造選択こうぞうせんたく実行じっこうし、選択せんたくしたSourceRegionを保持ほじする。確定かくていBindingBundleScopeからそのbundleのrootを解決かいけつし、そのrootのOccurrenceだけを候補こうほにする。Foreign fieldは宣言元せんげんもとのRegionTargetを保持ほじしたまま、内容ないようのguest bundleに対応たいおうするrootと局所きょくしょmapをもちいる。たんなるsource座標一致ざひょういっちでhost/guestの名前なまえぜない。

要求位置ようきゅういちいちUnicode scalar範囲はんい選択せんたくregionのlogical範囲はんいを、所有しょゆうbundleの宣言せんげんExact/Transformed関係かんけいでOccurrenceのsourceへ対応付たいおうづけ、両者りょうしゃとOccurrence.spanがかさなるものをのこす。Exactはbyte差分さぶん被覆区間ひふくくかん、Transformedは宣言せんげんされた範囲全体はんいぜんたい対応たいおうである。queryよう対応たいおう双方向そうほうこう関係かんけいであり、非一意ひいちいなExactやTransformedの候補こうほだまってひとつへしぼらず、renameよう一意いちい逆変換ぎゃくへんかん編集権限へんしゅうけんげんとは区別くべつする。source不足ふそくふるいrevision・不正ふせいscalar境界きょうかい停止ていし型付かたつ失敗しっぱいとなる。

対応たいおう使つかうmapはそのSyntaxBundleの局所表きょくしょひょうと、じつBindingBundleScope.customSourceMapsがすCustom受理行じゅりぎょうだけである。Customの生成せいせいsourceもBinding結果けっか明示めいじsource閉包へいほう解決かいけつする。Binding全体ぜんたい平坦へいたんなsourceMapsひょうぜんbundleへ適用てきようせず、おな生成せいせいsourceをhost/guestが共有きょうゆうしていてもべつownerのmapによる候補追加こうほついかゆるさない。

RegionQueryReplyのCompleteは選択せんたくregionとOccurrenceごとのDefinition/References結果列けっかれつつ。れつ確定かくていfactsの発行順はっこうじゅんたもち、各結果かくけっか保存ほぞんされた最終さいしゅうResolutionのEntity IDを使つかう。region=None、regionはあるがOccurrenceがない、未解決みかいけつ/Open入力にゅうりょく複数ふくすうOccurrence、Ambiguousの複数ふくすうEntity、位置いちたないEntityを区別くべつする。名前なまえ再探索さいたんさく発行時はっこうじstageの書換かきかえでCustomの更新こうしんさない。途中候補とちゅうこうほはInvalid/Stoppedで公開こうかいせず、使用済しようず資源しげんはらもどさない。ReportのUsageはnative処理終了時点しょりしゅうりょうじてんであり、後続こうぞくserializationの実出力課金じつしゅつりょくかきんとはける。

初回しょかいRegionQuery受信じゅしんは、明示めいじBindingRequest/ReaderFactBatch sidecarを復元ふくげんして準備じゅんびし、おな選択せんたくProfileでじつBindingを実行じっこうしたあと要求ようきゅう返信へんしん照合しょうごうする。返信へんしんCompleteのcodec検査けんさはこの入力にゅうりょく完了結果かんりょうけっかからqueryを予算付よさんつきで再計算さいけいさんし、候補こうほ選択せんたく・source閉包へいほう比較ひかくする。raw BindingResultやbundleScopesぎょう自己申告じこしんこくRegionKeyから意味いみproof・通信認証つうしんにんしょう・provider実行許可じっこうきょか発行はっこうしない。

QuerySelectionはもとのOccurrenceId・span・確定かくていReferenceResolutionとopenInputを保持ほじする。対象たいしょうなしはNone、未解決みかいけつとOpen namespaceのfree inputはopenInputで区別くべつし、DeferredもUnresolvedにつぶさない。定義候補ていぎこうほ確定かくていresolutionのEntity IDれつしたがい、曖昧あいまい全候補ぜんこうほとその順序じゅんじょ維持いじする。位置いちたないEntityはIDとlocation=Noneをかえし、かりのsource位置いちつくらない。locationがある場合ばあいはURI、定義全体ていぎぜんたいrange、任意にんい名前なまえselectionを分離ぶんりする。

Referencesは選択せんたくしたかくEntity IDごとに確定かくていOccurrenceを検索けんさくする。既定きていではResolvedのReferenceだけをかえす。ReferenceOptionsはDefinition・Import・Export role、およびそのEntityをAmbiguous候補こうほふくむOccurrenceをそれぞれ明示的めいじてき追加ついかできる。曖昧あいまい出現しゅつげんはambiguous=trueで区別くべつし、同綴どうつづりのべつEntityをぜない。通常つうじょうBindingのImportがのexport候補こうほ可視かしにする操作そうさと、providerが明示的めいじてきかえすImport roleのOccurrenceはべつであり、queryがあたらしいOccurrenceを捏造ねつぞうしない。Customの更新後こうしんごもとstageから名前検索なまえけんさくをやりなおさず、確定かくていresolutionをもちいる。

QueryReplyはDefinition/References/Invalid/StoppedとReport、参照位置さんしょういち必要ひつよう宣言せんげんsourcesをつ。げんqueryはあらたな診断しんだん・eventを発行はっこうせず、解析診断かいせきしんだんもとBindingReplyにのこす。query失敗しっぱいはtyped原因げんいんまたはもとStopReasonを保持ほじし、候補途中列こうほとちゅうれつ成功結果せいこうけっかとして公開こうかいしない。使用済しようずみBudgetとSourceAdmissionははらもどさない。sourcesはsource ID・revision・digestじゅん正準化せいじゅんかする。

QueryRequestの初回しょかいdecoderはもとRust要求ようきゅう必要ひつようとしないが、自己申告じこしんこくkeyから完了かんりょうしたBindingAnalysisをつくらない。じつqueryはhostが保持ほじするどうkeyの意味いみproofを使つかう。返信へんしんdecoderは対応たいおうする要求ようきゅう、role options、候補こうほIDれつ範囲はんい・URIと明示めいじsource閉包へいほう検査けんさし、ambient sourceで欠損けっそんめない。これはraw結果けっか構造検査こうぞうけんさであり、通信認証つうしんにんしょうやリモートの解決結果かいけつけっか意味証明いみしょうめいではない。

Customを使つかうprepared実行じっこうにもおなじkey/有効ゆうこうLimitsの検査けんさ適用てきようする。hostのauthorizeが参照さんしょうする設定せってい権限方針けんげんほうしん明示めいじresourceをえて結果けっかわる場合ばあい、hostはその入力変更にゅうりょくへんこうをProfile resourcesやschemaで宣言せんげんしたrequest optionsなどのidentityへ反映はんえいし、きゅうkeyの結果けっか再利用さいりようしてはならない。keyは実行時じっこうじFactAuthorityそのものを認証にんしょうせず、おなじkeyのまま任意にんいのhost設定変更せっていへんこう安全あんぜんゆるあたいでもない。

definition結果けっかはoriginSelection、targetUri、targetRange、targetSelectionを分離ぶんりする。entityのnameだけ選択せんたくしつつ定義全体ていぎぜんたいしめせる。sourceが配布はいふpackageの場合ばあい専用せんようvirtual documentとして公開こうかいできる。

CorrespondsToには「対応文たいおうぶん移動いどう」、Originには「生成元せいせいもと移動いどう」を提供ていきょうし、通常つうじょう定義ていぎジャンプとはべつrelationとしてあつかう。多義的たぎてき解決かいけつ複数候補ふくすうこうほかえし、単語一致たんごいっちひとつにめない。

renameはおなじEntityをすOccurrenceだけを対象たいしょうにする。新名しんめい適格性てきかくせい予約語よやくご、shadowing、scope内衝突ないしょうとつ外側そとがわ参照さんしょう捕捉ほそくまで再検査さいけんさする。SourceMapの逆変換ぎゃくへんかん一意いちいでない場所ばしょはRenameNotInvertible。ぜんTextEditはrevisionきでatomicにかえす。

現在げんざいの rename は RenameRequest(key, source, offset, newName, writable)たいする二段操作にだんそうさである。対象選択たいしょうせんたく上記じょうき名前なまえOccurrence規則きそく使つかう。writable はhostが許可きょかしたもとsnapshot集合しゅうごうであり、受信じゅしんしたSourceRefやURIだけから編集権限へんしゅうけんげん発行はっこうしない。未選択みせんたく未解決みかいけつ曖昧あいまい・Deferred・位置いちなしを型付かたつきで区別くべつして拒否きょひする。予約よやくheadは対象たいしょうEntityのFactNamespace.schemaを所有しょゆうする選択済せんたくずみpackageのForm.spellingと照合しょうごうする。べつschemaの言語げんごだけに存在そんざいするheadを予約語よやくごくわえない。最終的さいしゅうてき名前なまえのreader適格性てきかくせい構文選択こうぶんせんたく実再じっさいparseで検査けんさする。

prepareはもとじつparse完了結果かんりょうけっかと、そのおなじimmutable treeを借用しゃくようするprepared Binding要求ようきゅうどうkeyの完了解析かんりょうかいせき要求ようきゅうする。private RenameDraftにはもとrevisionへの編集候補へんしゅうこうほ候補こうほsnapshot集合しゅうごう保持ほじするが、成功せいこうtransactionや編集列へんしゅうれつ公開入口こうかいいりぐちあたえない。draftはrename操作専用そうさせんようSourceAdmissionを所有しょゆうし、おな有効ゆうこうLimitsのBudgetをprepare・さいparse・再解析さいかいせき・acceptのあいだ排他的はいたてき借用しゃくようする。失敗しっぱいやdraft破棄はき使用済しようず費用ひようはらもどさない。別候補べつこうほおなもとrevisionから分岐ぶんきでき、共有きょうゆうもとSourceStoreを候補作成時こうほさくせいじ変更へんこうしない。

逆写像ぎゃくしゃぞう宣言せんげんSourceMapを全探索ぜんたんさくし、同一どういつsource・revision・digestじょう一意いちい連続範囲れんぞくはんいたっするExact対応たいおうだけを使つかう。隣接りんせつするExact区間くかんおなじbyte変位へんいあななく全対象範囲ぜんたいしょうはんい被覆ひふくするなら結合けつごうでき、表順ひょうじゅん区間分割くかんぶんかつ結果けっかえない。ことなるsourceや変位へんいへの多義性たぎせい被覆穴ひふくあな、Transformed、Composite/Synthetic origin、cycleは拒否きょひする。quoteやescapeから復号ふくごうされた意味名いみめいもとbytesがことなる場合ばあい明示逆めいじぎゃくencoderがないままquoteを置換ちかんおこなわない。探索たんさく範囲比較はんいひかく複製ふくせいはWork/Depth/Nodes/Allocationの対象たいしょうとなる。

ここで探索たんさくする宣言表せんげんひょう対象たいしょうEntityまたはかくOccurrenceのnamespace rootに対応たいおうするじつbundleの局所きょくしょmapと、そのbundleのcustomSourceMapsが受理じゅりmapにかぎる。平坦へいたんなFactSet.sourceMaps全体ぜんたい編集先へんしゅうさき根拠こんきょにしない。かくOccurrenceは自分じぶんのownerで逆写像ぎゃくしゃぞうし、おなじEntityをすという理由りゆうだけで対象たいしょうEntityのmapを流用りゅうようしない。前向まえむ導出どうしゅつ各元編集かくもとへんしゅう対応たいおうownerのくみごとに独立どくりつした閉包へいほうをたどり、最終的さいしゅうてき編集列へんしゅうれつだけを統合とうごうする。再解析後さいかいせきごのsource位置対応いちたいおうはold/newそれぞれのEntity・Occurrence owner、構文位置こうぶんいち各正準かくせいじゅんbundle ownerで検査けんさする。guestだけが宣言せんげんしたmapでhostめいのwritable rootをえることはできない。

もとへの編集へんしゅうからExact対応たいおう前向まえむきにも適用てきようし、影響えいきょうする派生はせいsnapshotのつぎrevisionと内部編集ないぶへんしゅうつくる。派生側はせいがわ未対応みたいおうbyteは保存ほぞんする。さいparseがかえ全宣言ぜんせんげんsourceはdraftの指定していsnapshot集合しゅうごうと、ID・revision・digest・URI・ぜんbytesで一致いっちしなければならない。mapのtargetであることはsnapshot全体ぜんたい照合免除しょうごうめんじょにならない。hostがreaderの生成せいせいsourceを予約よやくする場合ばあいも、この候補こうほidentityを使つかう。公開こうかいする編集へんしゅう許可きょかされたもとsnapshotへのれつだけで、派生側はせいがわ内部編集ないぶへんしゅう追加ついか書込権限かきこみけんげんとして外部がいぶわたさない。

acceptは候補こうほじつparse完了結果かんりょうけっかおなじimmutable treeにたいするprepared要求ようきゅう完了解析かんりょうかいせき照合しょうごうする。Profileの意味いみidentity、provider/package実行じっこうidentity、options・analysis ID・有効ゆうこうLimitsを維持いじし、候補全こうほぜんsource、構文こうぶんkind/field/選択せんたくcontext、編集へんしゅう対応たいおうする位置いち意味いみpayloadを検査けんさする。Entityの対応たいおう宣言位置せんげんいち・scope/namespace・意味名いみめいもとづき、opaque IDの数値一致すうちいっちだけでめない。対象外たいしょうがい名前なまえふくめ、Resolved・ぜんAmbiguous候補こうほ・Unresolved/free input・Deferred・Customの確定かくていresolutionが対応たいおうしていることを検査けんさする。後続こうぞくscopeで名前検索なまえけんさくをやりなおしてCustomの判断はんだん上書うわがきしない。衝突しょうとつ捕捉ほそく構文変更こうぶんへんこう別要求べつようきゅうとの組替くみかえ・停止ていしでは編集列へんしゅうれつ一部いちぶ公開こうかいしない。

nativeのCompletedParseはじつParseSessionのread/resume/reserve/resume_headがCompleteをかえした場合ばあいだけ発行はっこうする所有しょゆうproofであり、待機たいき回復かいふく停止ていし通常つうじょうのParseReplyを保持ほじする。もと候補こうほのprepared treeがこのproofの同一どういつimmutable treeを借用しゃくようする条件じょうけんはnative内部ないぶ保証ほしょうで、pointerやRust ABIを公開こうかいschemaへ露出ろしゅつしない。raw treeの取出とりだしはproofを消費しょうひし、raw ParseTreeやNDF decodeから再発行さいはっこうできない。将来しょうらい別言語べつげんごべつprocess parserも、認証にんしょうされた発行要求はっこうようきゅうじつparse実行結果じっこうけっかむす同等どうとうのhost境界きょうかい必要ひつようとする。現在げんざいのraw rename request/reply codecはschema、要求ようきゅうkey、書込対象かきこみたいしょう、old digest、編集非重複へんしゅうひじゅうふくもとsource閉包へいほう検査けんさするが、通信認証つうしんにんしょうやparse実行証明じっこうしょうめい発行はっこうしない。

RenameReplyのCompleteはしんAnalysisKeyとぜんTextEdit、Invalid/Stoppedは編集へんしゅうなしをかえす。Reportは実消費じつしょうひUsageを保持ほじし、この操作自身そうさじしん新規しんきdiagnostic/eventを発行はっこうしない。さいparse/解析かいせき正式せいしきReportはそれぞれのかえ保持ほじする。受信じゅしんしたUsageの内部整合ないぶせいごう外部処理費用がいぶしょりひよう認証にんしょうべつ責務せきむである。最終適用さいしゅうてきよう呼出側よびだしがわもとSourceStoreにたいし、base revision・old digestきのatomic applyでおこなう。一般いっぱんregion selector、任意にんいencoderによる意味名いみめい逆変換ぎゃくへんかん増分再解析ぞうぶんさいかいせき外部がいぶparser実行じっこう認証にんしょうtransportはこの段階だんかい完成範囲かんせいはんいふくめない。

5. 不完全入力ふかんぜんにゅうりょく

構文こうぶんエラーで文書全体ぶんしょぜんたいうしなわない。treeにMissing(expected, anchor)、Unexpected(span)、Unparsed(range,reason)をてる。通常つうじょう成功せいこうnodeと区別くべつし、checked混入こんにゅうさせない。

EOFで既知きちarityの不足ふそくするとMissingをつくる。現在げんざいのcategoryに不適合ふてきごうだがancestorの明示的同期位置めいじてきどうきいち適合てきごうするtokenは消費しょうひせずMissingを挿入そうにゅうできる。同期根拠どうきこんきょがなければUnexpectedとして消費しょうひするか、その範囲はんいをUnparsedとしてのこす。どちらをえらぶかはpackageのRecoveryPlanに固定こていする。

arity不明ふめいのheadのかず推測すいそくしない。該当がいとうrangeをUnparsedにし、すで確定かくていした周辺しゅうへん情報じょうほうだけをかえす。prefix構文こうぶんではあやまただしい境界きょうかい入力にゅうりょくだけから復元ふくげんできない場合ばあいがある。完全かんぜん復元ふくげんできると広告こうこくしない。

SentenceLiteralでは改行かいぎょう/EOF/終了引用符しゅうりょういんようふ回復境界かいふくきょうかい注釈ちゅうしゃく不足括弧ふそくかっこについてexpected tokenと開始位置かいしいちかえす。期待きたいする括弧かっこ自動挿入じどうそうにゅうするfixは提案ていあんであり、ユーザー操作そうさなしにソースをえない。

6. 増分解析ぞうぶんかいせき取消とりけ

編集へんしゅうはbaseRevisionきTextEditれつ編集後へんしゅうごしんsnapshotをつくり、ふるいsnapshotは不変ふへん編集へんしゅう交差こうさしないrangeは編集写像へんしゅうしゃぞうしんsnapshotへ明示的めいじてきうつせる。交差こうさするtoken、contextを変更へんこうする前方宣言ぜんぽうせんげん、その依存下流いぞんかりゅう無効化むこうかする。

再利用可能さいりようかのうなnodeは、source内容ないよう、entry category、reader/context/provider digestが一致いっちする場合ばあいかぎる。独立どくりつみや意味値いみち再利用さいりようできる。全再解析ぜんさいかいせきとの出力比較しゅつりょくひかくをconformanceにふくめる。最悪時さいあくじ全体再解析ぜんたいさいかいせきただしい経路けいろとしてのこし、つね編集差分へんしゅうさぶんだけの計算量けいさんりょう保証ほしょうしない。

LSPがわはdebounceとcancelを担当たんとうする。coreは明示的めいじてきbudget/pollを使つかう。ふるいrevisionの結果けっか公開こうかいしない。cacheと統計とうけい明示的めいじてきsession stateであり、かくれたglobalにはしない。

7. LSP adapterの責務せきむ

3.17で定義ていぎされた位置いちencoding/diagnostic/semantic token/definitionなど契約けいやく利用りようし、機能きのうはcapabilityで交渉こうしょうする。UTF-8/UTF-16/UTF-32の位置変換いちへんかんをLineIndexでおこなう。UTF-16をfallbackとしてかならあつかう。日本語にほんご補助平面文字ほじょへいめんもじのbyteすう、UTF-16 code unitすう表示幅ひょうじはば混同こんどうしない。

一般的いっぱんてきなDSL classめいはsemantic token legendの独自どくじtypeとしてせる。クライアントが対応たいおうしない場合ばあい表示ひょうじfallbackを使つかうが、NEPL3内部ないぶkindをえない。position/legendの変換へんかんはdomain crateにかない。

nepl3-lspはひとつの汎用はんようserver。workspace設定せっていから拡張子かくちょうしとLanguagePackageを選択せんたくし、かくDSLごとのserverの再実装さいじっそう不要ふようVS Code/Neovimには接続せつぞく設定せっていだけのうすいadapterをく。packageを変更へんこうしたらanalysisを無効化むこうかし、必要ひつようならlegend登録とうろく更新こうしんする。

8. 診断しんだん・ログの表示ひょうじ

同一どういつDiagnosticをCLI、LSP、browserへrenderする。CLI stderrは表示ひょうじadapter、stdoutは要求ようきゅうされた成果物せいかぶつだけ。JSON/NDF診断出力しんだんしゅつりょく人間用表示にんげんようひょうじ分離ぶんりする。詳細しょうさいtraceは明示的めいじてき選択せんたくし、ソース全文ぜんぶん環境かんきょう機密値きみつち既定きていでは記録きろくしない。

情報じょうほう不足ふそくする場合ばあいはstage/requirementsとして表示ひょうじし、存在そんざいしないsource位置いちつくらない。providerの内部ないぶエラーとユーザーの構文こうぶんミスを区別くべつする。

9. workspace trustの境界きょうかい

通常つうじょう解析かいせき診断しんだん対象たいしょうプログラムをevaluateしない。Grammar reader providerはhostのallowlist・署名しょめい・schemaで制限せいげんする。workspaceからnative pluginを自動じどうbuild/loadしない。untrusted providerには隔離かくりrunnerが必要ひつようで、ない環境かんきょうではTrustRequiredをかえす。巨大入力きょだいにゅうりょく/再帰さいき/イベント/出力しゅつりょくにも上限じょうげん設定せっていする。