午前中は TypeScript のお勉強をしてました。だって、
declare const Buffer: any;
const hasBuffer = (typeof Buffer !== 'undefined');
export class VSBuffer {
static alloc(byteLength: number): VSBuffer {
if (hasBuffer) {
return new VSBuffer(Buffer.allocUnsafe(byteLength));
} else {
return new VSBuffer(new Uint8Array(byteLength));
}
}
いきなり、これですよ。なんだよ、このコード。any で受けて、hasBuffer ですか? record型は面白いが微妙。
% ls ~/src/public/vscode/src/vs/editor/common
commands/ core/ editorCommon.ts model.ts services/ view/
config/ diff/ editorContextKeys.ts modes/ standalone/ viewLayout/
controller/ editorAction.ts model/ modes.ts standaloneStrings.ts viewModel/
というわけで、正直なMVCでよろしい。で、
% more ~/src/public/vscode/src/vs/editor/common/model/textModel.ts
が Model というところまではすぐにわかったんですが...
key input から model 変更の道筋がわからない
VSCode + Chrome extension で debug していくわけなんですが、さっぱりわかりません。なのだが、学生が getRange で捕まえられるっての発見。
僕がわからないところを見つけてくるのは偉すぎる。
なのだが、
stack trace をコピペできないのでスクショ
なんだよそれ。でわかったのは、
# In vs/workbench/browser/parts/editor/textResourceEditor.ts
60:
61: // Remember view settings if input changes
62: this.saveTextResourceEditorViewState(this.input);
63:
64: // Set input and resolve
65: await super.setInput(input, options, context, token);
66: const resolvedModel = await input.resolve();
await で resolve しているわけね。setInput ではわからん。
結局、
# editStack.ts
public pushEditOperation()
で editor command を undo 用に取っておいて、
# vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts
public applyEdits(rawOperations: ValidAnnotatedEditOperation[], recordTrimAutoWhitespace: boolean, computeUndoEdits: boolean): ApplyEditsResult {
で処理するってところまで見れました。この辺のcomandにhookがあるので、それでいろいろできるらしい。
行単位で変更前と後を持っている贅沢な作りだな。