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;
}
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);
}
}
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);
}
}
}
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);
}
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);
}
Aggregations