occam-furtle 3.0.305 → 3.0.310
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/element/assignment/array.js +20 -20
- package/lib/element/assignment/object.js +17 -14
- package/lib/element/binding/named.js +6 -6
- package/lib/element/binding.js +4 -4
- package/lib/element/every.js +8 -8
- package/lib/element/nodeQuery.js +5 -5
- package/lib/element/nodesQuery.js +5 -5
- package/lib/element/parameter.js +4 -4
- package/lib/element/primitive.js +42 -23
- package/lib/element/procedure/anonymous.js +4 -4
- package/lib/element/procedure.js +8 -10
- package/lib/element/reduce.js +6 -6
- package/lib/element/some.js +8 -8
- package/lib/element/term/comparison.js +4 -4
- package/lib/element/term/logical.js +7 -7
- package/lib/element/term/negated.js +5 -5
- package/lib/element/term.js +3 -3
- package/lib/element/ternary.js +5 -5
- package/lib/element/type.js +94 -0
- package/lib/element/value.js +56 -5
- package/lib/element/variable.js +4 -4
- package/lib/node/assignments/variable.js +4 -10
- package/lib/node/binding/named.js +2 -2
- package/lib/node/binding.js +16 -23
- package/lib/node/declaration/procedure.js +4 -10
- package/lib/node/parameter.js +5 -10
- package/lib/node/primitive.js +9 -9
- package/lib/node/procedure/anoymous.js +4 -10
- package/lib/node/type.js +41 -0
- package/lib/nominalValueProperties.js +86 -0
- package/lib/nominalValueProperty.js +45 -0
- package/lib/nonTerminalNodeMap.js +3 -1
- package/lib/preamble.js +2 -1
- package/lib/ruleNames.js +5 -1
- package/lib/typeNames.js +34 -0
- package/lib/utilities/element.js +50 -18
- package/lib/utilities/primitive.js +13 -9
- package/lib/utilities/string.js +35 -22
- package/lib/utilities/value.js +9 -20
- package/lib/utilities/values.js +3 -3
- package/package.json +2 -2
- package/src/element/assignment/array.js +31 -26
- package/src/element/assignment/object.js +20 -13
- package/src/element/binding/named.js +10 -6
- package/src/element/binding.js +5 -3
- package/src/element/every.js +9 -7
- package/src/element/nodeQuery.js +5 -4
- package/src/element/nodesQuery.js +5 -4
- package/src/element/parameter.js +5 -3
- package/src/element/primitive.js +56 -26
- package/src/element/procedure/anonymous.js +5 -3
- package/src/element/procedure.js +8 -12
- package/src/element/reduce.js +6 -5
- package/src/element/some.js +9 -7
- package/src/element/term/comparison.js +6 -3
- package/src/element/term/logical.js +8 -6
- package/src/element/term/negated.js +5 -4
- package/src/element/term.js +3 -2
- package/src/element/ternary.js +5 -4
- package/src/element/type.js +128 -0
- package/src/element/value.js +27 -3
- package/src/element/variable.js +5 -3
- package/src/node/assignments/variable.js +5 -13
- package/src/node/binding/named.js +1 -1
- package/src/node/binding.js +19 -30
- package/src/node/declaration/procedure.js +5 -13
- package/src/node/parameter.js +6 -14
- package/src/node/primitive.js +8 -8
- package/src/node/procedure/anoymous.js +5 -13
- package/src/node/type.js +43 -0
- package/src/nominalValueProperties.js +103 -0
- package/src/nominalValueProperty.js +55 -0
- package/src/nonTerminalNodeMap.js +3 -0
- package/src/preamble.js +1 -0
- package/src/ruleNames.js +1 -0
- package/src/typeNames.js +7 -0
- package/src/utilities/element.js +67 -19
- package/src/utilities/primitive.js +31 -22
- package/src/utilities/string.js +42 -24
- package/src/utilities/value.js +18 -31
- package/src/utilities/values.js +1 -2
- package/lib/nodeProperties.js +0 -78
- package/lib/nodeProperty.js +0 -45
- package/lib/types.js +0 -34
- package/src/nodeProperties.js +0 -89
- package/src/nodeProperty.js +0 -53
- package/src/types.js +0 -7
package/src/element/binding.js
CHANGED
|
@@ -37,10 +37,12 @@ export default define(class Binding extends Element {
|
|
|
37
37
|
|
|
38
38
|
context.trace(`Comparing the '${termString}' term against the '${bindingString}' binding...`);
|
|
39
39
|
|
|
40
|
-
const termType = term.getType()
|
|
40
|
+
const termType = term.getType(),
|
|
41
|
+
typeEqualToTermType = this.type.isEqualTo(termType);
|
|
41
42
|
|
|
42
|
-
if (
|
|
43
|
-
const
|
|
43
|
+
if (!typeEqualToTermType) {
|
|
44
|
+
const typeString = this.type.getString(),
|
|
45
|
+
message = `The '${termString}' term's '${termType}' type is not equal to the '${bindingString}' binding's '${typeString}' type.`,
|
|
44
46
|
exception = Exception.fromMessage(message);
|
|
45
47
|
|
|
46
48
|
throw exception;
|
package/src/element/every.js
CHANGED
|
@@ -7,7 +7,7 @@ import Exception from "../exception";
|
|
|
7
7
|
|
|
8
8
|
import { define } from "../elements";
|
|
9
9
|
import { valueFromNode, valueFromBoolean } from "../utilities/value";
|
|
10
|
-
import {
|
|
10
|
+
import { LIST_TYPE_NAME, BOOLEAN_TYPE_NAME } from "../typeNames";
|
|
11
11
|
|
|
12
12
|
const { asyncEvery } = asynchronousUtilities;
|
|
13
13
|
|
|
@@ -39,11 +39,12 @@ export default define(class Every extends Element {
|
|
|
39
39
|
|
|
40
40
|
value = this.variable.evaluate(context);
|
|
41
41
|
|
|
42
|
-
const valueType = value.getType()
|
|
42
|
+
const valueType = value.getType(),
|
|
43
|
+
valueTypeListType = valueType.isListType();
|
|
43
44
|
|
|
44
|
-
if (
|
|
45
|
+
if (valueTypeListType) {
|
|
45
46
|
const valueString = value.getString(),
|
|
46
|
-
message = `The '${valueString}' value's '${valueType}' type should be '${
|
|
47
|
+
message = `The '${valueString}' value's '${valueType}' type should be '${LIST_TYPE_NAME}'.`,
|
|
47
48
|
exception = Exception.fromMessage(message);
|
|
48
49
|
|
|
49
50
|
throw exception;
|
|
@@ -61,11 +62,12 @@ export default define(class Every extends Element {
|
|
|
61
62
|
|
|
62
63
|
value = await this.anonymousProcedure.call(values, context);
|
|
63
64
|
|
|
64
|
-
const valueType = value.getType()
|
|
65
|
+
const valueType = value.getType(),
|
|
66
|
+
valueTypeBooleanType = valueType.isBooleanType();
|
|
65
67
|
|
|
66
|
-
if (
|
|
68
|
+
if (!valueTypeBooleanType) {
|
|
67
69
|
const termString = term.getString(),
|
|
68
|
-
message = `The '${termString}' term's type is '${termType}' when it should be of type '${
|
|
70
|
+
message = `The '${termString}' term's type is '${termType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
|
|
69
71
|
exception = Exception.fromMessage(message);
|
|
70
72
|
|
|
71
73
|
throw exception;
|
package/src/element/nodeQuery.js
CHANGED
|
@@ -6,7 +6,7 @@ import { arrayUtilities } from "necessary";
|
|
|
6
6
|
import Exception from "../exception";
|
|
7
7
|
|
|
8
8
|
import { define } from "../elements";
|
|
9
|
-
import {
|
|
9
|
+
import { NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
|
|
10
10
|
import { valueFromNodeAndNominalValue } from "../utilities/value";
|
|
11
11
|
|
|
12
12
|
const { first } = arrayUtilities;
|
|
@@ -43,11 +43,12 @@ export default define(class NodeQuery extends Element {
|
|
|
43
43
|
|
|
44
44
|
value = this.variable.evaluate(context);
|
|
45
45
|
|
|
46
|
-
const valueType = value.getType()
|
|
46
|
+
const valueType = value.getType(),
|
|
47
|
+
valueTypeNominalValueType = valueType.isNominalValueType();
|
|
47
48
|
|
|
48
|
-
if (
|
|
49
|
+
if (!valueTypeNominalValueType) {
|
|
49
50
|
const valueString = value.getString(),
|
|
50
|
-
message = `The '${valueString}' value's '${valueType}' type should be '${
|
|
51
|
+
message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUE_TYPE_NAME}'.`,
|
|
51
52
|
exception = Exception.fromMessage(message);
|
|
52
53
|
|
|
53
54
|
throw exception;
|
|
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
|
|
|
5
5
|
import Exception from "../exception";
|
|
6
6
|
|
|
7
7
|
import { define } from "../elements";
|
|
8
|
-
import {
|
|
8
|
+
import { NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
|
|
9
9
|
import { valueFromNodesAndNominalValue } from "../utilities/value";
|
|
10
10
|
|
|
11
11
|
export default define(class NodesQuery extends Element {
|
|
@@ -40,11 +40,12 @@ export default define(class NodesQuery extends Element {
|
|
|
40
40
|
|
|
41
41
|
value = this.variable.evaluate(context);
|
|
42
42
|
|
|
43
|
-
const valueType = value.getType()
|
|
43
|
+
const valueType = value.getType(),
|
|
44
|
+
valueTypeNominalValueType = valueType.isNominalValueType();
|
|
44
45
|
|
|
45
|
-
if (
|
|
46
|
+
if (!valueTypeNominalValueType) {
|
|
46
47
|
const valueString = value.getString(),
|
|
47
|
-
message = `The '${valueString}' value's '${valueType}' type should be '${
|
|
48
|
+
message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUE_TYPE_NAME}'.`,
|
|
48
49
|
exception = Exception.fromMessage(message);
|
|
49
50
|
|
|
50
51
|
throw exception;
|
package/src/element/parameter.js
CHANGED
|
@@ -28,10 +28,12 @@ export default define(class Parameter extends Element {
|
|
|
28
28
|
|
|
29
29
|
context.trace(`Comparing the '${valueString}' value against the '${parameterString}' parameter...`);
|
|
30
30
|
|
|
31
|
-
const valueType = value.getType()
|
|
31
|
+
const valueType = value.getType(),
|
|
32
|
+
typeEqualToValueType = this.type.isEqualTo(valueType);
|
|
32
33
|
|
|
33
|
-
if (
|
|
34
|
-
const
|
|
34
|
+
if (!typeEqualToValueType) {
|
|
35
|
+
const typeString = ths.type.getString(),
|
|
36
|
+
message = `The '${valueString}' value's '${valueType}' type is not equal to the '${parameterString}' parameter's '${typeString}' type.`,
|
|
35
37
|
exception = Exception.fromMessage(message);
|
|
36
38
|
|
|
37
39
|
throw exception;
|
package/src/element/primitive.js
CHANGED
|
@@ -6,7 +6,7 @@ import { arrayUtilities } from "necessary";
|
|
|
6
6
|
import elements from "../elements";
|
|
7
7
|
|
|
8
8
|
import { define } from "../elements";
|
|
9
|
-
import {
|
|
9
|
+
import { LIST_TYPE_NAME, STRING_TYPE_NAME, NUMBER_TYPE_NAME, BOOLEAN_TYPE_NAME, NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
|
|
10
10
|
|
|
11
11
|
const { match } = arrayUtilities;
|
|
12
12
|
|
|
@@ -37,13 +37,33 @@ export default define(class Primitive extends Element {
|
|
|
37
37
|
isEqualTo(primitive) {
|
|
38
38
|
let equalTo = false;
|
|
39
39
|
|
|
40
|
-
const
|
|
40
|
+
const primitiveType = primitive.getType(),
|
|
41
|
+
typeEqualToPrimitiveType = this.type.isEqualTo(primitiveType);
|
|
41
42
|
|
|
42
|
-
if (
|
|
43
|
-
const value = primitive.getValue()
|
|
43
|
+
if (typeEqualToPrimitiveType) {
|
|
44
|
+
const value = primitive.getValue(),
|
|
45
|
+
typeName = this.type.getName();
|
|
44
46
|
|
|
45
|
-
switch (
|
|
46
|
-
case
|
|
47
|
+
switch (typeName) {
|
|
48
|
+
case LIST_TYPE_NAME: {
|
|
49
|
+
const listA = this.value, ///
|
|
50
|
+
listB = value, ///
|
|
51
|
+
matches = match(listA, listB, (valueA, valueB) => {
|
|
52
|
+
const matches = valueA.isEqualTo(valueB);
|
|
53
|
+
|
|
54
|
+
if (matches) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
if (matches) {
|
|
60
|
+
equalTo = true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
case STRING_TYPE_NAME: {
|
|
47
67
|
const stringLiteralA = this.value, ///
|
|
48
68
|
stringLiteralB = value; ///
|
|
49
69
|
|
|
@@ -54,7 +74,7 @@ export default define(class Primitive extends Element {
|
|
|
54
74
|
break;
|
|
55
75
|
}
|
|
56
76
|
|
|
57
|
-
case
|
|
77
|
+
case NUMBER_TYPE_NAME: {
|
|
58
78
|
const numberA = this.value, ///
|
|
59
79
|
numberB = value; ///
|
|
60
80
|
|
|
@@ -65,7 +85,7 @@ export default define(class Primitive extends Element {
|
|
|
65
85
|
break;
|
|
66
86
|
}
|
|
67
87
|
|
|
68
|
-
case
|
|
88
|
+
case BOOLEAN_TYPE_NAME: {
|
|
69
89
|
const booleanA = this.value, ///
|
|
70
90
|
booleanB = value; ///
|
|
71
91
|
|
|
@@ -76,7 +96,7 @@ export default define(class Primitive extends Element {
|
|
|
76
96
|
break;
|
|
77
97
|
}
|
|
78
98
|
|
|
79
|
-
case
|
|
99
|
+
case NOMINAL_VALUE_TYPE_NAME: {
|
|
80
100
|
const nominalValueA = this.value, ///
|
|
81
101
|
nomimalValueB = value, ///
|
|
82
102
|
matches = nominalValueA.match(nomimalValueB);
|
|
@@ -87,30 +107,40 @@ export default define(class Primitive extends Element {
|
|
|
87
107
|
|
|
88
108
|
break;
|
|
89
109
|
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
90
112
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
nominalValuesB = value, ///
|
|
94
|
-
matches = match(nominalValuesA, nominalValuesB, (nominalValueA, nomimalValueB) => {
|
|
95
|
-
const matches = nominalValueA.match(nomimalValueB);
|
|
113
|
+
return equalTo;
|
|
114
|
+
}
|
|
96
115
|
|
|
97
|
-
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
});
|
|
116
|
+
static name = "Primitive";
|
|
101
117
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
118
|
+
static fromPrimitiveValueAndType(primitiveValue, type, context) {
|
|
119
|
+
const value = primitiveValue, ///
|
|
120
|
+
typeName = type.getName();
|
|
105
121
|
|
|
106
|
-
|
|
107
|
-
}
|
|
122
|
+
let string;
|
|
108
123
|
|
|
124
|
+
switch (typeName) {
|
|
125
|
+
case NOMINAL_VALUE_TYPE_NAME: {
|
|
126
|
+
const nominalValue = value; ///
|
|
127
|
+
|
|
128
|
+
string = nominalValue.getString();
|
|
129
|
+
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
default: {
|
|
134
|
+
string = `${value}`;
|
|
135
|
+
|
|
136
|
+
break;
|
|
109
137
|
}
|
|
110
138
|
}
|
|
111
139
|
|
|
112
|
-
|
|
113
|
-
|
|
140
|
+
const node = null,
|
|
141
|
+
breakPoint = null,
|
|
142
|
+
primitive = new Primitive(context, string, node, breakPoint, type, value);
|
|
114
143
|
|
|
115
|
-
|
|
144
|
+
return primitive;
|
|
145
|
+
}
|
|
116
146
|
});
|
|
@@ -37,11 +37,13 @@ export default define(class AnonymousProcedure extends Element {
|
|
|
37
37
|
|
|
38
38
|
const variables = variablesFromValuesAndParameters(values, this.parameters, context),
|
|
39
39
|
value = await this.returnBlock.evaluate(variables, context),
|
|
40
|
-
valueType = value.getType()
|
|
40
|
+
valueType = value.getType(),
|
|
41
|
+
typeEqualToValueType = this.type.isEqualTo(valueType);
|
|
41
42
|
|
|
42
|
-
if (
|
|
43
|
+
if (!typeEqualToValueType) {
|
|
43
44
|
const valueString = value.getString(),
|
|
44
|
-
|
|
45
|
+
typeString = this.type.getString(),
|
|
46
|
+
message = `The '${valueString}' value's '${valueType}' type is not equal to the '${anonymousProcedureString}' anonymous procedure's '${typeString}' type.`,
|
|
45
47
|
exception = Exception.fromMessage(message);
|
|
46
48
|
|
|
47
49
|
throw exception;
|
package/src/element/procedure.js
CHANGED
|
@@ -5,7 +5,6 @@ import { Element } from "occam-languages";
|
|
|
5
5
|
import Exception from "../exception";
|
|
6
6
|
|
|
7
7
|
import { define } from "../elements";
|
|
8
|
-
import { BOOLEAN_TYPE } from "../types";
|
|
9
8
|
import { valuesFromNominalValues } from "../utilities/values";
|
|
10
9
|
import { variablesFromValuesAndParameters } from "../utilities/parameters";
|
|
11
10
|
|
|
@@ -35,15 +34,10 @@ export default define(class Procedure extends Element {
|
|
|
35
34
|
return this.returnBlock;
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
isBoolean() {
|
|
39
|
-
const typeBooleanType = (this.type === BOOLEAN_TYPE),
|
|
40
|
-
boolean = typeBooleanType; ///
|
|
41
|
-
|
|
42
|
-
return boolean;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
37
|
getName() { return this.label.getName(); }
|
|
46
38
|
|
|
39
|
+
isBooleanType() { return this.type.isBooleanType(); }
|
|
40
|
+
|
|
47
41
|
getReturnStatement() { return this.returnBlock.getReturnStatement(); }
|
|
48
42
|
|
|
49
43
|
compareProcedureName(procedureName) { return this.label.compareProcedureName(procedureName); }
|
|
@@ -59,11 +53,13 @@ export default define(class Procedure extends Element {
|
|
|
59
53
|
|
|
60
54
|
const variables = variablesFromValuesAndParameters(values, this.parameters, context),
|
|
61
55
|
value = await this.returnBlock.evaluate(variables, context),
|
|
62
|
-
valueType = value.getType()
|
|
56
|
+
valueType = value.getType(),
|
|
57
|
+
typeEqualToValueType = this.type.isEqualTo(valueType);
|
|
63
58
|
|
|
64
|
-
if (
|
|
59
|
+
if (!typeEqualToValueType) {
|
|
65
60
|
const valueString = value.getString(),
|
|
66
|
-
|
|
61
|
+
typeString = this.type.getString(),
|
|
62
|
+
message = `The '${valueString}' value's '${typeString}' type is not equal to the '${procedureString}' procedure's '${typeString}' type.`,
|
|
67
63
|
exception = Exception.fromMessage(message);
|
|
68
64
|
|
|
69
65
|
throw exception;
|
|
@@ -83,7 +79,7 @@ export default define(class Procedure extends Element {
|
|
|
83
79
|
|
|
84
80
|
context.trace(`Calling the '${procedureString}' procedure nominally...`);
|
|
85
81
|
|
|
86
|
-
const values = valuesFromNominalValues(nominalValues),
|
|
82
|
+
const values = valuesFromNominalValues(nominalValues, context),
|
|
87
83
|
term = await this.call(values, context);
|
|
88
84
|
|
|
89
85
|
context.debug(`...called the '${procedureString}' procedure nominally.`);
|
package/src/element/reduce.js
CHANGED
|
@@ -6,8 +6,8 @@ import elements from "../elements";
|
|
|
6
6
|
import Exception from "../exception";
|
|
7
7
|
|
|
8
8
|
import { define } from "../elements";
|
|
9
|
-
import { NOMINAL_VALUES_TYPE } from "../types";
|
|
10
9
|
import { valueFromNominalValue } from "../utilities/value";
|
|
10
|
+
import { LIST_TYPE_NAME } from "../typeNames";
|
|
11
11
|
|
|
12
12
|
const { asyncReduce } = asynchronousUtilities;
|
|
13
13
|
|
|
@@ -43,11 +43,12 @@ export default define(class Reduce extends Element {
|
|
|
43
43
|
|
|
44
44
|
value = this.variable.evaluate(context);
|
|
45
45
|
|
|
46
|
-
const valueType = value.getType()
|
|
46
|
+
const valueType = value.getType(),
|
|
47
|
+
valueTypeListType = valueType.isListType();
|
|
47
48
|
|
|
48
|
-
if (
|
|
49
|
+
if (!valueTypeListType) {
|
|
49
50
|
const valueString = value.getString(),
|
|
50
|
-
message = `The '${valueString}' value's '${valueType}' type should be '${
|
|
51
|
+
message = `The '${valueString}' value's '${valueType}' type should be '${LIST_TYPE_NAME}'.`,
|
|
51
52
|
exception = Exception.fromMessage(message);
|
|
52
53
|
|
|
53
54
|
throw exception;
|
|
@@ -66,7 +67,7 @@ export default define(class Reduce extends Element {
|
|
|
66
67
|
|
|
67
68
|
const values = Values.fromValue(value, context);
|
|
68
69
|
|
|
69
|
-
value = valueFromNominalValue(nominalValue
|
|
70
|
+
value = valueFromNominalValue(nominalValue);
|
|
70
71
|
|
|
71
72
|
values.addValue(value);
|
|
72
73
|
|
package/src/element/some.js
CHANGED
|
@@ -6,7 +6,7 @@ import elements from "../elements";
|
|
|
6
6
|
import Exception from "../exception";
|
|
7
7
|
|
|
8
8
|
import { define } from "../elements";
|
|
9
|
-
import {
|
|
9
|
+
import { LIST_TYPE_NAME, BOOLEAN_TYPE_NAME } from "../typeNames";
|
|
10
10
|
import { valueFromBoolean, valueFromNominalValue } from "../utilities/value";
|
|
11
11
|
|
|
12
12
|
const { asyncSome } = asynchronousUtilities;
|
|
@@ -38,11 +38,12 @@ export default define(class Some extends Element {
|
|
|
38
38
|
|
|
39
39
|
value = this.variable.evaluate(context);
|
|
40
40
|
|
|
41
|
-
const valueType = value.getType()
|
|
41
|
+
const valueType = value.getType(),
|
|
42
|
+
valueTypeListType = valueType.isListType();
|
|
42
43
|
|
|
43
|
-
if (
|
|
44
|
+
if (!valueTypeListType) {
|
|
44
45
|
const valueString = value.getString(),
|
|
45
|
-
message = `The '${valueString}' value's '${valueType}' type should be '${
|
|
46
|
+
message = `The '${valueString}' value's '${valueType}' type should be '${LIST_TYPE_NAME}'.`,
|
|
46
47
|
exception = Exception.fromMessage(message);
|
|
47
48
|
|
|
48
49
|
throw exception;
|
|
@@ -60,11 +61,12 @@ export default define(class Some extends Element {
|
|
|
60
61
|
|
|
61
62
|
value = await this.anonymousProcedure.call(values, context);
|
|
62
63
|
|
|
63
|
-
const valueType = value.getType()
|
|
64
|
+
const valueType = value.getType(),
|
|
65
|
+
valueTypeBooleanType = valueType.isBooleanType();
|
|
64
66
|
|
|
65
|
-
if (
|
|
67
|
+
if (!valueTypeBooleanType) {
|
|
66
68
|
const valueString = value.getString(),
|
|
67
|
-
message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${
|
|
69
|
+
message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
|
|
68
70
|
exception = Exception.fromMessage(message);
|
|
69
71
|
|
|
70
72
|
throw exception;
|
|
@@ -38,12 +38,15 @@ export default define(class ComparisonTerm extends Element {
|
|
|
38
38
|
const leftValue = this.leftTerm.evaluate(context),
|
|
39
39
|
rightValue = this.rightTerm.evaluate(context),
|
|
40
40
|
leftValueType = leftValue.getType(),
|
|
41
|
-
rightValueType = rightValue.getType()
|
|
41
|
+
rightValueType = rightValue.getType(),
|
|
42
|
+
leftValueTypeEqualToRightValueType = leftValueType.isEqualTo(rightValueType);
|
|
42
43
|
|
|
43
|
-
if (
|
|
44
|
+
if (!leftValueTypeEqualToRightValueType) {
|
|
44
45
|
const leftValueString = leftValue.getString(),
|
|
45
46
|
rightValueString = rightValue.getString(),
|
|
46
|
-
|
|
47
|
+
leftValueTypeString = leftValueType.getString(),
|
|
48
|
+
rightValueTypeString = rightValueType.getString(),
|
|
49
|
+
message = `The '${leftValueString}' left term's type is '${leftValueTypeString}' whereas the '${rightValueString}' right term's type is '${rightValueTypeString}'.`,
|
|
47
50
|
exception = Exception.fromMessage(message);
|
|
48
51
|
|
|
49
52
|
throw exception;
|
|
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
|
|
|
5
5
|
import Exception from "../../exception";
|
|
6
6
|
|
|
7
7
|
import { define } from "../../elements";
|
|
8
|
-
import {
|
|
8
|
+
import { BOOLEAN_TYPE_NAME } from "../../typeNames";
|
|
9
9
|
import { valueFromBoolean } from "../../utilities/value";
|
|
10
10
|
|
|
11
11
|
export default define(class LogicalTerm extends Element {
|
|
@@ -44,19 +44,21 @@ export default define(class LogicalTerm extends Element {
|
|
|
44
44
|
const leftValue = this.leftTerm.evaluate(context),
|
|
45
45
|
rightValue = this.rightTerm.evaluate(context),
|
|
46
46
|
leftValueType = leftValue.getType(),
|
|
47
|
-
rightValueType = rightValue.getType()
|
|
47
|
+
rightValueType = rightValue.getType(),
|
|
48
|
+
leftValueTypeBooleanType = leftValueType.isBooleanType(),
|
|
49
|
+
rightValueTypeBooleanType = rightValueType.isBooleanType();
|
|
48
50
|
|
|
49
|
-
if (
|
|
51
|
+
if (!leftValueTypeBooleanType) {
|
|
50
52
|
const leftValueString = leftValue.getString(),
|
|
51
|
-
message = `The '${leftValueString}' left term's type is '${leftValueType}' when it should be of type '${
|
|
53
|
+
message = `The '${leftValueString}' left term's type is '${leftValueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
|
|
52
54
|
exception = Exception.fromMessage(message);
|
|
53
55
|
|
|
54
56
|
throw exception;
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
if (
|
|
59
|
+
if (!rightValueTypeBooleanType) {
|
|
58
60
|
const rightValueString = rightValue.getString(),
|
|
59
|
-
message = `The '${rightValueString}' right term's type is '${rightValueType}' when it should be of type '${
|
|
61
|
+
message = `The '${rightValueString}' right term's type is '${rightValueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
|
|
60
62
|
exception = Exception.fromMessage(message);
|
|
61
63
|
|
|
62
64
|
throw exception;
|
|
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
|
|
|
5
5
|
import Exception from "../../exception";
|
|
6
6
|
|
|
7
7
|
import { define } from "../../elements";
|
|
8
|
-
import {
|
|
8
|
+
import { BOOLEAN_TYPE_NAME } from "../../typeNames";
|
|
9
9
|
import { valueFromBoolean } from "../../utilities/value";
|
|
10
10
|
|
|
11
11
|
export default define(class NegatedTerm extends Element {
|
|
@@ -33,11 +33,12 @@ export default define(class NegatedTerm extends Element {
|
|
|
33
33
|
|
|
34
34
|
value = this.term.evaluate(context);
|
|
35
35
|
|
|
36
|
-
const valueType = value.getType()
|
|
36
|
+
const valueType = value.getType(),
|
|
37
|
+
valueTypeBooleanType = valueType.isBooleanType();
|
|
37
38
|
|
|
38
|
-
if (
|
|
39
|
+
if (!valueTypeBooleanType) {
|
|
39
40
|
const valueString = value.getString(),
|
|
40
|
-
message = `The '${valueString}' left value's type is '${valueType}' when it should be of type '${
|
|
41
|
+
message = `The '${valueString}' left value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
|
|
41
42
|
exception = Exception.fromMessage(message);
|
|
42
43
|
|
|
43
44
|
throw exception;
|
package/src/element/term.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { Element } from "occam-languages";
|
|
4
4
|
|
|
5
5
|
import { define } from "../elements";
|
|
6
|
-
import {
|
|
6
|
+
import { BOOLEAN_TYPE_NAME } from "../typeNames";
|
|
7
7
|
|
|
8
8
|
export default define(class Term extends Element {
|
|
9
9
|
constructor(context, string, node, breakPoint, variable, primitive, negatedTerm, logicalTerm, bracketedTerm, comparisonTerm) {
|
|
@@ -71,7 +71,8 @@ export default define(class Term extends Element {
|
|
|
71
71
|
|
|
72
72
|
isBoolean() {
|
|
73
73
|
const type = this.getType(),
|
|
74
|
-
|
|
74
|
+
booleanType = type.isBooleanType(),
|
|
75
|
+
boolean = booleanType; ///
|
|
75
76
|
|
|
76
77
|
return boolean;
|
|
77
78
|
}
|
package/src/element/ternary.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
|
|
|
5
5
|
import Exception from "../exception";
|
|
6
6
|
|
|
7
7
|
import { define } from "../elements";
|
|
8
|
-
import {
|
|
8
|
+
import { BOOLEAN_TYPE_NAME } from "../typeNames";
|
|
9
9
|
|
|
10
10
|
export default define(class Ternary extends Element {
|
|
11
11
|
constructor(context, string, node, breakPoint, term, ifExpression, elseExpression) {
|
|
@@ -37,11 +37,12 @@ export default define(class Ternary extends Element {
|
|
|
37
37
|
|
|
38
38
|
value = this.term.evaluate(context);
|
|
39
39
|
|
|
40
|
-
const valueType = value.getType()
|
|
40
|
+
const valueType = value.getType(),
|
|
41
|
+
valueTypeBooleanType = valueType.isBooleanType();
|
|
41
42
|
|
|
42
|
-
if (
|
|
43
|
+
if (!valueTypeBooleanType) {
|
|
43
44
|
const valueString = value.getString(),
|
|
44
|
-
message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${
|
|
45
|
+
message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
|
|
45
46
|
exception = Exception.fromMessage(message);
|
|
46
47
|
|
|
47
48
|
throw exception;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Element } from "occam-languages";
|
|
4
|
+
|
|
5
|
+
import { define } from "../elements";
|
|
6
|
+
|
|
7
|
+
import { typeStringFromTypeNameAndArgumentTypeName } from "../utilities/string";
|
|
8
|
+
import { LIST_TYPE_NAME, STRING_TYPE_NAME, NUMBER_TYPE_NAME, BOOLEAN_TYPE_NAME, NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
|
|
9
|
+
|
|
10
|
+
export default define(class Type extends Element {
|
|
11
|
+
constructor(context, string, node, breakPoint, name, argumentType) {
|
|
12
|
+
super(context, string, node, breakPoint);
|
|
13
|
+
|
|
14
|
+
this.name = name;
|
|
15
|
+
this.argumentType = argumentType;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
getName() {
|
|
19
|
+
return this.name;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getArgumentType() {
|
|
23
|
+
return this.argumentType;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
isListType() {
|
|
27
|
+
const listType = (this.name === LIST_TYPE_NAME);
|
|
28
|
+
|
|
29
|
+
return listType;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
isStringType() {
|
|
33
|
+
const booleanType = (this.name === STRING_TYPE_NAME);
|
|
34
|
+
|
|
35
|
+
return booleanType;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
isNumberType() {
|
|
39
|
+
const numberType = (this.name === NUMBER_TYPE_NAME);
|
|
40
|
+
|
|
41
|
+
return numberType;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
isBooleanType() {
|
|
45
|
+
const booleanType = (this.name === BOOLEAN_TYPE_NAME);
|
|
46
|
+
|
|
47
|
+
return booleanType;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
isNominalValueType() {
|
|
51
|
+
const listType = (this.name === NOMINAL_VALUE_TYPE_NAME);
|
|
52
|
+
|
|
53
|
+
return listType;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
isEqualTo(type) {
|
|
57
|
+
let equalTo = false;
|
|
58
|
+
|
|
59
|
+
const typeName = type.getName();
|
|
60
|
+
|
|
61
|
+
if (this.name === typeName) {
|
|
62
|
+
switch (this.name) {
|
|
63
|
+
case LIST_TYPE_NAME: {
|
|
64
|
+
const typeArgumentType = type.getArgumentType();
|
|
65
|
+
|
|
66
|
+
if ((this.argumentType === null) || (typeArgumentType === null)) {
|
|
67
|
+
if (this.argumentType === typeArgumentType) {
|
|
68
|
+
equalTo = true;
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
const arguemntTypeEqualToTypeArgumentType = this.argumentType.isEqualTo(typeArgumentType);
|
|
72
|
+
|
|
73
|
+
if (arguemntTypeEqualToTypeArgumentType) {
|
|
74
|
+
equalTo = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
default: {
|
|
82
|
+
equalTo = true;
|
|
83
|
+
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return equalTo;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static name = "Type";
|
|
93
|
+
|
|
94
|
+
static fromTypeName(typeName, context) {
|
|
95
|
+
let type = null;
|
|
96
|
+
|
|
97
|
+
if (typeName !== null) {
|
|
98
|
+
const node = null, ///
|
|
99
|
+
name = typeName, ///
|
|
100
|
+
argumentType = null,
|
|
101
|
+
typeString = typeName, ///
|
|
102
|
+
string = typeString, ///
|
|
103
|
+
breakPoint = null;
|
|
104
|
+
|
|
105
|
+
context = null;
|
|
106
|
+
|
|
107
|
+
type = new Type(context, string, node, breakPoint, name, argumentType);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return type;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static fromTypeNameAndArgumentTypeName(typeName, argumentTypeName, context) {
|
|
114
|
+
const node = null, ///
|
|
115
|
+
name = typeName, ///
|
|
116
|
+
argumentType = Type.fromTypeName(argumentTypeName, context),
|
|
117
|
+
typeString = typeStringFromTypeNameAndArgumentTypeName(typeName, argumentTypeName),
|
|
118
|
+
string = typeString, ///
|
|
119
|
+
breakPoint = null;
|
|
120
|
+
|
|
121
|
+
context = null;
|
|
122
|
+
|
|
123
|
+
const type = new Type(context, string, node, breakPoint, name, argumentType);
|
|
124
|
+
|
|
125
|
+
return type;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
});
|