skir 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/casing.d.ts +5 -0
  2. package/dist/casing.js +23 -0
  3. package/dist/casing.js.map +1 -0
  4. package/dist/command_line_parser.d.ts +36 -0
  5. package/dist/command_line_parser.d.ts.map +1 -0
  6. package/dist/command_line_parser.js +240 -0
  7. package/dist/command_line_parser.js.map +1 -0
  8. package/dist/compatibility_checker.d.ts +74 -0
  9. package/dist/compatibility_checker.js +331 -0
  10. package/dist/compatibility_checker.js.map +1 -0
  11. package/dist/compiler.d.ts +3 -0
  12. package/dist/compiler.js +406 -0
  13. package/dist/compiler.js.map +1 -0
  14. package/dist/completion_helper.d.ts +27 -0
  15. package/dist/completion_helper.js +101 -0
  16. package/dist/completion_helper.js.map +1 -0
  17. package/dist/config.d.ts +18 -0
  18. package/dist/config.js +19 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/config_parser.d.ts +34 -0
  21. package/dist/config_parser.js +217 -0
  22. package/dist/config_parser.js.map +1 -0
  23. package/dist/definition_finder.d.ts +16 -0
  24. package/dist/definition_finder.js +375 -0
  25. package/dist/definition_finder.js.map +1 -0
  26. package/dist/dependency_manager.d.ts +14 -0
  27. package/dist/dependency_manager.js +109 -0
  28. package/dist/dependency_manager.js.map +1 -0
  29. package/dist/doc_comment_parser.d.ts +6 -0
  30. package/dist/doc_comment_parser.js +269 -0
  31. package/dist/doc_comment_parser.js.map +1 -0
  32. package/dist/doc_reference_resolver.d.ts +5 -0
  33. package/dist/doc_reference_resolver.js +232 -0
  34. package/dist/doc_reference_resolver.js.map +1 -0
  35. package/dist/error_renderer.d.ts +24 -0
  36. package/dist/error_renderer.js +326 -0
  37. package/dist/error_renderer.js.map +1 -0
  38. package/dist/exit_error.d.ts +8 -0
  39. package/dist/exit_error.d.ts.map +1 -0
  40. package/dist/exit_error.js +8 -0
  41. package/dist/exit_error.js.map +1 -0
  42. package/dist/expected_names.d.ts +11 -0
  43. package/dist/expected_names.js +34 -0
  44. package/dist/expected_names.js.map +1 -0
  45. package/dist/formatter.d.ts +28 -0
  46. package/dist/formatter.js +338 -0
  47. package/dist/formatter.js.map +1 -0
  48. package/dist/get_dependencies_flow.d.ts +40 -0
  49. package/dist/get_dependencies_flow.js +177 -0
  50. package/dist/get_dependencies_flow.js.map +1 -0
  51. package/dist/import_block_formatter.d.ts +3 -0
  52. package/dist/import_block_formatter.js +36 -0
  53. package/dist/import_block_formatter.js.map +1 -0
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +2 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/io.d.ts +23 -0
  59. package/dist/io.d.ts.map +1 -0
  60. package/dist/io.js +58 -0
  61. package/dist/io.js.map +1 -0
  62. package/dist/literals.d.ts +12 -0
  63. package/dist/literals.js +96 -0
  64. package/dist/literals.js.map +1 -0
  65. package/dist/module_collector.d.ts +9 -0
  66. package/dist/module_collector.js +73 -0
  67. package/dist/module_collector.js.map +1 -0
  68. package/dist/module_set.d.ts +51 -0
  69. package/dist/module_set.js +1331 -0
  70. package/dist/module_set.js.map +1 -0
  71. package/dist/package_downloader.d.ts +4 -0
  72. package/dist/package_downloader.js +256 -0
  73. package/dist/package_downloader.js.map +1 -0
  74. package/dist/package_types.d.ts +30 -0
  75. package/dist/package_types.d.ts.map +1 -0
  76. package/dist/package_types.js +2 -0
  77. package/dist/package_types.js.map +1 -0
  78. package/dist/parser.d.ts +7 -0
  79. package/dist/parser.js +1335 -0
  80. package/dist/parser.js.map +1 -0
  81. package/dist/project_initializer.d.ts +2 -0
  82. package/dist/project_initializer.d.ts.map +1 -0
  83. package/dist/project_initializer.js +207 -0
  84. package/dist/project_initializer.js.map +1 -0
  85. package/dist/snapshotter.d.ts +16 -0
  86. package/dist/snapshotter.js +263 -0
  87. package/dist/snapshotter.js.map +1 -0
  88. package/dist/tokenizer.d.ts +18 -0
  89. package/dist/tokenizer.js +244 -0
  90. package/dist/tokenizer.js.map +1 -0
  91. package/package.json +2 -2
@@ -0,0 +1,109 @@
1
+ import * as fs from "fs/promises";
2
+ import path from "node:path";
3
+ import { GetDependenciesFlow } from "./get_dependencies_flow.js";
4
+ import { REAL_FILE_SYSTEM } from "./io.js";
5
+ import { downloadPackage } from "./package_downloader.js";
6
+ export class DependencyManager {
7
+ constructor(rootDir, githubToken, fileReader = REAL_FILE_SYSTEM, packageDownloader = downloadPackage) {
8
+ this.rootDir = rootDir;
9
+ this.githubToken = githubToken;
10
+ this.fileReader = fileReader;
11
+ this.packageDownloader = packageDownloader;
12
+ }
13
+ async getDependencies(dependencies, writeOption = "write") {
14
+ const flow = new GetDependenciesFlow(await this.readDependenciesFile(), this.githubToken, this.packageDownloader);
15
+ const result = await flow.run(dependencies);
16
+ if (result.kind === "success" &&
17
+ writeOption === "write" &&
18
+ result.changed) {
19
+ await this.writeOnDisk(result.packages);
20
+ }
21
+ return result;
22
+ }
23
+ async writeOnDisk(packages) {
24
+ // Write everything to a temp directory first, then rename it.
25
+ const relPathToContent = new Map();
26
+ for (const [packageId, pkg] of Object.entries(packages)) {
27
+ for (const [modulePath, content] of Object.entries(pkg.modules)) {
28
+ const relPath = packageId +
29
+ modulePath
30
+ .substring(packageId.length)
31
+ .replace(/\.skir$/, ".readonly.skir");
32
+ relPathToContent.set(relPath, content);
33
+ }
34
+ }
35
+ relPathToContent.set(DEPENDENCIES_FILENAME, JSON.stringify(packages, null, 2));
36
+ const unixMillis = Date.now();
37
+ const tempDir = this.externalDir + "." + unixMillis + ".tmp";
38
+ const limboDir = this.externalDir + ".~" + unixMillis + ".tmp";
39
+ let tempDirExists = false;
40
+ let limboDirExists = false;
41
+ try {
42
+ await fs.mkdir(tempDir, { recursive: true });
43
+ tempDirExists = true;
44
+ // Write all files in parallel
45
+ const writePromises = Array.from(relPathToContent.entries()).map(async ([relPath, content]) => {
46
+ const fullPath = path.join(tempDir, relPath);
47
+ const dir = path.dirname(fullPath);
48
+ await fs.mkdir(dir, { recursive: true });
49
+ await fs.writeFile(fullPath, content, "utf-8");
50
+ });
51
+ await Promise.all(writePromises);
52
+ try {
53
+ await fs.rename(this.externalDir, limboDir);
54
+ }
55
+ catch (error) {
56
+ // It's okay if externalDir doesn't exist yet.
57
+ const doesNotExist = error &&
58
+ typeof error === "object" &&
59
+ "code" in error &&
60
+ error.code === "ENOENT";
61
+ if (!doesNotExist) {
62
+ throw error;
63
+ }
64
+ }
65
+ limboDirExists = true;
66
+ await fs.rename(tempDir, this.externalDir);
67
+ tempDirExists = false;
68
+ await fs.rm(limboDir, { recursive: true, force: true });
69
+ limboDirExists = false;
70
+ }
71
+ finally {
72
+ if (tempDirExists) {
73
+ try {
74
+ await fs.rm(tempDir, { recursive: true, force: true });
75
+ }
76
+ catch (e) {
77
+ console.error(e);
78
+ }
79
+ }
80
+ if (limboDirExists) {
81
+ try {
82
+ await fs.rm(limboDir, { recursive: true, force: true });
83
+ }
84
+ catch (e) {
85
+ console.error(e);
86
+ }
87
+ }
88
+ }
89
+ }
90
+ get externalDir() {
91
+ return path.join(this.rootDir, "skir-external");
92
+ }
93
+ async readDependenciesFile() {
94
+ const dependenciesPath = path.join(this.externalDir, DEPENDENCIES_FILENAME);
95
+ const content = await this.fileReader.readTextFileAsync(dependenciesPath);
96
+ if (content === undefined) {
97
+ return {};
98
+ }
99
+ try {
100
+ return JSON.parse(content);
101
+ }
102
+ catch (error) {
103
+ console.error(`Failed to parse ${dependenciesPath}:`, error);
104
+ return {};
105
+ }
106
+ }
107
+ }
108
+ const DEPENDENCIES_FILENAME = "dependencies.json";
109
+ //# sourceMappingURL=dependency_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency_manager.js","sourceRoot":"","sources":["../src/dependency_manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Doc, MutableDoc, Result, Token } from "skir-internal";
2
+ export declare function parseDocComment(docComment: Token, completionMode?: {
3
+ position: number;
4
+ }): Result<Doc>;
5
+ export declare function mergeDocs(docs: readonly Doc[]): MutableDoc;
6
+ //# sourceMappingURL=doc_comment_parser.d.ts.map
@@ -0,0 +1,269 @@
1
+ export function parseDocComment(docComment, completionMode) {
2
+ const parser = new DocCommentParser(docComment, completionMode);
3
+ return parser.parse();
4
+ }
5
+ class DocCommentParser {
6
+ constructor(docComment, completionMode) {
7
+ this.docComment = docComment;
8
+ this.completionMode = completionMode;
9
+ this.pieces = [];
10
+ this.errors = [];
11
+ this.currentText = "";
12
+ this.charIndex = -1;
13
+ const { text } = docComment;
14
+ if (text.startsWith("/// ")) {
15
+ this.content = text.slice(4);
16
+ }
17
+ else if (text.startsWith("///")) {
18
+ this.content = text.slice(3);
19
+ }
20
+ else {
21
+ throw new Error("Expected doc comment to start with ///");
22
+ }
23
+ this.charIndex = 0;
24
+ }
25
+ parse() {
26
+ this.parseDocComment();
27
+ // Add any remaining text
28
+ if (this.currentText.length > 0) {
29
+ this.pieces.push({ kind: "text", text: this.currentText });
30
+ }
31
+ const { pieces } = this;
32
+ const text = pieces
33
+ .map((p) => {
34
+ switch (p.kind) {
35
+ case "text":
36
+ return p.text;
37
+ case "reference":
38
+ return p.referenceRange.text;
39
+ }
40
+ })
41
+ .join("");
42
+ return {
43
+ result: {
44
+ text: text,
45
+ pieces: this.pieces,
46
+ },
47
+ errors: this.errors,
48
+ };
49
+ }
50
+ parseDocComment() {
51
+ // Matches unescaped [ or ], OR escaped [[ or ]]
52
+ const specialCharRegex = /\[\[|\]\]|\[|\]/g;
53
+ while (this.charIndex < this.content.length) {
54
+ // Find next special character or escaped bracket
55
+ specialCharRegex.lastIndex = this.charIndex;
56
+ const match = specialCharRegex.exec(this.content);
57
+ if (!match) {
58
+ // No more special characters, add rest as text
59
+ this.currentText += this.content.slice(this.charIndex);
60
+ break;
61
+ }
62
+ // Add text before the special character
63
+ if (match.index > this.charIndex) {
64
+ this.currentText += this.content.slice(this.charIndex, match.index);
65
+ }
66
+ const matched = match[0];
67
+ this.charIndex = match.index;
68
+ if (matched === "[[") {
69
+ // Escaped left bracket
70
+ this.currentText += "[";
71
+ this.charIndex += 2;
72
+ }
73
+ else if (matched === "]]") {
74
+ // Escaped right bracket
75
+ this.currentText += "]";
76
+ this.charIndex += 2;
77
+ }
78
+ else if (matched === "[") {
79
+ // Start of a reference - save current text if any
80
+ if (this.currentText.length > 0) {
81
+ this.pieces.push({ kind: "text", text: this.currentText });
82
+ this.currentText = "";
83
+ }
84
+ // Parse the reference
85
+ const reference = this.parseReference();
86
+ this.pieces.push(reference);
87
+ }
88
+ else if (matched === "]") {
89
+ // Unmatched right bracket - treat as text
90
+ this.currentText += matched;
91
+ this.charIndex++;
92
+ }
93
+ }
94
+ }
95
+ parseReference() {
96
+ const { content, docComment } = this;
97
+ const leftBracketCharIndex = this.charIndex;
98
+ const contentOffset = docComment.text.length - content.length;
99
+ const startPosition = docComment.position + contentOffset + leftBracketCharIndex;
100
+ const rightBracketCharIndex = content.indexOf("]", leftBracketCharIndex);
101
+ // End position: right after the closing bracket or at end of the line if
102
+ // not found.
103
+ const endCharIndex = rightBracketCharIndex < 0 ? content.length : rightBracketCharIndex + 1;
104
+ const referenceText = content.slice(leftBracketCharIndex, endCharIndex);
105
+ const referenceRange = {
106
+ text: referenceText,
107
+ originalText: referenceText,
108
+ position: startPosition,
109
+ line: docComment.line,
110
+ colNumber: startPosition - docComment.line.position,
111
+ };
112
+ let hasError = false;
113
+ if (rightBracketCharIndex < 0) {
114
+ hasError = true;
115
+ this.errors.push({
116
+ token: referenceRange,
117
+ message: "Unterminated reference",
118
+ });
119
+ }
120
+ // Move past the left bracket
121
+ this.charIndex++;
122
+ const wordRegex = /[a-zA-Z][_a-zA-Z0-9]*/g;
123
+ const tokens = [];
124
+ while (this.charIndex < endCharIndex) {
125
+ const char = content[this.charIndex];
126
+ const contentOffset = docComment.text.length - content.length;
127
+ const position = docComment.position + contentOffset + this.charIndex;
128
+ const makeToken = (text) => ({
129
+ text: text,
130
+ originalText: text,
131
+ position: position,
132
+ line: docComment.line,
133
+ colNumber: position - docComment.line.position,
134
+ });
135
+ if (char === ".") {
136
+ // Dot token
137
+ tokens.push(makeToken("."));
138
+ this.charIndex++;
139
+ }
140
+ else if (/^[a-zA-Z]/.test(char)) {
141
+ // Start of a word token - use regex to match the whole word
142
+ wordRegex.lastIndex = this.charIndex;
143
+ const match = wordRegex.exec(content);
144
+ const word = match[0];
145
+ tokens.push(makeToken(word));
146
+ this.charIndex += word.length;
147
+ }
148
+ else if (char === "]") {
149
+ // Reached the end of the reference
150
+ tokens.push(makeToken("]"));
151
+ this.charIndex++;
152
+ }
153
+ else {
154
+ // Invalid character in reference (including whitespace)
155
+ const contentOffset = docComment.text.length - content.length;
156
+ const column = this.docComment.colNumber + contentOffset + this.charIndex;
157
+ hasError = true;
158
+ this.errors.push({
159
+ token: referenceRange,
160
+ message: `Invalid character in reference at column ${column + 1}`,
161
+ });
162
+ // Exit loop
163
+ this.charIndex = endCharIndex;
164
+ }
165
+ }
166
+ if (!hasError && this.completionMode) {
167
+ const { position } = this.completionMode;
168
+ const refAbsoluteStart = startPosition;
169
+ const refAbsoluteEnd = docComment.position + contentOffset + endCharIndex;
170
+ if (position >= refAbsoluteStart && position < refAbsoluteEnd) {
171
+ const inExistingWord = tokens.some((t) => {
172
+ return (/^[a-zA-Z]/.test(t.text) &&
173
+ position >= t.position &&
174
+ position <= t.position + t.text.length);
175
+ });
176
+ if (!inExistingWord) {
177
+ const fakeToken = {
178
+ text: "...",
179
+ originalText: "",
180
+ position: position,
181
+ line: docComment.line,
182
+ colNumber: position - docComment.line.position,
183
+ };
184
+ const insertIndex = tokens.findIndex((t) => t.position >= position);
185
+ if (insertIndex === -1) {
186
+ tokens.push(fakeToken);
187
+ }
188
+ else {
189
+ tokens.splice(insertIndex, 0, fakeToken);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ const nameParts = hasError ? [] : this.parseNameParts(tokens);
195
+ return {
196
+ kind: "reference",
197
+ nameParts: nameParts,
198
+ absolute: tokens[0]?.text === ".",
199
+ referee: undefined,
200
+ docComment: this.docComment,
201
+ referenceRange: referenceRange,
202
+ };
203
+ }
204
+ parseNameParts(tokens) {
205
+ const nameParts = [];
206
+ let expect = "identifier or '.'";
207
+ for (const token of tokens) {
208
+ let expected;
209
+ if (/^[a-zA-Z]/.test(token.text) || token.text === "...") {
210
+ // Identifier token or fake completion token.
211
+ expected = expect === "identifier or '.'" || expect === "identifier";
212
+ expect = "'.' or ']'";
213
+ nameParts.push({
214
+ token: token,
215
+ declaration: undefined,
216
+ });
217
+ }
218
+ else if (token.text === ".") {
219
+ expected = expect === "identifier or '.'" || expect === "'.' or ']'";
220
+ expect = "identifier";
221
+ }
222
+ else {
223
+ if (token.text !== "]") {
224
+ throw new Error(`Unexpected token in doc reference: ${token.text}`);
225
+ }
226
+ expected = expect === "'.' or ']'";
227
+ }
228
+ if (!expected) {
229
+ this.errors.push({
230
+ token: token,
231
+ expected: expect,
232
+ });
233
+ return [];
234
+ }
235
+ if (token.text === "]") {
236
+ return nameParts;
237
+ }
238
+ }
239
+ // An error has already been pushed to signify the unterminated reference.
240
+ return [];
241
+ }
242
+ }
243
+ export function mergeDocs(docs) {
244
+ if (docs.length <= 0) {
245
+ return EMPTY_DOC;
246
+ }
247
+ // Insert '\n' between each doc comment (== line)
248
+ const text = docs.map((d) => d.text).join("\n");
249
+ const pieces = [];
250
+ for (let i = 0; i < docs.length; ++i) {
251
+ const doc = docs[i];
252
+ if (i !== 0) {
253
+ pieces.push({
254
+ kind: "text",
255
+ text: "\n",
256
+ });
257
+ }
258
+ doc.pieces.forEach((p) => pieces.push(p));
259
+ }
260
+ return {
261
+ text: text,
262
+ pieces: pieces,
263
+ };
264
+ }
265
+ const EMPTY_DOC = Object.freeze({
266
+ text: "",
267
+ pieces: Object.freeze([]),
268
+ });
269
+ //# sourceMappingURL=doc_comment_parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc_comment_parser.js","sourceRoot":"","sources":["../src/doc_comment_parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ErrorSink, Module, MutableConstant, MutableMethod, MutableRecord, MutableRecordField, RecordKey, RecordLocation } from "skir-internal";
2
+ export type Documentee = MutableConstant | MutableMethod | MutableRecord | MutableRecordField;
3
+ /** Resolve the references in the doc comments of the given declaration. */
4
+ export declare function resolveDocReferences(documentee: Documentee, docModule: Module, getModule: (modulePath: string) => Module | undefined, recordMap: ReadonlyMap<RecordKey, RecordLocation>, errors: ErrorSink): void;
5
+ //# sourceMappingURL=doc_reference_resolver.d.ts.map
@@ -0,0 +1,232 @@
1
+ import { declarationsToExpectedNames, ExpectedNamesCollector, } from "./expected_names.js";
2
+ /** Resolve the references in the doc comments of the given declaration. */
3
+ export function resolveDocReferences(documentee, docModule, getModule, recordMap, errors) {
4
+ const doc = documentee.kind === "field" ? documentee.field.doc : documentee.doc;
5
+ const docReferences = doc.pieces.filter((p) => p.kind === "reference");
6
+ if (docReferences.length <= 0) {
7
+ return;
8
+ }
9
+ // Build list of naming scopes to search, in order of priority.
10
+ const scopes = buildScopes(documentee, docModule, recordMap);
11
+ // Resolve each reference by searching through scopes in priority order.
12
+ for (const reference of docReferences) {
13
+ resolveReferenceInScopes(reference, scopes, docModule, getModule, errors);
14
+ }
15
+ }
16
+ function buildScopes(documentee, docModule, recordMap) {
17
+ const scopes = [];
18
+ const pushRecordAncestorsToScopes = (record) => {
19
+ const { key } = record;
20
+ const location = recordMap.get(key);
21
+ const ancestors = [...location.recordAncestors].reverse();
22
+ for (const ancestor of ancestors) {
23
+ scopes.push(ancestor);
24
+ }
25
+ };
26
+ const pushTypeToScopes = (type) => {
27
+ if (type) {
28
+ const recordKey = tryFindRecordForType(type);
29
+ if (recordKey) {
30
+ const { record } = recordMap.get(recordKey);
31
+ scopes.push(record);
32
+ }
33
+ }
34
+ };
35
+ switch (documentee.kind) {
36
+ case "constant": {
37
+ scopes.push(docModule);
38
+ pushTypeToScopes(documentee.type);
39
+ break;
40
+ }
41
+ case "field": {
42
+ const { field, record } = documentee;
43
+ pushRecordAncestorsToScopes(record);
44
+ scopes.push(docModule);
45
+ pushTypeToScopes(field.type);
46
+ break;
47
+ }
48
+ case "method": {
49
+ scopes.push(docModule);
50
+ pushTypeToScopes(documentee.requestType);
51
+ pushTypeToScopes(documentee.responseType);
52
+ break;
53
+ }
54
+ case "record": {
55
+ pushRecordAncestorsToScopes(documentee);
56
+ scopes.push(docModule);
57
+ break;
58
+ }
59
+ }
60
+ return scopes;
61
+ }
62
+ function resolveReferenceInScopes(reference, scopes, docModule, getModule, errors) {
63
+ const { nameParts } = reference;
64
+ if (nameParts.length <= 0) {
65
+ return;
66
+ }
67
+ const expectedNamesCollector = new ExpectedNamesCollector();
68
+ for (const scope of scopes) {
69
+ if (reference.absolute && scope !== docModule) {
70
+ continue;
71
+ }
72
+ const referee = tryResolveReference(nameParts, scope, docModule, getModule);
73
+ if (referee.kind === "no-match") {
74
+ expectedNamesCollector.collect(referee.expectedNames);
75
+ // Try the next scope.
76
+ }
77
+ else if (referee.kind === "failed-match") {
78
+ if (referee.error) {
79
+ errors.push(referee.error);
80
+ }
81
+ // Don't try the next scope.
82
+ return;
83
+ }
84
+ else {
85
+ reference.referee = referee;
86
+ return;
87
+ }
88
+ }
89
+ // No match in any scope. Report an error on the first name part.
90
+ const firstName = nameParts[0].token;
91
+ errors.push({
92
+ token: firstName,
93
+ message: "Not found",
94
+ expectedNames: expectedNamesCollector.expectedNames,
95
+ });
96
+ }
97
+ // Try to resolve a reference by looking it up in the given scope.
98
+ function tryResolveReference(nameParts, scope, docModule, getModule) {
99
+ let firstNameMatched = false;
100
+ for (let i = 0; i < nameParts.length; i++) {
101
+ const namePart = nameParts[i];
102
+ const match = scope.nameToDeclaration[namePart.token.text];
103
+ if (!match) {
104
+ const expectedNames = declarationsToExpectedNames(scope.nameToDeclaration, (d) => scope === docModule ||
105
+ (d.kind !== "import" && d.kind !== "import-alias"));
106
+ if (firstNameMatched) {
107
+ return {
108
+ kind: "failed-match",
109
+ error: {
110
+ token: namePart.token,
111
+ message: "Not found",
112
+ expectedNames: expectedNames,
113
+ },
114
+ };
115
+ }
116
+ else {
117
+ return {
118
+ kind: "no-match",
119
+ expectedNames: expectedNames,
120
+ };
121
+ }
122
+ }
123
+ firstNameMatched = true;
124
+ const isLastPart = i === nameParts.length - 1;
125
+ const makeExpectedToBeLastNameFailedMatch = () => ({
126
+ kind: "failed-match",
127
+ error: {
128
+ token: namePart.token,
129
+ message: "Expected to be the last name in the sequence",
130
+ },
131
+ });
132
+ switch (match.kind) {
133
+ case "constant":
134
+ case "method": {
135
+ namePart.declaration = match;
136
+ if (isLastPart) {
137
+ return match;
138
+ }
139
+ else {
140
+ return makeExpectedToBeLastNameFailedMatch();
141
+ }
142
+ }
143
+ case "record": {
144
+ scope = match;
145
+ namePart.declaration = match;
146
+ if (isLastPart) {
147
+ return match;
148
+ }
149
+ else {
150
+ break;
151
+ }
152
+ }
153
+ case "field": {
154
+ namePart.declaration = match;
155
+ if (isLastPart) {
156
+ return {
157
+ kind: "field",
158
+ field: match,
159
+ record: scope,
160
+ };
161
+ }
162
+ else {
163
+ return makeExpectedToBeLastNameFailedMatch();
164
+ }
165
+ }
166
+ case "import-alias": {
167
+ if (isLastPart) {
168
+ return {
169
+ kind: "failed-match",
170
+ error: {
171
+ token: namePart.token,
172
+ message: "Cannot be the last name in the sequence",
173
+ },
174
+ };
175
+ }
176
+ // Falls through
177
+ }
178
+ case "import": {
179
+ if (scope !== docModule) {
180
+ // Cannot refer to other module's imports.
181
+ return {
182
+ kind: "failed-match",
183
+ error: {
184
+ token: namePart.token,
185
+ message: "Cannot refer to other module's imports",
186
+ },
187
+ };
188
+ }
189
+ const { resolvedModulePath } = match;
190
+ if (!resolvedModulePath) {
191
+ return {
192
+ kind: "failed-match",
193
+ error: null, // An error has already been registered
194
+ };
195
+ }
196
+ const importedModule = getModule(resolvedModulePath);
197
+ if (!importedModule) {
198
+ return {
199
+ kind: "failed-match",
200
+ error: null, // An error has already been registered
201
+ };
202
+ }
203
+ scope = importedModule;
204
+ if (match.kind === "import") {
205
+ // Rewind to this name part, but with the imported module as scope.
206
+ --i;
207
+ }
208
+ else {
209
+ namePart.declaration = match;
210
+ }
211
+ break;
212
+ }
213
+ case "removed": {
214
+ throw new TypeError();
215
+ }
216
+ }
217
+ }
218
+ throw new Error("Unreachable");
219
+ }
220
+ function tryFindRecordForType(type) {
221
+ switch (type.kind) {
222
+ case "array":
223
+ return tryFindRecordForType(type.item);
224
+ case "optional":
225
+ return tryFindRecordForType(type.other);
226
+ case "record":
227
+ return type.key;
228
+ case "primitive":
229
+ return null;
230
+ }
231
+ }
232
+ //# sourceMappingURL=doc_reference_resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc_reference_resolver.js","sourceRoot":"","sources":["../src/doc_reference_resolver.ts"],"names":[],"mappings":"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"}