예제 #1
0
        public override ITypeSymbol ResolveTypeSymbol(PhpCompilation compilation)
        {
            if (this.ResolvedType.IsValidType())
            {
                return(this.ResolvedType);
            }

            if (_self == null || _self.IsTraitType())
            {
                // no self, parent, static resolvable in compile-time:
                return(new MissingMetadataTypeSymbol(ToString(), 0, false));
            }

            // resolve types that parser skipped
            switch (_type)
            {
            case ReservedType.self:
                return(_self);

            case ReservedType.parent:
                var btype = _self.BaseType;
                return((btype == null || btype.IsObjectType())     // no "System.Object" in PHP, invalid parent
                        ? new MissingMetadataTypeSymbol(ToString(), 0, false)
                        : btype);

            case ReservedType.@static:
                if (_self.IsSealed)
                {
                    // `static` == `self` <=> self is sealed
                    return(_self);
                }
                break;
            }

            // unk
            return(null);
        }