Skip to content

Commit 731ec13

Browse files
committed
feat: Implement new vendor extension items and invalid items
1 parent e73b2d1 commit 731ec13

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

src/codec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const enum Tag {
1212
GENERATED_RANGE_BINDINGS = 0x6,
1313
GENERATED_RANGE_SUBRANGE_BINDING = 0x7,
1414
GENERATED_RANGE_CALL_SITE = 0x8,
15+
VENDOR_EXTENSION = 0x63,
1516
}
1617

1718
export const enum EncodedTag {
@@ -24,6 +25,7 @@ export const enum EncodedTag {
2425
GENERATED_RANGE_BINDINGS = "G", // 0x6
2526
GENERATED_RANGE_SUBRANGE_BINDING = "H", // 0x7
2627
GENERATED_RANGE_CALL_SITE = "I", // 0x8
28+
VENDOR_EXTENSION = "/", // 0x63
2729
}
2830

2931
export const enum OriginalScopeFlags {

src/decode/decode.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,4 +557,38 @@ describe("decode", () => {
557557
assertEquals(info.ranges[0].start, { line: 0, column: 0 });
558558
assertEquals(info.ranges[0].end, { line: 0, column: 10 });
559559
});
560+
561+
it("ignores vendor extensions", () => {
562+
const encoder = new ItemEncoder();
563+
encoder.addUnsignedVLQs(Tag.VENDOR_EXTENSION, 0);
564+
encoder.finishItem();
565+
const map = createMap(encoder.encode(), ["x_ext_item"]);
566+
567+
assertEquals(decode(map, { mode: DecodeMode.STRICT }), {
568+
scopes: [],
569+
ranges: [],
570+
});
571+
});
572+
573+
it("throws for invalid item tags in strict mode", () => {
574+
const encoder = new ItemEncoder();
575+
encoder.addUnsignedVLQs(42, 1, 2, 3);
576+
encoder.finishItem();
577+
const map = createMap(encoder.encode(), []);
578+
579+
assertThrows(
580+
() => decode(map, { mode: DecodeMode.STRICT }),
581+
Error,
582+
"Encountered illegal item tag 42",
583+
);
584+
});
585+
586+
it("ignores invalid item tags in lax mode", () => {
587+
const encoder = new ItemEncoder();
588+
encoder.addUnsignedVLQs(42, 1, 2, 3);
589+
encoder.finishItem();
590+
const map = createMap(encoder.encode(), []);
591+
592+
assertEquals(decode(map), { scopes: [], ranges: [] });
593+
});
560594
});

src/decode/decode.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,10 @@ class Decoder {
143143
while (iter.hasNext()) {
144144
const tag = iter.nextUnsignedVLQ();
145145
switch (tag) {
146-
case Tag.EMPTY:
146+
case Tag.EMPTY: {
147147
this.#scopes.push(null);
148148
break;
149+
}
149150
case Tag.ORIGINAL_SCOPE_START: {
150151
const item: OriginalScopeStartItem = {
151152
flags: iter.nextUnsignedVLQ(),
@@ -245,6 +246,14 @@ class Decoder {
245246
);
246247
break;
247248
}
249+
case Tag.VENDOR_EXTENSION: {
250+
const _extensionNameIdx = iter.nextUnsignedVLQ();
251+
break;
252+
}
253+
default: {
254+
this.#throwInStrictMode(`Encountered illegal item tag ${tag}`);
255+
break;
256+
}
248257
}
249258

250259
// Consume any trailing VLQ and the the ","

0 commit comments

Comments
 (0)