Skip to content

Commit bda1edf

Browse files
authored
perf: flatten sourceMap to improve memory usage (#4964)
1 parent 10742fa commit bda1edf

File tree

99 files changed

+1234
-1570
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+1234
-1570
lines changed

packages/apidom-ast/src/Node.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ export interface NodeOptions {
77
readonly children?: unknown[];
88
readonly position?: Position;
99
readonly isMissing?: boolean;
10+
readonly startPositionRow?: number;
11+
readonly startPositionColumn?: number;
12+
readonly startIndex?: number;
13+
readonly endPositionRow?: number;
14+
readonly endPositionColumn?: number;
15+
readonly endIndex?: number;
1016
}
1117

1218
/**
@@ -21,13 +27,37 @@ class Node {
2127

2228
public children: unknown[];
2329

24-
public position?: Position;
30+
public startPositionRow?: number;
2531

26-
constructor({ children = [], position, isMissing = false }: NodeOptions = {}) {
32+
public startPositionColumn?: number;
33+
34+
public startIndex?: number;
35+
36+
public endPositionRow?: number;
37+
38+
public endPositionColumn?: number;
39+
40+
public endIndex?: number;
41+
42+
constructor({
43+
children = [],
44+
isMissing = false,
45+
startPositionRow,
46+
startPositionColumn,
47+
startIndex,
48+
endPositionRow,
49+
endPositionColumn,
50+
endIndex,
51+
}: NodeOptions = {}) {
2752
this.type = (this.constructor as typeof Node).type;
2853
this.isMissing = isMissing;
2954
this.children = children;
30-
this.position = position;
55+
this.startPositionRow = startPositionRow;
56+
this.startPositionColumn = startPositionColumn;
57+
this.startIndex = startIndex;
58+
this.endPositionRow = endPositionRow;
59+
this.endPositionColumn = endPositionColumn;
60+
this.endIndex = endIndex;
3161
}
3262

3363
// creates shallow clone of node

packages/apidom-ast/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export type { PointOptions, PositionOptions } from './Position.ts';
8282
export { default as Error } from './Error.ts';
8383
export type { ErrorOptions } from './Error.ts';
8484
export { default as ParseResult } from './ParseResult.ts';
85-
export { isParseResult, isLiteral, isPoint, isPosition } from './predicates.ts';
85+
export { isParseResult, isLiteral } from './predicates.ts';
8686
// AST traversal related exports
8787
export {
8888
BREAK,

packages/apidom-ast/src/predicates.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type Literal from './Literal.ts';
2-
import Position, { Point } from './Position.ts';
32
import ParseResult from './ParseResult.ts';
43

54
/**
@@ -13,16 +12,6 @@ export const isNodeType = (type: string, node: unknown): boolean =>
1312
*/
1413
export const isLiteral = (node: unknown): node is Literal => isNodeType('literal', node);
1514

16-
/**
17-
* @public
18-
*/
19-
export const isPosition = (node: unknown): node is Position => isNodeType('position', node);
20-
21-
/**
22-
* @public
23-
*/
24-
export const isPoint = (node: unknown): node is Point => isNodeType('point', node);
25-
2615
/**
2716
* @public
2817
*/

packages/apidom-ast/src/yaml/errors/YamlTagError.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { ApiDOMErrorOptions } from '@swagger-api/apidom-error';
22

33
import YamlSchemaError from './YamlSchemaError.ts';
4-
import Position from '../../Position.ts';
54
import Node from '../../Node.ts';
65

76
/**
@@ -11,7 +10,12 @@ export interface YamlTagErrorOptions<T extends Node = Node> extends ApiDOMErrorO
1110
readonly specificTagName: string;
1211
readonly explicitTagName: string;
1312
readonly tagKind: string;
14-
readonly tagPosition?: Position;
13+
readonly tagStartPositionRow?: number;
14+
readonly tagStartPositionColumn?: number;
15+
readonly tagStartPositionIndex?: number;
16+
readonly tagEndPositionRow?: number;
17+
readonly tagEndPositionColumn?: number;
18+
readonly tagEndPositionIndex?: number;
1519
readonly nodeCanonicalContent?: string;
1620
readonly node?: T;
1721
}
@@ -26,7 +30,17 @@ class YamlTagError extends YamlSchemaError {
2630

2731
public readonly tagKind!: string;
2832

29-
public readonly tagPosition?: Position;
33+
public readonly tagStartPositionRow?: number;
34+
35+
public readonly tagStartPositionColumn?: number;
36+
37+
public readonly tagStartPositionIndex?: number;
38+
39+
public readonly tagEndPositionRow?: number;
40+
41+
public readonly tagEndPositionColumn?: number;
42+
43+
public readonly tagEndPositionIndex?: number;
3044

3145
public readonly nodeCanonicalContent?: string;
3246

@@ -39,7 +53,12 @@ class YamlTagError extends YamlSchemaError {
3953
this.specificTagName = structuredOptions.specificTagName;
4054
this.explicitTagName = structuredOptions.explicitTagName;
4155
this.tagKind = structuredOptions.tagKind;
42-
this.tagPosition = structuredOptions.tagPosition;
56+
this.tagStartPositionRow = structuredOptions.tagStartPositionRow;
57+
this.tagStartPositionColumn = structuredOptions.tagStartPositionColumn;
58+
this.tagStartPositionIndex = structuredOptions.tagStartPositionIndex;
59+
this.tagEndPositionRow = structuredOptions.tagEndPositionRow;
60+
this.tagEndPositionColumn = structuredOptions.tagEndPositionColumn;
61+
this.tagEndPositionIndex = structuredOptions.tagEndPositionIndex;
4362
this.nodeCanonicalContent = structuredOptions.nodeCanonicalContent;
4463
this.node = structuredOptions.node;
4564
}

packages/apidom-ast/src/yaml/schemas/failsafe/index.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { clone } from 'ramda';
2-
31
import YamlTagError from '../../errors/YamlTagError.ts';
42
import YamlDirective from '../../nodes/YamlDirective.ts';
53
import { YamlNodeKind } from '../../nodes/YamlTag.ts';
@@ -95,7 +93,12 @@ class FailsafeSchema {
9593
specificTagName,
9694
explicitTagName: node.tag.explicitName,
9795
tagKind: node.tag.kind,
98-
tagPosition: clone(node.tag.position),
96+
tagStartPositionRow: node.tag.startPositionRow,
97+
tagStartPositionColumn: node.tag.startPositionColumn,
98+
tagStartPositionIndex: node.tag.startIndex,
99+
tagEndPositionRow: node.tag.endPositionRow,
100+
tagEndPositionColumn: node.tag.endPositionColumn,
101+
tagEndPositionIndex: node.tag.endIndex,
99102
node: node.clone(),
100103
});
101104
}
@@ -106,7 +109,12 @@ class FailsafeSchema {
106109
specificTagName,
107110
explicitTagName: node.tag.explicitName,
108111
tagKind: node.tag.kind,
109-
tagPosition: clone(node.tag.position),
112+
tagStartPositionRow: node.tag.startPositionRow,
113+
tagStartPositionColumn: node.tag.startPositionColumn,
114+
tagStartPositionIndex: node.tag.startIndex,
115+
tagEndPositionRow: node.tag.endPositionRow,
116+
tagEndPositionColumn: node.tag.endPositionColumn,
117+
tagEndPositionIndex: node.tag.endIndex,
110118
nodeCanonicalContent: canonicalNode.content,
111119
node: node.clone(),
112120
});

packages/apidom-converter/src/strategies/openapi-3-1-to-openapi-3-0-3/toolbox.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
import { Element, Meta, Attributes, AnnotationElement } from '@swagger-api/apidom-core';
1+
import {
2+
Element,
3+
Meta,
4+
Attributes,
5+
AnnotationElement,
6+
assignSourceMap,
7+
} from '@swagger-api/apidom-core';
28
import { createToolbox as createToolboxOpenAPI31 } from '@swagger-api/apidom-ns-openapi-3-1';
39

410
const createToolbox = () => {
511
const openAPI31Toolbox = createToolboxOpenAPI31();
612

713
const copySourceMap = <T extends Element, U extends Element>(from: T, to: U): void => {
814
if (openAPI31Toolbox.predicates.hasElementSourceMap(from)) {
9-
to.meta.set('sourceMap', from.meta.get('sourceMap'));
15+
assignSourceMap(to, from);
1016
}
1117
};
1218

packages/apidom-converter/test/strategies/openapi-3-1-to-openapi-3-0-3/refractor-plugins/security-requirements-empty-roles/index.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import path from 'node:path';
22
import { fileURLToPath } from 'node:url';
33
import { mediaTypes as openAPI31MediaTypes } from '@swagger-api/apidom-parser-adapter-openapi-json-3-1';
44
import { mediaTypes as openAPI30MediaTypes } from '@swagger-api/apidom-parser-adapter-openapi-json-3-0';
5-
import { AnnotationElement, includesClasses, toJSON, toValue } from '@swagger-api/apidom-core';
5+
import { AnnotationElement, includesClasses, toJSON } from '@swagger-api/apidom-core';
66
import { assert, expect } from 'chai';
77

88
import convert from '../../../../../src/index.ts';
@@ -73,20 +73,22 @@ describe('converter', function () {
7373
const annotation: AnnotationElement = annotations.find((a: AnnotationElement) =>
7474
a.code?.equals('security-requirements-empty-roles'),
7575
);
76-
const sourceMap = annotation.meta.get('sourceMap');
77-
const { positionStart, positionEnd } = sourceMap;
78-
const [startRow, startColumn, startChar] = toValue(positionStart);
79-
const [endRow, endColumn, endChar] = toValue(positionEnd);
76+
const {
77+
startPositionRow,
78+
startPositionColumn,
79+
startIndex,
80+
endPositionRow,
81+
endPositionColumn,
82+
endIndex,
83+
} = annotation;
8084

81-
assert.isDefined(sourceMap);
85+
assert.strictEqual(startPositionRow, 15);
86+
assert.strictEqual(startPositionColumn, 29);
87+
assert.strictEqual(startIndex, 299);
8288

83-
assert.strictEqual(startRow, 15);
84-
assert.strictEqual(startColumn, 29);
85-
assert.strictEqual(startChar, 299);
86-
87-
assert.strictEqual(endRow, 18);
88-
assert.strictEqual(endColumn, 13);
89-
assert.strictEqual(endChar, 358);
89+
assert.strictEqual(endPositionRow, 18);
90+
assert.strictEqual(endPositionColumn, 13);
91+
assert.strictEqual(endIndex, 358);
9092
});
9193
});
9294
});

packages/apidom-converter/test/strategies/openapi-3-1-to-openapi-3-0-3/refractor-plugins/security-scheme-type/index.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import path from 'node:path';
22
import { fileURLToPath } from 'node:url';
33
import { mediaTypes as openAPI31MediaTypes } from '@swagger-api/apidom-parser-adapter-openapi-json-3-1';
44
import { mediaTypes as openAPI30MediaTypes } from '@swagger-api/apidom-parser-adapter-openapi-json-3-0';
5-
import { AnnotationElement, includesClasses, toJSON, toValue } from '@swagger-api/apidom-core';
5+
import { AnnotationElement, includesClasses, toJSON } from '@swagger-api/apidom-core';
66
import { assert, expect } from 'chai';
77

88
import convert from '../../../../../src/index.ts';
@@ -61,20 +61,22 @@ describe('converter', function () {
6161
const annotation: AnnotationElement = annotations.find((a: AnnotationElement) =>
6262
a.code?.equals('mutualTLS'),
6363
);
64-
const sourceMap = annotation.meta.get('sourceMap');
65-
const { positionStart, positionEnd } = sourceMap;
66-
const [startRow, startColumn, startChar] = toValue(positionStart);
67-
const [endRow, endColumn, endChar] = toValue(positionEnd);
64+
const {
65+
startPositionRow,
66+
startPositionColumn,
67+
startIndex,
68+
endPositionRow,
69+
endPositionColumn,
70+
endIndex,
71+
} = annotation;
6872

69-
assert.isDefined(sourceMap);
73+
assert.strictEqual(startPositionRow, 9);
74+
assert.strictEqual(startPositionColumn, 32);
75+
assert.strictEqual(startIndex, 188);
7076

71-
assert.strictEqual(startRow, 9);
72-
assert.strictEqual(startColumn, 32);
73-
assert.strictEqual(startChar, 188);
74-
75-
assert.strictEqual(endRow, 12);
76-
assert.strictEqual(endColumn, 13);
77-
assert.strictEqual(endChar, 247);
77+
assert.strictEqual(endPositionRow, 12);
78+
assert.strictEqual(endPositionColumn, 13);
79+
assert.strictEqual(endIndex, 247);
7880
});
7981

8082
specify(

packages/apidom-core/src/clone/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { ArraySlice, ObjectSlice, KeyValuePair, Element } from 'minim';
22

3-
import { isElement } from '../predicates/index.ts';
3+
import { hasElementSourceMap, isElement } from '../predicates/index.ts';
44
import DeepCloneError from './errors/DeepCloneError.ts';
55
import ShallowCloneError from './errors/ShallowCloneError.ts';
6+
import { assignSourceMap } from '../util.ts';
67

78
/**
89
* @public
@@ -123,6 +124,10 @@ const cloneShallowElement = <T extends Element>(element: T): T => {
123124

124125
copy.element = element.element;
125126

127+
if (hasElementSourceMap(element)) {
128+
assignSourceMap(copy, element);
129+
}
130+
126131
if (element.meta.length > 0) {
127132
copy._meta = cloneDeep(element.meta);
128133
}

packages/apidom-core/src/elements/SourceMap.ts

Lines changed: 0 additions & 56 deletions
This file was deleted.

0 commit comments

Comments
 (0)