Skip to content

Commit 5e18a3b

Browse files
authored
fix: translating roxygen parse to iteration (#2202)
refactor: translating roxygen parse to iteration
1 parent 6dfc15e commit 5e18a3b

File tree

6 files changed

+25
-21
lines changed

6 files changed

+25
-21
lines changed

src/core/print/slice-diff-ansi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function mergeJointRangesInSorted(loc: { location: SourceRange; selected: boolea
1414
return [
1515
...acc.slice(0, -1), {
1616
selected: curr.selected || acc[acc.length - 1].selected,
17-
location: mergeRanges(acc[acc.length - 1].location, curr.location)
17+
location: mergeRanges([acc[acc.length - 1].location, curr.location])
1818
}];
1919
} else {
2020
return [...acc, curr];

src/linter/rules/unused-definition.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ function buildQuickFix(variable: RNode<ParentInformation>, dfg: DataflowGraph, a
6060
}
6161

6262
const totalRangeToRemove = mergeRanges(
63-
...definedBys.map(d => {
63+
[...definedBys.map(d => {
6464
const vertex = ast.idMap.get(d);
6565
return vertex?.info.fullRange ?? vertex?.location;
6666
}),
67-
variable.info.fullRange ?? variable.location
67+
variable.info.fullRange ?? variable.location]
6868
);
6969

7070
return [{
@@ -85,7 +85,7 @@ function onlyKeepSupersetOfUnused(
8585
return elements; // nothing to filter, only one element
8686
}
8787
return elements.filter(e => {
88-
const otherRange = mergeRanges(...(e.quickFix?.map(q => q.range) ?? [e.range]));
88+
const otherRange = mergeRanges((e.quickFix?.map(q => q.range) ?? [e.range]));
8989
return !ranges.some(r => rangeCompare(r, otherRange) !== 0 && rangeIsSubsetOf(otherRange, r)); // there is no smaller remove
9090
});
9191
}

src/r-bridge/roxygen2/roxygen-parse.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export function parseRoxygenCommentsOfNode(node: RNode<ParentInformation>, idMap
4949
attachedTo: cur?.info.id,
5050
requestNode: node.info.id,
5151
range: [
52-
...mergeRanges(...comments.map(c => c.location)),
52+
...mergeRanges(comments.map(c => c.location)),
5353
comments.find(c => c.info.file)?.info.file
5454
]
5555
};
@@ -75,7 +75,10 @@ export function parseRoxygenComment(commentText: readonly string[]): RoxygenTag[
7575
tags: [],
7676
idx: 0
7777
};
78-
val(state, [KnownRoxygenTags.Text]);
78+
let tag = val(state, [KnownRoxygenTags.Text]);
79+
while(tag) {
80+
tag = parseRoxygenTag(state, tag);
81+
}
7982
return state.tags;
8083
}
8184

@@ -116,7 +119,7 @@ function addTag(state: RoxygenParseContext, tag: RoxygenTag): void {
116119
state.tags.push(tag);
117120
}
118121

119-
function val(state: RoxygenParseContext, tagName: TagLine, lineToVal: (lines: readonly string[]) => unknown | undefined = l => l.join('\n').trim()): void {
122+
function val(state: RoxygenParseContext, tagName: TagLine, lineToVal: (lines: readonly string[]) => unknown | undefined = l => l.join('\n').trim()): TagLine | undefined {
120123
const [lines, nextTag] = collectUntilNextTag(state);
121124

122125
if(tagName[1]) {
@@ -141,26 +144,26 @@ function val(state: RoxygenParseContext, tagName: TagLine, lineToVal: (lines: re
141144
}
142145

143146
}
144-
parseRoxygenTag(state, nextTag);
147+
return nextTag;
145148
}
146149

147-
const spaceVals = (s: RoxygenParseContext, t: TagLine): void => val(s, t, l => splitAtEscapeSensitive(l.join(' ')));
148-
const flagVal = (s: RoxygenParseContext, t: TagLine): void => val(s, t, () => undefined);
150+
const spaceVals = (s: RoxygenParseContext, t: TagLine): TagLine | undefined => val(s, t, l => splitAtEscapeSensitive(l.join(' ')));
151+
const flagVal = (s: RoxygenParseContext, t: TagLine): TagLine | undefined => val(s, t, () => undefined);
149152

150-
const section = (s: RoxygenParseContext, t: TagLine): void => val(s, t, l => {
153+
const section = (s: RoxygenParseContext, t: TagLine): TagLine | undefined => val(s, t, l => {
151154
return { title: l[0].trim(), content: l.slice(1).join('\n').trim() };
152155
});
153156

154-
export const firstAndRest = (firstName: string, secondName: string) => (s: RoxygenParseContext, t: TagLine): void => val(s, t, l => {
157+
export const firstAndRest = (firstName: string, secondName: string) => (s: RoxygenParseContext, t: TagLine): TagLine | undefined => val(s, t, l => {
155158
const vals = splitAtEscapeSensitive(l.join('\n'));
156159
return { [firstName]: vals[0], [secondName]: vals.slice(1).join(' ').trim() };
157160
});
158-
const firstAndArrayRest = (firstName: string, secondName: string) => (s: RoxygenParseContext, t: TagLine): void => val(s, t, l => {
161+
const firstAndArrayRest = (firstName: string, secondName: string) => (s: RoxygenParseContext, t: TagLine): TagLine | undefined => val(s, t, l => {
159162
const vals = splitAtEscapeSensitive(l.join('\n'));
160163
return { [firstName]: vals[0], [secondName]: vals.slice(1) };
161164
});
162165

163-
const asNumber = (s: RoxygenParseContext, t: TagLine): void => val(s, t, l => {
166+
const asNumber = (s: RoxygenParseContext, t: TagLine): TagLine | undefined => val(s, t, l => {
164167
const num = Number(l.join(' ').trim());
165168
return Number.isNaN(num) ? undefined : num;
166169
});
@@ -225,12 +228,13 @@ const TagMap = {
225228
tag: t[0],
226229
content: l.join(' ')
227230
}))
228-
} as const satisfies Record<KnownRoxygenTags, (state: RoxygenParseContext, tagName: TagLine) => void>;
231+
} as const satisfies Record<KnownRoxygenTags, (state: RoxygenParseContext, tagName: TagLine) => TagLine | undefined>;
229232

230-
function parseRoxygenTag(state: RoxygenParseContext, tagName: TagLine | undefined): void {
233+
/** returns the next tag */
234+
function parseRoxygenTag(state: RoxygenParseContext, tagName: TagLine | undefined): TagLine | undefined {
231235
if(tagName === undefined) {
232-
return;
236+
return undefined;
233237
}
234238
const parser = TagMap[tagName[0] as KnownRoxygenTags] ?? val;
235-
parser(state, tagName);
239+
return parser(state, tagName);
236240
}

src/util/range.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export function invalidRange(): SourceRange {
7676
* If you are interested in combining overlapping ranges into a minimal set of ranges, see {@link combineRanges}.
7777
* @throws if no ranges are provided
7878
*/
79-
export function mergeRanges(...rs: (SourceRange | undefined)[]): SourceRange {
79+
export function mergeRanges(rs: (SourceRange | undefined)[] = []): SourceRange {
8080
const rsSafe: SourceRange[] = rs.filter(isNotUndefined);
8181
guard(rsSafe.length > 0, 'Cannot merge no ranges');
8282
return rsSafe.reduce(([sl, sc, el, ec], [nsl, nsc, nel, nec]) => [

test/functionality/r-bridge/lang/ast/model.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ describe('Model specific tests', () => {
99
});
1010
const assertMerged = (ranges: SourceRange[], expected: SourceRange, message = ''): void => {
1111
test(JSON.stringify(ranges), () => {
12-
assert.deepStrictEqual(mergeRanges(...ranges), expected, `${message}`);
12+
assert.deepStrictEqual(mergeRanges(ranges), expected, `${message}`);
1313
});
1414
};
1515
describe('one ranges always returns the same', () => {

test/functionality/util/range.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ describe('Range', () => {
9595
describe('mergeRanges', () => {
9696
function assertMerged(expected: SourceRange, ...a: SourceRange[]) {
9797
assert.deepStrictEqual(
98-
mergeRanges(...a),
98+
mergeRanges(a),
9999
expected,
100100
`mergeRanges(${JSON.stringify(a)})`
101101
);

0 commit comments

Comments
 (0)