コード例 #1
0
 public GenericImplementationType(IFrontendType input, IFrontendType output, IFrontendType context)
 {
     this.input               = input ?? throw new ArgumentNullException(nameof(input));
     this.output              = output ?? throw new ArgumentNullException(nameof(output));
     this.context             = context ?? throw new ArgumentNullException(nameof(context));
     TypeParameterDefinitions = new[] { input, output, context }.OfType <IGenericTypeParameterPlacholder>().Select(x => Possibly.Is(x)).ToArray();
 }
コード例 #2
0
 public static IVerifiableType ConvertTypeOrThrow(this IFrontendType self, IConversionContext context)
 {
     if (self is IConvertableFrontendType <IVerifiableType> convertable)
     {
         return(convertable.Convert(context));
     }
     throw new Exception("could not be converted");
 }
コード例 #3
0
ファイル: Overlay.cs プロジェクト: rauldoblem/Tac
 public IFrontendType Convert(IFrontendType type)
 {
     if (type.Is <IWeakTypeDefinition>(out var typeDef))
     {
         return(new OverlayTypeDefinition(typeDef, this));
     }
     if (type is IGenericTypeParameterPlacholder generic && map.TryGetValue(generic, out var value))
     {
         return(value);
     }
     return(type);
 }
コード例 #4
0
ファイル: TypeTests.cs プロジェクト: Prototypist1/Tac
        public void PrimitivesAreThemselves()
        {
            var left  = new IFrontendType <IVerifiableType>[] { new NumberType(), new StringType(), new BooleanType() };
            var right = new IFrontendType <IVerifiableType>[] { new NumberType(), new StringType(), new BooleanType() };

            for (int i = 0; i < left.Length; i++)
            {
                for (int j = 0; j < right.Length; j++)
                {
                    if (i == j)
                    {
                        Assert.True(left[i].TheyAreUs(left[j], new List <(IFrontendType <IVerifiableType>, IFrontendType <IVerifiableType>)>()).Is1OrThrow());
                    }
                    else
                    {
                        Assert.False(left[i].TheyAreUs(left[j], new List <(IFrontendType <IVerifiableType>, IFrontendType <IVerifiableType>)>()).Is1OrThrow());
                    }
                }
            }
        }
コード例 #5
0
        //public IIsPossibly<IFrontendType<IVerifiableType>> Returns()
        //{
        //    return Possibly.Is(TypeDefinition.GetValue());
        //}

        public IOrType <bool, IError> TheyAreUs(IFrontendType <IVerifiableType> they, List <(IFrontendType <IVerifiableType>, IFrontendType <IVerifiableType>)> assumeTrue)
コード例 #6
0
 public static IEnumerable <IError> TypeCheck(this IOrType <IBox <IFrontendCodeElement>, IError> self, IFrontendType <IVerifiableType> targetType)
 {
     return(ReturnsTypeOrErrors(self).SwitchReturns <IEnumerable <IError> >(
                x =>
     {
         if (!x.TheyAreUs(targetType, new List <(IFrontendType <IVerifiableType>, IFrontendType <IVerifiableType>)>()).SwitchReturns(x => x, x => false))
         {
             return new[] { Error.Other($"left cannot be {x}") };
         }
         return System.Array.Empty <IError>();
     },
                x => new[] { x }));
 }
コード例 #7
0
ファイル: PrimitiveType.cs プロジェクト: Prototypist1/Tac
        // Is1OrThrow is sloppy here
        // probably this interface should entertain the possiblity that a type doesn't know it's members because the code is jibberish
        //public IReadOnlyList<WeakMemberDefinition> GetMembers() => members.Is1OrThrow();

        private static IIsPossibly <(IOrType <IFrontendType <IVerifiableType>, IError> fromLeft, IOrType <IFrontendType <IVerifiableType>, IError> fromRight)> IsOrType(IFrontendType <IVerifiableType> them)
        {
            if (them.SafeIs(out FrontEndOrType orType))
            {
                return(Possibly.Is <(IOrType <IFrontendType <IVerifiableType>, IError> fromLeft, IOrType <IFrontendType <IVerifiableType>, IError> fromRight)>((orType.left.GetValue(), orType.right.GetValue())));
            }
            return(Possibly.IsNot <(IOrType <IFrontendType <IVerifiableType>, IError> fromLeft, IOrType <IFrontendType <IVerifiableType>, IError> fromRight)>());
        }
コード例 #8
0
ファイル: PrimitiveType.cs プロジェクト: Prototypist1/Tac
 public static IOrType <IFrontendType <IVerifiableType>, IError> UnwrapRefrence(this IFrontendType <IVerifiableType> frontendType)
 {
     if (frontendType is RefType refType)
     {
         return(refType.inner);
     }
     return(OrType.Make <IFrontendType <IVerifiableType>, IError>(frontendType));
 }
コード例 #9
0
 public TypeParameter(IGenericTypeParameterPlacholder parameterDefinition, IFrontendType frontendType)
 {
     this.parameterDefinition = parameterDefinition;
     this.frontendType        = frontendType ?? throw new ArgumentNullException(nameof(frontendType));
 }