diff --git a/legend-pure-core/legend-pure-m3-core/src/main/resources/platform/pure/essential/lang/creation/dynamicNew.pure b/legend-pure-core/legend-pure-m3-core/src/main/resources/platform/pure/essential/lang/creation/dynamicNew.pure index 537ecaa5c8..a5fcb7a7f9 100644 --- a/legend-pure-core/legend-pure-m3-core/src/main/resources/platform/pure/essential/lang/creation/dynamicNew.pure +++ b/legend-pure-core/legend-pure-m3-core/src/main/resources/platform/pure/essential/lang/creation/dynamicNew.pure @@ -47,6 +47,14 @@ Class meta::pure::functions::lang::tests::dynamicNew::D_D name : String[1]; } + +Class meta::pure::functions::lang::tests::dynamicNew::ClassWithDefault +{ + name : String[1] = 'default_X_Y'; + other : String[1]; + optional : String[0..1]; +} + function meta::pure::functions::lang::tests::dynamicNew::getterOverrideToMany(o:Any[1], property:Property[1]):Any[*] { [^D_D(name = $o->cast(@D_A).a + $o->getHiddenPayload()->cast(@String)->toOne()), ^D_D(name = $o->cast(@D_A).b->toOne() + $o->getHiddenPayload()->cast(@String)->toOne())] @@ -57,6 +65,34 @@ function meta::pure::functions::lang::tests::dynamicNew::getterOverrideToOne(o:A ^D_D(name = $o->cast(@D_A).a + $o->getHiddenPayload()->cast(@String)->toOne()); } +function <> meta::pure::functions::lang::tests::dynamicNew::testDynamicNewWithDefault():Boolean[1] +{ + assertEquals('default_X_Y', dynamicNew(ClassWithDefault, [^KeyValue(key='other',value='rrr')])->cast(@ClassWithDefault).name); + + let x = [^KeyValue(key='other',value='rrr')]; + assertEquals('default_X_Y', dynamicNew(ClassWithDefault, $x)->cast(@ClassWithDefault).name); + + let c = ClassWithDefault; + assertEquals('default_X_Y', dynamicNew($c, [^KeyValue(key='other',value='rrr')])->cast(@ClassWithDefault).name); + + let c_any = ClassWithDefault->cast(@Class); + assertEquals('default_X_Y', dynamicNew($c_any, [^KeyValue(key='other',value='rrr')])->cast(@ClassWithDefault).name); +} + +function <> meta::pure::functions::lang::tests::dynamicNew::testDynamicNewWithDefaultAndSet():Boolean[1] +{ + assertEquals('NewVal', dynamicNew(ClassWithDefault, [^KeyValue(key='other',value='rrr'), ^KeyValue(key='name',value='NewVal')])->cast(@ClassWithDefault).name); + + let x = [^KeyValue(key='other',value='rrr'), ^KeyValue(key='name',value='NewVal')]; + assertEquals('NewVal', dynamicNew(ClassWithDefault, $x)->cast(@ClassWithDefault).name); + + let c = ClassWithDefault; + assertEquals('NewVal', dynamicNew($c, [^KeyValue(key='other',value='rrr'), ^KeyValue(key='name',value='NewVal')])->cast(@ClassWithDefault).name); + + let c_any = ClassWithDefault->cast(@Class); + assertEquals('NewVal', dynamicNew($c_any, [^KeyValue(key='other',value='rrr'), ^KeyValue(key='name',value='NewVal')])->cast(@ClassWithDefault).name); +} + function <> meta::pure::functions::lang::tests::dynamicNew::testSimpleDynamicNew():Boolean[1] { let a = D_A; diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/essentials/lang/creation/DynamicNew.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/essentials/lang/creation/DynamicNew.java index a6d031a4cc..050a15863e 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/essentials/lang/creation/DynamicNew.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/essentials/lang/creation/DynamicNew.java @@ -46,23 +46,10 @@ public DynamicNew() @Override public ListIterable transformParameterValues(ListIterable parametersValues, CoreInstance topLevelElement, ProcessorSupport processorSupport, ProcessorContext processorContext) { - ListIterable defaultValues = transformDefaultValues(parametersValues.get(0), processorSupport, processorContext); - MutableList transformedParams = Lists.mutable.ofInitialCapacity(parametersValues.size()); parametersValues.forEachWithIndex((parameterValue, index) -> { - if (defaultValues.notEmpty() && index == 1) - { - ListIterable values = Instance.getValueForMetaPropertyToManyResolved(parameterValue, M3Properties.values, processorSupport); - String type = TypeProcessor.typeToJavaObjectSingle(Instance.getValueForMetaPropertyToOneResolved(parameterValue, M3Properties.genericType, processorSupport), true, processorSupport); - - MutableList processedValues = values.collect(v -> ValueSpecificationProcessor.processValueSpecification(topLevelElement, v, processorContext), Lists.mutable.withAll(defaultValues)); - transformedParams.add(processedValues.size() > 1 ? "Lists.mutable.<" + type + ">with(" + processedValues.makeString(",") + ")" : processedValues.makeString(",")); - } - else - { transformedParams.add(ValueSpecificationProcessor.processValueSpecification(topLevelElement, parameterValue, processorContext)); - } }); return transformedParams; @@ -119,18 +106,4 @@ public String build(CoreInstance topLevelElement, CoreInstance functionExpressio String newObjectStatement = newObject + "," + newOverrideInstance + "," + getterOverrides + ",es)"; return "Pure.handleValidation(false," + newObjectStatement + "," + SourceInfoProcessor.sourceInfoToString(functionExpression.getSourceInformation()) + ",es)"; } - - private ListIterable transformDefaultValues(CoreInstance instance, ProcessorSupport processorSupport, ProcessorContext processorContext) - { - CoreInstance genericType = Instance.getValueForMetaPropertyToOneResolved(instance, M3Properties.genericType, M3Properties.typeArguments, processorSupport); - - return genericType != null ? InstantiationHelpers.manageDefaultValues(this::formatDefaultValueString, - Instance.getValueForMetaPropertyToOneResolved(genericType, M3Properties.rawType, processorSupport), true, processorContext).select(s -> !s.isEmpty()) - : Lists.immutable.empty(); - } - - private String formatDefaultValueString(String name, String value) - { - return "new org.finos.legend.pure.generated.Root_meta_pure_functions_lang_KeyValue_Impl(\"Anonymous_NoCounter\")._key(\"" + name + "\")._value(" + value + ")"; - } } diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/InstantiationHelpers.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/InstantiationHelpers.java index 84b23901e3..d77ec4b46a 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/InstantiationHelpers.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/InstantiationHelpers.java @@ -127,40 +127,6 @@ else if (!isNull && (Multiplicity.isLowerZero(expressionMultiplicity) || Multipl }).makeString(""); } - public static ListIterable manageDefaultValues(BiFunction formatString, CoreInstance sourceClass, boolean doSingleWrap, ProcessorContext processorContext) - { - ProcessorSupport processorSupport = processorContext.getSupport(); - ListIterable properties = sourceClass.getValueForMetaPropertyToMany(M3Properties.properties); - - return properties.collect(coreInstance -> - { - if (coreInstance.getValueForMetaPropertyToOne(M3Properties.defaultValue) == null) - { - return ""; - } - - boolean propertyIsToOne = Multiplicity.isToOne(Instance.getValueForMetaPropertyToOneResolved(coreInstance, M3Properties.multiplicity, processorSupport), false); - CoreInstance expression = Property.getDefaultValueExpression(Instance.getValueForMetaPropertyToOneResolved(coreInstance, M3Properties.defaultValue, processorSupport)); - String value = ValueSpecificationProcessor.processValueSpecification(expression, processorContext); - if ("this".equals(value)) - { - CoreInstance expressionRawType = Instance.getValueForMetaPropertyToOneResolved(Instance.getValueForMetaPropertyToOneResolved(expression, M3Properties.genericType, processorSupport), M3Properties.rawType, processorSupport); - value = PackageableElement.getSystemPathForPackageableElement(expressionRawType, "_") + processorContext.getClassImplSuffix() + "." + value; - } - - CoreInstance expressionMultiplicity = Multiplicity.newMultiplicity(expression.getValueForMetaPropertyToMany(M3Properties.values).size(), processorSupport); - - if ((doSingleWrap || !propertyIsToOne) - && (Multiplicity.isLowerZero(expressionMultiplicity) || Multiplicity.isToOne(expressionMultiplicity))) - { - //wrap - value = "CompiledSupport.toPureCollection(" + value + ")"; - } - - return formatString.apply(coreInstance.getName(), value); - }); - } - public static String manageId(ListIterable parametersValues, ProcessorSupport processorSupport) { String id = Instance.getValueForMetaPropertyToOneResolved(parametersValues.get(1), M3Properties.values, processorSupport).getName(); diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/New.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/New.java index e21086dab2..2d3c02669e 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/New.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/New.java @@ -27,6 +27,7 @@ import org.finos.legend.pure.runtime.java.compiled.generation.processors.natives.AbstractNative; import org.finos.legend.pure.runtime.java.compiled.generation.processors.type.FullJavaPaths; import org.finos.legend.pure.runtime.java.compiled.generation.processors.type.TypeProcessor; +import org.finos.legend.pure.runtime.java.compiled.generation.processors.type._class.DefaultValue; public class New extends AbstractNative { @@ -55,7 +56,7 @@ public String build(CoreInstance topLevelElement, CoreInstance functionExpressio return "new " + JavaPackageAndImportBuilder.buildImplClassReferenceFromType(_class) + (addGenericType ? TypeProcessor.buildTypeArgumentsString(genericType, false, processorSupport) : "") + "(\"" + newId + "\")" + (addGenericType ? "._classifierGenericType(" + InstantiationHelpers.buildGenericType(genericType, processorContext) + ")" : "") + (_Class.computeConstraintsInHierarchy(_class, processorSupport).isEmpty() ? "" : "._validate(false, " + SourceInfoProcessor.sourceInfoToString(functionExpression.getSourceInformation()) + ", es)") - + InstantiationHelpers.manageDefaultValues(this::formatDefaultValueString, Instance.getValueForMetaPropertyToOneResolved(genericType, M3Properties.rawType, processorSupport), false, processorContext).makeString(""); + + DefaultValue.manageDefaultValues(this::formatDefaultValueString, Instance.getValueForMetaPropertyToOneResolved(genericType, M3Properties.rawType, processorSupport), false, processorContext).makeString(""); } } diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/NewWithKeyExpr.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/NewWithKeyExpr.java index 84ab61c414..e3c1ac55d5 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/NewWithKeyExpr.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/natives/grammar/lang/creation/NewWithKeyExpr.java @@ -26,6 +26,7 @@ import org.finos.legend.pure.runtime.java.compiled.generation.processors.natives.AbstractNative; import org.finos.legend.pure.runtime.java.compiled.generation.processors.type.FullJavaPaths; import org.finos.legend.pure.runtime.java.compiled.generation.processors.type.TypeProcessor; +import org.finos.legend.pure.runtime.java.compiled.generation.processors.type._class.DefaultValue; public class NewWithKeyExpr extends AbstractNative { @@ -50,7 +51,7 @@ public String build(CoreInstance topLevelElement, CoreInstance functionExpressio return "new " + JavaPackageAndImportBuilder.buildImplClassReferenceFromType(_class) + (addGenericType ? TypeProcessor.buildTypeArgumentsString(genericType, false, processorSupport) : "") + "(\"" + newId + "\")" + (addGenericType ? "._classifierGenericType(" + InstantiationHelpers.buildGenericType(genericType, processorContext) + ")" : "") - + InstantiationHelpers.manageDefaultValues(this::formatDefaultValueString, Instance.getValueForMetaPropertyToOneResolved(genericType, M3Properties.rawType, processorSupport), false, processorContext).makeString("") + + DefaultValue.manageDefaultValues(this::formatDefaultValueString, Instance.getValueForMetaPropertyToOneResolved(genericType, M3Properties.rawType, processorSupport), false, processorContext).makeString("") + InstantiationHelpers.manageKeyValues(genericType, Instance.getValueForMetaPropertyToOneResolved(genericType, M3Properties.rawType, processorSupport), keyValues, processorContext) + (_Class.computeConstraintsInHierarchy(_class, processorSupport).isEmpty() ? "" : "._validate(false, " + SourceInfoProcessor.sourceInfoToString(functionExpression.getSourceInformation()) + ", es)"); } diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/coreinstance/AbstractCompiledCoreInstance.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/coreinstance/AbstractCompiledCoreInstance.java index 90b621556c..5649448e9b 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/coreinstance/AbstractCompiledCoreInstance.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/coreinstance/AbstractCompiledCoreInstance.java @@ -14,6 +14,11 @@ package org.finos.legend.pure.runtime.java.compiled.generation.processors.support.coreinstance; +import org.eclipse.collections.api.RichIterable; +import org.eclipse.collections.api.factory.Lists; +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.api.tuple.Pair; +import org.finos.legend.pure.m3.execution.ExecutionSupport; import org.finos.legend.pure.m4.coreinstance.AbstractCoreInstance; import org.finos.legend.pure.m4.coreinstance.CoreInstance; import org.finos.legend.pure.m4.coreinstance.compileState.CompileState; @@ -100,4 +105,9 @@ public boolean equals(Object obj) { return this.pureEquals(obj); } + + public MutableList> defaultValues(ExecutionSupport es) + { + return Lists.mutable.empty(); + } } diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/ClassImplProcessor.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/ClassImplProcessor.java index dbad1ce306..19234e2038 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/ClassImplProcessor.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/ClassImplProcessor.java @@ -44,6 +44,8 @@ import org.finos.legend.pure.runtime.java.compiled.generation.processors.type.TypeProcessor; import org.finos.legend.pure.runtime.java.compiled.generation.processors.valuespecification.ValueSpecificationProcessor; +import java.util.function.BiFunction; + public class ClassImplProcessor { //DO NOT ADD WIDE * IMPORTS TO THIS LIST IT IMPACTS COMPILE TIMES @@ -95,6 +97,15 @@ public static StringJavaSource buildImplementation(String _package, String impor String classNamePlusTypeParams = className + typeParamsString; String interfaceNamePlusTypeParams = TypeProcessor.javaInterfaceForType(_class) + typeParamsString; + ListIterable defaultValues = DefaultValue.manageDefaultValues(new BiFunction() + { + @Override + public String apply(String name, String value) + { + return "org.eclipse.collections.impl.tuple.Tuples.pair(\"" + name + "\", " + value + ")"; + } + }, _class, true, processorContext).select(s -> !s.isEmpty()); + boolean isGetterOverride = M3Paths.GetterOverride.equals(PackageableElement.getUserPathForPackageableElement(_class)) || M3Paths.ConstraintsGetterOverride.equals(PackageableElement.getUserPathForPackageableElement(_class)); @@ -146,6 +157,12 @@ public static StringJavaSource buildImplementation(String _package, String impor buildGetFullSystemPath() + //Not supported on platform classes yet (ClassProcessor.isPlatformClass(_class) ? "" : validate(_class, className, classGenericType, processorContext, processorSupport.class_getSimpleProperties(_class))) + + (defaultValues.isEmpty() ? "" : + " @Override\n" + + " public MutableList> defaultValues(ExecutionSupport es)\n" + + " {\n" + + " return Lists.mutable.with(" + defaultValues.makeString(",") + ");\n" + + " }") + "}"); } diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/DefaultValue.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/DefaultValue.java new file mode 100644 index 0000000000..e1c14c52be --- /dev/null +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/generation/processors/type/_class/DefaultValue.java @@ -0,0 +1,65 @@ +// Copyright 2024 Goldman Sachs +// +// 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 +// +// http://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. + +package org.finos.legend.pure.runtime.java.compiled.generation.processors.type._class; + +import org.eclipse.collections.api.list.ListIterable; +import org.finos.legend.pure.m3.navigation.Instance; +import org.finos.legend.pure.m3.navigation.M3Properties; +import org.finos.legend.pure.m3.navigation.PackageableElement.PackageableElement; +import org.finos.legend.pure.m3.navigation.ProcessorSupport; +import org.finos.legend.pure.m3.navigation.multiplicity.Multiplicity; +import org.finos.legend.pure.m3.navigation.property.Property; +import org.finos.legend.pure.m4.coreinstance.CoreInstance; +import org.finos.legend.pure.runtime.java.compiled.generation.ProcessorContext; +import org.finos.legend.pure.runtime.java.compiled.generation.processors.valuespecification.ValueSpecificationProcessor; + +import java.util.function.BiFunction; + +public class DefaultValue +{ + public static ListIterable manageDefaultValues(BiFunction formatString, CoreInstance sourceClass, boolean doSingleWrap, ProcessorContext processorContext) + { + ProcessorSupport processorSupport = processorContext.getSupport(); + ListIterable properties = sourceClass.getValueForMetaPropertyToMany(M3Properties.properties); + + return properties.collect(coreInstance -> + { + if (coreInstance.getValueForMetaPropertyToOne(M3Properties.defaultValue) == null) + { + return ""; + } + + boolean propertyIsToOne = Multiplicity.isToOne(Instance.getValueForMetaPropertyToOneResolved(coreInstance, M3Properties.multiplicity, processorSupport), false); + CoreInstance expression = Property.getDefaultValueExpression(Instance.getValueForMetaPropertyToOneResolved(coreInstance, M3Properties.defaultValue, processorSupport)); + String value = ValueSpecificationProcessor.processValueSpecification(expression, processorContext); + if ("this".equals(value)) + { + CoreInstance expressionRawType = Instance.getValueForMetaPropertyToOneResolved(Instance.getValueForMetaPropertyToOneResolved(expression, M3Properties.genericType, processorSupport), M3Properties.rawType, processorSupport); + value = PackageableElement.getSystemPathForPackageableElement(expressionRawType, "_") + processorContext.getClassImplSuffix() + "." + value; + } + + CoreInstance expressionMultiplicity = Multiplicity.newMultiplicity(expression.getValueForMetaPropertyToMany(M3Properties.values).size(), processorSupport); + + if ((doSingleWrap || !propertyIsToOne) + && (Multiplicity.isLowerZero(expressionMultiplicity) || Multiplicity.isToOne(expressionMultiplicity))) + { + //wrap + value = "CompiledSupport.toPureCollection(" + value + ")"; + } + + return formatString.apply(coreInstance.getName(), value); + }); + } +} diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/metadata/ClassCache.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/metadata/ClassCache.java index 3d4083c550..2d7a67733f 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/metadata/ClassCache.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/java/org/finos/legend/pure/runtime/java/compiled/metadata/ClassCache.java @@ -74,6 +74,12 @@ private void validateClassLoaderForLegacyMethods(ClassLoader classLoader) } } + public Class getIfAbsentPutImplForType(Type type) + { + TypeJavaInfo java = getJavaInfoForType(type); + return java.implClass; + } + public Class getIfAbsentPutInterfaceForType(Type type) { TypeJavaInfo java = getJavaInfoForType(type); diff --git a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/resources/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/core/CoreGen.java b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/resources/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/core/CoreGen.java index a9c830eea9..0e79383745 100644 --- a/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/resources/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/core/CoreGen.java +++ b/legend-pure-runtime/legend-pure-runtime-java-engine-compiled/src/main/resources/org/finos/legend/pure/runtime/java/compiled/generation/processors/support/core/CoreGen.java @@ -19,6 +19,7 @@ import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.factory.Maps; import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.api.map.MutableMap; import org.finos.legend.pure.m3.coreinstance.meta.pure.functions.collection.List; import org.finos.legend.pure.m3.coreinstance.meta.pure.functions.collection.Pair; import org.finos.legend.pure.m3.coreinstance.meta.pure.functions.lang.KeyExpression; @@ -39,6 +40,7 @@ import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.CompiledSupport; import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.LambdaCompiledExtended; import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.Pure; +import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.coreinstance.AbstractCompiledCoreInstance; import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.coreinstance.GetterOverrideExecutor; import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.coreinstance.QuantityCoreInstance; import org.finos.legend.pure.runtime.java.compiled.generation.processors.support.function.PureFunction2; @@ -191,6 +193,40 @@ public static String toRepresentation(Object any, ExecutionSupport es) return "<" + Pure.manageId(any) + " instanceOf " + Pure.elementToPath((PackageableElement) CoreGen.safeGetGenericType(any, es)._rawType(), "::") + ">"; } + public static RichIterable processKeyExpressions(java.lang.Class _class, Object instance, RichIterable keyExpressions, ExecutionSupport es) + { + try + { + MutableList> vals = ((AbstractCompiledCoreInstance)instance).defaultValues(es); + MutableMap defaultVals = Maps.mutable.empty(); + MutableMap given = Maps.mutable.empty(); + + MutableList defaultVals_L = vals.collect(new DefendedFunction, Root_meta_pure_functions_lang_KeyValue>() + { + @Override + public Root_meta_pure_functions_lang_KeyValue valueOf(org.eclipse.collections.api.tuple.Pair pair) + { + return new Root_meta_pure_functions_lang_KeyValue_Impl("")._key(pair.getOne())._value(pair.getTwo()); + } + }); + MutableList givenL = keyExpressions.toList(); + for (Root_meta_pure_functions_lang_KeyValue kv : defaultVals_L) + { + defaultVals.put(kv._key(), kv); + } + for (Root_meta_pure_functions_lang_KeyValue kv : givenL) + { + given.put(kv._key(), kv); + } + defaultVals.putAll(given); + return defaultVals.valuesView(); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + public static Object newObject(final Class aClass, RichIterable keyExpressions, ElementOverride override, Function getterToOne, Function getterToMany, Object payload, PureFunction2 getterToOneExec, PureFunction2 getterToManyExec, ExecutionSupport es) { final ClassCache classCache = ((CompiledExecutionSupport) es).getClassCache(); @@ -199,6 +235,7 @@ public static Object newObject(final Class aClass, RichIterable params, Stack keyValues = Instance.getValueForMetaPropertyToManyResolved(params.get(1), M3Properties.values, processorSupport);