occam-verify-cli 0.0.677 → 0.0.679
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/action/verify.js +14 -4
- package/lib/conclusion.js +10 -5
- package/lib/consequent.js +8 -3
- package/lib/context/file.js +74 -4
- package/lib/context/release.js +7 -2
- package/lib/equality.js +16 -16
- package/lib/premise.js +12 -7
- package/lib/supposition.js +9 -4
- package/lib/type.js +3 -8
- package/lib/utilities/string.js +26 -13
- package/lib/verifier/node/metastatement.js +173 -0
- package/lib/verifier/node/statementAsCombinator.js +186 -0
- package/lib/verifier/node/termAsConstructor.js +224 -0
- package/lib/verifier/node.js +158 -0
- package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/conclusion.js +13 -12
- package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/premise.js +13 -12
- package/lib/verifier/nodes/metastatementForMetavariable.js +198 -0
- package/lib/verifier/nodes/statement.js +199 -0
- package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/conclusion.js +13 -12
- package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/premise.js +13 -12
- package/lib/verifier/nodes/statementForMetavariable.js +203 -0
- package/lib/verifier/nodes/term.js +212 -0
- package/lib/verifier/{termForVariable/supposition.js → nodes/termForVariable/consequent.js} +13 -12
- package/lib/verifier/{termForVariable/consequent.js → nodes/termForVariable/supposition.js} +13 -12
- package/lib/verifier/nodes/termForVariable.js +209 -0
- package/lib/verifier/nodes.js +175 -0
- package/lib/verify/assertion/type.js +20 -10
- package/lib/verify/axiom.js +3 -3
- package/lib/verify/conclusion.js +3 -3
- package/lib/verify/conjecture.js +3 -3
- package/lib/verify/consequent.js +3 -3
- package/lib/verify/declaration/combinator.js +7 -2
- package/lib/verify/declaration/constructor.js +8 -2
- package/lib/verify/declaration/metavariable.js +7 -2
- package/lib/verify/declaration/type.js +7 -2
- package/lib/verify/declaration/variable.js +8 -2
- package/lib/verify/file.js +3 -3
- package/lib/verify/label.js +9 -4
- package/lib/verify/lemma.js +3 -3
- package/lib/verify/metastatement/qualified.js +5 -6
- package/lib/verify/metastatement/unqualified.js +9 -7
- package/lib/verify/metastatement.js +34 -157
- package/lib/verify/metavariable.js +6 -4
- package/lib/verify/premise.js +3 -3
- package/lib/verify/release.js +3 -3
- package/lib/verify/rule.js +3 -3
- package/lib/verify/statement/qualified.js +5 -6
- package/lib/verify/statement/unqualified.js +9 -7
- package/lib/verify/statement.js +112 -317
- package/lib/verify/statementAsCombinator.js +8 -82
- package/lib/verify/supposition.js +3 -3
- package/lib/verify/term.js +69 -213
- package/lib/verify/termAsConstructor.js +15 -89
- package/lib/verify/theorem.js +3 -3
- package/lib/verify/type.js +7 -5
- package/lib/verify/typeInference.js +5 -5
- package/lib/verify/variable.js +7 -5
- package/package.json +5 -5
- package/src/conclusion.js +5 -4
- package/src/consequent.js +3 -2
- package/src/context/file.js +11 -4
- package/src/context/release.js +9 -2
- package/src/equality.js +10 -10
- package/src/premise.js +7 -6
- package/src/supposition.js +4 -3
- package/src/type.js +3 -8
- package/src/utilities/string.js +34 -23
- package/src/verifier/node/metastatement.js +57 -0
- package/src/verifier/node/statementAsCombinator.js +80 -0
- package/src/verifier/node/termAsConstructor.js +124 -0
- package/src/verifier/node.js +85 -0
- package/src/verifier/nodes/metastatementForMetavariable/conclusion.js +11 -0
- package/src/verifier/nodes/metastatementForMetavariable/premise.js +11 -0
- package/src/verifier/{metastatementForMetavariable.js → nodes/metastatementForMetavariable.js} +6 -6
- package/src/verifier/nodes/statement.js +98 -0
- package/src/verifier/nodes/statementForMetavariable/conclusion.js +11 -0
- package/src/verifier/nodes/statementForMetavariable/premise.js +11 -0
- package/src/verifier/{statementForMetavariable.js → nodes/statementForMetavariable.js} +10 -10
- package/src/verifier/nodes/term.js +111 -0
- package/src/verifier/nodes/termForVariable/consequent.js +11 -0
- package/src/verifier/nodes/termForVariable/supposition.js +11 -0
- package/src/verifier/{termForVariable.js → nodes/termForVariable.js} +9 -9
- package/src/verifier/nodes.js +111 -0
- package/src/verify/assertion/type.js +25 -9
- package/src/verify/axiom.js +2 -2
- package/src/verify/conclusion.js +2 -2
- package/src/verify/conjecture.js +2 -2
- package/src/verify/consequent.js +2 -2
- package/src/verify/declaration/combinator.js +9 -1
- package/src/verify/declaration/constructor.js +15 -1
- package/src/verify/declaration/metavariable.js +9 -1
- package/src/verify/declaration/type.js +14 -1
- package/src/verify/declaration/variable.js +15 -1
- package/src/verify/file.js +2 -2
- package/src/verify/label.js +10 -2
- package/src/verify/lemma.js +4 -4
- package/src/verify/metastatement/qualified.js +4 -6
- package/src/verify/metastatement/unqualified.js +9 -7
- package/src/verify/metastatement.js +32 -57
- package/src/verify/metavariable.js +6 -3
- package/src/verify/premise.js +2 -2
- package/src/verify/release.js +2 -2
- package/src/verify/rule.js +2 -2
- package/src/verify/statement/qualified.js +4 -6
- package/src/verify/statement/unqualified.js +9 -7
- package/src/verify/statement.js +159 -283
- package/src/verify/statementAsCombinator.js +9 -129
- package/src/verify/supposition.js +2 -2
- package/src/verify/term.js +94 -159
- package/src/verify/termAsConstructor.js +20 -135
- package/src/verify/theorem.js +2 -2
- package/src/verify/type.js +7 -4
- package/src/verify/typeInference.js +4 -4
- package/src/verify/variable.js +7 -4
- package/lib/verifier/metastatementForMetavariable.js +0 -198
- package/lib/verifier/statementForMetavariable.js +0 -203
- package/lib/verifier/termForVariable.js +0 -209
- package/lib/verifier.js +0 -138
- package/src/verifier/metastatementForMetavariable/conclusion.js +0 -9
- package/src/verifier/metastatementForMetavariable/premise.js +0 -9
- package/src/verifier/statementForMetavariable/conclusion.js +0 -9
- package/src/verifier/statementForMetavariable/premise.js +0 -9
- package/src/verifier/termForVariable/consequent.js +0 -9
- package/src/verifier/termForVariable/supposition.js +0 -9
- package/src/verifier.js +0 -74
package/src/verify/statement.js
CHANGED
|
@@ -1,189 +1,58 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import Verifier from "../verifier";
|
|
4
3
|
import Equality from "../equality";
|
|
5
4
|
import verifyTerm from "../verify/term";
|
|
6
5
|
import equalityCombinator from "../ocmbinator/equality";
|
|
7
6
|
import bracketedCombinator from "../ocmbinator/bracketed";
|
|
8
7
|
import verifyTypeInference from "../verify/typeInference";
|
|
9
8
|
import verifyTypeAssertion from "../verify/assertion/type";
|
|
9
|
+
import statementNodesVerifier from "../verifier/nodes/statement";
|
|
10
10
|
|
|
11
|
-
import {
|
|
12
|
-
import { termVerifier } from "../verify/term";
|
|
11
|
+
import { nodeQuery } from "../utilities/query";
|
|
13
12
|
import { first, second } from "../utilities/array";
|
|
14
|
-
import { OBJECT_TYPE_NAME } from "../typeNames";
|
|
15
|
-
import { STATEMENT_META_TYPE } from "../metaTypes";
|
|
16
|
-
import { verifyTermAsVariable } from "../verify/term";
|
|
17
|
-
import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
|
|
18
|
-
import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
|
|
19
|
-
|
|
20
|
-
const termNodeQuery = nodeQuery("/argument/term!"),
|
|
21
|
-
typeNodeQuery = nodeQuery("/argument/type!"),
|
|
22
|
-
metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
|
|
23
|
-
statementNodeQuery = nodeQuery("/metaArgument/statement!"),
|
|
24
|
-
typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
|
|
25
|
-
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!"),
|
|
26
|
-
metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
|
|
27
|
-
|
|
28
|
-
class StatementVerifier extends Verifier {
|
|
29
|
-
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context) {
|
|
30
|
-
let nonTerminalNodeVerified = false;
|
|
31
|
-
|
|
32
|
-
const nonTerminalNode = nonTerminalNodeA, ///
|
|
33
|
-
combinatorNonTerminalNode = nonTerminalNodeB; ///
|
|
34
|
-
|
|
35
|
-
const ruleName = nonTerminalNode.getRuleName(), ///
|
|
36
|
-
combinatorRuleName = combinatorNonTerminalNode.getRuleName(); ///
|
|
37
|
-
|
|
38
|
-
if (ruleName === combinatorRuleName) {
|
|
39
|
-
switch (ruleName) {
|
|
40
|
-
case ARGUMENT_RULE_NAME: {
|
|
41
|
-
const argumentNode = nonTerminalNode, ///
|
|
42
|
-
constructorArgumentNode = combinatorNonTerminalNode, ///
|
|
43
|
-
argumentNodeVerified = termVerifier.verifyArgumentNode(argumentNode, constructorArgumentNode, context);
|
|
44
|
-
|
|
45
|
-
nonTerminalNodeVerified = argumentNodeVerified; ///
|
|
46
|
-
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
case META_ARGUMENT_RULE_NAME: {
|
|
51
|
-
const metaArgumentNode = nonTerminalNode, ///
|
|
52
|
-
combinatorMetaargumentNode = combinatorNonTerminalNode, ///
|
|
53
|
-
metaArgumentNodeVerified = this.verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context);
|
|
54
|
-
|
|
55
|
-
nonTerminalNodeVerified = metaArgumentNodeVerified; ///
|
|
56
|
-
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
default: {
|
|
61
|
-
const childNodes = nonTerminalNode.getChildNodes(),
|
|
62
|
-
combinatorChildNodes = combinatorNonTerminalNode.getChildNodes(),
|
|
63
|
-
nodesA = childNodes, ///
|
|
64
|
-
nodesB = combinatorChildNodes, ///
|
|
65
|
-
nodesVerified = this.verifyNodes(nodesA, nodesB, context);
|
|
66
|
-
|
|
67
|
-
nonTerminalNodeVerified = nodesVerified; ///
|
|
68
|
-
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return nonTerminalNodeVerified;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
verifyArgumentNode(argumentNode, combinatorArgumentNode, context) {
|
|
78
|
-
let argumentNodeVerified = false;
|
|
79
|
-
|
|
80
|
-
const termNode = termNodeQuery(argumentNode);
|
|
81
|
-
|
|
82
|
-
if (termNode === null) {
|
|
83
|
-
const argumentString = context.nodeAsString(argumentNode);
|
|
84
|
-
|
|
85
|
-
context.error(`The '${argumentString}' argument should be a term, not a type`, argumentNode);
|
|
86
|
-
} else {
|
|
87
|
-
const types = [],
|
|
88
|
-
termVerified = verifyTerm(termNode, types, context);
|
|
89
|
-
|
|
90
|
-
if (termVerified) {
|
|
91
|
-
const firstType = first(types),
|
|
92
|
-
termType = firstType, ///
|
|
93
|
-
typeNode = typeNodeQuery(combinatorArgumentNode),
|
|
94
|
-
typeName = typeNameFromTypeNode(typeNode),
|
|
95
|
-
type = (typeName === OBJECT_TYPE_NAME) ?
|
|
96
|
-
objectType : ///
|
|
97
|
-
context.findTypeByTypeName(typeName),
|
|
98
|
-
statementTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
|
|
99
|
-
|
|
100
|
-
if (statementTypeEqualToOrSubTypeOfType) {
|
|
101
|
-
argumentNodeVerified = true;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return argumentNodeVerified;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context) {
|
|
110
|
-
let metaArgumentNodeVerified = false;
|
|
111
|
-
|
|
112
|
-
const statementNode = statementNodeQuery(metaArgumentNode),
|
|
113
|
-
combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
|
|
114
13
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
} else {
|
|
120
|
-
if (combinatorMetaTYpeNode === null) {
|
|
121
|
-
const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
|
|
122
|
-
|
|
123
|
-
context.error(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
|
|
124
|
-
} else {
|
|
125
|
-
const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
|
|
126
|
-
content = combinatorMetaTypeTerminalNode.getContent(),
|
|
127
|
-
contentStatementMetaType = (content === STATEMENT_META_TYPE);
|
|
128
|
-
|
|
129
|
-
if (!contentStatementMetaType) {
|
|
130
|
-
context.error(`Expected the meta-type to be 'Statement' but got '${content}'.`, metaArgumentNode);
|
|
131
|
-
} else {
|
|
132
|
-
metaArgumentNodeVerified = true;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return metaArgumentNodeVerified;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export const statementVerifier = new StatementVerifier();
|
|
14
|
+
const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
|
|
15
|
+
rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!"),
|
|
16
|
+
typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
|
|
17
|
+
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
|
|
142
18
|
|
|
143
|
-
|
|
144
|
-
let statementVerified
|
|
19
|
+
function verifyStatement(statementNode, assignments, derived, context, verifyAhead) {
|
|
20
|
+
let statementVerified;
|
|
145
21
|
|
|
146
22
|
const statementString = context.nodeAsString(statementNode);
|
|
147
23
|
|
|
148
|
-
context.
|
|
149
|
-
|
|
150
|
-
if (!statementVerified) {
|
|
151
|
-
const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode, context);
|
|
152
|
-
|
|
153
|
-
statementVerified = statementVerifiedAgainstCombinators; ///
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (!statementVerified) {
|
|
157
|
-
const statementVerifiedAsTypeInference = verifyStatementAsTypeInference(statementNode, derived, context);
|
|
24
|
+
context.trace(`Verifying the '${statementString}' statement...`, statementNode);
|
|
158
25
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
statementVerified = statementVerifiedAsTypeAssertion; ///
|
|
166
|
-
}
|
|
26
|
+
const verifyStatementFunctions = [
|
|
27
|
+
verifyStatementAsEquality,
|
|
28
|
+
verifyStatementAsTypeInference,
|
|
29
|
+
verifyStatementAsTypeAssertion,
|
|
30
|
+
verifyStatementAgainstCombinators
|
|
31
|
+
];
|
|
167
32
|
|
|
168
|
-
|
|
169
|
-
const
|
|
33
|
+
statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
|
|
34
|
+
const statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
|
|
170
35
|
|
|
171
|
-
statementVerified
|
|
172
|
-
|
|
36
|
+
if (statementVerified) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
173
40
|
|
|
174
41
|
if (statementVerified) {
|
|
175
|
-
context.debug(
|
|
42
|
+
context.debug(`...verified the '${statementString}' statement.`, statementNode);
|
|
176
43
|
}
|
|
177
44
|
|
|
178
45
|
return statementVerified;
|
|
179
46
|
}
|
|
180
47
|
|
|
181
|
-
|
|
182
|
-
|
|
48
|
+
Object.assign(verifyStatement, {
|
|
49
|
+
statementNodesVerifier
|
|
50
|
+
});
|
|
183
51
|
|
|
184
|
-
|
|
52
|
+
export default verifyStatement;
|
|
185
53
|
|
|
186
|
-
|
|
54
|
+
export function verifyStatementAgainstCombinators(statementNode, assignments, derived, context, verifyAhead) {
|
|
55
|
+
let statementVerifiedAgainstCombinators;
|
|
187
56
|
|
|
188
57
|
let combinators = context.getCombinators();
|
|
189
58
|
|
|
@@ -192,186 +61,193 @@ export function verifyStatementAgainstCombinators(statementNode, context) {
|
|
|
192
61
|
...combinators
|
|
193
62
|
];
|
|
194
63
|
|
|
195
|
-
|
|
196
|
-
const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
64
|
+
statementVerifiedAgainstCombinators = combinators.some((combinator) => {
|
|
65
|
+
const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead);
|
|
197
66
|
|
|
198
67
|
if (statementVerifiedAgainstCombinator) {
|
|
199
68
|
return true;
|
|
200
69
|
}
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
if (combinator !== null) {
|
|
204
|
-
statementVerifiedAgainstCombinators = true;
|
|
205
|
-
}
|
|
70
|
+
});
|
|
206
71
|
|
|
207
72
|
return statementVerifiedAgainstCombinators;
|
|
208
73
|
}
|
|
209
74
|
|
|
210
|
-
export function verifyStatementAgainstCombinator(statementNode, combinator, context) {
|
|
75
|
+
export function verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead) {
|
|
76
|
+
let statementVerifiedAgainstCombinator;
|
|
77
|
+
|
|
211
78
|
const statementString = context.nodeAsString(statementNode),
|
|
212
79
|
combinatorString = combinator.getString();
|
|
213
80
|
|
|
214
|
-
context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator
|
|
81
|
+
context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator...`, statementNode);
|
|
215
82
|
|
|
216
83
|
const combinatorStatementNode = combinator.getStatementNode(),
|
|
217
84
|
nonTerminalNodeA = statementNode, ///
|
|
218
85
|
nonTerminalNodeB = combinatorStatementNode, ///
|
|
219
|
-
nonTerminalNodeVerified =
|
|
220
|
-
|
|
86
|
+
nonTerminalNodeVerified = statementNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context, verifyAhead);
|
|
87
|
+
|
|
88
|
+
statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
|
|
89
|
+
|
|
90
|
+
if (statementVerifiedAgainstCombinator) {
|
|
91
|
+
context.debug(`...verified the '${statementString}' statement against the '${combinatorString}' combinator.`, statementNode);
|
|
92
|
+
}
|
|
221
93
|
|
|
222
94
|
return statementVerifiedAgainstCombinator;
|
|
223
95
|
}
|
|
224
96
|
|
|
225
|
-
function verifyStatementAsTypeInference(statementNode, derived, context) {
|
|
97
|
+
function verifyStatementAsTypeInference(statementNode, assignments, derived, context, verifyAhead) {
|
|
226
98
|
let statementVerifiedAsTypeInference = false;
|
|
227
99
|
|
|
100
|
+
const statementString = context.nodeAsString(statementNode);
|
|
101
|
+
|
|
102
|
+
context.trace(`Verifying the '${statementString}' statement as a type inference...`, statementNode);
|
|
103
|
+
|
|
228
104
|
const typeInferenceNode = typeInferenceNodeQuery(statementNode);
|
|
229
105
|
|
|
230
106
|
if (typeInferenceNode !== null) {
|
|
231
107
|
if (!derived) {
|
|
232
108
|
const typeInferenceString = context.nodeAsString(typeInferenceNode);
|
|
233
109
|
|
|
234
|
-
context.
|
|
110
|
+
context.info(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
|
|
235
111
|
} else {
|
|
236
|
-
const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context);
|
|
112
|
+
const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context, verifyAhead);
|
|
237
113
|
|
|
238
114
|
statementVerifiedAsTypeInference = typeInferenceVerified; ///
|
|
239
115
|
}
|
|
240
116
|
}
|
|
241
117
|
|
|
118
|
+
if (statementVerifiedAsTypeInference) {
|
|
119
|
+
context.debug(`...verified the '${statementString}' statement as a type inference.`, statementNode);
|
|
120
|
+
}
|
|
121
|
+
|
|
242
122
|
return statementVerifiedAsTypeInference;
|
|
243
123
|
}
|
|
244
124
|
|
|
245
|
-
function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
|
|
125
|
+
function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context, verifyAhead) {
|
|
246
126
|
let statementVerifiedAsTypeAssertion = false;
|
|
247
127
|
|
|
128
|
+
const statementString = context.nodeAsString(statementNode);
|
|
129
|
+
|
|
130
|
+
context.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
|
|
131
|
+
|
|
248
132
|
const typeAssertionNode = typeAssertionNodeQuery(statementNode);
|
|
249
133
|
|
|
250
134
|
if (typeAssertionNode !== null) {
|
|
251
|
-
const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context);
|
|
135
|
+
const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead);
|
|
252
136
|
|
|
253
137
|
statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
|
|
254
138
|
}
|
|
255
139
|
|
|
140
|
+
if (statementVerifiedAsTypeAssertion) {
|
|
141
|
+
context.debug(`...verified the '${statementString}' statement as a type assertion.`, statementNode);
|
|
142
|
+
}
|
|
143
|
+
|
|
256
144
|
return statementVerifiedAsTypeAssertion;
|
|
257
145
|
}
|
|
258
146
|
|
|
259
|
-
function verifyStatementAsEquality(statementNode, derived, context) {
|
|
260
|
-
let statementVerifiedAsEquality
|
|
147
|
+
function verifyStatementAsEquality(statementNode, assignments, derived, context, verifyAhead) {
|
|
148
|
+
let statementVerifiedAsEquality;
|
|
149
|
+
|
|
150
|
+
const statementString = context.nodeAsString(statementNode);
|
|
151
|
+
|
|
152
|
+
context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
|
|
261
153
|
|
|
262
154
|
const combinator = equalityCombinator, ///
|
|
263
|
-
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context)
|
|
155
|
+
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, () => {
|
|
156
|
+
let verifiedAhead;
|
|
264
157
|
|
|
265
|
-
|
|
266
|
-
|
|
158
|
+
const verifyStatementAsEqualityFunctions = [
|
|
159
|
+
verifyStatementAsDerivedEquality,
|
|
160
|
+
verifyStatementAsEqualTerms
|
|
161
|
+
];
|
|
267
162
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
equalityVerified = equality.verify(equalities, context);
|
|
163
|
+
verifiedAhead = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
|
|
164
|
+
const statementVerified = verifyStatementAsEqualityFunction(statementNode, derived, context, verifyAhead);
|
|
271
165
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
rightTermNode = equality.getRightTermNode(),
|
|
277
|
-
leftTermVerifiedAsVariable = verifyTermAsVariable(leftTermNode, variables, context),
|
|
278
|
-
rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
|
|
279
|
-
|
|
280
|
-
if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
|
|
281
|
-
const firstVariable = first(variables),
|
|
282
|
-
secondVariable = second(variables),
|
|
283
|
-
leftVariable = firstVariable, ///
|
|
284
|
-
rightVariable = secondVariable, ///
|
|
285
|
-
leftVariableName = leftVariable.getName(),
|
|
286
|
-
leftVariableType = leftVariable.getType(),
|
|
287
|
-
rightVariableName = rightVariable.getName(),
|
|
288
|
-
rightVariableType = rightVariable.getType(),
|
|
289
|
-
leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
|
|
290
|
-
|
|
291
|
-
if (!leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
|
|
292
|
-
const leftVariableTypeName = leftVariableType.getName(),
|
|
293
|
-
rightVariableTypeName = rightVariableType.getName();
|
|
294
|
-
|
|
295
|
-
context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightVariableName}' variable's '${rightVariableTypeName}' type.`, statementNode);
|
|
296
|
-
} else {
|
|
297
|
-
statementVerifiedAsEquality = true;
|
|
298
|
-
}
|
|
299
|
-
} else if (leftTermVerifiedAsVariable) {
|
|
300
|
-
const types = [];
|
|
301
|
-
|
|
302
|
-
verifyTerm(rightTermNode, types, context);
|
|
303
|
-
|
|
304
|
-
const firstType = first(types),
|
|
305
|
-
firstVariable = first(variables),
|
|
306
|
-
leftVariable = firstVariable, ///
|
|
307
|
-
rightTermType = firstType, ///
|
|
308
|
-
leftVariableName = leftVariable.getName(),
|
|
309
|
-
leftVariableType = leftVariable.getType(),
|
|
310
|
-
leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
|
|
311
|
-
|
|
312
|
-
if (!leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
313
|
-
const rightTermString = context.nodeAsString(rightTermNode),
|
|
314
|
-
rightTermTypeName = rightTermType.getName(),
|
|
315
|
-
leftVariableTypeName = leftVariableType.getName();
|
|
316
|
-
|
|
317
|
-
context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
|
|
318
|
-
} else {
|
|
319
|
-
statementVerifiedAsEquality = true;
|
|
320
|
-
}
|
|
321
|
-
} else if (rightTermVerifiedAsVariable) {
|
|
322
|
-
const types = [];
|
|
323
|
-
|
|
324
|
-
verifyTerm(leftTermNode, types, context);
|
|
325
|
-
|
|
326
|
-
const firstType = first(types),
|
|
327
|
-
firstVariable = first(variables),
|
|
328
|
-
leftTermType = firstType, ///
|
|
329
|
-
rightVariable = firstVariable, ///
|
|
330
|
-
rightVariableName = rightVariable.getName(),
|
|
331
|
-
rightVariableType = rightVariable.getType(),
|
|
332
|
-
rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
|
|
333
|
-
|
|
334
|
-
if (!rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
335
|
-
const leftTermString = context.nodeAsString(leftTermNode),
|
|
336
|
-
leftTermTypeName = leftTermType.getName(),
|
|
337
|
-
rightVariableTypeName = rightVariableType.getName();
|
|
338
|
-
|
|
339
|
-
context.error(`The right '${rightVariableName}' variable's '${rightVariableTypeName}' type is not equal to or a super-type of the left '${leftTermString}' term's '${leftTermTypeName}' type.`, statementNode);
|
|
340
|
-
} else {
|
|
341
|
-
statementVerifiedAsEquality = true;
|
|
342
|
-
}
|
|
343
|
-
} else {
|
|
344
|
-
const types = [];
|
|
345
|
-
|
|
346
|
-
verifyTerm(leftTermNode, types, context);
|
|
347
|
-
|
|
348
|
-
verifyTerm(rightTermNode, types, context);
|
|
349
|
-
|
|
350
|
-
const firstType = first(types),
|
|
351
|
-
secondType = second(types),
|
|
352
|
-
leftTermType = firstType, ///
|
|
353
|
-
rightTermType = secondType, ///
|
|
354
|
-
leftTermTypeEqualToOrSubTypeOfOfSuperTypeOf = leftTermType.isEqualToOrSubTypeOfOfSuperTypeOf(rightTermType);
|
|
355
|
-
|
|
356
|
-
if (!leftTermTypeEqualToOrSubTypeOfOfSuperTypeOf) {
|
|
357
|
-
const leftTermString = context.nodeAsString(leftTermNode),
|
|
358
|
-
rightTermString = context.nodeAsString(rightTermNode),
|
|
359
|
-
leftTermTypeName = leftTermType.getName(),
|
|
360
|
-
rightTermTypeName = rightTermType.getName();
|
|
361
|
-
|
|
362
|
-
context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
|
|
363
|
-
} else {
|
|
364
|
-
statementVerifiedAsEquality = true;
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
}
|
|
166
|
+
if (statementVerified) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
369
170
|
|
|
370
|
-
|
|
371
|
-
|
|
171
|
+
return verifiedAhead;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
statementVerifiedAsEquality = statementVerifiedAgainstCombinator; ///
|
|
372
175
|
|
|
373
|
-
|
|
176
|
+
if (statementVerifiedAsEquality) {
|
|
177
|
+
context.debug(`...verified the '${statementString}' statement as an equality.`, statementNode);
|
|
374
178
|
}
|
|
375
179
|
|
|
376
180
|
return statementVerifiedAsEquality;
|
|
377
181
|
}
|
|
182
|
+
|
|
183
|
+
function verifyStatementAsDerivedEquality(statementNode, derived, context, verifyAhead) {
|
|
184
|
+
let verifiedStatementAsDerivedEquality = false;
|
|
185
|
+
|
|
186
|
+
const statementString = context.nodeAsString(statementNode);
|
|
187
|
+
|
|
188
|
+
context.trace(`Verifying the '${statementString}' statement as a derived equality...`, statementNode);
|
|
189
|
+
|
|
190
|
+
if (derived) {
|
|
191
|
+
const equality = Equality.fromStatementNode(statementNode),
|
|
192
|
+
equalities = context.getEqualities(),
|
|
193
|
+
equalityVerified = equality.verify(equalities, context, verifyAhead);
|
|
194
|
+
|
|
195
|
+
verifiedStatementAsDerivedEquality = equalityVerified; ///
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (verifiedStatementAsDerivedEquality) {
|
|
199
|
+
context.debug(`...verified the '${statementString}' statement as a derived equality.`, statementNode);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return verifiedStatementAsDerivedEquality;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function verifyStatementAsEqualTerms(statementNode, derived, context, verifyAhead) {
|
|
206
|
+
let statementVerifiedAsEqualTerms;
|
|
207
|
+
|
|
208
|
+
const statementString = context.nodeAsString(statementNode);
|
|
209
|
+
|
|
210
|
+
context.trace(`Verifying the '${statementString}' statement as equal terms...`, statementNode);
|
|
211
|
+
|
|
212
|
+
const types = [],
|
|
213
|
+
leftTermNode = leftTermNodeQuery(statementNode),
|
|
214
|
+
leftTermVerified = verifyTerm(leftTermNode, types, context, () => {
|
|
215
|
+
let verifiedAhead;
|
|
216
|
+
|
|
217
|
+
const rightTermNode = rightTermNodeQuery(statementNode),
|
|
218
|
+
rightTermVerified = verifyTerm(rightTermNode, types, context, () => {
|
|
219
|
+
let verifiedAhead = false;
|
|
220
|
+
|
|
221
|
+
const firstType = first(types),
|
|
222
|
+
secondType = second(types),
|
|
223
|
+
leftType = firstType, ///
|
|
224
|
+
rightType = secondType, ///
|
|
225
|
+
leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType = leftType.isEqualToOrSubTypeOfOfSuperTypeOf(rightType);
|
|
226
|
+
|
|
227
|
+
if (!leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType) {
|
|
228
|
+
const leftTypeName = leftType.getName(),
|
|
229
|
+
rightTypeName = rightType.getName(),
|
|
230
|
+
leftTermString = context.nodeAsString(leftTermNode),
|
|
231
|
+
rightTermString = context.nodeAsString(rightTermNode);
|
|
232
|
+
|
|
233
|
+
context.info(`The left '${leftTermString}' term's '${leftTypeName}' type is not equal to, a sub-type of nor a super-type of the right '${rightTermString}' term's '${rightTypeName}' type.`, statementNode);
|
|
234
|
+
} else {
|
|
235
|
+
verifiedAhead = verifyAhead();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return verifiedAhead;
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
verifiedAhead = rightTermVerified; ///
|
|
242
|
+
|
|
243
|
+
return verifiedAhead;
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
statementVerifiedAsEqualTerms = leftTermVerified; ///
|
|
247
|
+
|
|
248
|
+
if (statementVerifiedAsEqualTerms) {
|
|
249
|
+
context.trace(`...verified the '${statementString}' statement as equal terms.`, statementNode);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return statementVerifiedAsEqualTerms;
|
|
253
|
+
}
|