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