public bool ValidateTypeVariance(ComputationContext ctx, IOwnedNode placement, VarianceMode typeNamePosition) { // Programming in Scala, 2nd ed, p. 399 (all errors are mine) TypeDefinition typedef = this.TargetType; if (typedef.IsTemplateParameter) { TemplateParameter param = typedef.TemplateParameter; TemplateDefinition template = param.EnclosingScope <TemplateDefinition>(); if (placement.EnclosingScopesToRoot().Contains(template)) { bool covariant_in_immutable = param.Variance == VarianceMode.Out && (template.IsFunction() || template.CastType().InstanceOf.MutabilityOfType(ctx) == TypeMutability.ConstAsSource); // don't report errors for covariant types which are used in immutable template types if (!covariant_in_immutable && typeNamePosition.PositionCollides(param.Variance)) { return(false); } } } else { for (int i = 0; i < typedef.Name.Parameters.Count; ++i) { if (!this.TemplateArguments[i].ValidateTypeVariance(ctx, placement, typeNamePosition.Flipped(typedef.Name.Parameters[i].Variance))) { return(false); } } } return(true); }
public static bool IsFunctionContained(this IEntityVariable @this) { TemplateDefinition scope = @this.EnclosingScope <TemplateDefinition>(); return(scope.IsFunction()); }