-
Notifications
You must be signed in to change notification settings - Fork 19
/
ConstructorReference.js
86 lines (74 loc) · 2.62 KB
/
ConstructorReference.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {SpelNode} from './SpelNode';
import {Stack} from '../lib/Stack';
/**
* Represents the invocation of a constructor. Either a constructor on a regular type or
* construction of an array. When an array is constructed, an initializer can be specified.
*
* <p>Examples:<br>
* new String('hello world')<br>
* new int[]{1,2,3,4}<br>
* new int[3] new int[3]{1,2,3}
*
* @author Andy Clement
* @author Juergen Hoeller
* @since 3.0
*/
function createNode(position, dimensions, nodes) {
var isArray = nodes !== undefined;
var dimension;
if (isArray) {
dimension = dimensions.length && dimensions[0] && dimensions[0].getType() === 'number' ? dimensions[0].getValue() : null;
} else {
nodes = dimensions;
dimensions = undefined;
}
const [_qualifiedIdentifier, ...args] = nodes;
var node = SpelNode.create('constructorref', position, ...nodes);
node.getRaw = function () {
return dimension;
};
node.getValue = function (state) {
if (isArray && args.length <= 1) {
var compiledArgs = [];
//populate arguments
args.forEach(function (arg) {
// reset the active context to root context for evaluating argument
const currentActiveContext = state.activeContext
state.activeContext = new Stack();
state.activeContext.push(state.rootContext);
// evaluate argument
compiledArgs.push(arg.getValue(state));
// reset the active context
state.activeContext = currentActiveContext;
});
if (args.length === 1) {
return compiledArgs[0];
} else {
return dimension ? new Array(dimension) : [];
}
}
throw {
name: 'MethodNotImplementedException',
message: 'ConstructorReference: Not implemented'
}
};
return node;
}
export var ConstructorReference = {
create: createNode
};