occam-verify-cli 0.0.373 → 0.0.375

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/src/axiom.js CHANGED
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
 
3
+ import Label from "./label";
4
+
3
5
  import { AXIOM_KIND } from "./kinds";
4
6
  import { nodeAsString } from "./utilities/string";
7
+ import { STATEMENT_RULE_NAME } from "occam-custom-grammars/lib/ruleNames";
5
8
 
6
9
  export default class Axiom {
7
10
  constructor(labels, statementNode, suppositionStatementNode, consequentStatementNode) {
@@ -41,28 +44,74 @@ export default class Axiom {
41
44
  }
42
45
 
43
46
  toJSON() {
44
- const statementString = nodeAsString(this.statementNode),
47
+ const labelsJSON = this.labels.map((label) => {
48
+ const labelJSON = label.toJSON();
49
+
50
+ return labelJSON;
51
+ }),
52
+ statementString = nodeAsString(this.statementNode),
45
53
  consequentStatementString = nodeAsString(this.consequentStatementNode),
46
54
  suppositionStatementString = nodeAsString(this.suppositionStatementNode),
47
55
  kind = AXIOM_KIND,
56
+ labels = labelsJSON, ///
48
57
  statement = statementString, ///
49
58
  consequent = consequentStatementString, ///
50
59
  supposition = suppositionStatementString, ///
51
- json = this.labels.map((label) => {
52
- const labelString = label.asString();
60
+ json = {
61
+ kind,
62
+ labels,
63
+ statement,
64
+ consequent,
65
+ supposition
66
+ };
53
67
 
54
- label = labelString; ///
68
+ return json;
69
+ }
55
70
 
56
- return ({
57
- kind,
58
- label,
59
- statement,
60
- consequent,
61
- supposition
62
- });
63
- });
71
+ static fromJSON(json, callback) {
72
+ let { labels } = json;
64
73
 
65
- return json;
74
+ const { statement, consequent, supposition } = json;
75
+
76
+ labels = labels.map((label) => {
77
+ const json = label; ///
78
+
79
+ label = Label.fromJSON(json);
80
+
81
+ return label;
82
+ });
83
+
84
+ let statementNode = null,
85
+ consequentNode = null,
86
+ suppositionNode = null;
87
+
88
+ if (statement !== null) {
89
+ const content = statement, ///
90
+ ruleName = STATEMENT_RULE_NAME,
91
+ node = callback(content, ruleName);
92
+
93
+ statementNode = node; ///
94
+ }
95
+
96
+ if (consequent !== null) {
97
+ const content = consequent, ///
98
+ ruleName = STATEMENT_RULE_NAME,
99
+ node = callback(content, ruleName);
100
+
101
+ consequentNode = node; ///
102
+ }
103
+
104
+ if (supposition !== null) {
105
+ const content = supposition, ///
106
+ ruleName = STATEMENT_RULE_NAME,
107
+ node = callback(content, ruleName);
108
+
109
+ suppositionNode = node; ///
110
+ }
111
+
112
+ const axiom = new Axiom(labels, statementNode, consequentNode, suppositionNode);
113
+
114
+ return axiom;
66
115
  }
67
116
 
68
117
  static fromStatementNodeAndLabels(statementNode, labels) {
package/src/combinator.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { nodeAsString } from "./utilities/string";
4
4
  import { COMBINATOR_KIND } from "./kinds";
5
+ import { STATEMENT_RULE_NAME } from "./ruleNames";
5
6
 
6
7
  export default class Combinator {
7
8
  constructor(statementNode) {
@@ -22,14 +23,25 @@ export default class Combinator {
22
23
  const statementString = nodeAsString(this.statementNode),
23
24
  kind = COMBINATOR_KIND,
24
25
  statement = statementString, ///
25
- json = [{
26
+ json = {
26
27
  kind,
27
28
  statement
28
- }];
29
+ };
29
30
 
30
31
  return json;
31
32
  }
32
33
 
34
+ static fromJSON(json, callback) {
35
+ const { statement } = json,
36
+ content = statement, ///
37
+ ruleName = STATEMENT_RULE_NAME,
38
+ node = callback(content, ruleName),
39
+ statementNode = node, ///
40
+ combinator = new Combinator(statementNode);
41
+
42
+ return combinator;
43
+ }
44
+
33
45
  static fromStatementNode(statementNode) {
34
46
  const combinator = new Combinator(statementNode);
35
47
 
package/src/conclusion.js CHANGED
@@ -33,6 +33,17 @@ export default class Conclusion {
33
33
  return json;
34
34
  }
35
35
 
36
+ static fromJSON(json, callback) {
37
+ const { metastatement } = json,
38
+ ruleName = METASTATEMENT_RULE_NAME,
39
+ content = metastatement, ///
40
+ node = callback(content, ruleName),
41
+ metastatementNode = node, ///
42
+ conclusion = new Conclusion(metastatementNode);
43
+
44
+ return conclusion;
45
+ }
46
+
36
47
  static fromMetastatementNode(metastatementNode) {
37
48
  const conclusion = new Conclusion(metastatementNode);
38
49
 
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
 
3
+ import Type from "./type";
4
+
3
5
  import { nodeAsString } from "./utilities/string";
6
+ import { TERM_RULE_NAME } from "./ruleNames";
4
7
  import { CONSTRUCTOR_KIND } from "./kinds";
5
8
 
6
9
  export default class Constructor {
@@ -42,15 +45,33 @@ export default class Constructor {
42
45
  kind = CONSTRUCTOR_KIND,
43
46
  term = termString, ///
44
47
  type = typeJSON, ///
45
- json = [{
48
+ json = {
46
49
  kind,
47
50
  term,
48
51
  type
49
- }];
52
+ };
50
53
 
51
54
  return json;
52
55
  }
53
56
 
57
+ static fromJSON(json, callback) {
58
+ let { type } = json;
59
+
60
+ const { term } = json,
61
+ content = term, ///
62
+ ruleName = TERM_RULE_NAME,
63
+ node = callback(content, ruleName),
64
+ termNode = node; ///
65
+
66
+ json = type; ///
67
+
68
+ type = Type.fromJSON(json);
69
+
70
+ const constructor = new Constructor(termNode, type);
71
+
72
+ return constructor;
73
+ }
74
+
54
75
  static fromTermNodeAndType(termNode, type) {
55
76
  const constructor = new Constructor(termNode, type);
56
77
 
@@ -301,31 +301,31 @@ export default class FileContext {
301
301
  this.rules.forEach((rule) => {
302
302
  const ruleJSON = rule.toJSON();
303
303
 
304
- push(json, ruleJSON);
304
+ json.push(ruleJSON);
305
305
  });
306
306
 
307
307
  this.types.forEach((type) => {
308
308
  const typeJSON = type.toJSON();
309
309
 
310
- push(json, typeJSON);
310
+ json.push(typeJSON);
311
311
  });
312
312
 
313
313
  this.axioms.forEach((axiom) => {
314
314
  const axiomJSON = axiom.toJSON();
315
315
 
316
- push(json, axiomJSON);
316
+ json.push(axiomJSON);
317
317
  });
318
318
 
319
319
  this.combinators.forEach((combinator) => {
320
320
  const combinatorJSON = combinator.toJSON();
321
321
 
322
- push(json, combinatorJSON);
322
+ json.push(combinatorJSON);
323
323
  });
324
324
 
325
325
  this.constructors.forEach((constructor) => {
326
326
  const constructorJSON = constructor.toJSON();
327
327
 
328
- push(json, constructorJSON)
328
+ json.push(constructorJSON)
329
329
  });
330
330
 
331
331
  return json;
@@ -16,8 +16,8 @@ export default class DirectoryReleaseContext extends ReleaseContext {
16
16
  return this.fileContexts;
17
17
  }
18
18
 
19
- getRules(releaseNames = []) {
20
- const rules = [],
19
+ getTypes(releaseNames = []) {
20
+ const types = [],
21
21
  releaseName = this.getReleaseName(),
22
22
  releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
23
23
 
@@ -27,25 +27,25 @@ export default class DirectoryReleaseContext extends ReleaseContext {
27
27
  const bubble = false;
28
28
 
29
29
  this.fileContexts.forEach((fileContext) => {
30
- const fileContextRules = fileContext.getRules(bubble);
30
+ const fileContextTypes = fileContext.getTypes(bubble);
31
31
 
32
- push(rules, fileContextRules);
32
+ push(types, fileContextTypes);
33
33
  });
34
34
 
35
35
  this.releaseContexts.forEach((releaseContext) => {
36
- const releaseContextRules = releaseContext.getRules(releaseNames);
36
+ const releaseContextTypes = releaseContext.getTypes(releaseNames);
37
37
 
38
- push(rules, releaseContextRules);
38
+ push(types, releaseContextTypes);
39
39
  });
40
40
  }
41
41
 
42
- return rules;
42
+ return types;
43
43
  }
44
44
 
45
- getTypes(releaseNames = []) {
46
- const types = [],
47
- releaseName = this.getReleaseName(),
48
- releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
45
+ getRules(releaseNames = []) {
46
+ const rules = [],
47
+ releaseName = this.getReleaseName(),
48
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
49
49
 
50
50
  if (!releaseNamesIncludesReleaseName) {
51
51
  releaseNames.push(releaseName);
@@ -53,25 +53,25 @@ export default class DirectoryReleaseContext extends ReleaseContext {
53
53
  const bubble = false;
54
54
 
55
55
  this.fileContexts.forEach((fileContext) => {
56
- const fileContextTypes = fileContext.getTypes(bubble);
56
+ const fileContextRules = fileContext.getRules(bubble);
57
57
 
58
- push(types, fileContextTypes);
58
+ push(rules, fileContextRules);
59
59
  });
60
60
 
61
61
  this.releaseContexts.forEach((releaseContext) => {
62
- const releaseContextTypes = releaseContext.getTypes(releaseNames);
62
+ const releaseContextRules = releaseContext.getRules(releaseNames);
63
63
 
64
- push(types, releaseContextTypes);
64
+ push(rules, releaseContextRules);
65
65
  });
66
66
  }
67
67
 
68
- return types;
68
+ return rules;
69
69
  }
70
70
 
71
71
  getAxioms(releaseNames = []) {
72
72
  const axioms = [],
73
- releaseName = this.getReleaseName(),
74
- releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
73
+ releaseName = this.getReleaseName(),
74
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
75
75
 
76
76
  if (!releaseNamesIncludesReleaseName) {
77
77
  releaseNames.push(releaseName);
@@ -96,8 +96,8 @@ export default class DirectoryReleaseContext extends ReleaseContext {
96
96
 
97
97
  getLabels(releaseNames = []) {
98
98
  const labels = [],
99
- releaseName = this.getReleaseName(),
100
- releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
99
+ releaseName = this.getReleaseName(),
100
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
101
101
 
102
102
  if (!releaseNamesIncludesReleaseName) {
103
103
  releaseNames.push(releaseName);
@@ -122,8 +122,8 @@ export default class DirectoryReleaseContext extends ReleaseContext {
122
122
 
123
123
  getCombinators(releaseNames = []) {
124
124
  const combinators = [],
125
- releaseName = this.getReleaseName(),
126
- releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
125
+ releaseName = this.getReleaseName(),
126
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
127
127
 
128
128
  if (!releaseNamesIncludesReleaseName) {
129
129
  releaseNames.push(releaseName);
@@ -148,8 +148,8 @@ export default class DirectoryReleaseContext extends ReleaseContext {
148
148
 
149
149
  getConstructors(releaseNames = []) {
150
150
  const constructors = [],
151
- releaseName = this.getReleaseName(),
152
- releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
151
+ releaseName = this.getReleaseName(),
152
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
153
153
 
154
154
  if (!releaseNamesIncludesReleaseName) {
155
155
  releaseNames.push(releaseName);
@@ -195,8 +195,8 @@ export default class DirectoryReleaseContext extends ReleaseContext {
195
195
  florenceParser = null,
196
196
  releaseContexts = null,
197
197
  fileContexts = [],
198
- releaseContext = new DirectoryReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, releaseContexts, fileContexts);
198
+ directoryReleaseContext = new DirectoryReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, releaseContexts, fileContexts);
199
199
 
200
- return releaseContext;
200
+ return directoryReleaseContext;
201
201
  }
202
202
  }
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+
3
+ import ReleaseContext from "../../context/release";
4
+
5
+ import Rule from "../../rule";
6
+ import Type from "../../type";
7
+ import Axiom from "../../axiom";
8
+ import Combinator from "../../combinator";
9
+ import Constructor from "../../constructor";
10
+
11
+ import { push } from "../../utilities/array";
12
+ import { customGrammarFromNameAndEntries } from "../../utilities/customGrammar";
13
+ import { RULE_KIND, TYPE_KIND, AXIOM_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
14
+
15
+ export default class FileReleaseContext extends ReleaseContext {
16
+ constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, releaseContexts, contextJSON, types, rules, axioms, combinators, constructors) {
17
+ super(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, releaseContexts);
18
+
19
+ this.types = types;
20
+ this.rules = rules;
21
+ this.axioms = axioms;
22
+ this.combinators = combinators;
23
+ this.constructors = constructors;
24
+ this.contextJSON = contextJSON;
25
+ }
26
+
27
+ getContextJSON() {
28
+ return this.contextJSON;
29
+ }
30
+
31
+ getTypes(releaseNames = []) {
32
+ const types = [
33
+ ...this.types
34
+ ],
35
+ releaseName = this.getReleaseName(),
36
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
37
+
38
+ if (!releaseNamesIncludesReleaseName) {
39
+ releaseNames.push(releaseName);
40
+
41
+ this.releaseContexts.forEach((releaseContext) => {
42
+ const releaseContextTypes = releaseContext.getTypes(releaseNames);
43
+
44
+ push(types, releaseContextTypes);
45
+ });
46
+ }
47
+
48
+ return types;
49
+ }
50
+
51
+ getRules(releaseNames = []) {
52
+ const rules = [
53
+ ...this.rules
54
+ ],
55
+ releaseName = this.getReleaseName(),
56
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
57
+
58
+ if (!releaseNamesIncludesReleaseName) {
59
+ releaseNames.push(releaseName);
60
+
61
+ this.releaseContexts.forEach((releaseContext) => {
62
+ const releaseContextRules = releaseContext.getRules(releaseNames);
63
+
64
+ push(rules, releaseContextRules);
65
+ });
66
+ }
67
+
68
+ return rules;
69
+ }
70
+
71
+ getAxioms(releaseNames = []) {
72
+ const axioms = [
73
+ ...this.axioms
74
+ ],
75
+ releaseName = this.getReleaseName(),
76
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
77
+
78
+ if (!releaseNamesIncludesReleaseName) {
79
+ releaseNames.push(releaseName);
80
+
81
+ this.releaseContexts.forEach((releaseContext) => {
82
+ const releaseContextAxioms = releaseContext.getAxioms(releaseNames);
83
+
84
+ push(axioms, releaseContextAxioms);
85
+ });
86
+ }
87
+
88
+ return axioms;
89
+ }
90
+
91
+ getLabels(releaseNames = []) {
92
+ const labels = [],
93
+ releaseName = this.getReleaseName(),
94
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
95
+
96
+ this.rules.forEach((rule) => {
97
+ const ruleLabels = rule.getLabels();
98
+
99
+ push(labels, ruleLabels);
100
+ });
101
+
102
+ this.axioms.forEach((axiom) => {
103
+ const axiomLabels = axiom.getLabels();
104
+
105
+ push(labels, axiomLabels);
106
+ });
107
+
108
+ if (!releaseNamesIncludesReleaseName) {
109
+ releaseNames.push(releaseName);
110
+
111
+ this.releaseContexts.forEach((releaseContext) => {
112
+ const releaseContextAxioms = releaseContext.getAxioms(releaseNames);
113
+
114
+ push(labels, releaseContextAxioms);
115
+ });
116
+ }
117
+
118
+ return labels;
119
+ }
120
+
121
+ getCombinators(releaseNames = []) {
122
+ const combinators = [
123
+ ...this.combinators
124
+ ],
125
+ releaseName = this.getReleaseName(),
126
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
127
+
128
+ if (!releaseNamesIncludesReleaseName) {
129
+ releaseNames.push(releaseName);
130
+
131
+ this.releaseContexts.forEach((releaseContext) => {
132
+ const releaseContextCombinators = releaseContext.getCombinators(releaseNames);
133
+
134
+ push(combinators, releaseContextCombinators);
135
+ });
136
+ }
137
+
138
+ return combinators;
139
+ }
140
+
141
+ getConstructors(releaseNames = []) {
142
+ const constructors = [
143
+ ...this.constructors
144
+ ],
145
+ releaseName = this.getReleaseName(),
146
+ releaseNamesIncludesReleaseName = releaseNames.includes(releaseName);
147
+
148
+ if (!releaseNamesIncludesReleaseName) {
149
+ releaseNames.push(releaseName);
150
+
151
+ this.releaseContexts.forEach((releaseContext) => {
152
+ const releaseContextConstructors = releaseContext.getConstructors(releaseNames);
153
+
154
+ push(constructors, releaseContextConstructors);
155
+ });
156
+ }
157
+
158
+ return constructors;
159
+ }
160
+
161
+ initialise(dependencyReleaseContexts) {
162
+ super.initialise(dependencyReleaseContexts);
163
+
164
+ const ruleMap = this.florenceParser.getRuleMap(),
165
+ jsonArray = this.contextJSON, ///
166
+ callback = (content, ruleName) => {
167
+ const tokens = this.florenceLexer.tokenise(content),
168
+ rule = ruleMap[ruleName],
169
+ node = this.florenceParser.parse(tokens, rule);
170
+
171
+ return node;
172
+ };
173
+
174
+ jsonArray.forEach((json) => {
175
+ const { kind } = json;
176
+
177
+ switch (kind) {
178
+ case TYPE_KIND: {
179
+ const type = Type.fromJSON(json);
180
+
181
+ this.types.push(type);
182
+
183
+ break;
184
+ }
185
+
186
+ case RULE_KIND: {
187
+ const rule = Rule.fromJSON(json, callback);
188
+
189
+ this.rules.push(rule);
190
+
191
+ break;
192
+ }
193
+
194
+ case AXIOM_KIND: {
195
+ const axiom = Axiom.fromJSON(json, callback);
196
+
197
+ this.axioms.push(axiom);
198
+
199
+ break;
200
+ }
201
+
202
+ case COMBINATOR_KIND: {
203
+ const combinator = Combinator.fromJSON(json, callback);
204
+
205
+ this.combinators.push(combinator);
206
+
207
+ break;
208
+ }
209
+
210
+ case CONSTRUCTOR_KIND: {
211
+ const constructor = Constructor.fromJSON(json, callback);
212
+
213
+ this.constructors.push(constructor);
214
+
215
+ break;
216
+ }
217
+ }
218
+ });
219
+ }
220
+
221
+ static fromLogNameEntriesCallbacksAndContextJSON(log, name, entries, callbacks, contextJSON) {
222
+ const verified = false, ///
223
+ customGrammar = customGrammarFromNameAndEntries(name, entries),
224
+ florenceLexer = null,
225
+ florenceParser = null,
226
+ releaseContexts = null,
227
+ types = null,
228
+ rules = null,
229
+ axioms = null,
230
+ combinators = null,
231
+ constructors = null,
232
+ releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, releaseContexts, contextJSON, types, rules, axioms, combinators, constructors);
233
+
234
+ return releaseContext;
235
+ }
236
+ }
@@ -58,11 +58,17 @@ export default class ReleaseContext {
58
58
 
59
59
  getReleaseName() {
60
60
  const name = this.getName(),
61
- releaseName = name; ///
61
+ releaseName = name; ///
62
62
 
63
63
  return releaseName;
64
64
  }
65
65
 
66
+ isInitialised() {
67
+ const initialised = (this.releaseContexts !== null); ///
68
+
69
+ return initialised;
70
+ }
71
+
66
72
  getFile(filePath) { return this.entries.getFile(filePath); }
67
73
 
68
74
  getVersion() { return this.entries.getVersion(); }
@@ -99,12 +105,13 @@ export default class ReleaseContext {
99
105
 
100
106
  complete(filePath, leastLineIndex, greatestLineIndex) { this.callbacks.complete(filePath, leastLineIndex, greatestLineIndex); }
101
107
 
102
- initialise(releaseContexts, dependencyReleaseContexts) {
103
- const releaseContext = this; ///
104
-
105
- releaseContexts = [ releaseContext, ...dependencyReleaseContexts ]; ///
106
-
107
- const combinedCustomGrammar = combinedCustomGrammarFromReleaseContexts(releaseContexts);
108
+ initialise(dependencyReleaseContexts) {
109
+ const releaseContext = this, ///
110
+ releaseContexts = [
111
+ releaseContext,
112
+ ...dependencyReleaseContexts
113
+ ],
114
+ combinedCustomGrammar = combinedCustomGrammarFromReleaseContexts(releaseContexts);
108
115
 
109
116
  this.florenceLexer = florenceLexerFromCombinedCustomGrammar(combinedCustomGrammar);
110
117
 
package/src/index.js CHANGED
@@ -4,6 +4,7 @@ export { default as Callbacks } from "./callbacks";
4
4
  export { default as verifyRelease } from "./verify/release";
5
5
  export { default as ReleaseContext } from "./context/release";
6
6
  export { default as versionChanges } from "./versionChanges";
7
+ export { default as FileReleaseContext } from "./context/release/file";
7
8
  export { default as DirectoryReleaseContext } from "./context/release/directory";
8
9
 
9
10
  export { default as jsonUtilities } from "./utilities/json";
package/src/kinds.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- export const RULE_KIND = "rule";
4
3
  export const TYPE_KIND = "type";
4
+ export const RULE_KIND = "rule";
5
5
  export const AXIOM_KIND = "axiom";
6
6
  export const COMBINATOR_KIND = "combinator";
7
7
  export const CONSTRUCTOR_KIND = "constructor";
package/src/label.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { nodeAsString } from "./utilities/string";
4
+ import { TERM_RULE_NAME } from "./ruleNames";
4
5
  import { labelNameFromLabelNode } from "./utilities/query";
5
6
 
6
7
  export default class Label {
@@ -26,6 +27,22 @@ export default class Label {
26
27
  return string;
27
28
  }
28
29
 
30
+ toJSON() {
31
+ const string = nodeAsString(this.node),
32
+ json = string; ///
33
+
34
+ return json;
35
+ }
36
+
37
+ static fromJSON(json, callback) {
38
+ const content = json, ///
39
+ ruleName = TERM_RULE_NAME,
40
+ node = callback(content, ruleName),
41
+ label = new Label(node);
42
+
43
+ return label;
44
+ }
45
+
29
46
  static fromLabelNode(labelNode) {
30
47
  const node = labelNode, ///
31
48
  variable = new Label(node);