Beispiel #1
0
        internal override ImmutableArray <NamedTypeSymbol> GetDeclaredInterfaces(ConsList <Symbol> basesBeingResolved)
        {
            var ifaces = new HashSet <NamedTypeSymbol>();

            foreach (var i in _syntax.ImplementsList)
            {
                var t = (NamedTypeSymbol)DeclaringCompilation.GetTypeByMetadataName(i.ClassName.ClrName())
                        ?? new MissingMetadataTypeSymbol(i.ClassName.ClrName(), 0, false);

                if (t.Arity != 0)
                {
                    throw new NotImplementedException();    // generics
                }

                ifaces.Add(t);
            }

            // __invoke => IPhpCallable
            if (IsInvokable)
            {
                ifaces.Add(DeclaringCompilation.CoreTypes.IPhpCallable);
            }

            //
            return(ifaces.AsImmutable());
        }
Beispiel #2
0
        NamedTypeSymbol ResolveBaseType(DiagnosticBag diagnostics)
        {
            NamedTypeSymbol btype;

            if (_syntax.BaseClass != null)
            {
                var baseTypeName = _syntax.BaseClass.ClassName;
                if (baseTypeName == this.MakeQualifiedName())
                {
                    // TODO: Err diagnostics
                    throw new NotImplementedException($"cycle in class hierarchy, {this.MakeQualifiedName()} extends itself.");
                }

                btype = (NamedTypeSymbol)DeclaringCompilation.GetTypeByMetadataName(baseTypeName.ClrName())
                        ?? new MissingMetadataTypeSymbol(baseTypeName.ClrName(), 0, false);

                if (btype.Arity != 0)
                {
                    // TODO: Err diagnostics
                    throw new NotImplementedException($"Class {this.MakeQualifiedName()} extends a generic type {baseTypeName}.");    // generics not supported yet
                }
            }
            else if (!IsStatic && !IsInterface)
            {
                btype = DeclaringCompilation.CoreTypes.Object.Symbol;
            }
            else
            {
                btype = null;
            }

            //
            return(btype);
        }