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.
Files changed (63) hide show
  1. package/lib/axiomLemmaTheoremConjecture.js +3 -3
  2. package/lib/conclusion.js +9 -3
  3. package/lib/consequent.js +5 -2
  4. package/lib/context/file.js +2 -2
  5. package/lib/equality.js +13 -199
  6. package/lib/premise.js +17 -5
  7. package/lib/supposition.js +9 -3
  8. package/lib/utilities/array.js +5 -2
  9. package/lib/verifier/node/metastatement.js +9 -6
  10. package/lib/verifier/node/termAsConstructor.js +2 -2
  11. package/lib/verifier/nodes/equality.js +155 -0
  12. package/lib/verifier/nodes/metastatementForMetavariable.js +8 -8
  13. package/lib/verifier/nodes/statement.js +6 -5
  14. package/lib/verifier/nodes/term.js +3 -5
  15. package/lib/verifier/nodes/termForVariable.js +24 -16
  16. package/lib/verify/file.js +2 -2
  17. package/lib/verify/label.js +2 -2
  18. package/lib/verify/metastatement.js +8 -5
  19. package/lib/verify/metavariable.js +2 -2
  20. package/lib/verify/statement.js +39 -80
  21. package/lib/verify/term.js +16 -8
  22. package/lib/verify/termAsConstructor.js +2 -2
  23. package/lib/verify/terms.js +45 -0
  24. package/lib/verify/type.js +3 -3
  25. package/lib/verify/typeAssertion.js +124 -0
  26. package/lib/verify/variable.js +3 -3
  27. package/package.json +2 -2
  28. package/src/axiomLemmaTheoremConjecture.js +2 -2
  29. package/src/conclusion.js +10 -2
  30. package/src/consequent.js +7 -1
  31. package/src/context/file.js +2 -2
  32. package/src/equality.js +15 -141
  33. package/src/premise.js +20 -4
  34. package/src/supposition.js +10 -2
  35. package/src/utilities/array.js +1 -1
  36. package/src/verifier/node/metastatement.js +9 -5
  37. package/src/verifier/node/termAsConstructor.js +1 -1
  38. package/src/verifier/nodes/equality.js +68 -0
  39. package/src/verifier/nodes/metastatementForMetavariable.js +7 -7
  40. package/src/verifier/nodes/statement.js +6 -4
  41. package/src/verifier/nodes/term.js +1 -6
  42. package/src/verifier/nodes/termForVariable.js +34 -22
  43. package/src/verify/file.js +1 -1
  44. package/src/verify/label.js +1 -1
  45. package/src/verify/metastatement.js +8 -4
  46. package/src/verify/metavariable.js +1 -1
  47. package/src/verify/statement.js +50 -119
  48. package/src/verify/term.js +20 -12
  49. package/src/verify/termAsConstructor.js +1 -1
  50. package/src/verify/terms.js +54 -0
  51. package/src/verify/type.js +2 -2
  52. package/src/verify/typeAssertion.js +164 -0
  53. package/src/verify/variable.js +2 -2
  54. package/lib/node/statement/combinator/equality.js +0 -21
  55. package/lib/ocmbinator/equality.js +0 -126
  56. package/lib/tokens/statement/combinator/equality.js +0 -17
  57. package/lib/verify/assertion/type.js +0 -125
  58. package/lib/verify/typeInference.js +0 -132
  59. package/src/node/statement/combinator/equality.js +0 -9
  60. package/src/ocmbinator/equality.js +0 -23
  61. package/src/tokens/statement/combinator/equality.js +0 -10
  62. package/src/verify/assertion/type.js +0 -169
  63. 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, verifyAhead) {
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, verifyAhead);
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, verifyAhead) {
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.info(`The metavariable '${metavariableName}' is already present.`, metavariableNode);
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),
@@ -1,20 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  import Equality from "../equality";
4
- import verifyTerm from "../verify/term";
5
- import equalityCombinator from "../ocmbinator/equality";
4
+ import verifyTerms from "../verify/terms";
6
5
  import bracketedCombinator from "../ocmbinator/bracketed";
7
- import verifyTypeInference from "../verify/typeInference";
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 leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
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
- export function verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead) {
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
- if (statementVerifiedAsTypeAssertion) {
141
- context.debug(`...verified the '${statementString}' statement as a type assertion.`, statementNode);
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
- context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
115
+ const equality = Equality.fromStatementNode(statementNode);
153
116
 
154
- const combinator = equalityCombinator, ///
155
- statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, () => {
156
- let verifiedAhead;
117
+ if (equality !== null) {
118
+ const statementString = context.nodeAsString(statementNode);
157
119
 
158
- const verifyStatementAsEqualityFunctions = [
159
- verifyStatementAsDerivedEquality,
160
- verifyStatementAsEqualTerms
161
- ];
120
+ context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
162
121
 
163
- verifiedAhead = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
164
- const statementVerified = verifyStatementAsEqualityFunction(statementNode, derived, context, verifyAhead);
122
+ const verifyStatementAsEqualityFunctions = [
123
+ verifyStatementAsDerivedEquality,
124
+ verifyStatementAsStandaloneEquality
125
+ ];
165
126
 
166
- if (statementVerified) {
167
- return true;
168
- }
169
- });
127
+ statementVerifiedAsEquality = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
128
+ const statementVerified = verifyStatementAsEqualityFunction(statementNode, equality, derived, context, verifyAhead);
170
129
 
171
- return verifiedAhead;
172
- });
130
+ if (statementVerified) {
131
+ return true;
132
+ }
133
+ });
173
134
 
174
- statementVerifiedAsEquality = statementVerifiedAgainstCombinator; ///
175
-
176
- if (statementVerifiedAsEquality) {
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
- const statementString = context.nodeAsString(statementNode);
146
+ if (derived) {
147
+ const statementString = context.nodeAsString(statementNode);
187
148
 
188
- context.trace(`Verifying the '${statementString}' statement as a derived equality...`, statementNode);
149
+ context.trace(`Verifying the '${statementString}' derived equality...`, statementNode);
189
150
 
190
- if (derived) {
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
- if (verifiedStatementAsDerivedEquality) {
199
- context.debug(`...verified the '${statementString}' statement as a derived equality.`, statementNode);
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 verifyStatementAsEqualTerms(statementNode, derived, context, verifyAhead) {
206
- let statementVerifiedAsEqualTerms;
164
+ function verifyStatementAsStandaloneEquality(statementNode, equality, derived, context, verifyAhead) {
165
+ let statementVerifiedAsStandaloneEquality = false;
207
166
 
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);
167
+ if (!derived) {
168
+ const statementString = context.nodeAsString(statementNode);
226
169
 
227
- if (!leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType) {
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
- 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
- }
172
+ const leftTermNode = equality.getLeftTermNode(),
173
+ rightTermNode = equality.getRightTermNode(),
174
+ termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
237
175
 
238
- return verifiedAhead;
239
- });
176
+ statementVerifiedAsStandaloneEquality = termsVerified; ///
240
177
 
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);
178
+ if (statementVerifiedAsStandaloneEquality) {
179
+ context.trace(`...verified the '${statementString}' statement as a standalone equality.`, statementNode);
180
+ }
250
181
  }
251
182
 
252
- return statementVerifiedAsEqualTerms;
183
+ return statementVerifiedAsStandaloneEquality;
253
184
  }
@@ -28,11 +28,7 @@ function verifyTerm(termNode, types, context, verifyAhead) {
28
28
  });
29
29
 
30
30
  if (termVerified) {
31
- const firstType = first(types),
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
- if (termVerifiedAsVariable) {
90
- context.debug(`...verified the '${termString}' term as a variable.`, termNode);
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.info(`The '${termString}' constructor's '${typeName}' type is not present.`, termNode);
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
+ }
@@ -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.info(`The type '${typeName}' is already present.`, typeNode);
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.info(`The super-type '${superTypeName}' is not present.`, typeNode);
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
+ }
@@ -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.info(`The variable '${variableName}' is already present.`, variableNode);
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.info(`The '${variableName}' variable's '${typeName}' type is not present.`, variableNode);
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==