occam-verify-cli 0.0.679 → 0.0.680
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/lib/axiomLemmaTheoremConjecture.js +3 -3
- package/lib/conclusion.js +9 -3
- package/lib/consequent.js +5 -2
- package/lib/context/file.js +2 -2
- package/lib/equality.js +13 -199
- package/lib/premise.js +17 -5
- package/lib/supposition.js +9 -3
- package/lib/utilities/array.js +5 -2
- package/lib/verifier/node/metastatement.js +9 -6
- package/lib/verifier/node/termAsConstructor.js +2 -2
- package/lib/verifier/nodes/equality.js +155 -0
- package/lib/verifier/nodes/metastatementForMetavariable.js +8 -8
- package/lib/verifier/nodes/statement.js +6 -5
- package/lib/verifier/nodes/term.js +3 -5
- package/lib/verifier/nodes/termForVariable.js +24 -16
- package/lib/verify/file.js +2 -2
- package/lib/verify/label.js +2 -2
- package/lib/verify/metastatement.js +8 -5
- package/lib/verify/metavariable.js +2 -2
- package/lib/verify/statement.js +39 -80
- package/lib/verify/term.js +16 -8
- package/lib/verify/termAsConstructor.js +2 -2
- package/lib/verify/terms.js +45 -0
- package/lib/verify/type.js +3 -3
- package/lib/verify/typeAssertion.js +124 -0
- package/lib/verify/variable.js +3 -3
- package/package.json +2 -2
- package/src/axiomLemmaTheoremConjecture.js +2 -2
- package/src/conclusion.js +10 -2
- package/src/consequent.js +7 -1
- package/src/context/file.js +2 -2
- package/src/equality.js +15 -141
- package/src/premise.js +20 -4
- package/src/supposition.js +10 -2
- package/src/utilities/array.js +1 -1
- package/src/verifier/node/metastatement.js +9 -5
- package/src/verifier/node/termAsConstructor.js +1 -1
- package/src/verifier/nodes/equality.js +68 -0
- package/src/verifier/nodes/metastatementForMetavariable.js +7 -7
- package/src/verifier/nodes/statement.js +6 -4
- package/src/verifier/nodes/term.js +1 -6
- package/src/verifier/nodes/termForVariable.js +34 -22
- package/src/verify/file.js +1 -1
- package/src/verify/label.js +1 -1
- package/src/verify/metastatement.js +8 -4
- package/src/verify/metavariable.js +1 -1
- package/src/verify/statement.js +50 -119
- package/src/verify/term.js +20 -12
- package/src/verify/termAsConstructor.js +1 -1
- package/src/verify/terms.js +54 -0
- package/src/verify/type.js +2 -2
- package/src/verify/typeAssertion.js +164 -0
- package/src/verify/variable.js +2 -2
- package/lib/node/statement/combinator/equality.js +0 -21
- package/lib/ocmbinator/equality.js +0 -126
- package/lib/tokens/statement/combinator/equality.js +0 -17
- package/lib/verify/assertion/type.js +0 -125
- package/lib/verify/typeInference.js +0 -132
- package/src/node/statement/combinator/equality.js +0 -9
- package/src/ocmbinator/equality.js +0 -23
- package/src/tokens/statement/combinator/equality.js +0 -10
- package/src/verify/assertion/type.js +0 -169
- package/src/verify/typeInference.js +0 -146
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import metastatementNodeVerifier from "../verifier/node/metastatement";
|
|
4
4
|
|
|
5
|
-
function verifyMetastatement(metastatementNode, derived, metaproofContext
|
|
5
|
+
function verifyMetastatement(metastatementNode, derived, metaproofContext) {
|
|
6
6
|
let metastatementVerified;
|
|
7
7
|
|
|
8
8
|
const metastatementString = metaproofContext.nodeAsString(metastatementNode);
|
|
@@ -14,7 +14,7 @@ function verifyMetastatement(metastatementNode, derived, metaproofContext, verif
|
|
|
14
14
|
];
|
|
15
15
|
|
|
16
16
|
metastatementVerified = verifyMetastatementFunctions.some((verifyStatementFunction) => {
|
|
17
|
-
const metastatementVerified = verifyStatementFunction(metastatementNode, derived, metaproofContext
|
|
17
|
+
const metastatementVerified = verifyStatementFunction(metastatementNode, derived, metaproofContext);
|
|
18
18
|
|
|
19
19
|
if (metastatementVerified) {
|
|
20
20
|
return true;
|
|
@@ -34,7 +34,7 @@ Object.assign(verifyMetastatement, {
|
|
|
34
34
|
|
|
35
35
|
export default verifyMetastatement;
|
|
36
36
|
|
|
37
|
-
function verifyStandaloneMetastatement(metastatementNode, derived, metaproofContext
|
|
37
|
+
function verifyStandaloneMetastatement(metastatementNode, derived, metaproofContext) {
|
|
38
38
|
let standaloneMetastatementVerified;
|
|
39
39
|
|
|
40
40
|
const metastatementString = metaproofContext.nodeAsString(metastatementNode);
|
|
@@ -42,7 +42,11 @@ function verifyStandaloneMetastatement(metastatementNode, derived, metaproofCont
|
|
|
42
42
|
metaproofContext.trace(`Verifying the '${metastatementString}' standalone metastatement...`, metastatementNode);
|
|
43
43
|
|
|
44
44
|
const nonTerminalNode = metastatementNode, ///
|
|
45
|
-
nonTerminalNodeVerified = metastatementNodeVerifier.verifyNonTerminalNode(nonTerminalNode, metaproofContext)
|
|
45
|
+
nonTerminalNodeVerified = metastatementNodeVerifier.verifyNonTerminalNode(nonTerminalNode, metaproofContext, () => {
|
|
46
|
+
const verifiedAhead = true;
|
|
47
|
+
|
|
48
|
+
return verifiedAhead;
|
|
49
|
+
});
|
|
46
50
|
|
|
47
51
|
standaloneMetastatementVerified = nonTerminalNodeVerified; ///
|
|
48
52
|
|
|
@@ -15,7 +15,7 @@ export default function verifyMetavariable(metavariableNode, metaTypeNode, fileC
|
|
|
15
15
|
metavariablePresent = fileContext.isMetavariablePresentByMetavariableName(metavariableName);
|
|
16
16
|
|
|
17
17
|
if (metavariablePresent) {
|
|
18
|
-
fileContext.
|
|
18
|
+
fileContext.debug(`The metavariable '${metavariableName}' is already present.`, metavariableNode);
|
|
19
19
|
} else {
|
|
20
20
|
const metaTypeName = metaTypeNameFromMetaTypeNode(metaTypeNode),
|
|
21
21
|
metaType = fileContext.findMetaTypeByMetaTypeName(metaTypeName),
|
package/src/verify/statement.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import Equality from "../equality";
|
|
4
|
-
import
|
|
5
|
-
import equalityCombinator from "../ocmbinator/equality";
|
|
4
|
+
import verifyTerms from "../verify/terms";
|
|
6
5
|
import bracketedCombinator from "../ocmbinator/bracketed";
|
|
7
|
-
import
|
|
8
|
-
import verifyTypeAssertion from "../verify/assertion/type";
|
|
6
|
+
import verifyTypeAssertion from "../verify/typeAssertion";
|
|
9
7
|
import statementNodesVerifier from "../verifier/nodes/statement";
|
|
10
8
|
|
|
11
9
|
import { nodeQuery } from "../utilities/query";
|
|
12
|
-
import { first, second } from "../utilities/array";
|
|
13
10
|
|
|
14
|
-
const
|
|
15
|
-
rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!"),
|
|
16
|
-
typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
|
|
17
|
-
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
|
|
11
|
+
const typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
|
|
18
12
|
|
|
19
13
|
function verifyStatement(statementNode, assignments, derived, context, verifyAhead) {
|
|
20
14
|
let statementVerified;
|
|
@@ -25,7 +19,6 @@ function verifyStatement(statementNode, assignments, derived, context, verifyAhe
|
|
|
25
19
|
|
|
26
20
|
const verifyStatementFunctions = [
|
|
27
21
|
verifyStatementAsEquality,
|
|
28
|
-
verifyStatementAsTypeInference,
|
|
29
22
|
verifyStatementAsTypeAssertion,
|
|
30
23
|
verifyStatementAgainstCombinators
|
|
31
24
|
];
|
|
@@ -72,7 +65,7 @@ export function verifyStatementAgainstCombinators(statementNode, assignments, de
|
|
|
72
65
|
return statementVerifiedAgainstCombinators;
|
|
73
66
|
}
|
|
74
67
|
|
|
75
|
-
|
|
68
|
+
function verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead) {
|
|
76
69
|
let statementVerifiedAgainstCombinator;
|
|
77
70
|
|
|
78
71
|
const statementString = context.nodeAsString(statementNode),
|
|
@@ -94,160 +87,98 @@ export function verifyStatementAgainstCombinator(statementNode, combinator, cont
|
|
|
94
87
|
return statementVerifiedAgainstCombinator;
|
|
95
88
|
}
|
|
96
89
|
|
|
97
|
-
function verifyStatementAsTypeInference(statementNode, assignments, derived, context, verifyAhead) {
|
|
98
|
-
let statementVerifiedAsTypeInference = false;
|
|
99
|
-
|
|
100
|
-
const statementString = context.nodeAsString(statementNode);
|
|
101
|
-
|
|
102
|
-
context.trace(`Verifying the '${statementString}' statement as a type inference...`, statementNode);
|
|
103
|
-
|
|
104
|
-
const typeInferenceNode = typeInferenceNodeQuery(statementNode);
|
|
105
|
-
|
|
106
|
-
if (typeInferenceNode !== null) {
|
|
107
|
-
if (!derived) {
|
|
108
|
-
const typeInferenceString = context.nodeAsString(typeInferenceNode);
|
|
109
|
-
|
|
110
|
-
context.info(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
|
|
111
|
-
} else {
|
|
112
|
-
const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context, verifyAhead);
|
|
113
|
-
|
|
114
|
-
statementVerifiedAsTypeInference = typeInferenceVerified; ///
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (statementVerifiedAsTypeInference) {
|
|
119
|
-
context.debug(`...verified the '${statementString}' statement as a type inference.`, statementNode);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return statementVerifiedAsTypeInference;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
90
|
function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context, verifyAhead) {
|
|
126
91
|
let statementVerifiedAsTypeAssertion = false;
|
|
127
92
|
|
|
128
|
-
const statementString = context.nodeAsString(statementNode);
|
|
129
|
-
|
|
130
|
-
context.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
|
|
131
|
-
|
|
132
93
|
const typeAssertionNode = typeAssertionNodeQuery(statementNode);
|
|
133
94
|
|
|
134
95
|
if (typeAssertionNode !== null) {
|
|
96
|
+
const statementString = context.nodeAsString(statementNode);
|
|
97
|
+
|
|
98
|
+
context.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
|
|
99
|
+
|
|
135
100
|
const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead);
|
|
136
101
|
|
|
137
102
|
statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
|
|
138
|
-
}
|
|
139
103
|
|
|
140
|
-
|
|
141
|
-
|
|
104
|
+
if (statementVerifiedAsTypeAssertion) {
|
|
105
|
+
context.debug(`...verified the '${statementString}' statement as a type assertion.`, statementNode);
|
|
106
|
+
}
|
|
142
107
|
}
|
|
143
108
|
|
|
144
109
|
return statementVerifiedAsTypeAssertion;
|
|
145
110
|
}
|
|
146
111
|
|
|
147
112
|
function verifyStatementAsEquality(statementNode, assignments, derived, context, verifyAhead) {
|
|
148
|
-
let statementVerifiedAsEquality;
|
|
149
|
-
|
|
150
|
-
const statementString = context.nodeAsString(statementNode);
|
|
113
|
+
let statementVerifiedAsEquality = false;
|
|
151
114
|
|
|
152
|
-
|
|
115
|
+
const equality = Equality.fromStatementNode(statementNode);
|
|
153
116
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let verifiedAhead;
|
|
117
|
+
if (equality !== null) {
|
|
118
|
+
const statementString = context.nodeAsString(statementNode);
|
|
157
119
|
|
|
158
|
-
|
|
159
|
-
verifyStatementAsDerivedEquality,
|
|
160
|
-
verifyStatementAsEqualTerms
|
|
161
|
-
];
|
|
120
|
+
context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
|
|
162
121
|
|
|
163
|
-
|
|
164
|
-
|
|
122
|
+
const verifyStatementAsEqualityFunctions = [
|
|
123
|
+
verifyStatementAsDerivedEquality,
|
|
124
|
+
verifyStatementAsStandaloneEquality
|
|
125
|
+
];
|
|
165
126
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
});
|
|
127
|
+
statementVerifiedAsEquality = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
|
|
128
|
+
const statementVerified = verifyStatementAsEqualityFunction(statementNode, equality, derived, context, verifyAhead);
|
|
170
129
|
|
|
171
|
-
|
|
172
|
-
|
|
130
|
+
if (statementVerified) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
173
134
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
context.debug(`...verified the '${statementString}' statement as an equality.`, statementNode);
|
|
135
|
+
if (statementVerifiedAsEquality) {
|
|
136
|
+
context.debug(`...verified the '${statementString}' statement as an equality.`, statementNode);
|
|
137
|
+
}
|
|
178
138
|
}
|
|
179
139
|
|
|
180
140
|
return statementVerifiedAsEquality;
|
|
181
141
|
}
|
|
182
142
|
|
|
183
|
-
function verifyStatementAsDerivedEquality(statementNode, derived, context, verifyAhead) {
|
|
143
|
+
function verifyStatementAsDerivedEquality(statementNode, equality, derived, context, verifyAhead) {
|
|
184
144
|
let verifiedStatementAsDerivedEquality = false;
|
|
185
145
|
|
|
186
|
-
|
|
146
|
+
if (derived) {
|
|
147
|
+
const statementString = context.nodeAsString(statementNode);
|
|
187
148
|
|
|
188
|
-
|
|
149
|
+
context.trace(`Verifying the '${statementString}' derived equality...`, statementNode);
|
|
189
150
|
|
|
190
|
-
|
|
191
|
-
const equality = Equality.fromStatementNode(statementNode),
|
|
192
|
-
equalities = context.getEqualities(),
|
|
151
|
+
const equalities = context.getEqualities(),
|
|
193
152
|
equalityVerified = equality.verify(equalities, context, verifyAhead);
|
|
194
153
|
|
|
195
154
|
verifiedStatementAsDerivedEquality = equalityVerified; ///
|
|
196
|
-
}
|
|
197
155
|
|
|
198
|
-
|
|
199
|
-
|
|
156
|
+
if (verifiedStatementAsDerivedEquality) {
|
|
157
|
+
context.debug(`...verified the '${statementString}' derived equality.`, statementNode);
|
|
158
|
+
}
|
|
200
159
|
}
|
|
201
160
|
|
|
202
161
|
return verifiedStatementAsDerivedEquality;
|
|
203
162
|
}
|
|
204
163
|
|
|
205
|
-
function
|
|
206
|
-
let
|
|
164
|
+
function verifyStatementAsStandaloneEquality(statementNode, equality, derived, context, verifyAhead) {
|
|
165
|
+
let statementVerifiedAsStandaloneEquality = false;
|
|
207
166
|
|
|
208
|
-
|
|
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);
|
|
167
|
+
if (!derived) {
|
|
168
|
+
const statementString = context.nodeAsString(statementNode);
|
|
226
169
|
|
|
227
|
-
|
|
228
|
-
const leftTypeName = leftType.getName(),
|
|
229
|
-
rightTypeName = rightType.getName(),
|
|
230
|
-
leftTermString = context.nodeAsString(leftTermNode),
|
|
231
|
-
rightTermString = context.nodeAsString(rightTermNode);
|
|
170
|
+
context.trace(`Verifying the '${statementString}' statement as a standalone equality...`, statementNode);
|
|
232
171
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
172
|
+
const leftTermNode = equality.getLeftTermNode(),
|
|
173
|
+
rightTermNode = equality.getRightTermNode(),
|
|
174
|
+
termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
|
|
237
175
|
|
|
238
|
-
|
|
239
|
-
});
|
|
176
|
+
statementVerifiedAsStandaloneEquality = termsVerified; ///
|
|
240
177
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
statementVerifiedAsEqualTerms = leftTermVerified; ///
|
|
247
|
-
|
|
248
|
-
if (statementVerifiedAsEqualTerms) {
|
|
249
|
-
context.trace(`...verified the '${statementString}' statement as equal terms.`, statementNode);
|
|
178
|
+
if (statementVerifiedAsStandaloneEquality) {
|
|
179
|
+
context.trace(`...verified the '${statementString}' statement as a standalone equality.`, statementNode);
|
|
180
|
+
}
|
|
250
181
|
}
|
|
251
182
|
|
|
252
|
-
return
|
|
183
|
+
return statementVerifiedAsStandaloneEquality;
|
|
253
184
|
}
|
package/src/verify/term.js
CHANGED
|
@@ -28,11 +28,7 @@ function verifyTerm(termNode, types, context, verifyAhead) {
|
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
if (termVerified) {
|
|
31
|
-
|
|
32
|
-
type = firstType, ///
|
|
33
|
-
typeName = type.getName();
|
|
34
|
-
|
|
35
|
-
context.debug(`...verified the '${termString}' term, which has been given the '${typeName}' type.`, termNode);
|
|
31
|
+
context.debug(`...verified the '${termString}' term.`, termNode);
|
|
36
32
|
}
|
|
37
33
|
|
|
38
34
|
return termVerified;
|
|
@@ -63,13 +59,13 @@ export function verifyTermAgainstConstructors(termNode, types, context, verifyAh
|
|
|
63
59
|
export function verifyTermAsVariable(termNode, variables, context, verifyAhead) {
|
|
64
60
|
let termVerifiedAsVariable = false;
|
|
65
61
|
|
|
66
|
-
const termString = context.nodeAsString(termNode);
|
|
67
|
-
|
|
68
|
-
context.trace(`Verifying the '${termString}' term as a variable...`, termNode);
|
|
69
|
-
|
|
70
62
|
const variableNode = variableNodeQuery(termNode);
|
|
71
63
|
|
|
72
64
|
if (variableNode !== null) {
|
|
65
|
+
const termString = context.nodeAsString(termNode);
|
|
66
|
+
|
|
67
|
+
context.trace(`Verifying the '${termString}' term as a variable...`, termNode);
|
|
68
|
+
|
|
73
69
|
const variableName = variableNameFromVariableNode(variableNode),
|
|
74
70
|
variablePresent = context.isVariablePresentByVariableName(variableName);
|
|
75
71
|
|
|
@@ -82,12 +78,16 @@ export function verifyTermAsVariable(termNode, variables, context, verifyAhead)
|
|
|
82
78
|
|
|
83
79
|
verifiedAhead = verifyAhead();
|
|
84
80
|
|
|
81
|
+
if (!verifiedAhead) {
|
|
82
|
+
variables.pop();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
85
|
termVerifiedAsVariable = verifiedAhead; ///
|
|
86
86
|
}
|
|
87
|
-
}
|
|
88
87
|
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
if (termVerifiedAsVariable) {
|
|
89
|
+
context.debug(`...verified the '${termString}' term as a variable.`, termNode);
|
|
90
|
+
}
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
return termVerifiedAsVariable;
|
|
@@ -113,6 +113,10 @@ function verifyTermAgainstConstructor(termNode, types, constructor, context, ver
|
|
|
113
113
|
|
|
114
114
|
verifiedAhead = verifyAhead();
|
|
115
115
|
|
|
116
|
+
if (!verifiedAhead) {
|
|
117
|
+
types.pop();
|
|
118
|
+
}
|
|
119
|
+
|
|
116
120
|
return verifiedAhead;
|
|
117
121
|
});
|
|
118
122
|
|
|
@@ -144,6 +148,10 @@ function verifyTermAsStandaloneVariable(termNode, types, context, verifyAhead) {
|
|
|
144
148
|
|
|
145
149
|
verifiedAhead = verifyAhead();
|
|
146
150
|
|
|
151
|
+
if (!verifiedAhead) {
|
|
152
|
+
types.pop();
|
|
153
|
+
}
|
|
154
|
+
|
|
147
155
|
return verifiedAhead;
|
|
148
156
|
});
|
|
149
157
|
|
|
@@ -33,7 +33,7 @@ export default function verifyTermAsConstructor(termNode, typeNode, fileContext)
|
|
|
33
33
|
if (type !== null) {
|
|
34
34
|
termVerifiedAsConstructor = true;
|
|
35
35
|
} else {
|
|
36
|
-
fileContext.
|
|
36
|
+
fileContext.debug(`The '${termString}' constructor's '${typeName}' type is not present.`, termNode);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import verifyTerm from "../verify/term";
|
|
4
|
+
|
|
5
|
+
import { first, second } from "../utilities/array";
|
|
6
|
+
|
|
7
|
+
export default function verifyTerms(leftTermNode, rightTermNode, context, verifyAhead) {
|
|
8
|
+
let termsVerified;
|
|
9
|
+
|
|
10
|
+
const leftTermString = context.nodeAsString(leftTermNode),
|
|
11
|
+
rightTermString = context.nodeAsString(rightTermNode);
|
|
12
|
+
|
|
13
|
+
context.trace(`Verifying the '${leftTermString}' and '${rightTermString}' terms...`, leftTermNode);
|
|
14
|
+
|
|
15
|
+
const types = [],
|
|
16
|
+
leftTermVerified = verifyTerm(leftTermNode, types, context, () => {
|
|
17
|
+
let verifiedAhead;
|
|
18
|
+
|
|
19
|
+
const rightTermVerified = verifyTerm(rightTermNode, types, context, () => {
|
|
20
|
+
let verifiedAhead = false;
|
|
21
|
+
|
|
22
|
+
const firstType = first(types),
|
|
23
|
+
secondType = second(types),
|
|
24
|
+
leftType = firstType, ///
|
|
25
|
+
rightType = secondType, ///
|
|
26
|
+
leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType = leftType.isEqualToOrSubTypeOfOfSuperTypeOf(rightType);
|
|
27
|
+
|
|
28
|
+
if (!leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType) {
|
|
29
|
+
const leftTypeName = leftType.getName(),
|
|
30
|
+
rightTypeName = rightType.getName(),
|
|
31
|
+
leftTermString = context.nodeAsString(leftTermNode),
|
|
32
|
+
rightTermString = context.nodeAsString(rightTermNode);
|
|
33
|
+
|
|
34
|
+
context.debug(`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);
|
|
35
|
+
} else {
|
|
36
|
+
verifiedAhead = verifyAhead();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return verifiedAhead;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
verifiedAhead = rightTermVerified; ///
|
|
43
|
+
|
|
44
|
+
return verifiedAhead;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
if (termsVerified) {
|
|
48
|
+
context.debug(`...verified the '${leftTermString}' and '${rightTermString}' terms.`, leftTermNode);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
termsVerified = leftTermVerified; ///
|
|
52
|
+
|
|
53
|
+
return termsVerified
|
|
54
|
+
}
|
package/src/verify/type.js
CHANGED
|
@@ -15,7 +15,7 @@ export default function verifyType(typeNode, superTypeNode, fileContext) {
|
|
|
15
15
|
typePresent = fileContext.isTypePresentByTypeName(typeName);
|
|
16
16
|
|
|
17
17
|
if (typePresent) {
|
|
18
|
-
fileContext.
|
|
18
|
+
fileContext.debug(`The type '${typeName}' is already present.`, typeNode);
|
|
19
19
|
} else {
|
|
20
20
|
let type;
|
|
21
21
|
|
|
@@ -27,7 +27,7 @@ export default function verifyType(typeNode, superTypeNode, fileContext) {
|
|
|
27
27
|
const superType = fileContext.findTypeByTypeName(superTypeName);
|
|
28
28
|
|
|
29
29
|
if (superType === null) {
|
|
30
|
-
fileContext.
|
|
30
|
+
fileContext.debug(`The super-type '${superTypeName}' is not present.`, typeNode);
|
|
31
31
|
} else {
|
|
32
32
|
type = Type.fromTypeNameAndSuperType(typeName, superType);
|
|
33
33
|
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Variable from "../variable";
|
|
4
|
+
import Assignment from "../assignment";
|
|
5
|
+
|
|
6
|
+
import { first } from "../utilities/array";
|
|
7
|
+
import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
|
|
8
|
+
import { verifyTermAsVariable, verifyTermAgainstConstructors } from "../verify/term";
|
|
9
|
+
|
|
10
|
+
const termNodeQuery = nodeQuery("/typeAssertion/term!"),
|
|
11
|
+
typeNodeQuery = nodeQuery("/typeAssertion/type!");
|
|
12
|
+
|
|
13
|
+
export default function verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead) {
|
|
14
|
+
let typeAssertionVerified = false;
|
|
15
|
+
|
|
16
|
+
const typeAssertionString = context.nodeAsString(typeAssertionNode);
|
|
17
|
+
|
|
18
|
+
context.trace(`Verifying the '${typeAssertionString}' type assertion...`, typeAssertionNode);
|
|
19
|
+
|
|
20
|
+
const typeNode = typeNodeQuery(typeAssertionNode),
|
|
21
|
+
typeName = typeNameFromTypeNode(typeNode),
|
|
22
|
+
assertedTypeName = typeName, ///
|
|
23
|
+
assertedType = context.findTypeByTypeName(assertedTypeName);
|
|
24
|
+
|
|
25
|
+
if (assertedType === null) {
|
|
26
|
+
context.debug(`The '${typeName}' asserted type is not present.`, typeAssertionNode);
|
|
27
|
+
} else {
|
|
28
|
+
const verifyTypeAssertionFunctions = [
|
|
29
|
+
verifyVariableTypeAssertion,
|
|
30
|
+
verifyTermTypeAssertion
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
typeAssertionVerified = verifyTypeAssertionFunctions.some((verifyTypeAssertionFunction) => {
|
|
34
|
+
const typeAssertionVerified = verifyTypeAssertionFunction(typeAssertionNode, assertedType, assignments, derived, context, verifyAhead);
|
|
35
|
+
|
|
36
|
+
if (typeAssertionVerified) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (typeAssertionVerified) {
|
|
43
|
+
context.debug(`...verified the '${typeAssertionString}' statement type assertion.`, typeAssertionNode);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return typeAssertionVerified;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function verifyVariableTypeAssertion(typeAssertionNode, assertedType, assignments, derived, context, verifyAhead) {
|
|
50
|
+
let variableTypeAssertionVerified;
|
|
51
|
+
|
|
52
|
+
const typeAssertionString = context.nodeAsString(typeAssertionNode);
|
|
53
|
+
|
|
54
|
+
context.trace(`Verifying the '${typeAssertionString}' variable type assertion...`, typeAssertionNode);
|
|
55
|
+
|
|
56
|
+
const variables = [],
|
|
57
|
+
termNode = termNodeQuery(typeAssertionNode),
|
|
58
|
+
termVerifiedAsVariable = verifyTermAsVariable(termNode, variables, context, () => {
|
|
59
|
+
let verifiedAhead = false;
|
|
60
|
+
|
|
61
|
+
const firstVariable = first(variables),
|
|
62
|
+
variable = firstVariable, ///
|
|
63
|
+
variableName = variable.getName(),
|
|
64
|
+
variableType = variable.getType();
|
|
65
|
+
|
|
66
|
+
if (derived) {
|
|
67
|
+
const assertedTypeEqualToOrSuperTypeOfVariableType = assertedType.isEqualToOrSuperTypeOf(variableType);
|
|
68
|
+
|
|
69
|
+
if (!assertedTypeEqualToOrSuperTypeOfVariableType) {
|
|
70
|
+
const assertedTypeName = assertedType.getName(),
|
|
71
|
+
variableTypeName = variableType.getName();
|
|
72
|
+
|
|
73
|
+
context.debug(`The '${assertedTypeName}' asserted type is not equal to or a super-type of the '${variableName}' variable's '${variableTypeName}' type.`, typeAssertionNode);
|
|
74
|
+
} else {
|
|
75
|
+
verifiedAhead = verifyAhead();
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
const assertedTypeEqualToOrSubTypeOfVariableType = assertedType.isEqualToOrSubTypeOf(variableType);
|
|
79
|
+
|
|
80
|
+
if (!assertedTypeEqualToOrSubTypeOfVariableType) {
|
|
81
|
+
const assertedTypeName = assertedType.getName(),
|
|
82
|
+
variableTypeName = variableType.getName();
|
|
83
|
+
|
|
84
|
+
context.debug(`The '${assertedTypeName}' asserted type is not equal to or a sub-type of the '${variableName}' variable's '${variableTypeName}' type.`, typeAssertionNode);
|
|
85
|
+
} else {
|
|
86
|
+
const name = variableName, ///
|
|
87
|
+
type = assertedType, ///
|
|
88
|
+
variable = Variable.fromNameAndType(name, type),
|
|
89
|
+
assignment = Assignment.fromVariable(variable);
|
|
90
|
+
|
|
91
|
+
assignments.push(assignment);
|
|
92
|
+
|
|
93
|
+
verifiedAhead = verifyAhead();
|
|
94
|
+
|
|
95
|
+
if (!verifiedAhead) {
|
|
96
|
+
assignments.pop();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return verifiedAhead;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
variableTypeAssertionVerified = termVerifiedAsVariable; ///
|
|
105
|
+
|
|
106
|
+
if (variableTypeAssertionVerified) {
|
|
107
|
+
context.debug(`...verified the '${typeAssertionString}' variable type assertion.`, typeAssertionNode);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return variableTypeAssertionVerified;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function verifyTermTypeAssertion(typeAssertionNode, assertedType, assignments, derived, context, verifyAhead) {
|
|
114
|
+
let termTypeAssertionVerified;
|
|
115
|
+
|
|
116
|
+
const typeAssertionString = context.nodeAsString(typeAssertionNode);
|
|
117
|
+
|
|
118
|
+
context.trace(`Verifying the '${typeAssertionString}' term type assertion...`, typeAssertionNode);
|
|
119
|
+
|
|
120
|
+
const types = [],
|
|
121
|
+
termNode = termNodeQuery(typeAssertionNode),
|
|
122
|
+
termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, context, () => {
|
|
123
|
+
let verifiedAhead = false;
|
|
124
|
+
|
|
125
|
+
const firstType = first(types),
|
|
126
|
+
termType = firstType; ///
|
|
127
|
+
|
|
128
|
+
if (derived) {
|
|
129
|
+
const assertedTypeIsEqualToOrSuperTypeOfTermType = assertedType.isEqualToOrSuperTypeOf(termType);
|
|
130
|
+
|
|
131
|
+
if (!assertedTypeIsEqualToOrSuperTypeOfTermType) {
|
|
132
|
+
const termString = context.nodeAsString(termNode),
|
|
133
|
+
termTypeName = termType.getName(),
|
|
134
|
+
assertedTypeName = assertedType.getName();
|
|
135
|
+
|
|
136
|
+
context.debug(`The '${assertedTypeName}' asserted type is not equal to or a super-type of the '${termString}' term's '${termTypeName}' type.`, typeAssertionNode);
|
|
137
|
+
} else {
|
|
138
|
+
verifiedAhead = verifyAhead();
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
const assertedTypeIsEqualToOrSubTypeOfTermType = assertedType.isEqualToOrSubTypeOf(termType);
|
|
142
|
+
|
|
143
|
+
if (!assertedTypeIsEqualToOrSubTypeOfTermType) {
|
|
144
|
+
const termString = context.nodeAsString(termNode),
|
|
145
|
+
termTypeName = termType.getName(),
|
|
146
|
+
assertedTypeName = assertedType.getName();
|
|
147
|
+
|
|
148
|
+
context.debug(`The '${assertedTypeName}' asserted type is not equal to or a sub-type of the '${termString}' term's '${termTypeName}' type.`, typeAssertionNode);
|
|
149
|
+
} else {
|
|
150
|
+
verifiedAhead = verifyAhead();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return verifiedAhead;
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
termTypeAssertionVerified = termVerifiedAgainstConstructors; ///
|
|
158
|
+
|
|
159
|
+
if (termTypeAssertionVerified) {
|
|
160
|
+
context.debug(`...verified the '${typeAssertionString}' term type assertion.`, typeAssertionNode);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return termTypeAssertionVerified;
|
|
164
|
+
}
|
package/src/verify/variable.js
CHANGED
|
@@ -16,7 +16,7 @@ export default function verifyVariable(variableNode, typeNode, fileContext) {
|
|
|
16
16
|
variablePresent = fileContext.isVariablePresentByVariableName(variableName);
|
|
17
17
|
|
|
18
18
|
if (variablePresent) {
|
|
19
|
-
fileContext.
|
|
19
|
+
fileContext.debug(`The variable '${variableName}' is already present.`, variableNode);
|
|
20
20
|
} else {
|
|
21
21
|
let variable;
|
|
22
22
|
|
|
@@ -31,7 +31,7 @@ export default function verifyVariable(variableNode, typeNode, fileContext) {
|
|
|
31
31
|
const type = fileContext.findTypeByTypeName(typeName);
|
|
32
32
|
|
|
33
33
|
if (type === null) {
|
|
34
|
-
fileContext.
|
|
34
|
+
fileContext.debug(`The '${variableName}' variable's '${typeName}' type is not present.`, variableNode);
|
|
35
35
|
} else {
|
|
36
36
|
const name = variableName; ///
|
|
37
37
|
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return _default;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _equality = /*#__PURE__*/ _interop_require_default(require("../../../tokens/statement/combinator/equality"));
|
|
12
|
-
var _node = require("../../../utilities/node");
|
|
13
|
-
function _interop_require_default(obj) {
|
|
14
|
-
return obj && obj.__esModule ? obj : {
|
|
15
|
-
default: obj
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
var equalityCombinatorStatementNode = (0, _node.statementNodeFromUnqualifiedStatementTokens)(_equality.default);
|
|
19
|
-
var _default = equalityCombinatorStatementNode;
|
|
20
|
-
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9ub2RlL3N0YXRlbWVudC9jb21iaW5hdG9yL2VxdWFsaXR5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgdW5xdWFsaWZpZWRFcXVhbGl0eUNvbWJpbmF0b3JTdGF0ZW1lbnRUb2tlbnMgZnJvbSBcIi4uLy4uLy4uL3Rva2Vucy9zdGF0ZW1lbnQvY29tYmluYXRvci9lcXVhbGl0eVwiO1xuXG5pbXBvcnQgeyBzdGF0ZW1lbnROb2RlRnJvbVVucXVhbGlmaWVkU3RhdGVtZW50VG9rZW5zIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxpdGllcy9ub2RlXCI7XG5cbmNvbnN0IGVxdWFsaXR5Q29tYmluYXRvclN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlRnJvbVVucXVhbGlmaWVkU3RhdGVtZW50VG9rZW5zKHVucXVhbGlmaWVkRXF1YWxpdHlDb21iaW5hdG9yU3RhdGVtZW50VG9rZW5zKTtcblxuZXhwb3J0IGRlZmF1bHQgZXF1YWxpdHlDb21iaW5hdG9yU3RhdGVtZW50Tm9kZTtcbiJdLCJuYW1lcyI6WyJlcXVhbGl0eUNvbWJpbmF0b3JTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZUZyb21VbnF1YWxpZmllZFN0YXRlbWVudFRva2VucyIsInVucXVhbGlmaWVkRXF1YWxpdHlDb21iaW5hdG9yU3RhdGVtZW50VG9rZW5zIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFRQTs7O2VBQUE7OzsrREFOeUQ7b0JBRUc7Ozs7OztBQUU1RCxJQUFNQSxrQ0FBa0NDLElBQUFBLGlEQUEyQyxFQUFDQyxpQkFBNEM7SUFFaEksV0FBZUYifQ==
|