예제 #1
0
        public void Overrides(bool isInterface, bool isSealed, bool isAbstract)
        {
            var mGenerics = Enumerable.Range(0, 2).Select(i => GenericParameter.Create("U" + i)).ToArray();
            var baseType  = isInterface ? TypeSignature.Interface("Base", ns, Accessibility.APublic)
                                       : TypeSignature.Class("BaseC", ns, Accessibility.APublic, isAbstract: true);

            var baseMethod1  = MethodSignature.Abstract("M1", baseType, isInterface ? Accessibility.APublic : Accessibility.AProtected, TypeSignature.Object).With(isAbstract: isInterface);
            var baseMethod2  = MethodSignature.Abstract("M2", baseType, Accessibility.APublic, mGenerics[0], new MethodParameter(mGenerics[1], "a")).With(typeParameters: mGenerics.ToImmutableArray());
            var baseProperty = PropertySignature.Abstract("P1", baseType, TypeSignature.Boolean, Accessibility.APublic, null);

            cx.AddType(TypeDef.Empty(baseType).AddMember(
                           isInterface ? MethodDef.InterfaceDef(baseMethod1) : MethodDef.Create(baseMethod1, _ => Expression.Constant <object>(null)),
                           MethodDef.InterfaceDef(baseMethod2),
                           PropertyDef.InterfaceDef(baseProperty)
                           ));

            var type     = TypeSignature.Class("C", ns, Accessibility.APublic, canOverride: !isSealed, isAbstract: isAbstract);
            var method1  = MethodSignature.Override(type, baseMethod1, isAbstract: isAbstract);
            var method2  = MethodSignature.Override(type, baseMethod2);
            var property = PropertySignature.Override(type, baseProperty);

            cx.AddType(TypeDef.Empty(type, isInterface ? null : baseType.Specialize())
                       .AddImplements(isInterface ? new [] { baseType.Specialize() } : new SpecializedType[0])
                       .AddMember(
                           isAbstract ? MethodDef.InterfaceDef(method1) : MethodDef.Create(method1, _ => Expression.Constant(1).Box()),
                           MethodDef.Create(method2, (_, __) => Expression.Default(method2.TypeParameters[0])),
                           PropertyDef.Create(property, @this => Expression.Default(property.Type))
                           ));

            check.CheckOutput(cx, $"ifc({isInterface})-sealed({isSealed})-abstract({isAbstract})");
        }
예제 #2
0
        public static MethodDef ImplementToString(TypeSignature declaringType)
        {
            var method = MethodSignature.Override(declaringType, MethodSignature.Object_ToString);

            return(MethodDef.Create(method, @this => {
                return
                @this.Ref()
                .CallMethod(FormatMethodSignature(declaringType))
                .CallMethod(MethodReference.FromLambda <FmtToken>(x => x.ToString("\t", null)));
            }));
        }
예제 #3
0
        private TypeDef ImplementToString(TypeDef declaringType)
        {
            var properties =
                declaringType.Members
                .OfType <PropertyDef>()
                .Select(p => p.Signature)
                .Where(p => !p.IsStatic);

            var toStringSgn = MethodSignature.Override(declaringType.Signature, MethodSignature.Object_ToString);
            var toStringDef = MethodDef.Create(toStringSgn, @this => {
                Expression formatProperty(PropertySignature property)
                {
                    return(@this.Read().ReadProperty(property));
                }

                IEnumerable <Expression> stringFragments()
                {
                    yield return(Expression.Constant(declaringType.Signature.Name));

                    yield return(Expression.Constant(" {"));

                    var first = true;
                    foreach (var property in properties)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            yield return(Expression.Constant(","));
                        }
                        yield return(Expression.Constant(" " + property.Name + " = "));

                        yield return(formatProperty(property));
                    }
                    yield return(Expression.Constant(" }"));
                }

                return(ExpressionFactory.String_Concat(stringFragments()));
            });


            return(declaringType.AddMember(toStringDef));
        }
예제 #4
0
 static MethodSignature FormatMethodSignature(TypeSignature declaringType) =>
 MethodSignature.Override(declaringType, MethodReference.FromLambda <ITokenFormatable>(t => t.Format()).Signature);