예제 #1
0
        protected virtual IEnumerable <Syntax> TranslateFieldDeclaration(FieldDeclaration fieldDeclaration, ILTranslationContext data)
        {
            foreach (var v in fieldDeclaration.Variables)
            {
                var fd = new D.FieldDeclaration();
                fd.Accessibility = GetAccessibility(fieldDeclaration.Modifiers);
                fd.IsStatic      = fieldDeclaration.HasModifier(Modifiers.Static);
                fd.FieldName     = v.Name;
                fd.FieldType     = ResolveType(fieldDeclaration, fieldDeclaration.ReturnType);

                // TODO: initializer

                yield return(fd);
            }
        }
예제 #2
0
        private void Translator_VisitingEventDeclaration(object sender, VisitingEventArgs <EventDeclaration> e)
        {
            if (e.Handled)
            {
                return;
            }

            var translator = (ILTranslator)sender;

            var ed = e.Node.Annotation <EventDefinition>();

            if (ed == null)
            {
                return;
            }

            var delType   = translator.ResolveType(e.Node, e.Node.ReturnType);
            var arrayType = delType as D.ArrayType;

            if (arrayType == null)
            {
                arrayType = (delType as D.UnionType)?.ElementTypes.OfType <D.ArrayType>().FirstOrDefault();
                if (arrayType == null)
                {
                    arrayType = delType.MakeArrayType();
                }
            }

            var n  = e.Node.Variables.Single().Name;
            var fn = FIELD_PREFIX + n;
            var fd = new D.FieldDeclaration()
            {
                FieldName = fn,
                FieldType = arrayType
            };

            var ad = CreateAddAccessor(translator, e, arrayType, ed);
            var rd = CreateRemoveAccessor(translator, e, arrayType, ed);

            e.Results = new Syntax[] { fd, ad, rd };
        }
예제 #3
0
        protected virtual IEnumerable <Syntax> TranslatePropertyDeclaration(PropertyDeclaration propertyDeclaration, ILTranslationContext data)
        {
            var acc = GetAccessibility(propertyDeclaration.Modifiers);
            var tr  = ResolveType(propertyDeclaration, propertyDeclaration.ReturnType);

            // TODO: デコレーター

            // TODO: virtualの場合メソッドを生成する
            //if (propertyDeclaration.HasModifier(Modifiers.Abstract) || propertyDeclaration.HasModifier(Modifiers.Virtual))
            //{
            //}
            //else
            if (propertyDeclaration.Getter.IsNull ||
                propertyDeclaration.Getter.HasChildren ||
                propertyDeclaration.Setter.IsNull ||
                propertyDeclaration.Setter.HasChildren)
            {
                if (propertyDeclaration.Getter.Body.IsNull &&
                    propertyDeclaration.Setter.Body.IsNull)
                {
                    var pd = new D.FieldDeclaration();
                    pd.Accessibility = D.AccessibilityModifier.Private;
                    pd.FieldName     = "__" + propertyDeclaration.Name;
                    pd.FieldType     = tr;

                    yield return(pd);
                }

                if (!propertyDeclaration.Getter.IsNull)
                {
                    var getter = new D.GetAccessorDeclaration();
                    getter.Accessibility = propertyDeclaration.Getter.Modifiers != Modifiers.None ? GetAccessibility(propertyDeclaration.Getter.Modifiers) : acc;
                    getter.PropertyName  = propertyDeclaration.Name;
                    getter.PropertyType  = tr;

                    if (propertyDeclaration.Getter.Body.IsNull)
                    {
                        getter.Statements.Add(new S.ReturnStatement()
                        {
                            Value = new E.PropertyExpression()
                            {
                                Object   = new E.ThisExpression(),
                                Property = "__" + propertyDeclaration.Name
                            }
                        });
                    }
                    else
                    {
                        getter.Statements = GetStatements(propertyDeclaration.Getter.Body, data);
                    }

                    yield return(getter);
                }

                if (!propertyDeclaration.Setter.IsNull)
                {
                    var setter = new D.SetAccessorDeclaration();
                    setter.Accessibility = propertyDeclaration.Setter.Modifiers != Modifiers.None ? GetAccessibility(propertyDeclaration.Setter.Modifiers) : acc;
                    setter.PropertyName  = propertyDeclaration.Name;
                    setter.PropertyType  = tr;
                    setter.ParameterName = "value";

                    if (propertyDeclaration.Setter.Body.IsNull)
                    {
                        setter.Statements.Add(new S.ExpressionStatement()
                        {
                            Expression = new E.AssignmentExpression()
                            {
                                Target = new E.PropertyExpression()
                                {
                                    Object   = new E.ThisExpression(),
                                    Property = "__" + propertyDeclaration.Name
                                },
                                Value = new E.IdentifierExpression()
                                {
                                    Name = "value"
                                }
                            }
                        });
                    }
                    else
                    {
                        setter.Statements = GetStatements(propertyDeclaration.Setter.Body, data);
                    }

                    yield return(setter);
                }
            }
            else
            {
                var pd = new D.FieldDeclaration();
                pd.Accessibility = acc;
                pd.FieldName     = propertyDeclaration.Name;
                pd.FieldType     = tr;

                yield return(pd);
            }
        }