private static bool FunctionTypeConformToPropertyType(IFunctionType derivedType, IPropertyType baseType, IErrorList errorList, ISource sourceLocation) { bool Result = true; Debug.Assert(derivedType.ResolvedBaseType.IsAssigned); Debug.Assert(baseType.ResolvedBaseType.IsAssigned); Result &= TypeConformToBase(derivedType.ResolvedBaseType.Item, baseType.ResolvedBaseType.Item, errorList, sourceLocation, isConversionAllowed: false); if (baseType.PropertyKind != BaseNode.UtilityType.ReadOnly) { errorList.AddError(new ErrorTypeKindConformance(sourceLocation, derivedType, baseType)); Result = false; } IErrorList AllOverloadErrorList = new ErrorList(); bool MatchingDerivedOverload = false; foreach (IQueryOverloadType DerivedOverload in derivedType.OverloadList) { IErrorList OverloadErrorList = new ErrorList(); if (!QueryOverloadHasPropertyConformingBase(DerivedOverload, baseType, OverloadErrorList, sourceLocation)) { Debug.Assert(!OverloadErrorList.IsEmpty); AllOverloadErrorList.AddError(OverloadErrorList.At(0)); } else { MatchingDerivedOverload = true; } } if (!MatchingDerivedOverload) { errorList.AddErrors(AllOverloadErrorList); errorList.AddError(new ErrorTypeKindConformance(sourceLocation, derivedType, baseType)); Result = false; } return(Result); }
private static bool ProcedureTypeConformToProcedureType(IProcedureType derivedType, IProcedureType baseType, IErrorList errorList, ISource sourceLocation) { bool Result = true; Debug.Assert(derivedType.ResolvedBaseType.IsAssigned); Debug.Assert(baseType.ResolvedBaseType.IsAssigned); Result &= TypeConformToBase(derivedType.ResolvedBaseType.Item, baseType.ResolvedBaseType.Item, errorList, sourceLocation, isConversionAllowed: false); IErrorList AllOverloadErrorList = new ErrorList(); foreach (ICommandOverloadType BaseOverload in baseType.OverloadList) { bool MatchingDerivedOverload = false; foreach (ICommandOverloadType DerivedOverload in derivedType.OverloadList) { IErrorList OverloadErrorList = new ErrorList(); if (!CommandOverloadConformToBase(DerivedOverload, BaseOverload, OverloadErrorList, DerivedOverload)) { Debug.Assert(!OverloadErrorList.IsEmpty); AllOverloadErrorList.AddError(OverloadErrorList.At(0)); } else { MatchingDerivedOverload = true; } } if (!MatchingDerivedOverload) { errorList.AddErrors(AllOverloadErrorList); errorList.AddError(new ErrorOverloadMismatchConformance(sourceLocation, derivedType, baseType)); Result = false; } } return(Result); }