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/bin/main.js +3 -1
- package/bin/utilities/fileSystem.js +10 -8
- package/lib/axiom.js +45 -12
- package/lib/combinator.js +13 -7
- package/lib/conclusion.js +8 -1
- package/lib/constructor.js +24 -8
- package/lib/context/file.js +6 -6
- package/lib/context/release/directory.js +19 -19
- package/lib/context/release/file.js +336 -0
- package/lib/context/release.js +11 -6
- package/lib/index.js +5 -1
- package/lib/kinds.js +5 -5
- package/lib/label.js +16 -1
- package/lib/premise.js +8 -1
- package/lib/rule.js +39 -12
- package/lib/ruleNames.js +5 -1
- package/lib/type.js +19 -8
- package/lib/utilities/releaseContext.js +36 -2
- package/lib/verify/release.js +3 -20
- package/package.json +1 -1
- package/src/axiom.js +62 -13
- package/src/combinator.js +14 -2
- package/src/conclusion.js +11 -0
- package/src/constructor.js +23 -2
- package/src/context/file.js +5 -5
- package/src/context/release/directory.js +26 -26
- package/src/context/release/file.js +236 -0
- package/src/context/release.js +14 -7
- package/src/index.js +1 -0
- package/src/kinds.js +1 -1
- package/src/label.js +17 -0
- package/src/premise.js +11 -0
- package/src/rule.js +44 -12
- package/src/ruleNames.js +1 -0
- package/src/type.js +19 -2
- package/src/utilities/releaseContext.js +51 -1
- package/src/verify/release.js +2 -34
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
|
|
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 =
|
|
52
|
-
|
|
60
|
+
json = {
|
|
61
|
+
kind,
|
|
62
|
+
labels,
|
|
63
|
+
statement,
|
|
64
|
+
consequent,
|
|
65
|
+
supposition
|
|
66
|
+
};
|
|
53
67
|
|
|
54
|
-
|
|
68
|
+
return json;
|
|
69
|
+
}
|
|
55
70
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
label,
|
|
59
|
-
statement,
|
|
60
|
-
consequent,
|
|
61
|
-
supposition
|
|
62
|
-
});
|
|
63
|
-
});
|
|
71
|
+
static fromJSON(json, callback) {
|
|
72
|
+
let { labels } = json;
|
|
64
73
|
|
|
65
|
-
|
|
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
|
|
package/src/constructor.js
CHANGED
|
@@ -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
|
|
package/src/context/file.js
CHANGED
|
@@ -301,31 +301,31 @@ export default class FileContext {
|
|
|
301
301
|
this.rules.forEach((rule) => {
|
|
302
302
|
const ruleJSON = rule.toJSON();
|
|
303
303
|
|
|
304
|
-
push(
|
|
304
|
+
json.push(ruleJSON);
|
|
305
305
|
});
|
|
306
306
|
|
|
307
307
|
this.types.forEach((type) => {
|
|
308
308
|
const typeJSON = type.toJSON();
|
|
309
309
|
|
|
310
|
-
push(
|
|
310
|
+
json.push(typeJSON);
|
|
311
311
|
});
|
|
312
312
|
|
|
313
313
|
this.axioms.forEach((axiom) => {
|
|
314
314
|
const axiomJSON = axiom.toJSON();
|
|
315
315
|
|
|
316
|
-
push(
|
|
316
|
+
json.push(axiomJSON);
|
|
317
317
|
});
|
|
318
318
|
|
|
319
319
|
this.combinators.forEach((combinator) => {
|
|
320
320
|
const combinatorJSON = combinator.toJSON();
|
|
321
321
|
|
|
322
|
-
push(
|
|
322
|
+
json.push(combinatorJSON);
|
|
323
323
|
});
|
|
324
324
|
|
|
325
325
|
this.constructors.forEach((constructor) => {
|
|
326
326
|
const constructorJSON = constructor.toJSON();
|
|
327
327
|
|
|
328
|
-
push(
|
|
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
|
-
|
|
20
|
-
const
|
|
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
|
|
30
|
+
const fileContextTypes = fileContext.getTypes(bubble);
|
|
31
31
|
|
|
32
|
-
push(
|
|
32
|
+
push(types, fileContextTypes);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
this.releaseContexts.forEach((releaseContext) => {
|
|
36
|
-
const
|
|
36
|
+
const releaseContextTypes = releaseContext.getTypes(releaseNames);
|
|
37
37
|
|
|
38
|
-
push(
|
|
38
|
+
push(types, releaseContextTypes);
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
return
|
|
42
|
+
return types;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
56
|
+
const fileContextRules = fileContext.getRules(bubble);
|
|
57
57
|
|
|
58
|
-
push(
|
|
58
|
+
push(rules, fileContextRules);
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
this.releaseContexts.forEach((releaseContext) => {
|
|
62
|
-
const
|
|
62
|
+
const releaseContextRules = releaseContext.getRules(releaseNames);
|
|
63
63
|
|
|
64
|
-
push(
|
|
64
|
+
push(rules, releaseContextRules);
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
return
|
|
68
|
+
return rules;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
getAxioms(releaseNames = []) {
|
|
72
72
|
const axioms = [],
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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
|
-
|
|
152
|
-
|
|
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
|
-
|
|
198
|
+
directoryReleaseContext = new DirectoryReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, releaseContexts, fileContexts);
|
|
199
199
|
|
|
200
|
-
return
|
|
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
|
+
}
|
package/src/context/release.js
CHANGED
|
@@ -58,11 +58,17 @@ export default class ReleaseContext {
|
|
|
58
58
|
|
|
59
59
|
getReleaseName() {
|
|
60
60
|
const name = this.getName(),
|
|
61
|
-
|
|
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(
|
|
103
|
-
const releaseContext = this
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
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);
|