Search in sources :

Example 16 with org.finos.legend.pure.m3.navigation._class._Class

use of org.finos.legend.pure.m3.navigation._class._Class in project legend-pure by finos.

the class ProjectionUtil method createAbstractPropertyCopy.

private static AbstractProperty createAbstractPropertyCopy(AbstractProperty sourceProperty, PropertyOwner newOwner, ModelRepository repository, ProcessorSupport processorSupport) {
    AbstractProperty copy = (AbstractProperty) repository.newCoreInstance(sourceProperty.getName(), sourceProperty.getClassifier(), newOwner.getSourceInformation());
    copy._owner(newOwner);
    if (sourceProperty._name() != null) {
        copy._name(sourceProperty._name());
    } else if (copy._name() != null) {
        copy._nameRemove();
    }
    copy._classifierGenericType((GenericType) org.finos.legend.pure.m3.navigation.generictype.GenericType.copyGenericType(sourceProperty._classifierGenericType(), processorSupport));
    copy._genericType((GenericType) org.finos.legend.pure.m3.navigation.generictype.GenericType.copyGenericType(sourceProperty._genericType(), processorSupport));
    copy._multiplicity((Multiplicity) org.finos.legend.pure.m3.navigation.multiplicity.Multiplicity.copyMultiplicity(sourceProperty._multiplicity(), false, processorSupport));
    copyAnnotations(sourceProperty, copy, false, processorSupport);
    return copy;
}
Also used : AbstractProperty(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.function.property.AbstractProperty)

Example 17 with org.finos.legend.pure.m3.navigation._class._Class

use of org.finos.legend.pure.m3.navigation._class._Class in project legend-pure by finos.

the class ProjectionUtil method copyFunctionExpression.

private static void copyFunctionExpression(FunctionExpression valueSpecification, final ModelRepository modelRepository, final Context context, final ProcessorSupport processorSupport, final MutableMap<CoreInstance, CoreInstance> processedMap, final ProcessorState state, final ClassProjection classProjection, FunctionExpression copy) {
    RichIterable<? extends CoreInstance> valueCopies = valueSpecification._parametersValues().collect(new Function<ValueSpecification, CoreInstance>() {

        @Override
        public CoreInstance valueOf(ValueSpecification instance) {
            return copyValueSpecification(instance, modelRepository, context, processorSupport, processedMap, state, classProjection);
        }
    });
    copy._parametersValues((RichIterable<? extends ValueSpecification>) valueCopies);
    if (valueSpecification._importGroup() != null) {
        copy._importGroup(valueSpecification._importGroup());
    } else if (copy._importGroup() != null) {
        copy._importGroupRemove();
    }
    if (valueSpecification._functionName() != null) {
        copy._functionName(valueSpecification._functionName());
    } else if (copy._functionName() != null) {
        copy._functionNameRemove();
    }
    if (valueSpecification._propertyName() != null) {
        InstanceValue propertyNameSource = valueSpecification._propertyName();
        InstanceValue propertyNameCopy = (InstanceValue) copyValueSpecification(propertyNameSource, modelRepository, context, processorSupport, state, classProjection);
        propertyNameCopy._genericType((GenericType) org.finos.legend.pure.m3.navigation.generictype.GenericType.copyGenericType(propertyNameSource._genericType(), processorSupport));
        propertyNameCopy._multiplicity((Multiplicity) org.finos.legend.pure.m3.navigation.multiplicity.Multiplicity.copyMultiplicity(propertyNameSource._multiplicity(), false, processorSupport));
        copy._propertyName(propertyNameCopy);
    }
    if (valueSpecification._qualifiedPropertyName() != null) {
        InstanceValue propertyNameSource = valueSpecification._qualifiedPropertyName();
        InstanceValue qualifiedPropertyNameCopy = (InstanceValue) copyValueSpecification(propertyNameSource, modelRepository, context, processorSupport, state, classProjection);
        qualifiedPropertyNameCopy._genericType((GenericType) org.finos.legend.pure.m3.navigation.generictype.GenericType.copyGenericType(propertyNameSource._genericType(), processorSupport));
        qualifiedPropertyNameCopy._multiplicity((Multiplicity) org.finos.legend.pure.m3.navigation.multiplicity.Multiplicity.copyMultiplicity(propertyNameSource._multiplicity(), false, processorSupport));
        copy._qualifiedPropertyName(qualifiedPropertyNameCopy);
    }
}
Also used : ValueSpecification(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.valuespecification.ValueSpecification) CoreInstance(org.finos.legend.pure.m4.coreinstance.CoreInstance) InstanceValue(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.valuespecification.InstanceValue)

Example 18 with org.finos.legend.pure.m3.navigation._class._Class

use of org.finos.legend.pure.m3.navigation._class._Class in project legend-pure by finos.

the class FunctionDefinitionProcessor method findReturnTypesForLambda.

private static void findReturnTypesForLambda(FunctionDefinition<?> function, FunctionType functionType, ProcessorSupport processorSupport) throws PureCompilationException {
    ValueSpecification lastExpression = function._expressionSequence().toList().getLast();
    if (functionType._returnType() == null) {
        GenericType lastExpressionGenericType = lastExpression._genericType();
        if (lastExpressionGenericType == null) {
            throw new PureCompilationException(lastExpression.getSourceInformation(), "Final expression has no generic type");
        }
        GenericType lambdaReturnType = (GenericType) org.finos.legend.pure.m3.navigation.generictype.GenericType.copyGenericTypeAsInferredGenericType(lastExpressionGenericType, function.getSourceInformation(), processorSupport);
        if (function._classifierGenericType() != null && function._classifierGenericType()._typeArguments() != null && function._classifierGenericType()._typeArguments().size() > 0 && function._classifierGenericType()._typeArguments().toList().getFirst()._rawTypeCoreInstance() != null) {
            ((FunctionType) ImportStub.withImportStubByPass(function._classifierGenericType()._typeArguments().toList().getFirst()._rawTypeCoreInstance(), processorSupport))._returnType(lambdaReturnType);
        }
    }
    if (functionType._returnMultiplicity() == null) {
        Multiplicity lastExpressionMultiplicity = lastExpression._multiplicity();
        if (lastExpressionMultiplicity == null) {
            throw new PureCompilationException(lastExpression.getSourceInformation(), "Final expression has no multiplicity");
        }
        if (function._classifierGenericType() != null && function._classifierGenericType()._typeArguments() != null && function._classifierGenericType()._typeArguments().size() > 0 && function._classifierGenericType()._typeArguments().toList().getFirst()._rawTypeCoreInstance() != null) {
            ((FunctionType) ImportStub.withImportStubByPass(function._classifierGenericType()._typeArguments().toList().getFirst()._rawTypeCoreInstance(), processorSupport))._returnMultiplicity(lastExpressionMultiplicity);
        }
    }
}
Also used : GenericType(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.generics.GenericType) Multiplicity(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.multiplicity.Multiplicity) FunctionType(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.FunctionType) ValueSpecification(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.valuespecification.ValueSpecification) PureCompilationException(org.finos.legend.pure.m4.exception.PureCompilationException)

Example 19 with org.finos.legend.pure.m3.navigation._class._Class

use of org.finos.legend.pure.m3.navigation._class._Class in project legend-pure by finos.

the class FunctionDefinitionProcessor method process.

public static void process(FunctionDefinition<?> functionDefinition, ProcessorState state, Matcher matcher, ModelRepository repository) {
    ProcessorSupport processorSupport = state.getProcessorSupport();
    VariableContext variableContext = state.getVariableContext();
    FunctionType functionType = (FunctionType) processorSupport.function_getFunctionType(functionDefinition);
    state.getObserver().startProcessingFunction(functionDefinition, functionType);
    URLPatternLibrary urlPatternLibrary = state.getURLPatternLibrary();
    if (urlPatternLibrary != null) {
        urlPatternLibrary.possiblyRegister(functionDefinition, processorSupport);
    }
    boolean shouldSetTypeInferenceContext = (functionDefinition instanceof ConcreteFunctionDefinition) && (functionDefinition._classifierGenericType() != null) && (functionDefinition._classifierGenericType()._rawTypeCoreInstance() != null) && "ConcreteFunctionDefinition".equals(functionDefinition._classifierGenericType()._rawTypeCoreInstance().getName());
    if (shouldSetTypeInferenceContext) {
        state.newTypeInferenceContext(functionType);
    }
    functionType._parameters().forEach(var -> {
        try {
            variableContext.registerValue(var._name(), var);
        } catch (VariableNameConflictException e) {
            throw new PureCompilationException(functionDefinition.getSourceInformation(), e.getMessage());
        }
        GenericType propertyType = var._genericType();
        // The property type may be null if it's a lambda expression...
        if (propertyType != null) {
            // We resolve because we want to fail fast if a given type is unknown...
            org.finos.legend.pure.m3.navigation.generictype.GenericType.resolveGenericTypeUsingImports(propertyType, repository, processorSupport);
        }
    });
    ListIterable<? extends ValueSpecification> expressions = functionDefinition._expressionSequence().toList();
    if (expressions.isEmpty()) {
        throw new PureCompilationException(functionDefinition.getSourceInformation(), "Function definition must contain at least one expression");
    }
    // The function is going to be processed again after inference
    if (TypeInference.canProcessLambda(functionDefinition, state, processorSupport)) {
        state.getObserver().shiftTab();
        state.getObserver().startProcessingFunctionBody();
        processExpressions(functionDefinition, expressions, matcher, state, processorSupport);
        findReturnTypesForLambda(functionDefinition, functionType, processorSupport);
        FunctionDefinitionValidator.validateFunctionReturnType(functionDefinition, functionType, processorSupport);
        state.getObserver().finishedProcessingFunctionBody();
        state.getObserver().unShiftTab();
        state.addFunctionDefinition(functionDefinition);
    }
    if (shouldSetTypeInferenceContext) {
        state.deleteTypeInferenceContext();
    }
    state.getVariableContext().buildAndRegister("return", functionType._returnType(), functionType._returnMultiplicity(), processorSupport);
    RichIterable<? extends Constraint> constraints = functionDefinition._preConstraints();
    if (constraints.notEmpty()) {
        processConstraints(functionDefinition, constraints.toList(), matcher, state, processorSupport);
    }
    RichIterable<? extends Constraint> postConstraints = functionDefinition._postConstraints();
    if (postConstraints.notEmpty()) {
        processConstraints(functionDefinition, postConstraints.toList(), matcher, state, processorSupport);
    }
    state.getObserver().finishedProcessingFunction(functionType);
}
Also used : ConcreteFunctionDefinition(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.function.ConcreteFunctionDefinition) GenericType(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.generics.GenericType) ProcessorSupport(org.finos.legend.pure.m3.navigation.ProcessorSupport) URLPatternLibrary(org.finos.legend.pure.m3.serialization.runtime.pattern.URLPatternLibrary) FunctionType(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.FunctionType) VariableContext(org.finos.legend.pure.m3.compiler.postprocessing.VariableContext) VariableNameConflictException(org.finos.legend.pure.m3.compiler.postprocessing.VariableContext.VariableNameConflictException) PureCompilationException(org.finos.legend.pure.m4.exception.PureCompilationException)

Example 20 with org.finos.legend.pure.m3.navigation._class._Class

use of org.finos.legend.pure.m3.navigation._class._Class in project legend-pure by finos.

the class PropertyInstanceBuilder method createMilestonedProperties.

static ListIterable<AbstractProperty<?>> createMilestonedProperties(CoreInstance sourceProperty, CoreInstance propertyOwner, ListIterable<MilestonePropertyCodeBlock> propertyCodeBlocks, Context context, ProcessorSupport processorSupport, ModelRepository modelRepository) {
    CoreInstance rawType = sourceProperty instanceof AbstractProperty ? ((AbstractProperty<?>) sourceProperty)._genericType()._rawTypeCoreInstance() : null;
    ImportGroup importId = rawType instanceof org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel._import.ImportStub ? ((org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel._import.ImportStub) rawType)._importGroup() : null;
    return createM3MilestonedProperties(propertyOwner, importId, propertyCodeBlocks, context, processorSupport, modelRepository);
}
Also used : CoreInstance(org.finos.legend.pure.m4.coreinstance.CoreInstance) AbstractProperty(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.function.property.AbstractProperty) ImportGroup(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel._import.ImportGroup)

Aggregations

GenericType (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.generics.GenericType)98 CoreInstance (org.finos.legend.pure.m4.coreinstance.CoreInstance)95 RichIterable (org.eclipse.collections.api.RichIterable)54 Type (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.Type)52 VariableExpression (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.valuespecification.VariableExpression)51 PureCompilationException (org.finos.legend.pure.m4.exception.PureCompilationException)51 FunctionType (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.FunctionType)47 ValueSpecification (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.valuespecification.ValueSpecification)47 EngineException (org.finos.legend.engine.shared.core.operational.errorManagement.EngineException)40 MutableList (org.eclipse.collections.api.list.MutableList)38 ListIterate (org.eclipse.collections.impl.utility.ListIterate)37 ListIterable (org.eclipse.collections.api.list.ListIterable)34 FastList (org.eclipse.collections.impl.list.mutable.FastList)34 LambdaFunction (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.function.LambdaFunction)34 Property (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.function.property.Property)34 ProcessorSupport (org.finos.legend.pure.m3.navigation.ProcessorSupport)34 Class (org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.Class)33 SourceInformation (org.finos.legend.pure.m4.coreinstance.SourceInformation)33 List (java.util.List)32 EngineErrorType (org.finos.legend.engine.protocol.pure.v1.model.context.EngineErrorType)32