Exemplo n.º 1
0
        public void EmitEvent(
            DecompilerContext context, IAstEmitter astEmitter,
            EventDefinition @event, JSRawOutputIdentifier dollar
            )
        {
            if (Translator.ShouldSkipMember(@event))
            {
                return;
            }

            var eventInfo = TypeInfo.GetMemberInformation <Internal.EventInfo>(@event);

            if ((eventInfo == null) || eventInfo.IsIgnored)
            {
                return;
            }

            var isStatic = (@event.AddMethod ?? @event.RemoveMethod).IsStatic;

            Formatter.NewLine();

            dollar.WriteTo(Formatter);
            Formatter.Dot();

            if (eventInfo.IsExternal)
            {
                Formatter.Identifier("ExternalEvent", EscapingMode.None);
            }
            else if (@event.DeclaringType.HasGenericParameters && isStatic)
            {
                Formatter.Identifier("GenericEvent", EscapingMode.None);
            }
            else
            {
                Formatter.Identifier("Event", EscapingMode.None);
            }

            Formatter.LPar();

            Formatter.MemberDescriptor(eventInfo.IsPublic, eventInfo.IsStatic, eventInfo.IsVirtual);

            Formatter.Comma();

            Formatter.Value(Util.EscapeIdentifier(eventInfo.Name, EscapingMode.String));

            Formatter.Comma();
            Formatter.TypeReference(@event.EventType, astEmitter.ReferenceContext);

            Formatter.RPar();

            EmitCustomAttributes(context, @event.DeclaringType, @event, astEmitter);

            Formatter.Semicolon();
        }
Exemplo n.º 2
0
        public void EmitMethodDefinition(
            DecompilerContext context, MethodReference methodRef, MethodDefinition method,
            IAstEmitter astEmitter, bool stubbed,
            JSRawOutputIdentifier dollar, MethodInfo methodInfo = null
            )
        {
            if (methodInfo == null)
            {
                methodInfo = _TypeInfoProvider.GetMemberInformation <Internal.MethodInfo>(method);
            }

            bool isExternal, isReplaced, methodIsProxied;

            if (!Translator.ShouldTranslateMethodBody(
                    method, methodInfo, stubbed,
                    out isExternal, out isReplaced, out methodIsProxied
                    ))
            {
                return;
            }

            JSFunctionExpression function = Translator.GetFunctionBodyForMethod(
                isExternal, methodInfo
                );

            astEmitter.ReferenceContext.EnclosingType   = method.DeclaringType;
            astEmitter.ReferenceContext.EnclosingMethod = null;

            Formatter.NewLine();

            astEmitter.ReferenceContext.Push();
            astEmitter.ReferenceContext.DefiningMethod = methodRef;

            try {
                dollar.WriteTo(Formatter);
                Formatter.Dot();
                if (methodInfo.IsPInvoke)
                {
                    // FIXME: Write out dll name from DllImport
                    // FIXME: Write out alternate method name if provided
                    Formatter.Identifier("PInvokeMethod", EscapingMode.None);
                }
                else if (isExternal && !Configuration.GenerateSkeletonsForStubbedAssemblies.GetValueOrDefault(false))
                {
                    Formatter.Identifier("ExternalMethod", EscapingMode.None);
                }
                else
                {
                    Formatter.Identifier("Method", EscapingMode.None);
                }
                Formatter.LPar();

                // FIXME: Include IsVirtual?
                Formatter.MemberDescriptor(method.IsPublic, method.IsStatic, method.IsVirtual, false);

                Formatter.Comma();
                Formatter.Value(Util.EscapeIdentifier(methodInfo.GetName(true), EscapingMode.String));

                Formatter.Comma();
                Formatter.NewLine();

                Formatter.MethodSignature(methodRef, methodInfo.Signature, astEmitter.ReferenceContext);

                if (methodInfo.IsPInvoke && method.HasPInvokeInfo)
                {
                    Formatter.Comma();
                    Formatter.NewLine();
                    EmitPInvokeInfo(
                        methodRef, method, astEmitter
                        );
                }
                else if (!isExternal)
                {
                    Formatter.Comma();
                    Formatter.NewLine();

                    if (function != null)
                    {
                        Formatter.WriteRaw(Util.EscapeIdentifier(function.DisplayName));
                    }
                    else
                    {
                        Formatter.Identifier("JSIL.UntranslatableFunction", EscapingMode.None);
                        Formatter.LPar();
                        Formatter.Value(method.FullName);
                        Formatter.RPar();
                    }
                }

                Formatter.NewLine();
                Formatter.RPar();

                astEmitter.ReferenceContext.AttributesMethod = methodRef;

                EmitOverrides(context, methodInfo.DeclaringType, method, methodInfo, astEmitter);

                EmitCustomAttributes(context, method.DeclaringType, method, astEmitter);

                EmitParameterAttributes(context, method.DeclaringType, method, astEmitter);

                Formatter.Semicolon();
            } finally {
                astEmitter.ReferenceContext.Pop();
            }
        }