Ejemplo n.º 1
0
        public override void Translate(MethodDeclaration model, TranslationContext context)
        {
            if (model == null)
            {
                return;
            }

            context.WriteDeclaration(model);
            context.Write(" = function (");

            if (model.HasParameters)
            {
                context.WriteModels(model.Parameters, ", ");
            }

            // begin method
            context.WriteLine(") {");
            context.Indent();

            // set optional params to defaults
            foreach (var param in model.Parameters.Where(p => p.Definition.HasDefaultValue))
            {
                context.Write(String.Format("{0} = ({0} !== undefined) ? {0} : ", param.Name));
                context.WriteModel(param.DefaultExpression);
                context.WriteLine(";");
            }

            // write method body
            context.WriteModelBody(model.Body);
            context.Unindent();
            context.EnsureLineBreak();
            context.WriteLine("};");
        }
Ejemplo n.º 2
0
        public override void Translate(FieldDeclaration model, TranslationContext context)
        {
            if (model == null)
            {
                return;
            }

            context.WriteDeclaration(model);
            context.Write(" = ");

            if (model.Initializer == null)
            {
                context.Write(context.GetDefaultValue(model.Definition.Type));
            }
            else
            {
                // write the initializer
                context.InitializingType = model.Container;
                context.WriteModel(model.Initializer);
                context.InitializingType = null;
            }

            context.WriteLine(";");
        }
Ejemplo n.º 3
0
        public override void Translate(EventDeclaration model, TranslationContext context)
        {
            if (model == null)
            {
                return;
            }

            string fieldAddScript = null;
            string fieldRemScript = null;

            if (model.IsField)
            {
                // add a backing event list
                var fieldName    = "$" + model.Definition.Name;
                var backingField = new FieldDeclaration
                {
                    Container       = model.Container,
                    OriginatingNode = model.OriginatingNode,
                    OriginatingTree = model.OriginatingTree,
                    Definition      = new FieldDefinition
                    {
                        Name           = fieldName,
                        ContainingType = model.Definition.ContainingType,
                        Type           = new ClassDefinition()
                        {
                            Kind      = DefinitionKind.Type,
                            Name      = "Event",
                            Namespace = "Blade",
                        }
                    },
                    Initializer = new LiteralExpression
                    {
                        Type = LiteralType.None,
                        Text = "new Blade.Event()"
                    }
                };

                // use same modifier as property, but force private
                backingField.Definition.Modifiers.Apply(model.Definition.Modifiers);
                backingField.Definition.Modifiers.Access = Accessibility.Private;

                context.WriteModel(backingField);

                // manually create get/set body
                var fieldPrefix = model.IsStatic ? model.Container.Name : "this";
                var fieldAccess = fieldPrefix + "." + fieldName;

                fieldAddScript = fieldAccess + ".add(func, ctx);";
                fieldRemScript = fieldAccess + ".rem(func);";

                // add a method to invoke the event
                context.WriteDeclaration(model);
                context.WriteLine(" = function() {");
                context.Indent();
                context.WriteLine(fieldAccess + ".pub.apply(" + fieldAccess + ", arguments);");
                context.Unindent();
                context.WriteLine("}");
            }

            // write the add accessor
            context.WriteDeclaration(model, postfix: "$add");
            context.WriteLine(" = function(func, ctx) {");
            context.Indent();

            if (model.IsField)
            {
                context.WriteLine(fieldAddScript);
            }
            else
            {
                context.WriteModelBody(model.AddAccessor);
            }

            context.Unindent();
            context.WriteLine("};");

            // write the remove accessor
            context.WriteDeclaration(model, postfix: "$rem");
            context.WriteLine(" = function(func) {");
            context.Indent();

            if (model.IsField)
            {
                context.WriteLine(fieldRemScript);
            }
            else
            {
                context.WriteModelBody(model.RemoveAccessor);
            }

            context.Unindent();
            context.WriteLine("};");
        }
Ejemplo n.º 4
0
        public override void Translate(PropertyDeclaration model, TranslationContext context)
        {
            if (model == null)
            {
                return;
            }

            string autoGetScript = null;
            string autoSetScript = null;

            if (model.IsAutoProperty)
            {
                // add a backing field
                var fieldName    = "$" + model.Definition.Name;
                var backingField = new FieldDeclaration
                {
                    Container       = model.Container,
                    OriginatingNode = model.OriginatingNode,
                    OriginatingTree = model.OriginatingTree,
                    Definition      = new FieldDefinition
                    {
                        Name           = fieldName,
                        ContainingType = model.Definition.ContainingType,
                        Type           = model.Definition.Type,
                        Kind           = DefinitionKind.Member,
                        MemberKind     = MemberDefinitionKind.Field
                    }
                };

                // use same modifier as property, but force private
                backingField.Definition.Modifiers.Apply(model.Definition.Modifiers);
                backingField.Definition.Modifiers.Access = Accessibility.Private;

                context.WriteModel(backingField);

                // manually create get/set body
                var fieldPrefix = model.IsStatic ? model.Container.Name : "this";
                autoGetScript = "return " + fieldPrefix + "." + fieldName + ";";
                autoSetScript = fieldPrefix + "." + fieldName + " = value;";
            }

            // write the get accessor
            if (model.HasGetter || model.IsAutoProperty)
            {
                context.WriteDeclaration(model, "get_");
                context.WriteLine(" = function() {");
                context.Indent();

                if (model.IsAutoProperty)
                {
                    context.WriteLine(autoGetScript);
                }
                else
                {
                    context.WriteModelBody(model.GetAccessor);
                }

                context.Unindent();
                context.WriteLine("};");
            }

            // write the set accessor
            if (model.HasSetter || model.IsAutoProperty)
            {
                context.WriteDeclaration(model, "set_");
                context.WriteLine(" = function(value) {");
                context.Indent();

                if (model.IsAutoProperty)
                {
                    context.WriteLine(autoSetScript);
                }
                else
                {
                    context.WriteModelBody(model.SetAccessor);
                }

                context.Unindent();
                context.WriteLine("};");
            }
        }