occam-furtle 2.0.69 → 2.0.73
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/dom/assignment/object.js +36 -38
- package/lib/dom/assignment.js +1 -10
- package/lib/dom/block/return.js +31 -4
- package/lib/dom/block.js +1 -1
- package/lib/dom/parameter/named.js +143 -0
- package/lib/dom/parameter.js +10 -36
- package/lib/dom/parameters/named.js +208 -0
- package/lib/dom/parameters.js +8 -52
- package/lib/dom/procedure/anonymous.js +28 -24
- package/lib/dom/procedure.js +7 -22
- package/lib/dom/returnStatement.js +5 -10
- package/lib/dom/some.js +15 -6
- package/lib/dom/step.js +3 -12
- package/lib/dom/value.js +2 -2
- package/lib/dom/variable.js +5 -5
- package/lib/index.js +3 -2
- package/lib/nodeProperties.js +118 -0
- package/lib/nodeProperty.js +100 -0
- package/package.json +4 -4
- package/src/dom/assignment/object.js +34 -36
- package/src/dom/assignment.js +0 -10
- package/src/dom/block/return.js +51 -10
- package/src/dom/block.js +1 -1
- package/src/dom/parameter/named.js +119 -0
- package/src/dom/parameter.js +7 -43
- package/src/dom/parameters/named.js +129 -0
- package/src/dom/parameters.js +12 -63
- package/src/dom/procedure/anonymous.js +51 -37
- package/src/dom/procedure.js +3 -25
- package/src/dom/returnStatement.js +8 -14
- package/src/dom/some.js +25 -9
- package/src/dom/step.js +3 -12
- package/src/dom/value.js +1 -1
- package/src/dom/variable.js +8 -11
- package/src/index.js +2 -1
- package/src/nodeProperties.js +84 -0
- package/src/nodeProperty.js +56 -0
- package/lib/dom/assignment/variable.js +0 -133
- package/lib/parameters/node.js +0 -76
- package/src/dom/assignment/variable.js +0 -52
- package/src/parameters/node.js +0 -32
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import dom from "../../dom";
|
|
4
4
|
import Exception from "../../exception";
|
|
5
|
-
import
|
|
5
|
+
import nodeProperties from "../../nodeProperties";
|
|
6
6
|
|
|
7
7
|
import { nodeQuery } from "../../utilities/query";
|
|
8
8
|
import { domAssigned } from "../../dom";
|
|
@@ -12,10 +12,10 @@ import { CONTENT_PARAMETER_NAME, TERMINAL_PARAMETER_NAME, CHILD_NODES_PARAMETER_
|
|
|
12
12
|
const objectAssignmentNodeQuery = nodeQuery("/step/objectAssignment");
|
|
13
13
|
|
|
14
14
|
export default domAssigned(class ObjectAssigment {
|
|
15
|
-
constructor(string, variable,
|
|
15
|
+
constructor(string, variable, namedParameters) {
|
|
16
16
|
this.string = string;
|
|
17
17
|
this.variable = variable;
|
|
18
|
-
this.
|
|
18
|
+
this.namedParameters = namedParameters;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
getString() {
|
|
@@ -26,8 +26,8 @@ export default domAssigned(class ObjectAssigment {
|
|
|
26
26
|
return this.variable;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
return this.
|
|
29
|
+
getNamedParameters() {
|
|
30
|
+
return this.namedParameters;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
evaluate(context) {
|
|
@@ -46,54 +46,52 @@ export default domAssigned(class ObjectAssigment {
|
|
|
46
46
|
throw exception;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
nodeProperties.matchNamedParameters(this.namedParameters, context);
|
|
50
50
|
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
this.evaluateParameter(parameter, value, context);
|
|
54
|
-
}
|
|
51
|
+
this.namedParameters.forEachNamedParameter((namedParameter) => {
|
|
52
|
+
this.evaluateNamedParameter(namedParameter, value, context);
|
|
55
53
|
});
|
|
56
54
|
|
|
57
55
|
context.debug(`...evaluated the '${objectAssignmentString}' object assignment.`);
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
|
|
58
|
+
evaluateNamedParameter(namedParameter, value, context) {
|
|
61
59
|
const valueString = value.asString(context),
|
|
62
|
-
|
|
60
|
+
namedParameterString = namedParameter.getString();
|
|
63
61
|
|
|
64
|
-
context.trace(`Evaluating the '${
|
|
62
|
+
context.trace(`Evaluating the '${namedParameterString}' named parameter against the ${valueString} value...`);
|
|
65
63
|
|
|
66
|
-
const name =
|
|
64
|
+
const name = namedParameter.getName();
|
|
67
65
|
|
|
68
66
|
switch (name) {
|
|
69
67
|
case CONTENT_PARAMETER_NAME: {
|
|
70
|
-
this.
|
|
68
|
+
this.evaluateContentNamedParameter(namedParameter, value, context);
|
|
71
69
|
|
|
72
70
|
break;
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
case TERMINAL_PARAMETER_NAME: {
|
|
76
|
-
this.
|
|
74
|
+
this.evaluateTerminalNamedParameter(namedParameter, value, context);
|
|
77
75
|
|
|
78
76
|
break;
|
|
79
77
|
}
|
|
80
78
|
|
|
81
79
|
case CHILD_NODES_PARAMETER_NAME: {
|
|
82
|
-
this.
|
|
80
|
+
this.evaluateChildNodesNamedParameter(namedParameter, value, context);
|
|
83
81
|
|
|
84
82
|
break;
|
|
85
83
|
}
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
context.debug(`...evaluated the '${
|
|
86
|
+
context.debug(`...evaluated the '${namedParameterString}' parameter named against the ${valueString} value.`);
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
|
|
92
|
-
const type =
|
|
89
|
+
evaluateContentNamedParameter(namedParameter, value, context) {
|
|
90
|
+
const type = namedParameter.getType();
|
|
93
91
|
|
|
94
92
|
if (type !== STRING_TYPE) {
|
|
95
|
-
const
|
|
96
|
-
message = `The '${
|
|
93
|
+
const namedParameterString = namedParameter.getString(),
|
|
94
|
+
message = `The '${namedParameterString}' named parameter's type should be '${STRING_TYPE}'.`,
|
|
97
95
|
exception = Exception.fromMessage(message);
|
|
98
96
|
|
|
99
97
|
throw exception;
|
|
@@ -118,19 +116,19 @@ export default domAssigned(class ObjectAssigment {
|
|
|
118
116
|
value = Value.fromString(string, context); ///
|
|
119
117
|
|
|
120
118
|
const assignment = Assignment.fromValue(value, context),
|
|
121
|
-
variable = Variable.
|
|
119
|
+
variable = Variable.fromNamedParameterAndAssignment(namedParameter, assignment);
|
|
122
120
|
|
|
123
121
|
context.addVariable(variable);
|
|
124
122
|
|
|
125
123
|
variable.assign(context);
|
|
126
124
|
}
|
|
127
125
|
|
|
128
|
-
|
|
129
|
-
const type =
|
|
126
|
+
evaluateTerminalNamedParameter(namedParameter, value, context) {
|
|
127
|
+
const type = namedParameter.getType();
|
|
130
128
|
|
|
131
129
|
if (type !== BOOLEAN_TYPE) {
|
|
132
|
-
const
|
|
133
|
-
message = `The '${
|
|
130
|
+
const namedParameterString = namedParameter.getString(),
|
|
131
|
+
message = `The '${namedParameterString}' named parameter's type should be '${BOOLEAN_TYPE}'.`,
|
|
134
132
|
exception = Exception.fromMessage(message);
|
|
135
133
|
|
|
136
134
|
throw exception;
|
|
@@ -146,19 +144,19 @@ export default domAssigned(class ObjectAssigment {
|
|
|
146
144
|
value = Value.fromBoolean(boolean, context); ///
|
|
147
145
|
|
|
148
146
|
const assignment = Assignment.fromValue(value, context),
|
|
149
|
-
variable = Variable.
|
|
147
|
+
variable = Variable.fromNamedParameterAndAssignment(namedParameter, assignment);
|
|
150
148
|
|
|
151
149
|
context.addVariable(variable);
|
|
152
150
|
|
|
153
151
|
variable.assign(context);
|
|
154
152
|
}
|
|
155
153
|
|
|
156
|
-
|
|
157
|
-
const type =
|
|
154
|
+
evaluateChildNodesNamedParameter(namedParameter, value, context) {
|
|
155
|
+
const type = namedParameter.getType();
|
|
158
156
|
|
|
159
157
|
if (type !== NODES_TYPE) {
|
|
160
|
-
const
|
|
161
|
-
message = `The '${
|
|
158
|
+
const namedParameterString = namedParameter.getString(),
|
|
159
|
+
message = `The '${namedParameterString}' named parameter's type should be '${NODES_TYPE}'.`,
|
|
162
160
|
exception = Exception.fromMessage(message);
|
|
163
161
|
|
|
164
162
|
throw exception;
|
|
@@ -183,7 +181,7 @@ export default domAssigned(class ObjectAssigment {
|
|
|
183
181
|
value = Value.fromNodes(nodes, context); ///
|
|
184
182
|
|
|
185
183
|
const assignment = Assignment.fromValue(value, context),
|
|
186
|
-
variable = Variable.
|
|
184
|
+
variable = Variable.fromNamedParameterAndAssignment(namedParameter, assignment);
|
|
187
185
|
|
|
188
186
|
context.addVariable(variable);
|
|
189
187
|
|
|
@@ -198,13 +196,13 @@ export default domAssigned(class ObjectAssigment {
|
|
|
198
196
|
const objectAssignmentNode = objectAssignmentNodeQuery(stepNode);
|
|
199
197
|
|
|
200
198
|
if (objectAssignmentNode !== null) {
|
|
201
|
-
const { Variable,
|
|
199
|
+
const { Variable, NamedParameters } = dom,
|
|
202
200
|
node = objectAssignmentNode, ///
|
|
203
201
|
string = context.nodeAsString(node),
|
|
204
202
|
variable = Variable.fromObjectAssignmentNode(objectAssignmentNode, context),
|
|
205
|
-
|
|
203
|
+
namedParameters = NamedParameters.fromObjectAssignmentNode(objectAssignmentNode, context);
|
|
206
204
|
|
|
207
|
-
objectAssignment = new ObjectAssigment(string, variable,
|
|
205
|
+
objectAssignment = new ObjectAssigment(string, variable, namedParameters);
|
|
208
206
|
}
|
|
209
207
|
|
|
210
208
|
return objectAssignment;
|
package/src/dom/assignment.js
CHANGED
|
@@ -3,11 +3,8 @@
|
|
|
3
3
|
import dom from "../dom";
|
|
4
4
|
import Exception from "../exception";
|
|
5
5
|
|
|
6
|
-
import { nodeQuery } from "../utilities/query";
|
|
7
6
|
import { domAssigned } from "../dom";
|
|
8
7
|
|
|
9
|
-
const assignmentNodeQuery = nodeQuery("/variableAssignment/assignment");
|
|
10
|
-
|
|
11
8
|
export default domAssigned(class Assignment {
|
|
12
9
|
constructor(string, value) {
|
|
13
10
|
this.string = string;
|
|
@@ -67,13 +64,6 @@ export default domAssigned(class Assignment {
|
|
|
67
64
|
|
|
68
65
|
return assignment;
|
|
69
66
|
}
|
|
70
|
-
|
|
71
|
-
static fromVariableAssignmentNode(variableAssignmentNode, context) {
|
|
72
|
-
const assignmentNode = assignmentNodeQuery(variableAssignmentNode),
|
|
73
|
-
assignment = assignmentFromAssignmentNode(assignmentNode, context);
|
|
74
|
-
|
|
75
|
-
return assignment;
|
|
76
|
-
}
|
|
77
67
|
});
|
|
78
68
|
|
|
79
69
|
function stringFromValue(value, context) {
|
package/src/dom/block/return.js
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import dom from "../../dom";
|
|
4
|
+
import Exception from "../../exception";
|
|
4
5
|
import BlockContext from "../../context/block";
|
|
5
6
|
|
|
6
|
-
import { nodesQuery } from "../../utilities/query";
|
|
7
7
|
import { domAssigned } from "../../dom";
|
|
8
|
+
import { nodeQuery, nodesQuery } from "../../utilities/query";
|
|
8
9
|
|
|
9
|
-
const stepNodesQuery = nodesQuery("/
|
|
10
|
+
const stepNodesQuery = nodesQuery("/returnBlock/step"),
|
|
11
|
+
nonsenseNodesQuery = nodesQuery("/returnBlock/nonsense"),
|
|
12
|
+
anonymousProcedureReturnBlockNodeQuery = nodeQuery("/anonymousProcedure/returnBlock"),
|
|
13
|
+
procedureDeclarationReturnBlockNodeQuery = nodeQuery("/procedureDeclaration/returnBlock");
|
|
10
14
|
|
|
11
15
|
export default domAssigned(class ReturnBlock {
|
|
12
|
-
constructor(string, steps, returnStatement) {
|
|
16
|
+
constructor(string, steps, nonsensical, returnStatement) {
|
|
13
17
|
this.string = string;
|
|
14
18
|
this.steps = steps;
|
|
19
|
+
this.nonsensical = nonsensical;
|
|
15
20
|
this.returnStatement = returnStatement;
|
|
16
21
|
}
|
|
17
22
|
|
|
@@ -23,11 +28,22 @@ export default domAssigned(class ReturnBlock {
|
|
|
23
28
|
return this.steps;
|
|
24
29
|
}
|
|
25
30
|
|
|
31
|
+
isNonsensical() {
|
|
32
|
+
return this.nonsensical;
|
|
33
|
+
}
|
|
34
|
+
|
|
26
35
|
getReturnStatement() {
|
|
27
36
|
return this.returnStatement;
|
|
28
37
|
}
|
|
29
38
|
|
|
30
39
|
evaluate(variables, context) {
|
|
40
|
+
if (this.nonsensical) {
|
|
41
|
+
const message = `The return block is nonsensical.`,
|
|
42
|
+
exception = Exception.fromMessage(message);
|
|
43
|
+
|
|
44
|
+
throw exception;
|
|
45
|
+
}
|
|
46
|
+
|
|
31
47
|
const blockContext = BlockContext.fromVariables(variables, context);
|
|
32
48
|
|
|
33
49
|
context = blockContext; ///
|
|
@@ -44,13 +60,17 @@ export default domAssigned(class ReturnBlock {
|
|
|
44
60
|
static name = "ReturnBlock";
|
|
45
61
|
|
|
46
62
|
static fromProcedureDeclarationNode(procedureDeclarationNode, context) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
const procedureDeclarationReturnBlockNode = procedureDeclarationReturnBlockNodeQuery(procedureDeclarationNode),
|
|
64
|
+
returnBlockNode = procedureDeclarationReturnBlockNode, ///
|
|
65
|
+
returnBlock = returnBlockFromReturnBlockNode(returnBlockNode, context);
|
|
66
|
+
|
|
67
|
+
return returnBlock;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static fromAnonymousProcedureNode(anonymousProcedureNode, context) {
|
|
71
|
+
const anonymousProcedureReturnBlockNode = anonymousProcedureReturnBlockNodeQuery(anonymousProcedureNode),
|
|
72
|
+
returnBlockNode = anonymousProcedureReturnBlockNode, ///
|
|
73
|
+
returnBlock = returnBlockFromReturnBlockNode(returnBlockNode, context);
|
|
54
74
|
|
|
55
75
|
return returnBlock;
|
|
56
76
|
}
|
|
@@ -66,3 +86,24 @@ function stepsFromStepNodes(stepNodes, context) {
|
|
|
66
86
|
|
|
67
87
|
return steps;
|
|
68
88
|
}
|
|
89
|
+
|
|
90
|
+
function returnBlockFromReturnBlockNode(returnBlockNode, context) {
|
|
91
|
+
const { ReturnBlock, ReturnStatement } = dom,
|
|
92
|
+
node = returnBlockNode, ///
|
|
93
|
+
string = context.nodeAsString(node),
|
|
94
|
+
stepNodes = stepNodesQuery(returnBlockNode),
|
|
95
|
+
steps = stepsFromStepNodes(stepNodes, context),
|
|
96
|
+
nonsensical = nonsensicalFromReturnBlockNode(returnBlockNode, context),
|
|
97
|
+
returnStatement = ReturnStatement.fromReturnBlockNode(returnBlockNode, context),
|
|
98
|
+
returnBlock = new ReturnBlock(string, steps, nonsensical, returnStatement);
|
|
99
|
+
|
|
100
|
+
return returnBlock;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function nonsensicalFromReturnBlockNode(returnBlockNode, context) {
|
|
104
|
+
const nonsenseNodes = nonsenseNodesQuery(returnBlockNode),
|
|
105
|
+
nonsenseNodesLength = nonsenseNodes.length,
|
|
106
|
+
nonsensical = (nonsenseNodesLength > 0);
|
|
107
|
+
|
|
108
|
+
return nonsensical;
|
|
109
|
+
}
|
package/src/dom/block.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
import dom from "../dom";
|
|
4
4
|
import BlockContext from "../context/block";
|
|
5
5
|
|
|
6
|
+
import { nodesQuery } from "../utilities/query";
|
|
6
7
|
import { domAssigned } from "../dom";
|
|
7
|
-
import { nodeQuery, nodesQuery } from "../utilities/query";
|
|
8
8
|
|
|
9
9
|
const stepNodesQuery = nodesQuery("/block/step");
|
|
10
10
|
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Exception from "../../exception";
|
|
4
|
+
|
|
5
|
+
import { domAssigned } from "../../dom";
|
|
6
|
+
import { nodeQuery, nodesQuery } from "../../utilities/query";
|
|
7
|
+
|
|
8
|
+
const typeTerminalNodeQuery = nodeQuery("/namedParameter/@type"),
|
|
9
|
+
nameTerminalNodeQuery = nodeQuery("/namedParameter/@name[0]"),
|
|
10
|
+
asNameTerminalNodeQuery = nodeQuery("/namedParameter/@name[1]");
|
|
11
|
+
|
|
12
|
+
export default domAssigned(class NamedParameter {
|
|
13
|
+
constructor(string, type, name, asName) {
|
|
14
|
+
this.string = string;
|
|
15
|
+
this.type = type;
|
|
16
|
+
this.name = name;
|
|
17
|
+
this.asName = asName;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getString() {
|
|
21
|
+
return this.string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
getType() {
|
|
25
|
+
return this.type;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
getName() {
|
|
29
|
+
return this.name;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
getAsName() {
|
|
33
|
+
return this.asName;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
matchValue(value, context) {
|
|
37
|
+
const valueString = value.asString(context),
|
|
38
|
+
namedParameterString = this.string; ///
|
|
39
|
+
|
|
40
|
+
context.trace(`Matching the ${valueString} value against the '${namedParameterString}' named parameter...`);
|
|
41
|
+
|
|
42
|
+
const valueType = value.getType();
|
|
43
|
+
|
|
44
|
+
if (this.type !== valueType) {
|
|
45
|
+
const message = `The ${valueString} value's '${valueType}' type and '${namedParameterString}' named parameter's '${this.type}' type do not match.`,
|
|
46
|
+
exception = Exception.fromMessage(message);
|
|
47
|
+
|
|
48
|
+
throw exception;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
context.debug(`...matched the ${valueString} value against the '${namedParameterString}' named parameter.`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
matchNamedParameter(namedParameter, context) {
|
|
55
|
+
let namedParameterMatches;
|
|
56
|
+
|
|
57
|
+
const namedParameterA = this, ///
|
|
58
|
+
namedParameterB = namedParameter; ///
|
|
59
|
+
|
|
60
|
+
const namedParameterAString = namedParameterA.getString(),
|
|
61
|
+
namedParameterBString = namedParameterB.getString();
|
|
62
|
+
|
|
63
|
+
context.trace(`Matching the '${namedParameterAString}' named parameter against the '${namedParameterBString}' named parameter...`);
|
|
64
|
+
|
|
65
|
+
const name = namedParameter.getName(),
|
|
66
|
+
type = namedParameter.getType();
|
|
67
|
+
|
|
68
|
+
namedParameterMatches = ((this.name === name) && (this.type === type));
|
|
69
|
+
|
|
70
|
+
if (namedParameterMatches) {
|
|
71
|
+
context.debug(`...matched the '${namedParameterAString}' named parameter against the '${namedParameterBString}' named parameter.`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return namedParameterMatches;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static name = "NamedParameter";
|
|
78
|
+
|
|
79
|
+
static fromNamedParameterNode(namedParameterNode, context) {
|
|
80
|
+
const type = typeFromNamedParameterNode(namedParameterNode, context),
|
|
81
|
+
name = nameFromNamedParameterNode(namedParameterNode, context),
|
|
82
|
+
asName = asNameFromNamedParameterNode(namedParameterNode, context),
|
|
83
|
+
node = namedParameterNode, //
|
|
84
|
+
string = context.nodeAsString(node),
|
|
85
|
+
namedParameter = new NamedParameter(string, type, name, asName);
|
|
86
|
+
|
|
87
|
+
return namedParameter;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
function typeFromNamedParameterNode(namedParameterNode, context) {
|
|
92
|
+
const typeTerminalNode = typeTerminalNodeQuery(namedParameterNode),
|
|
93
|
+
typeTerminalNodeContent = typeTerminalNode.getContent(),
|
|
94
|
+
type = typeTerminalNodeContent; ///
|
|
95
|
+
|
|
96
|
+
return type;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function nameFromNamedParameterNode(namedParameterNode, context) {
|
|
100
|
+
const nameTerminalNode = nameTerminalNodeQuery(namedParameterNode),
|
|
101
|
+
nameTerminalNodeContent = nameTerminalNode.getContent(),
|
|
102
|
+
name = nameTerminalNodeContent; ///
|
|
103
|
+
|
|
104
|
+
return name;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function asNameFromNamedParameterNode(namedParameterNode, context) {
|
|
108
|
+
let asName = null;
|
|
109
|
+
|
|
110
|
+
const asNameTerminalNode = asNameTerminalNodeQuery(namedParameterNode);
|
|
111
|
+
|
|
112
|
+
if (asNameTerminalNode !== null) {
|
|
113
|
+
const asNameTerminalNodeContent = asNameTerminalNode.getContent();
|
|
114
|
+
|
|
115
|
+
asName = asNameTerminalNodeContent; ///
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return asName;
|
|
119
|
+
}
|
package/src/dom/parameter.js
CHANGED
|
@@ -10,24 +10,24 @@ const terminalNodesQuery = nodesQuery("/parameter/@*"),
|
|
|
10
10
|
typeTerminalNodeQuery = nodeQuery("/parameter/@type");
|
|
11
11
|
|
|
12
12
|
export default domAssigned(class Parameter {
|
|
13
|
-
constructor(string,
|
|
13
|
+
constructor(string, type, name) {
|
|
14
14
|
this.string = string;
|
|
15
|
-
this.name = name;
|
|
16
15
|
this.type = type;
|
|
16
|
+
this.name = name;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
getString() {
|
|
20
20
|
return this.string;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
getName() {
|
|
24
|
-
return this.name;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
23
|
getType() {
|
|
28
24
|
return this.type;
|
|
29
25
|
}
|
|
30
26
|
|
|
27
|
+
getName() {
|
|
28
|
+
return this.name;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
31
|
matchValue(value, context) {
|
|
32
32
|
const valueString = value.asString(context),
|
|
33
33
|
parameterString = this.string; ///
|
|
@@ -46,38 +46,8 @@ export default domAssigned(class Parameter {
|
|
|
46
46
|
context.debug(`...matched the ${valueString} value against the '${parameterString}' parameter.`);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
matchParameter(parameter, context) {
|
|
50
|
-
let parameterMatches;
|
|
51
|
-
|
|
52
|
-
const parameterA = this, ///
|
|
53
|
-
parameterB = parameter; ///
|
|
54
|
-
|
|
55
|
-
const parameterAString = parameterA.getString(),
|
|
56
|
-
parameterBString = parameterB.getString();
|
|
57
|
-
|
|
58
|
-
context.trace(`Matching the '${parameterAString}' parameter against the '${parameterBString}' parameter...`);
|
|
59
|
-
|
|
60
|
-
const name = parameter.getName(),
|
|
61
|
-
type = parameter.getType();
|
|
62
|
-
|
|
63
|
-
parameterMatches = ((this.name === name) && (this.type === type));
|
|
64
|
-
|
|
65
|
-
if (parameterMatches) {
|
|
66
|
-
context.debug(`...matched the '${parameterAString}' parameter against the '${parameterBString}' parameter.`);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return parameterMatches;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
49
|
static name = "Parameter";
|
|
73
50
|
|
|
74
|
-
static fromNameAndType(name, type, context) {
|
|
75
|
-
const string = stringFromNameAndType(name, type, context),
|
|
76
|
-
parameter = new Parameter(string, name, type);
|
|
77
|
-
|
|
78
|
-
return parameter;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
51
|
static fromParameterNode(parameterNode, context) {
|
|
82
52
|
let parameter = null;
|
|
83
53
|
|
|
@@ -90,19 +60,13 @@ export default domAssigned(class Parameter {
|
|
|
90
60
|
node = parameterNode, //
|
|
91
61
|
string = context.nodeAsString(node);
|
|
92
62
|
|
|
93
|
-
parameter = new Parameter(string,
|
|
63
|
+
parameter = new Parameter(string, type, name);
|
|
94
64
|
}
|
|
95
65
|
|
|
96
66
|
return parameter;
|
|
97
67
|
}
|
|
98
68
|
});
|
|
99
69
|
|
|
100
|
-
function stringFromNameAndType(name, type) {
|
|
101
|
-
const string = `${type} ${name}`;
|
|
102
|
-
|
|
103
|
-
return string;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
70
|
function nameFromParameterNode(parameterNode, context) {
|
|
107
71
|
const nameTerminalNode = nameTerminalNodeQuery(parameterNode),
|
|
108
72
|
nameTerminalNodeContent = nameTerminalNode.getContent(),
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import dom from "../../dom";
|
|
4
|
+
import Exception from "../../exception";
|
|
5
|
+
|
|
6
|
+
import { domAssigned } from "../../dom";
|
|
7
|
+
import { nodeQuery, nodesQuery } from "../../utilities/query";
|
|
8
|
+
|
|
9
|
+
const namedParameterNodesQuery = nodesQuery("/namedParameters/namedParameter"),
|
|
10
|
+
objectAssignmentNamedParametersNodeQuery = nodeQuery("/objectAssignment/namedParameters");
|
|
11
|
+
|
|
12
|
+
export default domAssigned(class NamedParameters {
|
|
13
|
+
constructor(string, array) {
|
|
14
|
+
this.string = string;
|
|
15
|
+
this.array = array;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
getString() {
|
|
19
|
+
return this.string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getArray() {
|
|
23
|
+
return this.array;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getLength() {
|
|
27
|
+
const length = this.array.length;
|
|
28
|
+
|
|
29
|
+
return length;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
getNamedParameter(index) {
|
|
33
|
+
const namedParameter = this.array[index] || null;
|
|
34
|
+
|
|
35
|
+
return namedParameter;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
someNamedParameter(callback) { return this.array.some(callback); }
|
|
39
|
+
|
|
40
|
+
forEachNamedParameter(callback) { this.array.forEach(callback); }
|
|
41
|
+
|
|
42
|
+
matchValues(values, context) {
|
|
43
|
+
const valuesString = values.getString(),
|
|
44
|
+
namedParametersString = this.string; ///
|
|
45
|
+
|
|
46
|
+
context.trace(`Matching the ${valuesString} values against the '${namedParametersString}' named parameters...`);
|
|
47
|
+
|
|
48
|
+
const valuesLength = values.getLength(),
|
|
49
|
+
namedParametersLength = this.getLength();
|
|
50
|
+
|
|
51
|
+
if (valuesLength !== namedParametersLength) {
|
|
52
|
+
const message = `The ${valuesString} values and '${namedParametersString}' named parameters are not of the same length.`,
|
|
53
|
+
exception = Exception.fromMessage(message);
|
|
54
|
+
|
|
55
|
+
throw exception;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
this.forEachNamedParameter((namedParameter, index) => {
|
|
59
|
+
if (namedParameter !== null) {
|
|
60
|
+
const value = values.getValue(index);
|
|
61
|
+
|
|
62
|
+
namedParameter.matchValue(value, context);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
context.debug(`...matched the ${valuesString} values against the '${namedParametersString}' named parameters.`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
matchNamedParameter(namedParameter, context) {
|
|
70
|
+
const namedParameterString = namedParameter.getString(),
|
|
71
|
+
namedParametersString = this.string; ///
|
|
72
|
+
|
|
73
|
+
context.trace(`Matching the '${namedParameterString}' namedParameter against the '${namedParametersString}' named parameters...`);
|
|
74
|
+
|
|
75
|
+
const namedParameterA = namedParameter, ///
|
|
76
|
+
namedParameterMatches = this.someNamedParameter((namedParameter) => {
|
|
77
|
+
if (namedParameter !== null) {
|
|
78
|
+
const namedParameterB = namedParameter, ///
|
|
79
|
+
namedParameterBMatchesNamedParameterA = namedParameterA.matchNamedParameter(namedParameterB, context);
|
|
80
|
+
|
|
81
|
+
if (namedParameterBMatchesNamedParameterA) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (!namedParameterMatches) {
|
|
88
|
+
const message = `The '${namedParameterString}' namedParameter does not match any of the '${namedParametersString}' named parameters.`,
|
|
89
|
+
exception = Exception.fromMessage(message);
|
|
90
|
+
|
|
91
|
+
throw exception;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
context.debug(`...matched the '${namedParameterString}' namedParameter against the '${namedParametersString}' named parameters.`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
matchNamedParameters(namedParameters, context) {
|
|
98
|
+
namedParameters.forEachNamedParameter((namedParameter) => {
|
|
99
|
+
if (namedParameter !== null) {
|
|
100
|
+
this.matchNamedParameter(namedParameter, context);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
static name = "NamedParameters";
|
|
106
|
+
|
|
107
|
+
static fromObjectAssignmentNode(objectAssignmentNode, context) {
|
|
108
|
+
const objectAssignmentNamedParametersNode = objectAssignmentNamedParametersNodeQuery(objectAssignmentNode),
|
|
109
|
+
parametersNode = objectAssignmentNamedParametersNode, ///
|
|
110
|
+
node = parametersNode, ///
|
|
111
|
+
string = context.nodeAsString(node),
|
|
112
|
+
namedParameterNodes = namedParameterNodesQuery(parametersNode),
|
|
113
|
+
array = arrayFromNamedParameterNodes(namedParameterNodes, context),
|
|
114
|
+
namedParameters = new NamedParameters(string, array);
|
|
115
|
+
|
|
116
|
+
return namedParameters;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
function arrayFromNamedParameterNodes(namedParameterNodes, context) {
|
|
121
|
+
const { NamedParameter } = dom,
|
|
122
|
+
array = namedParameterNodes.map((namedParameterNode) => { ///
|
|
123
|
+
const namedParameter = NamedParameter.fromNamedParameterNode(namedParameterNode, context);
|
|
124
|
+
|
|
125
|
+
return namedParameter;
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return array;
|
|
129
|
+
}
|