Skip to content

Commit 22296fb

Browse files
committed
Add isStackFrame for ranges to builder
1 parent 169e74e commit 22296fb

File tree

4 files changed

+50
-2
lines changed

4 files changed

+50
-2
lines changed

src/builder/builder.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,15 @@ describe("ScopeInfoBuilder", () => {
142142
assertStrictEquals(info.scopes[0], info.ranges[0].originalScope);
143143
assertStrictEquals(info.ranges[0].originalScope, scope);
144144
});
145+
146+
it("can set isStackFrame via option", () => {
147+
const info = builder.startRange(0, 0, { isStackFrame: true }).endRange(
148+
10,
149+
0,
150+
).build();
151+
152+
assertStrictEquals(info.ranges[0]?.isStackFrame, true);
153+
});
145154
});
146155

147156
describe("setRangeDefinitionScope", () => {
@@ -162,6 +171,18 @@ describe("ScopeInfoBuilder", () => {
162171
});
163172
});
164173

174+
describe("setRangeStackFrame", () => {
175+
it("sets the isStackFrame flag", () => {
176+
const info = builder.startRange(0, 0).setRangeStackFrame(true).endRange(
177+
10,
178+
0,
179+
)
180+
.build();
181+
182+
assertStrictEquals(info.ranges[0]?.isStackFrame, true);
183+
});
184+
});
185+
165186
describe("endRange", () => {
166187
it("does nothing when no range is open", () => {
167188
builder.endRange(0, 20);

src/builder/builder.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,12 @@ export class ScopeInfoBuilder {
113113
startRange(
114114
line: number,
115115
column: number,
116-
options?: { scope?: number | OriginalScope },
116+
options?: { scope?: number | OriginalScope; isStackFrame?: boolean },
117117
): this {
118118
const range: GeneratedRange = {
119119
start: { line, column },
120120
end: { line, column },
121-
isStackFrame: false,
121+
isStackFrame: Boolean(options?.isStackFrame),
122122
isHidden: false,
123123
values: [],
124124
children: [],
@@ -152,6 +152,13 @@ export class ScopeInfoBuilder {
152152
return this;
153153
}
154154

155+
setRangeStackFrame(isStackFrame: boolean): this {
156+
const range = this.#rangeStack.at(-1);
157+
if (range) range.isStackFrame = isStackFrame;
158+
159+
return this;
160+
}
161+
155162
endRange(line: number, column: number): this {
156163
const range = this.#rangeStack.pop();
157164
if (!range) return this;

src/builder/safe_builder.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,18 @@ describe("SafeScopeInfoBuilder", () => {
189189
});
190190
});
191191

192+
describe("setRangeStackFrame", () => {
193+
it("throws when no range is on open", () => {
194+
assertThrows(() => builder.setRangeStackFrame(true));
195+
});
196+
197+
it("throws while building a scope", () => {
198+
builder.startScope(0, 0);
199+
200+
assertThrows(() => builder.setRangeStackFrame(true));
201+
});
202+
});
203+
192204
describe("endRange", () => {
193205
it("throws when the range stack is empty", () => {
194206
assertThrows(() => builder.endRange(5, 0));

src/builder/safe_builder.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,14 @@ export class SafeScopeInfoBuilder extends ScopeInfoBuilder {
162162
return this;
163163
}
164164

165+
override setRangeStackFrame(isStackFrame: boolean): this {
166+
this.#verifyEmptyScopeStack("setRangeStackFrame");
167+
this.#verifyRangePresent("setRangeStackFrame");
168+
169+
super.setRangeStackFrame(isStackFrame);
170+
return this;
171+
}
172+
165173
override endRange(line: number, column: number): this {
166174
this.#verifyEmptyScopeStack("endRange");
167175

0 commit comments

Comments
 (0)