示例#1
0
        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);
        }
示例#2
0
        public static bool IsFunctionContained(this IEntityVariable @this)
        {
            TemplateDefinition scope = @this.EnclosingScope <TemplateDefinition>();

            return(scope.IsFunction());
        }