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/1、nepl3.analysis.execution/1、nepl3.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を返かえす。巨大入力きょだいにゅうりょく/再帰さいき/イベント/出力しゅつりょくにも上限じょうげんを設定せっていする。