Added support for batch property setting during element creation
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java
index dc773a3..7cfac37 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java
@@ -10,6 +10,7 @@
package org.eclipse.epsilon.eol.dom;
import java.util.ArrayList;
+import java.util.LinkedHashMap;
import java.util.List;
import org.eclipse.epsilon.eol.exceptions.EolIllegalPropertyException;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
@@ -51,23 +52,19 @@
instance = parameterValues.isEmpty() ? type.createInstance() : type.createInstance(parameterValues);
+ IPropertySetter setter = null;
+ LinkedHashMap<String, Object> properties = new LinkedHashMap<String, Object>();
+
for (Expression parameter : parameters) {
if (parameter.getClass() == EqualsOperatorExpression.class) {
EqualsOperatorExpression equalsOperatorExpression = (EqualsOperatorExpression) parameter;
if (equalsOperatorExpression.getFirstOperand() instanceof NameExpression) {
String property = ((NameExpression) equalsOperatorExpression.getFirstOperand()).getName();
- IPropertySetter setter = context.getIntrospectionManager().getPropertySetterFor(instance, property, context);
+ if (setter == null) setter = context.getIntrospectionManager().getPropertySetterFor(instance, property, context);
+
if (setter != null) {
Object value = executorFactory.execute(equalsOperatorExpression.getSecondOperand(), context);
- try {
- setter.invoke(instance, property, value, context);
- }
- catch (EolRuntimeException eox) {
- if (eox.getAst() == null) {
- eox.setAst(this);
- }
- throw eox;
- }
+ properties.put(property, value);
}
else throw new EolIllegalPropertyException(instance, property, equalsOperatorExpression.getFirstOperand(), context);
}
@@ -76,6 +73,19 @@
}
}
}
+
+ if (setter != null) {
+ try {
+ setter.invoke(instance, properties, context);
+ }
+ catch (EolRuntimeException eox) {
+ if (eox.getAst() == null) {
+ eox.setAst(this);
+ }
+ throw eox;
+ }
+ }
+
return instance;
}
else if (type instanceof EolTupleType) {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java
index c8f3dbc..4bbe3f6 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java
@@ -10,6 +10,8 @@
******************************************************************************/
package org.eclipse.epsilon.eol.execute.introspection;
+import java.util.Map;
+
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -39,4 +41,18 @@
default void invoke(Object target, String property, Object value) throws EolRuntimeException {
invoke(value, property, value, null);
}
+
+ /**
+ * Supports batch property setting through
+ * e.g. new Person(name="John", surname="Brown")
+ * @param target
+ * @param properties
+ * @since 2.5
+ */
+ default void invoke(Object target, Map<String, Object> properties, IEolContext context) throws EolRuntimeException {
+ for (String property : properties.keySet()) {
+ invoke(target, property, properties.get(property), context);
+ }
+ }
+
}