Beispiel #1
0
            // TODO: if it's an indexer then we want to override get_Item/set_Item methods
            // which map to [] and []=

            internal void AddBaseMethods(Type finishedType, SpecialNames specialNames)
            {
                // "Adds" base methods to super type - this makes super(...).xyz to work - otherwise
                // we'd return a function that did a virtual call resulting in a stack overflow.
                OverriddenMembers overrides = OverriddenMembers.GetForType(finishedType);

                foreach (MethodInfo mi in finishedType.GetMethods())
                {
                    if (!ShouldOverrideVirtual(mi))
                    {
                        continue;
                    }

                    string methodName = mi.Name;
                    if (methodName.StartsWith(BaseMethodPrefix) || methodName.StartsWith(FieldGetterPrefix) || methodName.StartsWith(FieldSetterPrefix))
                    {
                        foreach (string newName in specialNames.GetBaseName(mi))
                        {
                            if (mi.IsSpecialName && (newName.StartsWith("get_") || newName.StartsWith("set_")))
                            {
                                StoreOverriddenProperty(overrides, mi, newName);
                            }
                            else if (mi.IsSpecialName && (newName.StartsWith(FieldGetterPrefix) || newName.StartsWith(FieldSetterPrefix)))
                            {
                                StoreOverriddenField(overrides, mi, newName);
                            }
                            else
                            {
                                StoreOverriddenMethod(overrides, mi, newName);
                            }
                        }
                    }
                }
            }
Beispiel #2
0
            private void StoreOverriddenMethod(OverriddenMembers overrides, MethodInfo mi, string newName)
            {
                MemberInfo[] members = _baseType.GetMember(newName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy);
                Debug.Assert(members.Length > 0, String.Format("{0} from {1}", newName, _baseType.Name));
                Type declType = members[0].DeclaringType;

                overrides.AddMethod(mi, newName);
            }
 internal static OverriddenMembers GetForType(Type/*!*/ type) {
     OverriddenMembers result;
     lock (_overrideData) {
         if (!_overrideData.TryGetValue(type, out result)) {
             _overrideData[type] = result = new OverriddenMembers();
         }
     }
     return result;
 }
Beispiel #4
0
            internal static OverriddenMembers GetForType(Type /*!*/ type)
            {
                OverriddenMembers result;

                lock (_overrideData) {
                    if (!_overrideData.TryGetValue(type, out result))
                    {
                        _overrideData[type] = result = new OverriddenMembers();
                    }
                }
                return(result);
            }
Beispiel #5
0
            private void StoreOverriddenField(OverriddenMembers overrides, MethodInfo mi, string newName)
            {
                string fieldName = newName.Substring(FieldGetterPrefix.Length); // get_ or set_

                foreach (FieldInfo pi in _baseType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy))
                {
                    if (pi.Name == fieldName)
                    {
                        if (newName.StartsWith(FieldGetterPrefix))
                        {
                            overrides.AddMethod(mi, fieldName);
                        }
                        else if (newName.StartsWith(FieldSetterPrefix))
                        {
                            overrides.AddMethod(mi, fieldName + "=");
                        }
                    }
                }
            }
Beispiel #6
0
            private void StoreOverriddenProperty(OverriddenMembers overrides, MethodInfo mi, string newName)
            {
                string propName = newName.Substring(4); // get_ or set_

                foreach (PropertyInfo pi in _baseType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy))
                {
                    if (pi.Name == propName)
                    {
                        if (newName.StartsWith("get_"))
                        {
                            overrides.AddMethod(mi, propName);
                        }
                        else if (newName.StartsWith("set_"))
                        {
                            overrides.AddMethod(mi, propName + "=");
                        }
                    }
                }
            }
            private void StoreOverriddenMethod(OverriddenMembers overrides, MethodInfo mi, string newName) {
                MemberInfo[] members = _baseType.GetMember(newName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy);
                Debug.Assert(members.Length > 0, String.Format("{0} from {1}", newName, _baseType.Name));
                Type declType = members[0].DeclaringType;

                overrides.AddMethod(mi, newName);
            }
 private void StoreOverriddenField(OverriddenMembers overrides, MethodInfo mi, string newName) {
     string fieldName = newName.Substring(FieldGetterPrefix.Length); // get_ or set_
     foreach (FieldInfo pi in _baseType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy)) {
         if (pi.Name == fieldName) {
             if (newName.StartsWith(FieldGetterPrefix)) {
                 overrides.AddMethod(mi, fieldName);
             } else if (newName.StartsWith(FieldSetterPrefix)) {
                 overrides.AddMethod(mi, fieldName + "=");
             }
         }
     }
 }
 private void StoreOverriddenProperty(OverriddenMembers overrides, MethodInfo mi, string newName) {
     string propName = newName.Substring(4); // get_ or set_
     foreach (PropertyInfo pi in _baseType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy)) {
         if (pi.Name == propName) {
             if (newName.StartsWith("get_")) {
                 overrides.AddMethod(mi, propName);
             } else if (newName.StartsWith("set_")) {
                 overrides.AddMethod(mi, propName + "=");
             }
         }
     }
 }
Beispiel #10
0
 public static List <MemberTracker /*!*/> GetOverriddenMembersForType(Type /*!*/ type, string /*!*/ name)
 {
     return(OverriddenMembers.GetForType(type).GetMembers(name));
 }