Esempio n. 1
0
        public static string GetPropertyRef(IMember property, IEmitter emitter, bool isSetter = false, bool noOverload = false, bool ignoreInterface = false)
        {
            var attrName = emitter.GetEntityNameFromAttr(property, isSetter);

            if (!string.IsNullOrEmpty(attrName))
            {
                return attrName;
            }

            var name = emitter.GetEntityName(property, true, ignoreInterface);

            if (!noOverload)
            {
                var overloads = OverloadsCollection.Create(emitter, property, isSetter);
                name = overloads.HasOverloads ? overloads.GetOverloadName() : name;
                noOverload = !overloads.HasOverloads;
            }

            if (Helpers.IsFieldProperty(property, emitter))
            {
                return noOverload ? emitter.GetEntityName(property, false) : name;
            }

            return (isSetter ? "set" : "get") + name;
        }
Esempio n. 2
0
        public static string GetPropertyRef(IMember property, IEmitter emitter, bool isSetter = false, bool noOverload = false, bool ignoreInterface = false, bool withoutTypeParams = false, bool skipPrefix = false)
        {
            var attrName = emitter.GetEntityNameFromAttr(property, isSetter);

            if (!string.IsNullOrEmpty(attrName))
            {
                return(Helpers.AddInterfacePrefix(property, emitter, ignoreInterface, attrName, isSetter));
            }

            string name            = null;
            bool   isFieldProperty = Helpers.IsFieldProperty(property, emitter);

            if (isFieldProperty)
            {
                return(emitter.GetEntityName(property, false, ignoreInterface));
            }

            if (!noOverload)
            {
                var overloads = OverloadsCollection.Create(emitter, property, isSetter);
                return(overloads.GetOverloadName(ignoreInterface, skipPrefix ? null : GetSetOrGet(isSetter), withoutTypeParams));
            }

            name = emitter.GetEntityName(property, true, ignoreInterface);
            return(skipPrefix ? name : GetSetOrGet(isSetter, name));
        }
Esempio n. 3
0
        public static string GetPropertyRef(IMember property, IEmitter emitter, bool isSetter = false, bool noOverload = false, bool ignoreInterface = false)
        {
            if (property.DeclaringTypeDefinition != null && emitter.Validator.IsIgnoreType(property.DeclaringTypeDefinition))
            {
                var attrName = emitter.GetEntityNameFromAttr(property, isSetter);
                if (!string.IsNullOrEmpty(attrName))
                {
                    return(attrName);
                }
            }

            string name = emitter.GetEntityName(property, true, ignoreInterface);

            if (property.SymbolKind == SymbolKind.Indexer && name == "Item")
            {
                name = "";
            }
            else
            {
                if (!noOverload)
                {
                    var overloads = OverloadsCollection.Create(emitter, property, isSetter);
                    name       = overloads.HasOverloads ? overloads.GetOverloadName() : name;
                    noOverload = !overloads.HasOverloads;
                }
                if (Helpers.IsFieldProperty(property, emitter))
                {
                    return(noOverload ? emitter.GetEntityName(property, false) : name);
                }
            }
            return((isSetter ? "set" : "get") + name);
        }
Esempio n. 4
0
        public static string GetPropertyRef(PropertyDeclaration property, IEmitter emitter, bool isSetter = false, bool noOverload = false, bool ignoreInterface = false)
        {
            ResolveResult resolveResult = emitter.Resolver.ResolveNode(property, emitter) as MemberResolveResult;

            if (resolveResult != null && ((MemberResolveResult)resolveResult).Member != null)
            {
                return(GetPropertyRef(((MemberResolveResult)resolveResult).Member, emitter, isSetter, noOverload, ignoreInterface));
            }

            var name = emitter.GetEntityName(property, true, ignoreInterface);

            if (!noOverload)
            {
                var overloads = OverloadsCollection.Create(emitter, property, isSetter);
                name       = overloads.HasOverloads ? overloads.GetOverloadName() : name;
                noOverload = !overloads.HasOverloads;
            }

            if (Helpers.IsFieldProperty(property, emitter))
            {
                return(noOverload ? emitter.GetEntityName(property, false) : name);
            }

            return((isSetter ? "set" : "get") + name);
        }
Esempio n. 5
0
        public static string GetPropertyRef(PropertyDeclaration property, IEmitter emitter, bool isSetter = false, bool noOverload = false, bool ignoreInterface = false, bool withoutTypeParams = false)
        {
            ResolveResult resolveResult = emitter.Resolver.ResolveNode(property, emitter) as MemberResolveResult;

            if (resolveResult != null && ((MemberResolveResult)resolveResult).Member != null)
            {
                return(GetPropertyRef(((MemberResolveResult)resolveResult).Member, emitter, isSetter, noOverload, ignoreInterface, withoutTypeParams));
            }

            string name;
            bool   isFieldProperty = Helpers.IsFieldProperty(property, emitter);

            if (isFieldProperty)
            {
                return(emitter.GetEntityName(property, false, ignoreInterface));
            }

            if (!noOverload)
            {
                var overloads = OverloadsCollection.Create(emitter, property, isSetter);
                return(overloads.GetOverloadName(ignoreInterface, GetSetOrGet(isSetter), withoutTypeParams));
            }

            name = emitter.GetEntityName(property, true, ignoreInterface);
            return(GetSetOrGet(isSetter, name));
        }
Esempio n. 6
0
 private OverloadsCollection(IEmitter emitter, PropertyDeclaration propDeclaration, bool isSetter)
 {
     this.Emitter          = emitter;
     this.Name             = propDeclaration.Name;
     this.JsName           = Helpers.GetPropertyRef(propDeclaration, emitter, isSetter, true, true);
     this.Inherit          = !propDeclaration.HasModifier(Modifiers.Static);
     this.Static           = propDeclaration.HasModifier(Modifiers.Static);
     this.CancelChangeCase = !Helpers.IsFieldProperty(propDeclaration, emitter);
     this.IsSetter         = isSetter;
     this.Member           = this.FindMember(propDeclaration);
     this.TypeDefinition   = this.Member.DeclaringTypeDefinition;
     this.Type             = this.Member.DeclaringType;
     this.InitMembers();
     this.Emitter.OverloadsCache[propDeclaration.GetHashCode().ToString()] = this;
 }
Esempio n. 7
0
        private OverloadsCollection(IEmitter emitter, IMember member, bool isSetter = false, bool includeInline = false, bool isField = false)
        {
            if (member is IMethod)
            {
                var method = (IMethod)member;
                this.Inherit     = !method.IsConstructor && !method.IsStatic;
                this.Static      = method.IsStatic;
                this.Constructor = method.IsConstructor;
            }
            else if (member is IEntity)
            {
                var entity = (IEntity)member;
                this.Inherit = !entity.IsStatic;
                this.Static  = entity.IsStatic;
            }

            this.Emitter = emitter;
            this.Name    = member.Name;
            this.IsField = isField;

            if (member is IProperty)
            {
                this.CancelChangeCase = !Helpers.IsFieldProperty(member, emitter);
                this.JsName           = Helpers.GetPropertyRef(member, emitter, isSetter, true, true);
                this.AltJsName        = Helpers.GetPropertyRef(member, emitter, !isSetter, true, true);
                var p = (IProperty)member;
                this.FieldJsName = Helpers.IsAutoProperty(p) ? (Helpers.IsFieldProperty(p, this.Emitter) ? this.Emitter.GetEntityName(p) : Helpers.GetPropertyRef(p, this.Emitter, true, true, true, false, true)) : null;
            }
            else if (member is IEvent)
            {
                this.CancelChangeCase = true;
                this.JsName           = Helpers.GetEventRef(member, emitter, isSetter, true, true);
                this.AltJsName        = Helpers.GetEventRef(member, emitter, !isSetter, true, true);
                this.FieldJsName      = Helpers.GetEventRef(member, emitter, true, true, true, false, true);
            }
            else
            {
                this.JsName = this.Emitter.GetEntityName(member, false, true);
            }

            this.IncludeInline  = includeInline;
            this.Member         = member;
            this.TypeDefinition = this.Member.DeclaringTypeDefinition;
            this.Type           = this.Member.DeclaringType;
            this.IsSetter       = isSetter;
            this.InitMembers();
            this.Emitter.OverloadsCacheMembers[new Tuple <IMember, bool, bool>(member, isSetter, includeInline)] = this;
        }
Esempio n. 8
0
        private OverloadsCollection(IEmitter emitter, IMember member, bool isSetter = false, bool includeInline = false)
        {
            if (member is IMethod)
            {
                var method = (IMethod)member;
                this.Inherit     = !method.IsConstructor && !method.IsStatic;
                this.Static      = method.IsStatic;
                this.Constructor = method.IsConstructor;
            }
            else if (member is IEntity)
            {
                var entity = (IEntity)member;
                this.Inherit = !entity.IsStatic;
                this.Static  = entity.IsStatic;
            }

            this.Emitter = emitter;
            this.Name    = member.Name;

            if (member is IProperty)
            {
                this.CancelChangeCase = !Helpers.IsFieldProperty(member, emitter);
                this.JsName           = Helpers.GetPropertyRef(member, emitter, isSetter, true, true);
                this.AltJsName        = Helpers.GetPropertyRef(member, emitter, !isSetter, true, true);
            }
            else if (member is IEvent)
            {
                this.CancelChangeCase = true;
                this.JsName           = Helpers.GetEventRef(member, emitter, isSetter, true, true);
                this.AltJsName        = Helpers.GetEventRef(member, emitter, !isSetter, true, true);
            }
            else
            {
                this.JsName = this.Emitter.GetEntityName(member, false, true);
            }

            this.IncludeInline  = includeInline;
            this.Member         = member;
            this.TypeDefinition = this.Member.DeclaringTypeDefinition;
            this.Type           = this.Member.DeclaringType;
            this.IsSetter       = isSetter;
            this.InitMembers();
            string key = (member.MemberDefinition != null ? member.MemberDefinition.GetHashCode().ToString() : member.GetHashCode().ToString()) + isSetter.GetHashCode().ToString();

            this.Emitter.OverloadsCache[key] = this;
        }
Esempio n. 9
0
        private OverloadsCollection(IEmitter emitter, PropertyDeclaration propDeclaration, bool isSetter)
        {
            this.Emitter          = emitter;
            this.Name             = propDeclaration.Name;
            this.JsName           = Helpers.GetPropertyRef(propDeclaration, emitter, isSetter, true, true);
            this.AltJsName        = Helpers.GetPropertyRef(propDeclaration, emitter, !isSetter, true, true);
            this.FieldJsName      = propDeclaration.Getter != null && propDeclaration.Getter.Body.IsNull ? emitter.GetEntityName(propDeclaration) : null;
            this.Inherit          = !propDeclaration.HasModifier(Modifiers.Static);
            this.Static           = propDeclaration.HasModifier(Modifiers.Static);
            this.CancelChangeCase = !Helpers.IsFieldProperty(propDeclaration, emitter);
            this.IsSetter         = isSetter;
            this.Member           = this.FindMember(propDeclaration);
            var p = (IProperty)this.Member;

            this.FieldJsName    = Helpers.IsAutoProperty(p) ? (Helpers.IsFieldProperty(p, this.Emitter) ? this.Emitter.GetEntityName(p) : Helpers.GetPropertyRef(p, this.Emitter, true, true, true, false, true)) : null;
            this.TypeDefinition = this.Member.DeclaringTypeDefinition;
            this.Type           = this.Member.DeclaringType;
            this.InitMembers();
            this.Emitter.OverloadsCacheNodes[new Tuple <AstNode, bool>(propDeclaration, isSetter)] = this;
        }
Esempio n. 10
0
        public static bool IsFieldProperty(PropertyDeclaration property, IEmitter emitter)
        {
            ResolveResult resolveResult = emitter.Resolver.ResolveNode(property, emitter) as MemberResolveResult;

            if (resolveResult != null && ((MemberResolveResult)resolveResult).Member != null)
            {
                return(Helpers.IsFieldProperty(((MemberResolveResult)resolveResult).Member, emitter));
            }

            string name  = "Bridge.FieldProperty";
            string name1 = name + "Attribute";

            foreach (var i in property.Attributes)
            {
                foreach (var j in i.Attributes)
                {
                    if (j.Type.ToString() == name || j.Type.ToString() == name1)
                    {
                        return(true);
                    }
                    resolveResult = emitter.Resolver.ResolveNode(j, emitter);
                    if (resolveResult != null && resolveResult.Type != null && resolveResult.Type.FullName == name1)
                    {
                        return(true);
                    }
                }
            }

            if (!emitter.AssemblyInfo.AutoPropertyToField)
            {
                return(false);
            }

            var typeDef = emitter.GetTypeDefinition();
            var propDef = typeDef.Properties.FirstOrDefault(p => p.Name == property.Name);

            return(Helpers.IsAutoProperty(propDef));
        }
Esempio n. 11
0
        public static bool IsFieldProperty(PropertyDeclaration property, IEmitter emitter)
        {
            ResolveResult resolveResult = emitter.Resolver.ResolveNode(property, emitter) as MemberResolveResult;

            if (resolveResult != null && ((MemberResolveResult)resolveResult).Member != null)
            {
                return(Helpers.IsFieldProperty(((MemberResolveResult)resolveResult).Member, emitter));
            }

            if (AttributeHelper.HasFieldAttribute(property, emitter))
            {
                return(true);
            }

            if (!emitter.AssemblyInfo.AutoPropertyToField)
            {
                return(false);
            }

            var typeDef = emitter.GetTypeDefinition();
            var propDef = typeDef.Properties.FirstOrDefault(p => p.Name == property.Name);

            return(Helpers.IsAutoProperty(propDef));
        }
Esempio n. 12
0
        protected virtual List <IProperty> GetPropertyOverloads(List <IProperty> list = null, ITypeDefinition typeDef = null)
        {
            bool isTop = list == null;

            list    = list ?? new List <IProperty>();
            typeDef = typeDef ?? this.TypeDefinition;

            if (typeDef != null)
            {
                var bridgeType  = this.Emitter.BridgeTypes.Get(typeDef);
                var monoTypeDef = bridgeType != null ? bridgeType.TypeDefinition : null;
                var properties  = typeDef.Properties.Where(p =>
                {
                    if (p.IsExplicitInterfaceImplementation)
                    {
                        return(false);
                    }

                    var canGet = p.CanGet && p.Getter != null;
                    var canSet = p.CanSet && p.Setter != null;

                    if (monoTypeDef != null)
                    {
                        var monoProp = monoTypeDef.Properties.FirstOrDefault(mp => mp.Name == p.Name);

                        if (monoProp != null)
                        {
                            canGet = monoProp.GetMethod != null;
                            canSet = monoProp.SetMethod != null;
                        }
                    }

                    if (!this.IncludeInline)
                    {
                        var inline = canGet ? this.Emitter.GetInline(p.Getter) : null;
                        if (!string.IsNullOrWhiteSpace(inline))
                        {
                            return(false);
                        }

                        inline = canSet ? this.Emitter.GetInline(p.Setter) : null;
                        if (!string.IsNullOrWhiteSpace(inline))
                        {
                            return(false);
                        }

                        if (p.IsIndexer && canGet && p.Getter.Attributes.Any(a => a.AttributeType.FullName == "Bridge.ExternalAttribute"))
                        {
                            return(false);
                        }
                    }

                    bool eq             = false;
                    bool?equalsByGetter = null;
                    if (p.IsStatic == this.Static)
                    {
                        var getterIgnore = canGet && this.Emitter.Validator.IsExternalType(p.Getter);
                        var setterIgnore = canSet && this.Emitter.Validator.IsExternalType(p.Setter);
                        var getterName   = canGet ? Helpers.GetPropertyRef(p, this.Emitter, false, true, true) : null;
                        var setterName   = canSet ? Helpers.GetPropertyRef(p, this.Emitter, true, true, true) : null;
                        var fieldName    = Helpers.IsAutoProperty(p) ? (Helpers.IsFieldProperty(p, this.Emitter) ? this.Emitter.GetEntityName(p) : Helpers.GetPropertyRef(p, this.Emitter, true, true, true, false, true)) : null;

                        if (!getterIgnore && getterName != null && (getterName == this.JsName || getterName == this.AltJsName || getterName == this.FieldJsName))
                        {
                            eq             = true;
                            equalsByGetter = true;
                        }
                        else if (!setterIgnore && setterName != null && (setterName == this.JsName || setterName == this.AltJsName || setterName == this.FieldJsName))
                        {
                            eq             = true;
                            equalsByGetter = false;
                        }
                        else if (fieldName != null && (fieldName == this.JsName || fieldName == this.AltJsName || fieldName == this.FieldJsName))
                        {
                            eq = true;
                        }
                    }

                    if (eq)
                    {
                        if (p.IsOverride && !this.IsTemplateOverride(p))
                        {
                            return(false);
                        }

                        if (equalsByGetter.HasValue && this.Member is IMethod && this.AltJsName == null)
                        {
                            this.AltJsName = Helpers.GetPropertyRef(p, this.Emitter, equalsByGetter.Value, true, true);
                        }

                        return(true);
                    }

                    return(false);
                });

                list.AddRange(properties);

                if (this.Inherit)
                {
                    var baseTypeDefinitions = typeDef.DirectBaseTypes.Where(t => t.Kind == typeDef.Kind || (typeDef.Kind == TypeKind.Struct && t.Kind == TypeKind.Class));

                    foreach (var baseTypeDef in baseTypeDefinitions)
                    {
                        var result = this.GetPropertyOverloads(list, baseTypeDef.GetDefinition());
                        list.AddRange(result);
                    }
                }
            }

            return(isTop ? list.Distinct().ToList() : list);
        }