occam-furtle 3.0.519 → 3.0.521

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.
@@ -5,6 +5,7 @@ import { Element } from "occam-languages";
5
5
  import { define } from "../elements";
6
6
  import { instantiateImportBinding } from "../process/instantiate";
7
7
  import { labelFromJSON, labelToLabelJSON, referenceFromJSON, referenceToReferenceJSON } from "../utilities/json";
8
+ import {instantiate} from "../utilities/context";
8
9
 
9
10
  export default define(class ImportBinding extends Element {
10
11
  constructor(context, string, node, breakPoint, label, reference) {
@@ -22,11 +23,33 @@ export default define(class ImportBinding extends Element {
22
23
  return this.reference;
23
24
  }
24
25
 
25
- getProcedureName() {
26
+ getLabelledProcedureName() {
27
+ const labelName = this.label.getName(),
28
+ labelledProcedureName = labelName; ///
29
+
30
+ return labelledProcedureName;
31
+ }
32
+
33
+ getReferencedProcedureName() {
26
34
  const referenceName = this.reference.getName(),
27
- procedureName = referenceName; ///
35
+ referencedProcedureName = referenceName; ///
36
+
37
+ return referencedProcedureName;
38
+ }
28
39
 
29
- return procedureName;
40
+ isAllowed() {
41
+ const labelledProcedureName = this.getLabelledProcedureName(),
42
+ referencedProcedureName = this.getReferencedProcedureName(),
43
+ aliased = (labelledProcedureName !== referencedProcedureName);
44
+
45
+ return aliased;
46
+ }
47
+
48
+ compareLablledProcedureName(labelledProcedureName) {
49
+ const labelName = this.label.getName(),
50
+ labelledProcedureNameCompares = (labelName === labelledProcedureName);
51
+
52
+ return labelledProcedureNameCompares;
30
53
  }
31
54
 
32
55
  verify(releaseName, context, forward, back) {
@@ -34,17 +57,73 @@ export default define(class ImportBinding extends Element {
34
57
 
35
58
  context.trace(`Verifying the '${importBindingString}' import binding...`);
36
59
 
37
- const procedureName = this.getProcedureName(),
38
- procedure = context.findProcedureByProcedureName(procedureName);
60
+ let procedureName,
61
+ procedurePresent;
62
+
63
+ const referencedProcedureName = this.getReferencedProcedureName();
39
64
 
40
- if (procedure === null) {
65
+ procedureName = referencedProcedureName; ///
66
+
67
+ procedurePresent = context.isProcedurePresentByProcedureName(procedureName);
68
+
69
+ if (!procedurePresent) {
41
70
  context.trace(`The '${procedureName}' procedure is not present.`);
42
71
 
43
72
  return back();
44
73
  }
45
74
 
46
- const releaseNameCompares = procedure.compareReleaseName(releaseName);
75
+ const labelledProcedureName = this.getLabelledProcedureName();
76
+
77
+ procedureName = labelledProcedureName; ///
78
+
79
+ const aliased = this.isAllowed();
80
+
81
+ if (aliased) {
82
+ procedurePresent = context.isProcedurePresentByProcedureName(procedureName);
83
+
84
+ if (procedurePresent) {
85
+ context.trace(`The '${procedureName}' procedure is already present.`);
86
+
87
+ return back();
88
+ }
89
+ }
90
+
91
+ const importBindingPresent = context.isImportBindingPresentByLabelledProcedureName(labelledProcedureName);
92
+
93
+ if (importBindingPresent) {
94
+ const labelString = this.label.getString();
95
+
96
+ context.trace(`The '${importBindingString}' import binding's '${labelString}' label is already present...`);
97
+
98
+ return back();
99
+ }
100
+
101
+ procedureName = referencedProcedureName; ///
102
+
103
+ const procedure = context.findProcedureByProcedureName(procedureName),
104
+ releaseNameCompares = procedure.compareReleaseName(releaseName);
105
+
106
+ if (!releaseNameCompares) {
107
+ context.trace(`The '${procedureName}' procedure is not in the '${releaseName}' package.`);
108
+
109
+ return back();
110
+ }
111
+
112
+ const exported = procedure.isExported();
113
+
114
+ if (!exported) {
115
+ context.trace(`The '${procedureName}' procedure is not exported.`);
116
+
117
+ return back();
118
+ }
119
+
120
+ const importBinding = this;
121
+
122
+ context.addImportBinding(importBinding);
123
+
124
+ context.debug(`...verified the '${importBindingString}' import binding.`);
47
125
 
126
+ return forward(context, back);
48
127
  }
49
128
 
50
129
  toJSON() {
@@ -68,13 +147,18 @@ export default define(class ImportBinding extends Element {
68
147
  static name = "ImportBinding";
69
148
 
70
149
  static fromJSON(json, context) {
71
- const { string } = json,
72
- breakPoint = null,
73
- importBindingNode = instantiateImportBinding(string, context),
74
- label = labelFromJSON(json, context),
75
- reference = referenceFromJSON(json, context),
76
- node = importBindingNode, ///
77
- importBinding = new ImportBinding(context, string, node, breakPoint, label, reference);
150
+ let importBinding;
151
+
152
+ instantiate((context) => {
153
+ const { string } = json,
154
+ breakPoint = null,
155
+ importBindingNode = instantiateImportBinding(string, context),
156
+ label = labelFromJSON(json, context),
157
+ reference = referenceFromJSON(json, context),
158
+ node = importBindingNode; ///
159
+
160
+ importBinding = new ImportBinding(context, string, node, breakPoint, label, reference);
161
+ }, context);
78
162
 
79
163
  return importBinding;
80
164
  }
@@ -69,7 +69,9 @@ export default define(class ImportStatement extends Element {
69
69
  static name = "ImportStatement";
70
70
 
71
71
  static fromJSON(json, context) {
72
- return instantiate((context) => {
72
+ let importStatement;
73
+
74
+ instantiate((context) => {
73
75
  const { string } = json,
74
76
  importStatementNode = instantiateImportStatement(string, context),
75
77
  node = importStatementNode, ///
@@ -79,9 +81,9 @@ export default define(class ImportStatement extends Element {
79
81
 
80
82
  context = null;
81
83
 
82
- const importStatement = new ImportStatement(context, string, node, breakPoint, releaseName, importBindings);
83
-
84
- return importStatement;
84
+ importStatement = new ImportStatement(context, string, node, breakPoint, releaseName, importBindings);
85
85
  }, context);
86
+
87
+ return importStatement;
86
88
  }
87
89
  });
@@ -39,7 +39,9 @@ export default define(class Label extends Element {
39
39
  static name = "Label";
40
40
 
41
41
  static fromJSON(json, context) {
42
- return instantiate((context) => {
42
+ let label;
43
+
44
+ instantiate((context) => {
43
45
  const { string } = json,
44
46
  labelNode = instantiateLabel(string, context),
45
47
  node = labelNode, ///
@@ -48,9 +50,9 @@ export default define(class Label extends Element {
48
50
 
49
51
  context = null;
50
52
 
51
- const label = new Label(context, string, node, breakPoint, name);
52
-
53
- return label;
53
+ label = new Label(context, string, node, breakPoint, name);
54
54
  }, context);
55
+
56
+ return label;
55
57
  }
56
58
  });
@@ -84,7 +84,9 @@ export default define(class Parameters extends Element {
84
84
  static name = "Parameters";
85
85
 
86
86
  static fromJSON(json, context) {
87
- return instantiate((context) => {
87
+ let parameters;
88
+
89
+ instantiate((context) => {
88
90
  const { string } = json,
89
91
  parametersNode = instantiateParameters(string, context),
90
92
  node = parametersNode, ///
@@ -94,9 +96,9 @@ export default define(class Parameters extends Element {
94
96
 
95
97
  context = null;
96
98
 
97
- const parameters = new Parameters(context, string, node, breakPoint, array);
98
-
99
- return parameters;
99
+ parameters = new Parameters(context, string, node, breakPoint, array);
100
100
  }, context);
101
+
102
+ return parameters;
101
103
  }
102
104
  });
@@ -31,16 +31,25 @@ export default define(class ProcedureCall extends Element {
31
31
  context.trace(`Evaluating the '${procedureCallString}' function call...`);
32
32
 
33
33
  const procedureName = this.getProcedureName(),
34
- procedurePresent = context.isProcedurePresentByProcedureName(procedureName);
34
+ procedurePresent = context.isProcedurePresentByProcedureName(procedureName),
35
+ importedProcedurePresent = context.isImportedProcedurePresentByProcedureName(procedureName);
35
36
 
36
- if (!procedurePresent) {
37
+ if (!procedurePresent && !importedProcedurePresent) {
37
38
  const message = `The '${procedureCallString}' function is not present.'`,
38
39
  exception = Exception.fromMessage(message);
39
40
 
40
41
  return back(exception);
41
42
  }
42
43
 
43
- const procedure = context.findProcedureByProcedureName(procedureName);
44
+ let procedure;
45
+
46
+ if (!importedProcedurePresent) {
47
+ procedure = context.findProcedureByProcedureName(procedureName);
48
+ } else {
49
+ const importedProcedure = context.findImportedProcedureByProcedureName(procedureName);
50
+
51
+ procedure = importedProcedure; ///
52
+ }
44
53
 
45
54
  return this.values.evaluate(context, (values, back) => {
46
55
  return free((context) => {
@@ -39,7 +39,9 @@ export default define(class Reference extends Element {
39
39
  static name = "Reference";
40
40
 
41
41
  static fromJSON(json, context) {
42
- return instantiate((context) => {
42
+ let reference;
43
+
44
+ instantiate((context) => {
43
45
  const { string } = json,
44
46
  referencelNode = instantiateReference(string, context),
45
47
  node = referencelNode, ///
@@ -48,9 +50,9 @@ export default define(class Reference extends Element {
48
50
 
49
51
  context = null;
50
52
 
51
- const referencel = new Reference(context, string, node, breakPoint, name);
52
-
53
- return referencel;
53
+ reference = new Reference(context, string, node, breakPoint, name);
54
54
  }, context);
55
+
56
+ return reference;
55
57
  }
56
58
  });
@@ -110,7 +110,9 @@ export default define(class Type extends Element {
110
110
  static name = "Type";
111
111
 
112
112
  static fromJSON(json, context) {
113
- return instantiate((context) => {
113
+ let type;
114
+
115
+ instantiate((context) => {
114
116
  const { string } = json,
115
117
  typeNode = instantiateType(string, context),
116
118
  node = typeNode, ///
@@ -120,10 +122,10 @@ export default define(class Type extends Element {
120
122
 
121
123
  context = null;
122
124
 
123
- const type = new Type(context, string, node, breakPoint, name, argumentType);
124
-
125
- return type;
125
+ type = new Type(context, string, node, breakPoint, name, argumentType);
126
126
  }, context);
127
+
128
+ return type;
127
129
  }
128
130
 
129
131
  static fromTypeName(typeName, context) {
@@ -32,34 +32,6 @@ const bnf = `
32
32
 
33
33
 
34
34
 
35
- importBindings ::= importBinding ( "," importBinding )* ;
36
-
37
- namedBindings ::= namedBinding ( "," namedBinding )* ;
38
-
39
- parameters ::= parameter ( "," parameter )* ;
40
-
41
- bindings ::= binding ( "," binding )* ;
42
-
43
- values ::= value ( "," value )* ;
44
-
45
- terms ::= term ( "," term )* ;
46
-
47
-
48
-
49
- importBinding ::= reference ( "as" label )? ;
50
-
51
- namedBinding ::= type [name] ( "as" [name] )? ;
52
-
53
- parameter ::= type [name] ;
54
-
55
- binding ::= type [name]
56
-
57
- | ε
58
-
59
- ;
60
-
61
-
62
-
63
35
  procedureCall ::= reference<NO_WHITESPACE>"(" values? ")" ;
64
36
 
65
37
  returnBlock.. ::= "{" ( statement | nonsense )* returnStatement "}" ;
@@ -71,6 +43,10 @@ const bnf = `
71
43
  every ::= "every"<NO_WHITESPACE>"(" variable "," anonymousProcedure ")" ;
72
44
 
73
45
  some ::= "some"<NO_WHITESPACE>"(" variable "," anonymousProcedure ")" ;
46
+
47
+ all ::= "all"<NO_WHITESPACE>"(" variable "," referencesListLiteral ( "," values )? ")" ;
48
+
49
+ exists ::= "exists"<NO_WHITESPACE>"(" variable "," referencesListLiteral ( "," values )? ")" ;
74
50
 
75
51
 
76
52
 
@@ -96,6 +72,40 @@ const bnf = `
96
72
 
97
73
 
98
74
 
75
+ referencesListLiteral ::= "[" references? "]" ;
76
+
77
+
78
+
79
+ importBindings ::= importBinding ( "," importBinding )* ;
80
+
81
+ namedBindings ::= namedBinding ( "," namedBinding )* ;
82
+
83
+ parameters ::= parameter ( "," parameter )* ;
84
+
85
+ references ::= reference ( "," reference )* ;
86
+
87
+ bindings ::= binding ( "," binding )* ;
88
+
89
+ values ::= value ( "," value )* ;
90
+
91
+ terms ::= term ( "," term )* ;
92
+
93
+
94
+
95
+ importBinding ::= reference ( "as" label )? ;
96
+
97
+ namedBinding ::= type [name] ( "as" [name] )? ;
98
+
99
+ parameter ::= type [name] ;
100
+
101
+ binding ::= type [name]
102
+
103
+ | ε
104
+
105
+ ;
106
+
107
+
108
+
99
109
  comparisonTerm ::= term ( "==" | "!=" ) term ;
100
110
 
101
111
  bracketedTerm ::= "(" term ")" ;
@@ -118,6 +128,10 @@ const bnf = `
118
128
 
119
129
  | some
120
130
 
131
+ | all
132
+
133
+ | exists
134
+
121
135
  | nodesQuery
122
136
 
123
137
  | nodeQuery
@@ -156,7 +170,7 @@ const bnf = `
156
170
 
157
171
 
158
172
 
159
- type ::= "List"<NO_WHITESPACE>"<" ( "Node" | "String" | "Boolean" | "Integer" ) ">"
173
+ type ::= "List"<NO_WHITESPACE>"<" ( "Node" | "String" | "Boolean" | "Integer" ) ">"
160
174
 
161
175
  | "Node"
162
176
 
@@ -192,7 +206,7 @@ const bnf = `
192
206
 
193
207
  reference. ::= [name] ;
194
208
 
195
- variable ::= [name] ;
209
+ variable. ::= [name] ;
196
210
 
197
211
  label. ::= [name] ;
198
212
 
@@ -14,7 +14,7 @@ const entries = [
14
14
  "secondary-keyword": "^(?:as|if|else)"
15
15
  },
16
16
  {
17
- "function-name": "^(?:nodeQuery|nodesQuery|reduce|every|some|lengthOf|toInteger|tryInteger|startsWith|endsWith|contains)"
17
+ "function-name": "^(?:nodeQuery|nodesQuery|reduce|every|some|lengthOf|toInteger|tryInteger|startsWith|endsWith|contains|all|exists)"
18
18
  },
19
19
  {
20
20
  "type": "^(?:List|Node|String|Boolean|Integer)"