02. 共通きょうつうデータ契約けいやく

atomic pointerを使つかえるnative/Wasmでは、SourceAdmissionが受入済うけいれずみの不変ふへんsnapshot storageを操作内そうさないだけで所有しょゆうし、索引化さくいんかできる。おなじstorageの再受入さいうけいれには既存きそん証明しょうめい再利用さいりようし、独立どくりつdecodeのstorageにはsource/revision/digest/URIとSourceBytesの検査けんさおこなう。所有参照しょゆうさんしょう保持ほじして、addressの再利用さいりようふせぐ。内部ないぶaddressをwire・identity・出力しゅつりょくふくめてはならない。索引さくいんのWorkには要素数ようそすうによる探索たんさく・shiftの上界じょうかい事前計上じぜんけいじょうし、allocatorの配置はいちによるUsageのふせぐ。べつのSourceAdmissionやatomic targetへ、この証明しょうめいがない。

方針ほうしん

source、種類しゅるい構造こうぞう意味いみ解析結果かいせきけっか出自しゅつじを、独立どくりつ保持ほじする。エラーやeditor結果けっかを、文字列もじれつから再解析さいかいせきしない。

1. SourceとRange

SourceId はhostがあたえる、からでないopaque TextのIDである。Revision は、そのsourceのはんあらわす。SnapshotId = (SourceId, Revision, contentDigest) はnativeとwireでおな同一性どういつせいち、wire recordめいはSourceRefとする。SourceSnapshotはUTF-8の不変ふへんbyteれつと、locatorとしてのURIをべつつ。ファイルのほか、メモリ文書ぶんしょ生成文書せいせいぶんしょ許可きょかする。おなじURIを独立どくりつした文書ぶんしょも、ことなるSourceIdで区別くべつする。coreは乱数らんすう時計とけい・pointerからIDを生成せいせいしない。

SourceContentはid:SourceRef、uri:Text、utf8:Textをつ。受信時じゅしんじにはもとのUTF-8 byteれつのSHA-256をid.digestと照合しょうごうする。SourceBundleはsourcesのれつつ。おなじSourceId/revisionにことなる内容ないよう・digest・URIをてる入力にゅうりょくと、重複じゅうふくするsnapshot宣言せんげん拒否きょひする。SourceStoreへの同一どういつsnapshotの再参照さいさんしょうは、既存きそん不変値ふへんちす。文書ぶんしょあたらしいrevisionへ自動更新じどうこうしんしてはならない。URIの変更へんこうは、あたらしいrevisionとして明示めいじする。

Rustのnative SourceSnapshotは、pointer atomicを使つかえるtargetではidentity・URI・本文ほんぶんをまとめた非公開ひこうかい共有不変きょうゆうふへんstoragecloneかん内容ないよう変更へんこうせず共有きょうゆうする格納先かくのうさき使つかう。これらをcloneごとに複製ふくせいしない。おな共有きょうゆうstorageなら、みっつのあたいがすべておなじであると保証ほしょうできる。べつstorageのidentity・URI・本文ほんぶんは、あたい比較ひかくする。pointer atomicをたないalloc-only targetでは所有しょゆうStringを複製ふくせいし、Send/Syncの性質せいしつ不用意ふようい変更へんこうしない。この内部表現ないぶひょうげんをwireへ露出ろしゅつさせず、NDFの受信じゅしんでは全文ぜんぶんとdigestをあらためて検査けんさする。編集へんしゅうではあたらしいsnapshotを構築こうちくし、共有元きょうゆうもと変更へんこうしない。

共有きょうゆうstorageの初回確保しょかいかくほ編集へんしゅうによる新規確保しんきかくほは、AllocationUnitsへ計上けいじょうする。共有きょうゆうstorageを使つかうtargetのnative cloneでは、snapshot slotを計上けいじょうする。atomic targetでは、identity・URI・本文ほんぶん複製費用ふくせいひよう計上けいじょうする。じつコピーのclone_with_budgetとCopyPurpose::Cloneは、共有きょうゆうstorageの内容ないよう走査そうさしない。一方いっぽう外部がいぶcontinuationの比較前ひかくまえ使つかうcharge_cloneとCopyPurpose::Compareは、metadataと本文長ほんぶんちょうふく保守的ほしゅてき上限じょうげん維持いじする。ふたつのsnapshotを直接照合ちょくせつしょうごうするeq_with_budgetは、おな不変ふへんstorageと確認かくにんできる場合ばあいだけ内容比較ないようひかく省略しょうりゃくする。べつdecodeのstorageには、比較前ひかくまえ課金かきんする。SpanのSourceId、診断しんだん、Originなど、snapshot以外いがい所有値しょゆうち複製費用ふくせいひようつづ計上けいじょうする。source storeへの挿入そうにゅうべつ操作そうさとして、索引比較さくいんひかく重複照合じゅうふくしょうごう成長費用せいちょうひよう計上けいじょうする。この最適化さいてきかによって、SourceBytesの入場にゅうじょう停止理由ていしりゆう保持ほじ受信境界じゅしんきょうかい検査けんさ免除めんじょされるわけではない。

Span = (SnapshotId, start:u64, end:u64) とする。構築時こうちくじに、半開区間はんかいくかん [start,end)0 <= start <= end <= source.lenたし、UTF-8 scalar境界きょうかいにあることを検査けんさする。挿入位置そうにゅういちには空区間くうくかん使つかえる。空区間くうくかんひだりまたはみぎへのaffinityは、必要ひつよう操作そうさべつつ。ぎょうれつ画面幅がめんはばをSpanへ保存ほぞんしない。

CRLFはもとの2byteを維持いじする。LineIndexでは、LF、CRLF、CRをそれぞれひとつの改行かいぎょうとしてあつかう。BOMは先頭せんとうだけのtriviaとして記録きろくする。勝手かって除去じょきょして、以後いごのoffsetをずらしてはならない。不正ふせいUTF-8はSourceDecodeFailureとし、文字置換もじちかん位置いち捏造ねつぞうしない。診断しんだん・query・編集へんしゅうは、かならずsnapshotを指定していする。最新さいしんrevision以外いがい結果けっかを、たんにoffsetをたもったまま最新文書さいしんぶんしょ適用てきようしない。

SourceStore.applyはおな操作そうさのBudgetとSourceAdmissionをけ、編集元へんしゅうもと生成せいせいsnapshotを一度いちどずつSourceBytesへ計上けいじょうする。全削除ぜんさくじょ結果けっかからでも、もとsnapshotの入場にゅうじょう省略しょうりゃくしない。editの並替ならびかえ、snapshotの探索たんさく比較ひかく期待きたいdigestと出力しゅつりょくdigestの計算けいさん結果けっか・locator・返却へんきゃくIDのコピーには、処理前しょりまえにWork/AllocationUnitsをす。並替ならびかえではborrowed参照さんしょうだけをうごかし、SourceIdをsort keyとして無計上むけいじょう複製ふくせいしない。

全編集ぜんへんしゅう前提ぜんてい生成せいせいidentity、全出力ぜんしゅつりょく返却へんきゃくIDを準備じゅんびしてから、生成せいせいsnapshotのadmissionとSourceStoreを同時どうじ確定かくていする。後半こうはん検査失敗けんさしっぱい一部いちぶsourceのrevisionだけをすすめず、未公開みこうかい生成せいせいIDも予約状態よやくじょうたいとしてのこさない。既存入力きそんにゅうりょくのadmissionと、消費済しょうひずみのWork/Allocation/SourceBytesはもどさない。意味検査いみけんさ失敗後しっぱいごは、おな操作そうさ訂正ていせいして再試行さいしこうできる。予算停止後よさんていしごおなじBudgetの停止理由ていしりゆう保持ほじし、hostが別操作べつそうさのBudget/SourceAdmissionを明示めいじした場合ばあいだけ再試行さいしこうできる。返却へんきゃくIDは、SourceIdじゅんならべる。

2. schemaとkind

SchemaRef = (packageName, revision, digest)KindRef = (SchemaRef, LocalKindId) とする。LocalKindIdとfieldのならびは、package schemaで定義ていぎする。Word/String/Variable/Functionなどを、共通きょうつうじたTokenKindとしてかない。

共通きょうつう型言語かたげんごは、Unit / Bool / Natural / Integer / Rational / Text / Bytes / List<T> / Option<T> / Record / Variant / Referenceである。ぜんRecord/Variantのfieldとvariantを、登録済とうろくずみschemaで検査けんさする。domain内部ないぶでは、対応たいおうするRustのstruct/enumを使つかう。種類しゅるい表示ひょうじclassは独立どくりつしている。表示ひょうじclassは、拡張可能かくちょうかのうなIDとfallback roleをつ。共通きょうつうfallbackはcontent、marker、delimiter、name、quantity、annotationであり、構文こうぶん意味分類いみぶんるいではない。

3. Tokenと構文こうぶん

Tokenはkind、head span、payload、内部ないぶview、triviaへの関連かんれんつ。arityはべつのHeadShapeから取得しゅとくする。SentenceLiteral内部ないぶのviewを、prefix childrenへ追加ついかしない。HeadShape = {arity, arguments, transitionRecipe} とし、argumentsのかずをarityに一致いっちさせる。引数ひきすうごとのcontext recipeは既読きどく参照さんしょうできるが、headのarityは変更へんこうできない。

Parsed nodeはkind、head span、enclosing source cover、NodeIdれつ、opaque payloadへの参照さんしょう、OriginIdをつ。通常つうじょうのsource nodeのchildrenは、同一どういつsourceじょう重複じゅうふくしない順序じゅんじょつ。生成せいせいnodeはOrigin graphを使つかい、存在そんざいしない連続れんぞくsource範囲はんいつくらない。token/trivia/sourceのlossless保存ほぞんにより、もとのソースを再現さいげんできる。意味正規形いみせいきけいのprinterによるroundtripと、もとsourceをそのまますlossless roundtripは、ことなる操作そうさである。

ForeignClosureは、単体たんたいしたForeignSyntaxと、そのfieldのownerから選択せんたくしたEnvironmentEntry、ownerOrigins、ownerSources、ownerSourceMapsをつ。ForeignSyntax.environmentはowner環境表かんきょうひょう局所参照きょくしょさんしょうであり、おなじIDのguest環境かんきょう解決かいけつしない。EnvironmentBinding.originもownerOriginsへ解決かいけつし、guestのOriginRefと同一視どういつししない。ownerの構文こうぶんnode全体ぜんたいを、閉包へいほう複製ふくせいしない。

この形式けいしきでは、ownerのOrigin列全体れつぜんたいもと順序じゅんじょ・IDで保持ほじする。環境かんきょうのcanonical digestはOriginRefの数値すうちふくむ。そのため、originれつならえたり、部分列ぶぶんれつ再番号化さいばんごうかしたままdigestを保存ほぞんしてはならない。ownerとguestは、それぞれが宣言せんげんしたsourcesだけでOrigin/map/Spanを解決かいけつする。相手あいてひょうやambient storeで欠損けっそんおぎなわない。ひょうまた同一どういつsnapshotの共有きょうゆう許可きょかするが、同一表どういつひょう重複じゅうふくやidentity/URIの矛盾むじゅん拒否きょひする。

環境中かんきょうちゅう名前空間契約なまえくうかんけいやくは、wireのEnvironmentNamespaceRef(schema,name)である。FactSetちゅうのNamespaceRef(value:U64)とはことなるかたとしてあつかう。Rustでは、前者ぜんしゃをsyntax::NamespaceRef、後者こうしゃをfacts::NamespaceRefとして区別くべつする。きゅうEnvironmentBindingのwire参照さんしょう両者りょうしゃ混同こんどうし、empty bindingをFieldCountで拒否きょひしていた不整合ふせいごうは、この明示めいじしたdescriptorへ訂正ていせいする(R046)。

4. 内部ないぶview

ViewElement = {kind, span, fields, roles, relations} とする。ひとつのtokenに、複数ふくすうのViewElementが対応たいおうしてよい。おや範囲はんいふくめるが、変換後へんかんごのviewはSourceMapをかいしたべつsnapshotじょうく。外側そとがわparserはViewElementのあるいて構文こうぶんめない。

SyntaxBundleはsourceMapsを所有しょゆうし、その全端点ぜんたんてんおなじbundleのsourcesで解決かいけつする。foreignのmapはguest bundleに局所きょくしょであり、hostのtableで不足ふそくおぎなわない。mapれつ宣言順せんげんじゅん保存ほぞんし、nodeの再採番さいさいばんから独立どくりつさせる。TokenのかくviewとViewElementのかくには、直接包含ちょくせつほうがんか、検査済けんさずみmapによる包含ほうがん要求ようきゅうする。childのかくbyteからすべての逆経路ぎゃくけいろをたどり、parentない帰着きちゃくすることを検査けんさする。くうspanでは、挿入そうにゅうanchorを調しらべる。Exactはbyte displacement、Transformedは元範囲もとはんい全点ぜんてん対応たいおうさせる。対応たいおうける場合ばあいや、一部いちぶでもparentがい終端しゅうたんがある場合ばあいには、Coverをかえす。parentない到達とうたつしたあとの、さらにふる生成元せいせいもとは、今回こんかいのtokenへの帰属判定きぞくはんていふくめない。たんひとつのmap経路けいろ存在そんざいするだけでは受理じゅりしない。全経路ぜんけいろ検査けんさにも共有きょうゆうWork/Depth/Nodes/Allocation予算よさん使つかい、超過ちょうかはStoppedとする。

readerが内部ないぶviewを公開こうかいしない場合ばあいにも、token全体ぜんたい位置いち必須ひっすである。その場合ばあい内部ないぶ詳細しょうさいなeditor機能きのう利用可能りようかのうであると広告こうこくしない。

5. Origin graph

Origin = Direct(Span) | Composite(List<OriginId>) | Generated(operation, callsite, inputs) | Synthetic(reason, anchor) とする。脱出列だっしゅつれつをdecodeした文字列もじれつ、macro生成物せいせいぶつ回路かいろflatten、数式簡約すうしきかんやくには、多対多たたいた対応たいおうがありる。SourceMap区間同士くかんどうし関係かんけいあらわし、たんなる定数ていすうoffsetに限定げんていしない。mapの循環じゅんかん拒否きょひする。

診断しんだんのprimary位置いちは、問題もんだい直接入力ちょくせつにゅうりょく正確せいかく対応たいおうする範囲はんい優先ゆうせんする。生成物せいせいぶつ対応たいおうがなければ、生成呼出せいせいよびだ箇所かしょをprimary、template/argumentをrelatedとする。sourceがなければ位置いちなしのglobal診断しんだんとし、0ぎょう0れつ仮置かりおきしない。renameの逆変換ぎゃくへんかんには、一意いちいかつ可逆かぎゃく対応たいおうだけをゆるす。1対多たいた合成ごうせい正規化せいきかもどせない箇所かしょ編集へんしゅうは、明確めいかく理由りゆうけて拒否きょひする。

6. 名前なまえ関係かんけい

EntityId はsnapshot/analysisない宣言同一性せんげんどういつせいであり、つづりのhashだけにしない。Occurrence は、定義ていぎ参照さんしょうなどの役割やくわりとsourceじょう位置いちつ。ScopeId名前空間なまえくうかんおやscope、export/import edgeはべつつ。参照結果さんしょうけっかは、Resolved(entity)、Unresolved(name)、Ambiguous(candidates)、Deferred(requirements)のsum typeとする。definition jumpを単語検索たんごけんさく代用だいようしない。DocのCorrespondsToは翻訳対応ほんやくたいおう、BindingReferenceは名前参照なまえさんしょう、Originは生成元せいせいもとあらわす。これらのことなる関係かんけいを、ひとつの「おなじsymbol」へ統合とうごうしない。

6.1. 共通きょうつうfactsと専用処理せんようしょり変更範囲へんこうはんい

FactSetは明示めいじanalysisId、namespace、Scope/Entity/Occurrence、typed Relation、scope edge、source/Origin/SourceMapの所有しょゆうtableをつ。IDはanalysisない一意いちいなU64であり、べつanalysisやguestのおな数値すうち同一視どういつししない。namespaceはschema・name・policyと明示めいじroot scopeをつ。おな名前空間契約なまえくうかんけいやくを、べつarticle/moduleのべつrootへてられる。EntityとOccurrenceのscopeは、そのrootの配下はいかく。rootのおや暗黙あんもくすことはしない。

Entityのdefinition/selectionはOptionであり、sourceのない意味宣言いみせんげんかりSpanをつくらない。selectionをつときは、definitionの範囲内はんいないとする。Occurrenceはsourceじょう位置いち役割やくわり解決結果かいけつけっか保持ほじする。Resolved/Unresolved/Ambiguous/Deferredを区別くべつする。Ambiguousはことなる複数ふくすうEntityを、Deferredはからでない型付かたつ要求列ようきゅうれつつ。共通検査きょうつうけんさでは、参照先さんしょうさき存在そんざい名前なまえ名前空間契約なまえくうかんけいやく、source範囲はんいかた、scopeおや非循環ひじゅんかん調しらべる。lexical探索たんさく・shadowing・importを経由けいゆする可視性かしせいただしく計算けいさんされたことは、べつのbinding/resolution検査けんさ確認かくにんする。共通きょうつうのCheckedFactSetだけでは、そこまで保証ほしょうしない。

専用せんようfacts処理しょりには、既存きそんFactSetとhostが発行はっこうしたFactAuthorityをわたす。authorityはcurrentScope、許可きょかnamespace、明示的めいじてきめる既存きそんdescendant scope、読込よみこみをゆるすimportさきscope、更新こうしんゆる既存きそんOccurrence、Relationの明示めいじsource endpoint、ID予約範囲よやくはんい固定こていする。しんscopeは、currentScopeまたは今回作成こんかいさくせいしたscopeのかぎる。Entity/Occurrenceの追加ついか、import/export edge、既存きそんresolutionの更新こうしんは、かく許可きょかscope/namespaceに限定げんていする。べつarticle/module/guestのscopeを暗黙あんもく更新こうしんしない。Relationのsourceも、許可きょかscopeの対象たいしょうか、hostが明示めいじしたendpointでなければならない。参照先さんしょうさきっているだけでは、変更権限へんこうけんげんにならない。

FactDeltaは既存きそんIDを上書うわがきせず、予約よやくされた半開区間はんかいくかん[start,end)内側うちがわ追加ついかする。resolutionの更新こうしんには、べつれつ既存きそんOccurrenceを指定していする。追加ついかsourceはrequestの宣言せんげんtableへ付加ふかし、追加ついかOriginのoriginBaseを既存きそんOriginすう一致いっちさせる。新旧しんきゅうfactsのOriginRefは、この結合けつごうtableをす。namespaceれつ既存きそんscopeのおやえる操作そうさではない。失敗時しっぱいじにsource/Originをhostのglobal storeへ先行せんこうcommitして、欠損けっそんかくさない。受理前じゅりまえ消費しょうひしたusage/admissionは返却へんきゃくしない。

FactSet/Deltaのtyped wire入口いりぐちは、schema検査後けんさごおなじsource・ID・scope・authority検査けんさおこなう。FactSetのtableじゅん保存ほぞんし、IDを再採番さいさいばんしない。これは共通値きょうつうち検査けんさ交換契約こうかんけいやくである。T06の解決かいけつアルゴリズム、Custom binding callbackの実行じっこう解析操作全体かいせきそうさぜんたい完了かんりょう意味いみしない。

7. 診断しんだんとevent

Diagnosticはcode、severity、stage、schema/provider、構造化こうぞうかargs、primaryのOption、relatedれつ、fixれつつ。codeはschema所有しょゆうenumのIDとし、表示言語ひょうじげんご文章ぶんしょうはrenderer/catalogがめる。Fixは、前提ぜんていsnapshotと非重複ひじゅうふくTextEditれつつ。ふるいsnapshotに自動適用じどうてきようせず、expected text/digestを検査けんさする。複数ふくすうsourceのfixは、ひとつのtransactionとしてかえす。

ひとつのFixないでは、かくSourceIdのぜんeditがおなじsnapshotを前提ぜんていとする。ことなるrevisionを、おなじsourceの編集へんしゅうtransactionへぜない。この制約せいやくは、ことなるSourceIdへの複数編集ふくすうへんしゅうや、primary/relatedによる履歴りれきsnapshotの参照さんしょう禁止きんしするものではない。

EventはParseStarted/RuleTried/RuleCommitted/BindingResolved/OperationFinishedなどのschema所有しょゆうkind、operation path、必要ひつよう範囲はんい構造化こうぞうかpayloadをつ。domainログをすべて文字列もじれつにする必要ひつようはない。TraceLevelはOff/Summary/Detailedである。Offではeventをつくらず、予算よさん消費しょうひしない。上限じょうげんえるevent追加ついか最初さいしょ試行しこうでStopped(EventLimit)とし、先頭せんとう許容件数きょようけんすう保持ほじする。既存きそんeventの上書うわがきや、だまったCompleteはおこなわない。

overflowはeventれつそとにある traceOverflow: Option<TraceOverflow> へ、一度いちどだけ記録きろくする。TraceOverflow.droppedは、実際じっさい追加ついかこころみて受理じゅりされなかった件数けんすうあらわし、通常つうじょう即時停止そくじていしでは1となる。未実行みじっこう将来しょうらいeventすう推定すいていしない。この報告ほうこくfieldにより、events上限じょうげんが0でも停止理由ていしりゆう切捨きりすてをあらわせる。すでにcancelやべつlimitで停止ていしした処理しょり終了しゅうりょうeventを記録きろくしようとしても、さき確定かくていした停止理由ていしりゆうをEventLimitへえない。

backtrackingでしたcandidateの診断しんだんやeditor factsを、成功結果せいこうけっか混入こんにゅうさせない。debug traceだけが、試行しこう記録きろく保持ほじできる。coreはclockやloggerをばず、hostが時刻じこく出力先しゅつりょくさきける。

共通きょうつうReport検査けんさでは、登録済とうろくずみschemaと型付かたつきarguments/payload、primary/related/fix/eventの明示めいじsource参照さんしょうとUTF-8範囲はんい、Fixない期待きたいdigest一致いっち非重複ひじゅうふく調しらべる。usageが正式件数せいしきけんすう下回したまわらず、traceOverflow.droppedがせいであることも検査けんさする。おなじsnapshotの同一開始位置どういつかいしいちへの編集へんしゅうは、空範囲くうはんい挿入そうにゅうふくめて競合きょうごうとする。Report単独たんどくのcodecは、診断文面しんだんぶんめん真偽しんぎ、domain固有こゆうcodeとargumentsの対応たいおう外部がいぶproviderが申告しんこくした消費量しょうひりょう真正性しんせいせい証明しょうめいしない。操作入口そうさいりぐちは、別途保存べっとほぞんしたrequest・権限けんげん・usage履歴りれきむすける。Fixの適用時てきようじには、現在げんざいsnapshotとの一致いっち再検査さいけんさする。すで受理じゅりしたReportを再検査さいけんさ再掲さいけいしてもDiagnostics/Eventsの件数けんすう再課金さいかきんしないが、検査けんさWorkと所有しょゆうコピー費用ひよう計上けいじょうする。ReportようcodecへわたすSourceStoreは、その操作そうさ明示めいじした宣言表せんげんひょうである。環境全体かんきょうぜんたいのstoreを暗黙あんもく探索たんさくしない。

8. 予算よさん結果けっか

LimitsはsourceBytes、work、depth、nodes、allocationUnits、outputBytes、diagnostics、eventsをつ。全再帰ぜんさいき共有きょうゆうし、言語げんごえてリセットしない。論理的ろんりてきなlimit検査けんさと、OS allocatorの物理ぶつりOOMは同一どういつではない。trusted native codeの無限むげんloopを、呼出よびだ検査けんさ停止ていしできるとは主張しゅちょうしない。

Usageはおなじfieldめいべつrecordであり、許容最大値きょようさいだいちではなく、実際じっさい累積消費るいせきしょうひあらわす。depthだけは最大同時再帰深さいだいどうじさいきふかさとし、現在げんざいふかさはべつ管理かんりする。解放かいほう巻戻まきもどしで、消費済しょうひずみのwork/nodes/allocationUnitsなどを返却へんきゃくしない。整数加算せいすうかさんのoverflowは、該当がいとうlimitの超過ちょうかとして拒否きょひする。超過ちょうかした試行しこう成功せいこうした消費しょうひ計上けいじょうして、Usageを上限じょうげんよりおおきくしない。停止ていししたbudgetを、再開さいかい外部操作がいぶそうさ別言語べつげんごへの切替きりかえで新品しんぴんえない。

sourceBytesは、ひとつの共有操作きょうゆうそうさcontextへれるかくsnapshotのもとbyteちょうを、一度いちどずつ計上けいじょうする。参照さんしょうをたどるたびに、おなじsnapshotを再計上さいけいじょうしない。ただし、べつのsnapshot生成せいせい変更後へんこうごのsource、decodeつくるsourceは、別入力べつにゅうりょくとして計上けいじょうする。snapshotの構築こうちくだけをかえ低水準ていすいじゅんAPIと、受入済うけいれずみbundleの参照さんしょう区別くべつする。

sourceBytesをえる入力にゅうりょくは、文字数もじすうではなくもとのUTF-8 byteすう判定はんていし、Stopped(SourceLimit)をかえす。もとbyteれつるsnapshot constructorは、このながさをUTF-8 decodeよりまえ検査けんさする。NDF受信じゅしんでは、CBOR構造こうぞう・TextのUTF-8・schemaの検査けんさませてはじめて埋込うめこみsourceを識別しきべつできるため、その段階だんかい失敗しっぱいさきになる。すで停止ていししたbudgetの理由りゆうを、後続こうぞく検査けんさえない。

SourceAdmissionは操作共通そうさきょうつう資源計上台帳しげんけいじょうだいちょうであり、公開こうかいされたSourceStoreではない。bundleの後半こうはん失敗しっぱいしても、前半ぜんはんれたsnapshotの使用量しようりょうとidentity照合情報しょうごうじょうほうさない。おなじcontextで再試行さいしこうしてもおなじsnapshotを二重計上にじゅうけいじょうせず、locatorや内容ないよう衝突しょうとつ拒否きょひする。typed bundleの返却へんきゃくとSourceStoreへの反映はんえいは、全体ぜんたい検査成功後けんさせいこうごおこなう。した候補こうほのsourceを、解析結果かいせきけっか混入こんにゅうさせない。

Rust実装じっそうのSourceStoreとSourceAdmissionは、SourceId・revisionをキーとする非公開索引ひこうかいさくいん使つかう。索引さくいん一致いっちだけでsnapshotの一致いっちとはせず、digest・locatorと必要ひつよう内容比較ないようひかく維持いじする。sourceの公開列こうかいれつ挿入順そうにゅうじゅんのままとし、索引さくいん比較ひかく追加領域ついかりょういき要素移動ようそいどう予算よさん計上けいじょうする。複数ふくすうsourceの編集へんしゅうでは、sourceれつ入場台帳にゅうじょうだいちょう両索引りょうさくいん準備じゅんびをすべてませてから反映はんえいする。から索引さくいんたいする検索けんさくも、取消とりけしを無視むししない。Reportの補助ほじょsource索引さくいんとSourceMapのgraph索引さくいん内部実装ないぶじっそうであり、wireの順序じゅんじょ位置いち循環じゅんかん意味いみ変更へんこうしない。

操作結果そうさけっかは、Complete(value)、Invalid(partial)、Stopped(reason, partial)を区別くべつする。すべての結果けっかに、diagnostics、events、usage、traceOverflowをつReportをける。nativeでは共通きょうつうReportをまとめ、wireではOperationReplyの定義順ていぎじゅんにfieldを展開てんかいする。providerのAwaitも、おな報告ほうこく累積予算るいせきよさん保持ほじする。partialをcheckedとしてあつかわない。diagnostics上限じょうげん超過ちょうかはStopped(DiagnosticLimit)とし、上限じょうげん0では架空かくう診断しんだん追加ついかせず、StopReasonでつたえる。入力にゅうりょく問題もんだい未解決みかいけつ要求ようきゅう未対応みたいおう操作そうさ上限超過じょうげんちょうか、provider違反いはんは、べつcodeでかえす。