Skip to content

Commit b82bca4

Browse files
committed
Extract transformDocuments
1 parent 2a40c3b commit b82bca4

File tree

3 files changed

+130
-121
lines changed

3 files changed

+130
-121
lines changed

src/parse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as YAML from "yaml";
22
import { attachComments } from "./attach.ts";
33
import { createRoot } from "./factories/root.ts";
44
import Context from "./transforms/context.ts";
5-
import { transformDocuments } from "./transforms/document.ts";
5+
import { transformDocuments } from "./transforms/documents.ts";
66
import type { ParseOptions, Root } from "./types.ts";
77
import { updatePositions } from "./utils/update-positions.ts";
88
import { YAMLSyntaxError } from "./yaml-syntax-error.ts";

src/transforms/document.ts

Lines changed: 4 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,131 +1,15 @@
1-
import type * as YAML from "yaml";
2-
import * as YAML_CST from "../cst.ts";
31
import { createDocument } from "../factories/document.ts";
4-
import { createDocumentBody } from "../factories/document-body.ts";
5-
import { createDocumentHead } from "../factories/document-head.ts";
62
import { createPosition } from "../factories/position.ts";
73
import type { Document } from "../types.ts";
8-
import { getPointText } from "../utils/get-point-text.ts";
94
import type Context from "./context.ts";
105
import { transformDocumentBody } from "./document-body.ts";
116
import { transformDocumentHead } from "./document-head.ts";
7+
import { type DocumentData } from "./documents.ts";
128

13-
type DocumentData = {
14-
tokensBeforeBody: (YAML_CST.CommentSourceToken | YAML.CST.Directive)[];
15-
cstNode: YAML.CST.Document;
16-
node: YAML.Document.Parsed;
17-
tokensAfterBody: YAML_CST.CommentSourceToken[];
18-
documentEnd: YAML.CST.DocumentEnd | null;
19-
};
20-
21-
export function transformDocuments(
22-
parsedDocuments: YAML.Document.Parsed[],
23-
cstTokens: YAML.CST.Token[],
9+
export function transformDocument(
10+
document: DocumentData,
2411
context: Context,
25-
): Document[] {
26-
if (parsedDocuments.length === 0) {
27-
return [];
28-
}
29-
30-
const documents: DocumentData[] = [];
31-
32-
const bufferComments: YAML_CST.CommentSourceToken[] = [];
33-
const tokensBeforeBody: (YAML_CST.CommentSourceToken | YAML.CST.Directive)[] =
34-
[];
35-
let currentDocumentData: DocumentData | null = null;
36-
for (const token of YAML_CST.tokens(cstTokens)) {
37-
if (token.type === "document") {
38-
// istanbul ignore if -- @preserve
39-
if (parsedDocuments.length <= documents.length) {
40-
throw new Error(
41-
`Unexpected 'document' token at ${getPointText(context.transformOffset(token.offset))}`,
42-
);
43-
}
44-
45-
currentDocumentData = {
46-
tokensBeforeBody: [...tokensBeforeBody, ...bufferComments],
47-
cstNode: token,
48-
node: parsedDocuments[documents.length],
49-
tokensAfterBody: [],
50-
documentEnd: null,
51-
};
52-
53-
documents.push(currentDocumentData);
54-
tokensBeforeBody.length = 0;
55-
bufferComments.length = 0;
56-
continue;
57-
}
58-
59-
if (token.type === "comment") {
60-
bufferComments.push(token);
61-
continue;
62-
}
63-
64-
if (token.type === "directive") {
65-
tokensBeforeBody.push(...bufferComments, token);
66-
bufferComments.length = 0;
67-
continue;
68-
}
69-
70-
if (token.type === "doc-end") {
71-
// istanbul ignore if -- @preserve
72-
if (!currentDocumentData || currentDocumentData.documentEnd) {
73-
throw new Error(
74-
`Unexpected 'doc-end' token at ${getPointText(context.transformOffset(token.offset))}`,
75-
);
76-
}
77-
78-
currentDocumentData!.tokensAfterBody = [...bufferComments];
79-
bufferComments.length = 0;
80-
currentDocumentData!.documentEnd = token;
81-
continue;
82-
}
83-
}
84-
85-
// Append buffered comments to the last document
86-
if (currentDocumentData && !currentDocumentData.documentEnd) {
87-
currentDocumentData.tokensAfterBody.push(...bufferComments);
88-
bufferComments.length = 0;
89-
}
90-
91-
const nodes = documents.map(document => transformDocument(document, context));
92-
93-
if (bufferComments.length === 0) {
94-
return nodes;
95-
}
96-
97-
// Append remaining comments as a new document
98-
const firstComment = bufferComments[0];
99-
const commentDoc: Document = createDocument(
100-
createPosition(
101-
context.transformOffset(firstComment.offset),
102-
context.transformOffset(context.text.length),
103-
),
104-
false,
105-
false,
106-
createDocumentHead(
107-
createPosition(
108-
context.transformOffset(firstComment.offset),
109-
context.transformOffset(firstComment.offset),
110-
),
111-
[],
112-
[],
113-
null,
114-
),
115-
createDocumentBody(
116-
createPosition(
117-
context.transformOffset(firstComment.offset),
118-
context.transformOffset(context.text.length),
119-
),
120-
null,
121-
bufferComments.map(token => context.transformComment(token)),
122-
),
123-
null,
124-
);
125-
return [...nodes, commentDoc];
126-
}
127-
128-
function transformDocument(document: DocumentData, context: Context): Document {
12+
): Document {
12913
const { documentHead, tokensBeforeBody, docStart } = transformDocumentHead(
13014
document.tokensBeforeBody,
13115
document.cstNode,

src/transforms/documents.ts

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import type * as YAML from "yaml";
2+
import * as YAML_CST from "../cst.ts";
3+
import { createDocument } from "../factories/document.ts";
4+
import { createDocumentBody } from "../factories/document-body.ts";
5+
import { createDocumentHead } from "../factories/document-head.ts";
6+
import { createPosition } from "../factories/position.ts";
7+
import type { Document } from "../types.ts";
8+
import { getPointText } from "../utils/get-point-text.ts";
9+
import type Context from "./context.ts";
10+
import { transformDocument } from "./document.ts";
11+
12+
export type DocumentData = {
13+
tokensBeforeBody: (YAML_CST.CommentSourceToken | YAML.CST.Directive)[];
14+
cstNode: YAML.CST.Document;
15+
node: YAML.Document.Parsed;
16+
tokensAfterBody: YAML_CST.CommentSourceToken[];
17+
documentEnd: YAML.CST.DocumentEnd | null;
18+
};
19+
20+
export function transformDocuments(
21+
parsedDocuments: YAML.Document.Parsed[],
22+
cstTokens: YAML.CST.Token[],
23+
context: Context,
24+
): Document[] {
25+
if (parsedDocuments.length === 0) {
26+
return [];
27+
}
28+
29+
const documents: DocumentData[] = [];
30+
31+
const bufferComments: YAML_CST.CommentSourceToken[] = [];
32+
const tokensBeforeBody: (YAML_CST.CommentSourceToken | YAML.CST.Directive)[] =
33+
[];
34+
let currentDocumentData: DocumentData | null = null;
35+
for (const token of YAML_CST.tokens(cstTokens)) {
36+
if (token.type === "document") {
37+
// istanbul ignore if -- @preserve
38+
if (parsedDocuments.length <= documents.length) {
39+
throw new Error(
40+
`Unexpected 'document' token at ${getPointText(context.transformOffset(token.offset))}`,
41+
);
42+
}
43+
44+
currentDocumentData = {
45+
tokensBeforeBody: [...tokensBeforeBody, ...bufferComments],
46+
cstNode: token,
47+
node: parsedDocuments[documents.length],
48+
tokensAfterBody: [],
49+
documentEnd: null,
50+
};
51+
52+
documents.push(currentDocumentData);
53+
tokensBeforeBody.length = 0;
54+
bufferComments.length = 0;
55+
continue;
56+
}
57+
58+
if (token.type === "comment") {
59+
bufferComments.push(token);
60+
continue;
61+
}
62+
63+
if (token.type === "directive") {
64+
tokensBeforeBody.push(...bufferComments, token);
65+
bufferComments.length = 0;
66+
continue;
67+
}
68+
69+
if (token.type === "doc-end") {
70+
// istanbul ignore if -- @preserve
71+
if (!currentDocumentData || currentDocumentData.documentEnd) {
72+
throw new Error(
73+
`Unexpected 'doc-end' token at ${getPointText(context.transformOffset(token.offset))}`,
74+
);
75+
}
76+
77+
currentDocumentData!.tokensAfterBody = [...bufferComments];
78+
bufferComments.length = 0;
79+
currentDocumentData!.documentEnd = token;
80+
continue;
81+
}
82+
}
83+
84+
// Append buffered comments to the last document
85+
if (currentDocumentData && !currentDocumentData.documentEnd) {
86+
currentDocumentData.tokensAfterBody.push(...bufferComments);
87+
bufferComments.length = 0;
88+
}
89+
90+
const nodes = documents.map(document => transformDocument(document, context));
91+
92+
if (bufferComments.length === 0) {
93+
return nodes;
94+
}
95+
96+
// Append remaining comments as a new document
97+
const firstComment = bufferComments[0];
98+
const commentDoc: Document = createDocument(
99+
createPosition(
100+
context.transformOffset(firstComment.offset),
101+
context.transformOffset(context.text.length),
102+
),
103+
false,
104+
false,
105+
createDocumentHead(
106+
createPosition(
107+
context.transformOffset(firstComment.offset),
108+
context.transformOffset(firstComment.offset),
109+
),
110+
[],
111+
[],
112+
null,
113+
),
114+
createDocumentBody(
115+
createPosition(
116+
context.transformOffset(firstComment.offset),
117+
context.transformOffset(context.text.length),
118+
),
119+
null,
120+
bufferComments.map(token => context.transformComment(token)),
121+
),
122+
null,
123+
);
124+
return [...nodes, commentDoc];
125+
}

0 commit comments

Comments
 (0)