/// <summary>
        /// Gets the default number kind for this type.
        /// </summary>
        public NumberKinds GetDefaultNumberKind()
        {
            NumberKinds Result = NumberKinds.NotApplicable;

            foreach (IConstraint Constraint in FormalGeneric.ConstraintList)
            {
                //TODO Check this
                //Debug.Assert(Constraint.ResolvedParentType.IsAssigned);

                if (Constraint.ResolvedParentType.IsAssigned && Constraint.ResolvedParentType.Item is IClassType AsClassType)
                {
                    NumberKinds ClassKind = AsClassType.GetDefaultNumberKind();
                    Result = DowngradedKind(NumberKind, ClassKind);
                }
            }

            if (Result == NumberKinds.NotApplicable)
            {
                foreach (IConstraint Constraint in FormalGeneric.ConstraintList)
                {
                    //TODO Check this
                    //Debug.Assert(Constraint.ResolvedParentType.IsAssigned);

                    if (Constraint.ResolvedParentType.IsAssigned && Constraint.ResolvedParentType.Item is ICompiledNumberType AsNumberType)
                    {
                        Result = DowngradedKind(NumberKind, AsNumberType.NumberKind);
                    }
                }
            }

            return(Result);
        }
Exemple #2
0
        /// <summary>
        /// Finds the matching nodes of a <see cref="ICloneOfExpression"/>.
        /// </summary>
        /// <param name="node">The agent expression to check.</param>
        /// <param name="errorList">The list of errors found.</param>
        /// <param name="resolvedResult">The expression result types upon return.</param>
        /// <param name="resolvedException">Exceptions the expression can throw upon return.</param>
        /// <param name="constantSourceList">Sources of the constant expression upon return, if any.</param>
        /// <param name="expressionConstant">The expression constant upon return.</param>
        public static bool ResolveCompilerReferences(ICloneOfExpression node, IErrorList errorList, out IResultType resolvedResult, out IResultException resolvedException, out ISealableList <IExpression> constantSourceList, out ILanguageConstant expressionConstant)
        {
            resolvedResult     = null;
            resolvedException  = null;
            constantSourceList = new SealableList <IExpression>();
            expressionConstant = NeutralLanguageConstant.NotConstant;

            IExpression Source = (IExpression)node.Source;
            IResultType ResolvedSourceResult = Source.ResolvedResult.Item;

            foreach (IExpressionType Item in ResolvedSourceResult)
            {
                if (Item.ValueType is IClassType AsClassType)
                {
                    IClass BaseClass = AsClassType.BaseClass;

                    if (BaseClass.Cloneable == BaseNode.CloneableStatus.Cloneable)
                    {
                        AsClassType.MarkAsUsedInCloneOf();
                    }
                    else
                    {
                        errorList.AddError(new ErrorCloningNotAllowed(node, BaseClass.ValidClassName));
                        return(false);
                    }
                }
                else
                {
                    errorList.AddError(new ErrorClassTypeRequired(node));
                    return(false);
                }
            }

            resolvedResult = ResolvedSourceResult;
            ResultException.Propagate(Source.ResolvedException, out resolvedException);

#if COVERAGE
            Debug.Assert(node.IsComplex);
#endif

            return(true);
        }