skir 0.0.1 → 0.0.2
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.
- package/dist/casing.d.ts +1 -4
- package/dist/casing.d.ts.map +1 -1
- package/dist/casing.js +0 -29
- package/dist/casing.js.map +1 -1
- package/dist/casing.test.js +2 -13
- package/dist/casing.test.js.map +1 -1
- package/dist/command_line_parser.d.ts +3 -3
- package/dist/command_line_parser.d.ts.map +1 -1
- package/dist/command_line_parser.js +35 -38
- package/dist/command_line_parser.js.map +1 -1
- package/dist/command_line_parser.test.js +73 -78
- package/dist/command_line_parser.test.js.map +1 -1
- package/dist/compatibility_checker.d.ts +9 -3
- package/dist/compatibility_checker.d.ts.map +1 -1
- package/dist/compatibility_checker.js +17 -4
- package/dist/compatibility_checker.js.map +1 -1
- package/dist/compatibility_checker.test.js +55 -1
- package/dist/compatibility_checker.test.js.map +1 -1
- package/dist/compiler.js +34 -17
- package/dist/compiler.js.map +1 -1
- package/dist/config.d.ts +5 -35
- package/dist/config.d.ts.map +1 -1
- package/dist/definition_finder.d.ts +1 -1
- package/dist/definition_finder.d.ts.map +1 -1
- package/dist/doc_comment_parser.d.ts +3 -0
- package/dist/doc_comment_parser.d.ts.map +1 -0
- package/dist/doc_comment_parser.js +219 -0
- package/dist/doc_comment_parser.js.map +1 -0
- package/dist/doc_comment_parser.test.d.ts +2 -0
- package/dist/doc_comment_parser.test.d.ts.map +1 -0
- package/dist/doc_comment_parser.test.js +494 -0
- package/dist/doc_comment_parser.test.js.map +1 -0
- package/dist/error_renderer.d.ts +1 -1
- package/dist/error_renderer.d.ts.map +1 -1
- package/dist/error_renderer.js +84 -65
- package/dist/error_renderer.js.map +1 -1
- package/dist/formatter.d.ts +15 -2
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +191 -234
- package/dist/formatter.js.map +1 -1
- package/dist/formatter.test.js +322 -88
- package/dist/formatter.test.js.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/language_server.js +1 -1
- package/dist/language_server.js.map +1 -1
- package/dist/literals.d.ts +1 -2
- package/dist/literals.d.ts.map +1 -1
- package/dist/literals.js +1 -12
- package/dist/literals.js.map +1 -1
- package/dist/literals.test.js +1 -4
- package/dist/literals.test.js.map +1 -1
- package/dist/module_set.d.ts +3 -7
- package/dist/module_set.d.ts.map +1 -1
- package/dist/module_set.js +205 -51
- package/dist/module_set.js.map +1 -1
- package/dist/module_set.test.js +595 -28
- package/dist/module_set.test.js.map +1 -1
- package/dist/parser.d.ts +3 -4
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +185 -92
- package/dist/parser.js.map +1 -1
- package/dist/parser.test.js +243 -15
- package/dist/parser.test.js.map +1 -1
- package/dist/project_initializer.d.ts +2 -0
- package/dist/project_initializer.d.ts.map +1 -0
- package/dist/project_initializer.js +30 -0
- package/dist/project_initializer.js.map +1 -0
- package/dist/snapshotter.d.ts +3 -0
- package/dist/snapshotter.d.ts.map +1 -1
- package/dist/snapshotter.js +43 -6
- package/dist/snapshotter.js.map +1 -1
- package/dist/tokenizer.d.ts +8 -2
- package/dist/tokenizer.d.ts.map +1 -1
- package/dist/tokenizer.js +26 -20
- package/dist/tokenizer.js.map +1 -1
- package/dist/tokenizer.test.js +285 -269
- package/dist/tokenizer.test.js.map +1 -1
- package/package.json +7 -5
- package/src/casing.ts +1 -36
- package/src/command_line_parser.ts +42 -48
- package/src/compatibility_checker.ts +29 -7
- package/src/compiler.ts +35 -18
- package/src/definition_finder.ts +1 -1
- package/src/doc_comment_parser.ts +246 -0
- package/src/error_renderer.ts +90 -66
- package/src/formatter.ts +249 -238
- package/src/index.ts +0 -6
- package/src/language_server.ts +8 -8
- package/src/literals.ts +5 -14
- package/src/module_set.ts +259 -79
- package/src/parser.ts +213 -98
- package/src/project_initializer.ts +39 -0
- package/src/snapshotter.ts +46 -5
- package/src/tokenizer.ts +47 -25
- package/dist/encoding.d.ts +0 -2
- package/dist/encoding.d.ts.map +0 -1
- package/dist/encoding.js +0 -38
- package/dist/encoding.js.map +0 -1
- package/dist/encoding.test.d.ts +0 -2
- package/dist/encoding.test.d.ts.map +0 -1
- package/dist/encoding.test.js +0 -23
- package/dist/encoding.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -14
- package/dist/index.test.js.map +0 -1
- package/dist/types.d.ts +0 -375
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/src/encoding.ts +0 -32
- package/src/types.ts +0 -518
package/src/error_renderer.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RecordLocation,
|
|
3
|
+
ResolvedType,
|
|
4
|
+
SkirError,
|
|
5
|
+
Token,
|
|
6
|
+
} from "skir-internal";
|
|
1
7
|
import { caseMatches } from "./casing.js";
|
|
2
8
|
import {
|
|
3
9
|
BeforeAfter,
|
|
4
10
|
BreakingChange,
|
|
5
11
|
Expression,
|
|
6
|
-
|
|
12
|
+
getTokenForBreakingChange,
|
|
7
13
|
} from "./compatibility_checker.js";
|
|
8
14
|
import { ModuleSet } from "./module_set.js";
|
|
9
|
-
import { RecordLocation, ResolvedType, SkirError, Token } from "./types.js";
|
|
10
15
|
|
|
11
16
|
export function renderErrors(errors: readonly SkirError[]): void {
|
|
12
17
|
const MAX_ERRORS = 10;
|
|
@@ -46,7 +51,7 @@ export function formatError(error: SkirError): string {
|
|
|
46
51
|
result += "\n";
|
|
47
52
|
result += makeBlackOnWhite(" ".repeat(lineNumberStr.length));
|
|
48
53
|
result += " ".repeat(colNumber + 1);
|
|
49
|
-
result += makeRed("~".repeat(Math.max(token.
|
|
54
|
+
result += makeRed("~".repeat(Math.max(token.originalText.length, 1)));
|
|
50
55
|
result += "\n";
|
|
51
56
|
return result;
|
|
52
57
|
}
|
|
@@ -59,10 +64,12 @@ export function renderBreakingChanges(
|
|
|
59
64
|
for (let i = 0; i < breakingChanges.length && i < MAX; ++i) {
|
|
60
65
|
const breakingChange = breakingChanges[i]!;
|
|
61
66
|
console.error(formatBreakingChange(breakingChange, moduleSet));
|
|
67
|
+
console.error();
|
|
62
68
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
69
|
+
const numBreakingChanges = breakingChanges.length;
|
|
70
|
+
const s = numBreakingChanges === 1 ? "" : "s";
|
|
71
|
+
if (numBreakingChanges) {
|
|
72
|
+
console.error(`Found ${numBreakingChanges} breaking change${s}\n`);
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
75
|
|
|
@@ -70,37 +77,37 @@ function formatBreakingChange(
|
|
|
70
77
|
breakingChange: BreakingChange,
|
|
71
78
|
moduleSet: BeforeAfter<ModuleSet>,
|
|
72
79
|
): string {
|
|
80
|
+
const token = getTokenForBreakingChange(breakingChange);
|
|
81
|
+
const locationPrefix = token ? formatLocation(token) + " - " : "";
|
|
73
82
|
switch (breakingChange.kind) {
|
|
74
83
|
case "illegal-type-change": {
|
|
75
84
|
const { expression, type } = breakingChange;
|
|
76
|
-
const location = formatLocation(getTokenForExpression(expression.after));
|
|
77
85
|
const errorHeader = makeRed("Illegal type change");
|
|
78
86
|
return [
|
|
79
|
-
`${
|
|
80
|
-
" [Last snapshot]",
|
|
81
|
-
` Expression: ${formatExpression(expression.before)}`,
|
|
82
|
-
` Type: ${formatType(type.before, moduleSet.before)}`,
|
|
83
|
-
" [Now]",
|
|
84
|
-
` Expression: ${formatExpression(expression.after)}`,
|
|
85
|
-
` Type: ${formatType(type.after, moduleSet.after)}`,
|
|
87
|
+
`${locationPrefix}${errorHeader}\n`,
|
|
88
|
+
" [Last snapshot]\n",
|
|
89
|
+
` ${makeGray("Expression:")} ${formatExpression(expression.before)}`,
|
|
90
|
+
` ${makeGray("Type:")} ${formatType(type.before, moduleSet.before)}\n`,
|
|
91
|
+
" [Now]\n",
|
|
92
|
+
` ${makeGray("Expression:")} ${formatExpression(expression.after)}`,
|
|
93
|
+
` ${makeGray("Type:")} ${formatType(type.after, moduleSet.after)}`,
|
|
86
94
|
].join("\n");
|
|
87
95
|
}
|
|
88
96
|
case "missing-slots": {
|
|
89
97
|
const { missingRangeEnd, missingRangeStart, recordExpression, record } =
|
|
90
98
|
breakingChange;
|
|
91
|
-
const location = formatLocation(record.after.record.name);
|
|
92
99
|
const errorHeader = makeRed("Missing slots in record");
|
|
93
100
|
return [
|
|
94
|
-
`${
|
|
95
|
-
" [Last snapshot]",
|
|
96
|
-
` Expression: ${formatExpression(recordExpression.before)}`,
|
|
97
|
-
` Record: ${record.before.record.name.text}`,
|
|
98
|
-
` Slots: ${missingRangeEnd}`,
|
|
99
|
-
" [Now]",
|
|
100
|
-
` Expression: ${formatExpression(recordExpression.after)}`,
|
|
101
|
-
` Record: ${record.after.record.name.text}`,
|
|
102
|
-
` Slots: ${missingRangeStart}`,
|
|
103
|
-
"
|
|
101
|
+
`${locationPrefix}${errorHeader}\n`,
|
|
102
|
+
" [Last snapshot]\n",
|
|
103
|
+
` ${makeGray("Expression:")} ${formatExpression(recordExpression.before)}`,
|
|
104
|
+
` ${makeGray("Record:")} ${record.before.record.name.text}`,
|
|
105
|
+
` ${makeGray("Slots:")} ${missingRangeEnd}\n`,
|
|
106
|
+
" [Now]\n",
|
|
107
|
+
` ${makeGray("Expression:")} ${formatExpression(recordExpression.after)}`,
|
|
108
|
+
` ${makeGray("Record:")} ${record.after.record.name.text}`,
|
|
109
|
+
` ${makeGray("Slots:")} ${missingRangeStart}\n`,
|
|
110
|
+
` ${makeGray("Fix:")} mark the field numbers as removed`,
|
|
104
111
|
].join("\n");
|
|
105
112
|
}
|
|
106
113
|
case "missing-record": {
|
|
@@ -109,12 +116,12 @@ function formatBreakingChange(
|
|
|
109
116
|
record.record.recordType,
|
|
110
117
|
" ",
|
|
111
118
|
getQualifiedName(record),
|
|
112
|
-
`(${recordNumber})`,
|
|
113
119
|
].join("");
|
|
114
120
|
return [
|
|
115
|
-
makeRed("Missing record")
|
|
116
|
-
" [Last snapshot]",
|
|
117
|
-
`
|
|
121
|
+
`${makeRed("Missing record")}\n`,
|
|
122
|
+
" [Last snapshot]\n",
|
|
123
|
+
` ${makeGray("Record:")} ${recordDefinition}`,
|
|
124
|
+
` ${makeGray("Number:")} ${recordNumber}`,
|
|
118
125
|
].join("\n");
|
|
119
126
|
}
|
|
120
127
|
case "missing-method": {
|
|
@@ -126,67 +133,84 @@ function formatBreakingChange(
|
|
|
126
133
|
formatType(method.requestType!, moduleSet.before),
|
|
127
134
|
"): ",
|
|
128
135
|
formatType(method.responseType!, moduleSet.before),
|
|
129
|
-
` = ${method.number}`,
|
|
130
136
|
].join("");
|
|
131
137
|
return [
|
|
132
|
-
makeRed("Missing method")
|
|
133
|
-
" [Last snapshot]",
|
|
134
|
-
`
|
|
138
|
+
`${makeRed("Missing method")}\n`,
|
|
139
|
+
" [Last snapshot]\n",
|
|
140
|
+
` ${makeGray("Method:")} ${methodDefinition}`,
|
|
141
|
+
` ${makeGray("Number:")} ${method.number}`,
|
|
135
142
|
].join("\n");
|
|
136
143
|
}
|
|
137
|
-
case "
|
|
138
|
-
const { record, variantName
|
|
139
|
-
const location = formatLocation(record.after.record.name);
|
|
144
|
+
case "variant-kind-change": {
|
|
145
|
+
const { enumEpression, number, record, variantName } = breakingChange;
|
|
140
146
|
const errorHeader = makeRed("Illegal variant kind change");
|
|
141
147
|
const enumName = map(record, getQualifiedName);
|
|
142
148
|
const variantKind = map(variantName, (vn) => {
|
|
143
149
|
caseMatches(vn.text, "lower_underscore") ? "wrapper" : "constant";
|
|
144
150
|
});
|
|
145
151
|
return [
|
|
146
|
-
`${
|
|
147
|
-
" [Last snapshot]",
|
|
148
|
-
`
|
|
149
|
-
`
|
|
150
|
-
`
|
|
151
|
-
"
|
|
152
|
-
`
|
|
153
|
-
|
|
154
|
-
`
|
|
152
|
+
`${locationPrefix}${errorHeader}\n`,
|
|
153
|
+
" [Last snapshot]\n",
|
|
154
|
+
` ${makeGray("Expression:")} ${formatExpression(enumEpression.before)}`,
|
|
155
|
+
` ${makeGray("Enum:")} ${enumName.before}`,
|
|
156
|
+
` ${makeGray("Variant:")} ${variantName.before.text}`,
|
|
157
|
+
` ${makeGray("Number:")} ${number}`,
|
|
158
|
+
` ${makeGray("Kind:")} ${variantKind.before}\n`,
|
|
159
|
+
" [Now]\n",
|
|
160
|
+
` ${makeGray("Expression:")} ${formatExpression(enumEpression.after)}`,
|
|
161
|
+
` ${makeGray("Enum:")} ${enumName.after}`,
|
|
162
|
+
` ${makeGray("Variant:")} ${variantName.after.text}`,
|
|
163
|
+
` ${makeGray("Number:")} ${number}`,
|
|
164
|
+
` ${makeGray("Kind:")} ${variantKind.after}`,
|
|
165
|
+
].join("\n");
|
|
166
|
+
}
|
|
167
|
+
case "missing-variant": {
|
|
168
|
+
const { enumEpression, number, record, variantName } = breakingChange;
|
|
169
|
+
const errorHeader = makeRed("Missing variant");
|
|
170
|
+
const enumName = map(record, getQualifiedName);
|
|
171
|
+
return [
|
|
172
|
+
`${locationPrefix}${errorHeader}\n`,
|
|
173
|
+
" [Last snapshot]\n",
|
|
174
|
+
` ${makeGray("Expression:")} ${formatExpression(enumEpression.before)}`,
|
|
175
|
+
` ${makeGray("Enum:")} ${enumName.before}`,
|
|
176
|
+
` ${makeGray("Variant:")} ${variantName.text}`,
|
|
177
|
+
` ${makeGray("Number:")} ${number}\n`,
|
|
178
|
+
" [Now]\n",
|
|
179
|
+
` ${makeGray("Expression:")} ${formatExpression(enumEpression.after)}`,
|
|
180
|
+
` ${makeGray("Enum:")} ${enumName.after}`,
|
|
155
181
|
].join("\n");
|
|
156
182
|
}
|
|
157
183
|
case "record-kind-change": {
|
|
158
184
|
const { record, recordExpression, recordType } = breakingChange;
|
|
159
|
-
const location = formatLocation(record.after.record.name);
|
|
160
185
|
const errorHeader = makeRed("Record kind change");
|
|
161
186
|
return [
|
|
162
|
-
`${
|
|
163
|
-
" [Last snapshot]",
|
|
164
|
-
` Expression: ${formatExpression(recordExpression.before)}`,
|
|
165
|
-
` Record: ${record.before.record.name.text}`,
|
|
166
|
-
` Kind: ${recordType.before}`,
|
|
167
|
-
" [Now]",
|
|
168
|
-
` Expression: ${formatExpression(recordExpression.after)}`,
|
|
169
|
-
` Record: ${record.after.record.name.text}`,
|
|
170
|
-
` Kind: ${recordType.after}`,
|
|
187
|
+
`${locationPrefix}${errorHeader}\n`,
|
|
188
|
+
" [Last snapshot]\n",
|
|
189
|
+
` ${makeGray("Expression:")} ${formatExpression(recordExpression.before)}`,
|
|
190
|
+
` ${makeGray("Record:")} ${record.before.record.name.text}`,
|
|
191
|
+
` ${makeGray("Kind:")} ${recordType.before}\n`,
|
|
192
|
+
" [Now]\n",
|
|
193
|
+
` ${makeGray("Expression:")} ${formatExpression(recordExpression.after)}`,
|
|
194
|
+
` ${makeGray("Record:")} ${record.after.record.name.text}`,
|
|
195
|
+
` ${makeGray("Kind:")} ${recordType.after}`,
|
|
171
196
|
].join("\n");
|
|
172
197
|
}
|
|
173
198
|
case "removed-number-reintroduced": {
|
|
174
199
|
const { record, recordExpression, reintroducedAs, removedNumber } =
|
|
175
200
|
breakingChange;
|
|
176
|
-
const location = formatLocation(record.after.record.name);
|
|
177
201
|
const errorHeader = makeRed("Removed number reintroduced");
|
|
178
202
|
return [
|
|
179
|
-
`${
|
|
180
|
-
" [Last snapshot]",
|
|
181
|
-
` Expression: ${formatExpression(recordExpression.before)}`,
|
|
182
|
-
` Record: ${record.before.record.name.text}`,
|
|
183
|
-
` Removed: ${removedNumber}`,
|
|
184
|
-
" [Now]",
|
|
185
|
-
` Expression: ${formatExpression(recordExpression.after)}`,
|
|
186
|
-
` Record: ${record.after.record.name.text}`,
|
|
203
|
+
`${locationPrefix}${errorHeader}\n`,
|
|
204
|
+
" [Last snapshot]\n",
|
|
205
|
+
` ${makeGray("Expression:")} ${formatExpression(recordExpression.before)}`,
|
|
206
|
+
` ${makeGray("Record:")} ${record.before.record.name.text}`,
|
|
207
|
+
` ${makeGray("Removed:")} ${removedNumber}\n`,
|
|
208
|
+
" [Now]\n",
|
|
209
|
+
` ${makeGray("Expression:")} ${formatExpression(recordExpression.after)}`,
|
|
210
|
+
` ${makeGray("Record:")} ${record.after.record.name.text}`,
|
|
187
211
|
record.after.record.recordType === "struct"
|
|
188
|
-
? ` Field: ${reintroducedAs.text}`
|
|
189
|
-
: ` Variant: ${reintroducedAs.text}`,
|
|
212
|
+
? ` ${makeGray("Field:")} ${reintroducedAs.text}`
|
|
213
|
+
: ` ${makeGray("Variant:")} ${reintroducedAs.text}`,
|
|
190
214
|
].join("\n");
|
|
191
215
|
}
|
|
192
216
|
}
|