occam-verify-cli 0.0.262

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 (72) hide show
  1. package/README.md +7 -0
  2. package/bin/abbreviations.js +11 -0
  3. package/bin/antecedent.js +19 -0
  4. package/bin/axiom.js +52 -0
  5. package/bin/combinator.js +27 -0
  6. package/bin/conclusion.js +19 -0
  7. package/bin/consequent.js +19 -0
  8. package/bin/constants.js +9 -0
  9. package/bin/constructor.js +43 -0
  10. package/bin/context/file.js +257 -0
  11. package/bin/context/metaproof.js +90 -0
  12. package/bin/context/package/fileSystem.js +111 -0
  13. package/bin/context/package.js +221 -0
  14. package/bin/context/proof.js +93 -0
  15. package/bin/fileNames.js +17 -0
  16. package/bin/loadPackageContexts.js +53 -0
  17. package/bin/main.js +25 -0
  18. package/bin/metaAntecedent.js +19 -0
  19. package/bin/metaConsequent.js +19 -0
  20. package/bin/metaSubstitution.js +24 -0
  21. package/bin/options.js +9 -0
  22. package/bin/premise.js +19 -0
  23. package/bin/rule.js +64 -0
  24. package/bin/ruleNames.js +19 -0
  25. package/bin/type.js +120 -0
  26. package/bin/utilities/array.js +97 -0
  27. package/bin/utilities/fileSystem.js +97 -0
  28. package/bin/utilities/query.js +92 -0
  29. package/bin/utilities/rule.js +279 -0
  30. package/bin/utilities/string.js +51 -0
  31. package/bin/variable.js +54 -0
  32. package/bin/verify/antecedent.js +35 -0
  33. package/bin/verify/axiom/IndicativeConditional.js +54 -0
  34. package/bin/verify/axiom/unqualifiedStatement.js +40 -0
  35. package/bin/verify/axiom.js +37 -0
  36. package/bin/verify/conclusion.js +32 -0
  37. package/bin/verify/consequent.js +32 -0
  38. package/bin/verify/declaration/combinator.js +17 -0
  39. package/bin/verify/declaration/constructor.js +19 -0
  40. package/bin/verify/declaration/topLevel.js +61 -0
  41. package/bin/verify/declaration/type.js +21 -0
  42. package/bin/verify/declaration/variable.js +19 -0
  43. package/bin/verify/equality.js +52 -0
  44. package/bin/verify/file.js +43 -0
  45. package/bin/verify/files.js +46 -0
  46. package/bin/verify/label.js +27 -0
  47. package/bin/verify/labels.js +17 -0
  48. package/bin/verify/metaAntecedent.js +35 -0
  49. package/bin/verify/metaConsequent.js +32 -0
  50. package/bin/verify/metaDerivation.js +105 -0
  51. package/bin/verify/metaproof.js +46 -0
  52. package/bin/verify/metastatement/qualified.js +43 -0
  53. package/bin/verify/metastatement/unqualified.js +40 -0
  54. package/bin/verify/package.js +81 -0
  55. package/bin/verify/premise.js +35 -0
  56. package/bin/verify/rule/inferenceConditional.js +54 -0
  57. package/bin/verify/rule/unqualifiedMetastatement.js +40 -0
  58. package/bin/verify/rule.js +61 -0
  59. package/bin/verify/statement/qualified.js +17 -0
  60. package/bin/verify/statement/unqualified.js +27 -0
  61. package/bin/verify/statement.js +47 -0
  62. package/bin/verify/statementAsCombinator.js +140 -0
  63. package/bin/verify/term.js +183 -0
  64. package/bin/verify/termAsConstructor.js +173 -0
  65. package/bin/verify/termAsVariable.js +41 -0
  66. package/bin/verify/type.js +53 -0
  67. package/bin/verify/typeAssertion.js +69 -0
  68. package/bin/verify/variable.js +55 -0
  69. package/index.js +9 -0
  70. package/license.txt +48 -0
  71. package/package.json +24 -0
  72. package/verify.js +13 -0
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+
3
+ const { loggingUtilities } = require("necessary");
4
+
5
+ const Combinator = require("../combinator");
6
+
7
+ const { nodeAsString } = require("../utilities/string"),
8
+ { typeNameFromTypeNode } = require("../utilities/query"),
9
+ { TERM_RULE_NAME, TYPE_RULE_NAME } = require("../ruleNames");
10
+
11
+ const { log } = loggingUtilities;
12
+
13
+ function verifyStatementAsCombinator(statementNode, context) {
14
+ let statementVerifiedAsCombinator = false;
15
+
16
+ const statementString = nodeAsString(statementNode);
17
+
18
+ log.debug(`Verifying the ${statementString} statement as a combinator...`);
19
+
20
+ const nonTerminalNode = statementNode, ///
21
+ childNodes = nonTerminalNode.getChildNodes(),
22
+ childNodesVerified = verifyChildNodes(childNodes, context);
23
+
24
+ if (childNodesVerified) {
25
+ statementVerifiedAsCombinator = true;
26
+ }
27
+
28
+ if (statementVerifiedAsCombinator) {
29
+ const combinator = Combinator.fromStatementNode(statementNode);
30
+
31
+ context.addCombinator(combinator);
32
+
33
+ const statementString = nodeAsString(statementNode);
34
+
35
+ log.info(`Verified the '${statementString}' combinator.`);
36
+ }
37
+
38
+ return statementVerifiedAsCombinator;
39
+ }
40
+
41
+ module.exports = verifyStatementAsCombinator;
42
+
43
+ function verifyNode(node, context) {
44
+ let nodeVerified;
45
+
46
+ const nodeTerminalNode = node.isTerminalNode();
47
+
48
+ if (nodeTerminalNode) {
49
+ const terminalNode = node, ///
50
+ terminalNodeVerified = verifyTerminalNode(terminalNode, context);
51
+
52
+ nodeVerified = terminalNodeVerified; ///
53
+ } else {
54
+ const nonTerminalNode = node, ///
55
+ nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, context);
56
+
57
+ nodeVerified = nonTerminalNodeVerified; ///
58
+ }
59
+
60
+ return nodeVerified;
61
+ }
62
+
63
+ function verifyChildNodes(childNodes, context) {
64
+ const childNodesVerified = childNodes.every((childNode) => {
65
+ const node = childNode, ///
66
+ nodeVerified = verifyNode(node, context);
67
+
68
+ if (nodeVerified) {
69
+ return true;
70
+ }
71
+ });
72
+
73
+ return childNodesVerified;
74
+ }
75
+
76
+ function verifyTerminalNode(terminalNode, context) {
77
+ const terminalNodeVerified = true;
78
+
79
+ return terminalNodeVerified;
80
+ }
81
+
82
+ function verifyNonTerminalNode(nonTerminalNode, context) {
83
+ let nonTerminalNodeVerified;
84
+
85
+ const ruleName = nonTerminalNode.getRuleName();
86
+
87
+ switch (ruleName) {
88
+ case TYPE_RULE_NAME: {
89
+ const typeNode = nonTerminalNode, ///
90
+ typeNodeVerified = verifyTypeNode(typeNode, context);
91
+
92
+ nonTerminalNodeVerified = typeNodeVerified; ///
93
+
94
+ break;
95
+ }
96
+
97
+ case TERM_RULE_NAME: {
98
+ const termNode = nonTerminalNode, ///
99
+ termNodeVerified = verifyTermNode(termNode, context);
100
+
101
+ nonTerminalNodeVerified = termNodeVerified; ///
102
+
103
+ break;
104
+ }
105
+
106
+ default: {
107
+ const childNodes = nonTerminalNode.getChildNodes(),
108
+ childNodesVerified = verifyChildNodes(childNodes, context);
109
+
110
+ nonTerminalNodeVerified = childNodesVerified; ///
111
+
112
+ break;
113
+ }
114
+ }
115
+
116
+ return nonTerminalNodeVerified;
117
+ }
118
+
119
+ function verifyTypeNode(typeNode, context) {
120
+ let typeNodeVerified = false;
121
+
122
+ const typeName = typeNameFromTypeNode(typeNode),
123
+ typePresent = context.isTypePresentByTypeName(typeName);
124
+
125
+ if (!typePresent) {
126
+ log.error(`The type '${typeName}' is missing.`);
127
+ } else {
128
+ typeNodeVerified = true;
129
+ }
130
+
131
+ return typeNodeVerified;
132
+ }
133
+
134
+ function verifyTermNode(termNode, context) {
135
+ let termNodeVerified = false;
136
+
137
+ debugger
138
+
139
+ return termNodeVerified;
140
+ }
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+
3
+ const { loggingUtilities } = require("necessary/lib/main");
4
+
5
+ const verifyTermAsVariable = require("../verify/termAsVariable");
6
+
7
+ const { first } = require("../utilities/array"),
8
+ { nodeAsString } = require("../utilities/string"),
9
+ { ARGUMENT_RULE_NAME } = require("../ruleNames"),
10
+ { nodeQuery, typeNameFromTypeNode } = require("../utilities/query");
11
+
12
+ const { log } = loggingUtilities;
13
+
14
+ const termNodeQuery = nodeQuery("/argument/term!"),
15
+ typeNodeQuery = nodeQuery("/argument/type!")
16
+
17
+ function verifyTerm(termNode, types, values, context) {
18
+ let termVerified = false;
19
+
20
+ const names = [],
21
+ termVerifiedAsVariable = verifyTermAsVariable(termNode, types, names, values, context);
22
+
23
+ if (termVerifiedAsVariable) {
24
+ termVerified = true;
25
+ } else {
26
+ const constructors = context.getConstructors(),
27
+ constructor = constructors.find((constructor) => {
28
+ const termVerifiedAgainstConstructor = verifyTermAgainstConstructor(termNode, constructor, context);
29
+
30
+ if (termVerifiedAgainstConstructor) {
31
+ return true;
32
+ }
33
+ }) || null;
34
+
35
+ if (constructor !== null) {
36
+ const type = constructor.getType(),
37
+ value = termNode; ///
38
+
39
+ types.push(type);
40
+
41
+ values.push(value);
42
+
43
+ termVerified = true;
44
+ }
45
+ }
46
+
47
+ return termVerified;
48
+ }
49
+
50
+ module.exports = verifyTerm;
51
+
52
+ function verifyTermAgainstConstructor(termNode, constructor, context) {
53
+ const constructorTermNode = constructor.getTermNode(),
54
+ node = termNode, ///
55
+ constructorNode = constructorTermNode, ///
56
+ nodeVerified = verifyNode(node, constructorNode, context),
57
+ termVerifiedAgainstConstructor = nodeVerified; ///
58
+
59
+ return termVerifiedAgainstConstructor;
60
+ }
61
+
62
+ function verifyNode(node, constructorNode, context) {
63
+ let nodeVerified;
64
+
65
+ const nodeTerminalNode = node.isTerminalNode(),
66
+ constructorNodeTerminalNode = constructorNode.isTerminalNode();
67
+
68
+ if (nodeTerminalNode === constructorNodeTerminalNode) {
69
+ if (nodeTerminalNode) {
70
+ const terminalNode = node, ///
71
+ constructorTerminalNode = constructorNode, ///
72
+ terminalNodeVerified = verifyTerminalNode(terminalNode, constructorTerminalNode, context);
73
+
74
+ nodeVerified = terminalNodeVerified; ///
75
+ } else {
76
+ const nonTerminalNode = node, ///
77
+ constructorNonTerminalNode = constructorNode, ///
78
+ nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, context);
79
+
80
+ nodeVerified = nonTerminalNodeVerified; ///
81
+ }
82
+ }
83
+
84
+ return nodeVerified;
85
+ }
86
+
87
+ function verifyChildNodes(childNodes, constructorChildNodes, context) {
88
+ let childNodesVerified = false;
89
+
90
+ const childNodesLength = childNodes.length,
91
+ constructorChildNodesLength = constructorChildNodes.length;
92
+
93
+ if (childNodesLength === constructorChildNodesLength) {
94
+ childNodesVerified = childNodes.every((childNode, index) => {
95
+ const constructorChildNode = constructorChildNodes[index],
96
+ node = childNode, ///
97
+ constructorNode = constructorChildNode, ///
98
+ nodeVerified = verifyNode(node, constructorNode, context);
99
+
100
+ if (nodeVerified) {
101
+ return true;
102
+ }
103
+ });
104
+ }
105
+
106
+ return childNodesVerified;
107
+ }
108
+
109
+ function verifyTerminalNode(terminalNode, constructorTerminalNode, context) {
110
+ let terminalNodeVerified = false;
111
+
112
+ const matches = terminalNode.match(constructorTerminalNode);
113
+
114
+ if (matches) {
115
+ terminalNodeVerified = true;
116
+ }
117
+
118
+ return terminalNodeVerified;
119
+ }
120
+
121
+ function verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, context) {
122
+ let nonTerminalNodeVerified = false;
123
+
124
+ const ruleName = nonTerminalNode.getRuleName(),
125
+ constructorRuleName = constructorNonTerminalNode.getRuleName();
126
+
127
+ if (ruleName === constructorRuleName) {
128
+ switch (ruleName) {
129
+ case ARGUMENT_RULE_NAME: {
130
+ const argumentNode = nonTerminalNode, ///
131
+ constructorArgumentNode = constructorNonTerminalNode, ///
132
+ argumentNodeVerified = verifyArgumentNode(argumentNode, constructorArgumentNode, context);
133
+
134
+ nonTerminalNodeVerified = argumentNodeVerified; ///
135
+
136
+ break;
137
+ }
138
+
139
+ default: {
140
+ const childNodes = nonTerminalNode.getChildNodes(),
141
+ constructorChildNodes = constructorNonTerminalNode.getChildNodes(),
142
+ childNodesVerified = verifyChildNodes(childNodes, constructorChildNodes, context);
143
+
144
+ nonTerminalNodeVerified = childNodesVerified; ///
145
+
146
+ break;
147
+ }
148
+ }
149
+ }
150
+
151
+ return nonTerminalNodeVerified;
152
+ }
153
+
154
+ function verifyArgumentNode(argumentNode, constructorArgumentNode, context) {
155
+ let argumentNodeVerified = false;
156
+
157
+ const termNode = termNodeQuery(argumentNode);
158
+
159
+ if (termNode === null) {
160
+ const argumentString = nodeAsString(argumentNode);
161
+
162
+ log.error(`The ${argumentString} argument should be a term, not a type`);
163
+ } else {
164
+ const types = [],
165
+ values = [],
166
+ termVerified = verifyTerm(termNode, types, values, context);
167
+
168
+ if (termVerified) {
169
+ const firstType = first(types),
170
+ termType = firstType, ///
171
+ typeNode = typeNodeQuery(constructorArgumentNode),
172
+ typeName = typeNameFromTypeNode(typeNode),
173
+ type = context.findTypeByTypeName(typeName),
174
+ termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
175
+
176
+ if (termTypeEqualToOrSubTypeOfType) {
177
+ argumentNodeVerified = true;
178
+ }
179
+ }
180
+ }
181
+
182
+ return argumentNodeVerified;
183
+ }
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+
3
+ const { loggingUtilities } = require("necessary");
4
+
5
+ const verifyTerm = require("../verify/term"),
6
+ Constructor = require("../constructor");
7
+
8
+ const { first } = require("../utilities/array"),
9
+ { nodeAsString } = require("../utilities/string"),
10
+ { nodeQuery, typeNameFromTypeNode } = require("../utilities/query"),
11
+ { TERM_RULE_NAME, ARGUMENT_RULE_NAME } = require("../ruleNames");
12
+
13
+ const { log } = loggingUtilities;
14
+
15
+ const typeNodeQuery = nodeQuery("/argument/type");
16
+
17
+ function verifyTermAsConstructor(termNode, typeNode, context) {
18
+ let termVerifiedAsConstructor = false;
19
+
20
+ const termString = nodeAsString(termNode);
21
+
22
+ log.debug(`Verifying the '${termString}' term as a constructor...`);
23
+
24
+ const nonTerminalNode = termNode, ///
25
+ childNodes = nonTerminalNode.getChildNodes(),
26
+ childNodesVerified = verifyChildNodes(childNodes, context);
27
+
28
+ let type = null;
29
+
30
+ if (childNodesVerified) {
31
+ if (typeNode === null) {
32
+ termVerifiedAsConstructor = true;
33
+ } else {
34
+ const typeName = typeNameFromTypeNode(typeNode);
35
+
36
+ type = context.findTypeByTypeName(typeName);
37
+
38
+ if (type !== null) {
39
+ termVerifiedAsConstructor = true;
40
+ } else {
41
+ const termString = nodeAsString(termNode);
42
+
43
+ log.error(`The '${termString}' constructor's '${typeName}' type is missing.`);
44
+ }
45
+ }
46
+ }
47
+
48
+ if (termVerifiedAsConstructor) {
49
+ const constructor = Constructor.fromTermNodeAndType(termNode, type);
50
+
51
+ context.addConstructor(constructor);
52
+
53
+ const termString = nodeAsString(termNode);
54
+
55
+ log.info(`Verified the '${termString}' constructor.`);
56
+ }
57
+
58
+ return termVerifiedAsConstructor;
59
+ }
60
+
61
+ module.exports = verifyTermAsConstructor;
62
+
63
+ function verifyNode(node, context) {
64
+ let nodeVerified;
65
+
66
+ const nodeTerminalNode = node.isTerminalNode();
67
+
68
+ if (nodeTerminalNode) {
69
+ const terminalNode = node, ///
70
+ terminalNodeVerified = verifyTerminalNode(terminalNode, context);
71
+
72
+ nodeVerified = terminalNodeVerified; ///
73
+ } else {
74
+ const nonTerminalNode = node, ///
75
+ nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, context);
76
+
77
+ nodeVerified = nonTerminalNodeVerified; ///
78
+ }
79
+
80
+ return nodeVerified;
81
+ }
82
+
83
+ function verifyChildNodes(childNodes, context) {
84
+ const childNodesVerified = childNodes.every((childNode) => {
85
+ const node = childNode, ///
86
+ nodeVerified = verifyNode(node, context);
87
+
88
+ if (nodeVerified) {
89
+ return true;
90
+ }
91
+ });
92
+
93
+ return childNodesVerified;
94
+ }
95
+
96
+ function verifyTerminalNode(terminalNode, context) {
97
+ const terminalNodeVerified = true;
98
+
99
+ return terminalNodeVerified;
100
+ }
101
+
102
+ function verifyNonTerminalNode(nonTerminalNode, context) {
103
+ let nonTerminalNodeVerified;
104
+
105
+ const ruleName = nonTerminalNode.getRuleName();
106
+
107
+ switch (ruleName) {
108
+ case ARGUMENT_RULE_NAME: {
109
+ const argumentNode = nonTerminalNode, ///
110
+ argumentNodeVerified = verifyArgumentNode(argumentNode, context);
111
+
112
+ nonTerminalNodeVerified = argumentNodeVerified; ///
113
+
114
+ break;
115
+ }
116
+
117
+ case TERM_RULE_NAME: {
118
+ const termNode = nonTerminalNode, ///
119
+ types = [],
120
+ values = [],
121
+ termVerified = verifyTerm(termNode, types, values, context);
122
+
123
+ if (termVerified) {
124
+ const firstType = first(types),
125
+ type = firstType; ///
126
+
127
+ if (type !== null) {
128
+ const termString = nodeAsString(termNode);
129
+
130
+ log.error(`The type of the constructor's compound '${termString}' term node is not null.`);
131
+ } else {
132
+ nonTerminalNodeVerified = true; ///
133
+ }
134
+ }
135
+
136
+ break;
137
+ }
138
+
139
+ default: {
140
+ const childNodes = nonTerminalNode.getChildNodes(),
141
+ childNodesVerified = verifyChildNodes(childNodes, context);
142
+
143
+ nonTerminalNodeVerified = childNodesVerified; ///
144
+
145
+ break;
146
+ }
147
+ }
148
+
149
+ return nonTerminalNodeVerified;
150
+ }
151
+
152
+ function verifyArgumentNode(argumentNode, context) {
153
+ let typeNodeVerified = false;
154
+
155
+ const typeNode = typeNodeQuery(argumentNode);
156
+
157
+ if (typeNode === null) {
158
+ const argumentString = nodeAsString(argumentNode);
159
+
160
+ log.error(`The ${argumentString} argument should be a type.`);
161
+ } else {
162
+ const typeName = typeNameFromTypeNode(typeNode),
163
+ typePresent = context.isTypePresentByTypeName(typeName);
164
+
165
+ if (!typePresent) {
166
+ log.error(`The type '${typeName}' is missing.`);
167
+ } else {
168
+ typeNodeVerified = true;
169
+ }
170
+ }
171
+
172
+ return typeNodeVerified;
173
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ const { loggingUtilities } = require("necessary");
4
+
5
+ const { nodeQuery, variableNameFromVariableNode} = require("../utilities/query");
6
+
7
+ const variableNodeQuery = nodeQuery("/term/variable!");
8
+
9
+ const { log } = loggingUtilities;
10
+
11
+ function verifyTermAsVariable(termNode, types, names, values, context) {
12
+ let termVerifiedAsVariable = false;
13
+
14
+ const variableNode = variableNodeQuery(termNode);
15
+
16
+ if (variableNode !== null) {
17
+ const variableName = variableNameFromVariableNode(variableNode),
18
+ variablePresent = context.isVariablePresentByVariableName(variableName);
19
+
20
+ if (!variablePresent) {
21
+ log.error(`The ${variableName} variable is not present.`)
22
+ } else {
23
+ const variable = context.findVariableByVariableName(variableName),
24
+ type = variable.getType(),
25
+ name = variableName, ///
26
+ value = variable.getValue();
27
+
28
+ types.push(type);
29
+
30
+ names.push(name);
31
+
32
+ values.push(value);
33
+
34
+ termVerifiedAsVariable = true;
35
+ }
36
+ }
37
+
38
+ return termVerifiedAsVariable;
39
+ }
40
+
41
+ module.exports = verifyTermAsVariable;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ const { loggingUtilities } = require("necessary");
4
+
5
+ const Type = require("../type");
6
+
7
+ const { typeNameFromTypeNode } = require("../utilities/query");
8
+
9
+ const { log } = loggingUtilities;
10
+
11
+ function verifyType(typeNode, superTypeNode, context) {
12
+ let typeVerified = false;
13
+
14
+ const typeName = typeNameFromTypeNode(typeNode),
15
+ typePresent = context.isTypePresentByTypeName(typeName);
16
+
17
+ if (typePresent) {
18
+ log.error(`The type '${typeName}' is already present.`);
19
+ } else {
20
+ const superTypeName = typeNameFromTypeNode(superTypeNode);
21
+
22
+ if (superTypeName === null) {
23
+ const type = Type.fromTypeName(typeName),
24
+ typeString = type.asString();
25
+
26
+ context.addType(type);
27
+
28
+ typeVerified = true;
29
+
30
+ log.info(`Verified the '${typeString}' type.`);
31
+ } else {
32
+ const superType = context.findTypeByTypeName(superTypeName);
33
+
34
+ if (superType === null) {
35
+ log.error(`The super-type '${superTypeName}' is missing.`);
36
+ } else {
37
+ const type = Type.fromTypeNameAndSuperType(typeName, superType),
38
+ typeString = type.asString();
39
+
40
+ context.addType(type);
41
+
42
+ typeVerified = true;
43
+
44
+ log.info(`Verified the '${typeString}' type.`);
45
+ }
46
+ }
47
+ }
48
+
49
+ return typeVerified;
50
+ }
51
+
52
+ module.exports = verifyType;
53
+
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ const { loggingUtilities } = require("necessary");
4
+
5
+ const Variable = require("../variable"),
6
+ verifyTermAsVariable = require("../verify/termAsVariable");
7
+
8
+ const { first } = require("../utilities/array"),
9
+ { nodeQuery, typeNameFromTypeNode } = require("../utilities/query");
10
+
11
+ const { log } = loggingUtilities;
12
+
13
+ const termNodeQuery = nodeQuery("/typeAssertion/term"),
14
+ typeNodeQuery = nodeQuery("/typeAssertion/type");
15
+
16
+ function verifyTypeAssertion(typeAssertionNode, context) {
17
+ let typeAssertionVerified = false;
18
+
19
+ const typeNode = typeNodeQuery(typeAssertionNode),
20
+ typeName = typeNameFromTypeNode(typeNode),
21
+ typePresent = context.isTypePresentByTypeName(typeName);
22
+
23
+ if (!typePresent) {
24
+ log.error(`The ${typeName} type is not present.`);
25
+ } else {
26
+ const derived = context.isDerived();
27
+
28
+ if (derived) {
29
+ debugger
30
+ } else {
31
+ const types = [],
32
+ names = [],
33
+ values = [],
34
+ termNode = termNodeQuery(typeAssertionNode),
35
+ termVerified = verifyTermAsVariable(termNode, types, names, values, context);
36
+
37
+ if (termVerified) {
38
+ const firstName = first(names),
39
+ firstValue = first(values),
40
+ variableName = firstName, ///
41
+ value = firstValue;
42
+
43
+ if (value !== undefined) {
44
+ log.error(`The value of the ${variableName} variable is not undefined.`);
45
+ } else {
46
+ const type = context.findTypeByTypeName(typeName),
47
+ firstType = first(types),
48
+ variableType = firstType, ///
49
+ typeSubTypeOfVariableType = type.isSubTypeOf(variableType);
50
+
51
+ if (!typeSubTypeOfVariableType) {
52
+ log.error(`The asserted type of the ${variableName} variable is not a sub-type of its declared type.`);
53
+ } else {
54
+ const name = variableName, ///
55
+ variable = Variable.fromTypeAndName(type, name);
56
+
57
+ context.addVariable(variable);
58
+
59
+ typeAssertionVerified = true;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+
66
+ return typeAssertionVerified;
67
+ }
68
+
69
+ module.exports = verifyTypeAssertion;