Esempio n. 1
0
        public static MethodSymbol ResolveMethodImplementation(MethodSymbol method, NamedTypeSymbol type)
        {
            // ignoring System.Object (we don't override its methods from PHP)
            bool ignoreSystemObject = method.ContainingType.IsPhpType();

            for (; type != null; type = type.BaseType)
            {
                if (ignoreSystemObject && type.SpecialType == SpecialType.System_Object)
                {
                    break;
                }

                var members = type.GetMembersByPhpName(method.RoutineName).OfType <MethodSymbol>().Where(CanOverride);
                if (method.ContainingType.IsInterface)
                {
                    // check explicit interface override
                    members = members.Concat(type.GetMembers(method.ContainingType.GetFullName() + "." + method.RoutineName).OfType <MethodSymbol>());
                }

                var resolved = ResolveMethodImplementation(method, members);
                if (resolved != null)
                {
                    return(resolved);
                }
            }

            //
            return(null);
        }
        public override ImmutableArray <Symbol> GetMembersByPhpName(string name)
        {
            var originalMembers = _originalDefinition.GetMembersByPhpName(name);

            if (originalMembers.IsDefaultOrEmpty)
            {
                return(originalMembers);
            }

            return(originalMembers.Select(t => t.SymbolAsMember(this)).AsImmutable());
        }
        public static MethodSymbol ResolveMethodImplementation(MethodSymbol method, NamedTypeSymbol type)
        {
            for (; type != null; type = type.BaseType)
            {
                var members = type.GetMembersByPhpName(method.RoutineName).OfType <MethodSymbol>().Where(CanOverride);
                if (method.ContainingType.IsInterface)
                {
                    // check explicit interface override
                    members = members.Concat(type.GetMembers(method.ContainingType.GetFullName() + "." + method.RoutineName).OfType <MethodSymbol>());
                }

                var resolved = ResolveMethodImplementation(method, members);
                if (resolved != null)
                {
                    return(resolved);
                }
            }

            //
            return(null);
        }