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.
Files changed (115) hide show
  1. package/dist/casing.d.ts +1 -4
  2. package/dist/casing.d.ts.map +1 -1
  3. package/dist/casing.js +0 -29
  4. package/dist/casing.js.map +1 -1
  5. package/dist/casing.test.js +2 -13
  6. package/dist/casing.test.js.map +1 -1
  7. package/dist/command_line_parser.d.ts +3 -3
  8. package/dist/command_line_parser.d.ts.map +1 -1
  9. package/dist/command_line_parser.js +35 -38
  10. package/dist/command_line_parser.js.map +1 -1
  11. package/dist/command_line_parser.test.js +73 -78
  12. package/dist/command_line_parser.test.js.map +1 -1
  13. package/dist/compatibility_checker.d.ts +9 -3
  14. package/dist/compatibility_checker.d.ts.map +1 -1
  15. package/dist/compatibility_checker.js +17 -4
  16. package/dist/compatibility_checker.js.map +1 -1
  17. package/dist/compatibility_checker.test.js +55 -1
  18. package/dist/compatibility_checker.test.js.map +1 -1
  19. package/dist/compiler.js +34 -17
  20. package/dist/compiler.js.map +1 -1
  21. package/dist/config.d.ts +5 -35
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/definition_finder.d.ts +1 -1
  24. package/dist/definition_finder.d.ts.map +1 -1
  25. package/dist/doc_comment_parser.d.ts +3 -0
  26. package/dist/doc_comment_parser.d.ts.map +1 -0
  27. package/dist/doc_comment_parser.js +219 -0
  28. package/dist/doc_comment_parser.js.map +1 -0
  29. package/dist/doc_comment_parser.test.d.ts +2 -0
  30. package/dist/doc_comment_parser.test.d.ts.map +1 -0
  31. package/dist/doc_comment_parser.test.js +494 -0
  32. package/dist/doc_comment_parser.test.js.map +1 -0
  33. package/dist/error_renderer.d.ts +1 -1
  34. package/dist/error_renderer.d.ts.map +1 -1
  35. package/dist/error_renderer.js +84 -65
  36. package/dist/error_renderer.js.map +1 -1
  37. package/dist/formatter.d.ts +15 -2
  38. package/dist/formatter.d.ts.map +1 -1
  39. package/dist/formatter.js +191 -234
  40. package/dist/formatter.js.map +1 -1
  41. package/dist/formatter.test.js +322 -88
  42. package/dist/formatter.test.js.map +1 -1
  43. package/dist/index.d.ts +1 -5
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -4
  46. package/dist/index.js.map +1 -1
  47. package/dist/language_server.js +1 -1
  48. package/dist/language_server.js.map +1 -1
  49. package/dist/literals.d.ts +1 -2
  50. package/dist/literals.d.ts.map +1 -1
  51. package/dist/literals.js +1 -12
  52. package/dist/literals.js.map +1 -1
  53. package/dist/literals.test.js +1 -4
  54. package/dist/literals.test.js.map +1 -1
  55. package/dist/module_set.d.ts +3 -7
  56. package/dist/module_set.d.ts.map +1 -1
  57. package/dist/module_set.js +205 -51
  58. package/dist/module_set.js.map +1 -1
  59. package/dist/module_set.test.js +595 -28
  60. package/dist/module_set.test.js.map +1 -1
  61. package/dist/parser.d.ts +3 -4
  62. package/dist/parser.d.ts.map +1 -1
  63. package/dist/parser.js +185 -92
  64. package/dist/parser.js.map +1 -1
  65. package/dist/parser.test.js +243 -15
  66. package/dist/parser.test.js.map +1 -1
  67. package/dist/project_initializer.d.ts +2 -0
  68. package/dist/project_initializer.d.ts.map +1 -0
  69. package/dist/project_initializer.js +30 -0
  70. package/dist/project_initializer.js.map +1 -0
  71. package/dist/snapshotter.d.ts +3 -0
  72. package/dist/snapshotter.d.ts.map +1 -1
  73. package/dist/snapshotter.js +43 -6
  74. package/dist/snapshotter.js.map +1 -1
  75. package/dist/tokenizer.d.ts +8 -2
  76. package/dist/tokenizer.d.ts.map +1 -1
  77. package/dist/tokenizer.js +26 -20
  78. package/dist/tokenizer.js.map +1 -1
  79. package/dist/tokenizer.test.js +285 -269
  80. package/dist/tokenizer.test.js.map +1 -1
  81. package/package.json +7 -5
  82. package/src/casing.ts +1 -36
  83. package/src/command_line_parser.ts +42 -48
  84. package/src/compatibility_checker.ts +29 -7
  85. package/src/compiler.ts +35 -18
  86. package/src/definition_finder.ts +1 -1
  87. package/src/doc_comment_parser.ts +246 -0
  88. package/src/error_renderer.ts +90 -66
  89. package/src/formatter.ts +249 -238
  90. package/src/index.ts +0 -6
  91. package/src/language_server.ts +8 -8
  92. package/src/literals.ts +5 -14
  93. package/src/module_set.ts +259 -79
  94. package/src/parser.ts +213 -98
  95. package/src/project_initializer.ts +39 -0
  96. package/src/snapshotter.ts +46 -5
  97. package/src/tokenizer.ts +47 -25
  98. package/dist/encoding.d.ts +0 -2
  99. package/dist/encoding.d.ts.map +0 -1
  100. package/dist/encoding.js +0 -38
  101. package/dist/encoding.js.map +0 -1
  102. package/dist/encoding.test.d.ts +0 -2
  103. package/dist/encoding.test.d.ts.map +0 -1
  104. package/dist/encoding.test.js +0 -23
  105. package/dist/encoding.test.js.map +0 -1
  106. package/dist/index.test.d.ts +0 -2
  107. package/dist/index.test.d.ts.map +0 -1
  108. package/dist/index.test.js +0 -14
  109. package/dist/index.test.js.map +0 -1
  110. package/dist/types.d.ts +0 -375
  111. package/dist/types.d.ts.map +0 -1
  112. package/dist/types.js +0 -2
  113. package/dist/types.js.map +0 -1
  114. package/src/encoding.ts +0 -32
  115. package/src/types.ts +0 -518
@@ -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
- getTokenForExpression,
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.text.length, 1)));
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
- // Count the number of distinct modules with errors.
64
- if (breakingChanges.length) {
65
- console.error(`Found ${breakingChanges.length} errors\n`);
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
- `${location} - ${errorHeader}`,
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
- `${location} - ${errorHeader}`,
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
- " Fix: mark the field numbers as removed",
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
- ` Record: ${recordDefinition}`,
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
- ` Method: ${methodDefinition}`,
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 "enum-variant-kind-change": {
138
- const { record, variantName, number } = breakingChange;
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
- `${location} - ${errorHeader}`,
147
- " [Last snapshot]",
148
- ` Enum: ${enumName.before}`,
149
- ` Variant: ${variantName.before.text} = ${number}`,
150
- ` Kind: ${variantKind.before}`,
151
- " [Now]",
152
- ` Enum: ${enumName.after}`,
153
- ` Variant: ${variantName.after.text} = ${number}`,
154
- ` Kind: ${variantKind.after}`,
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
- `${location} - ${errorHeader}`,
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
- `${location} - ${errorHeader}`,
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
  }