Beispiel #1
0
        private TranslatedQualifiedName TranslateFallbackQualifiedName(QualifiedNameRef qname, AliasKind kind)
        {
            // aliasing
            QualifiedName tmp;

            if (qname.QualifiedName.IsSimpleName && this.namingContext.Aliases != null &&
                this.namingContext.Aliases.TryGetValue(new Alias(qname.QualifiedName.Name, kind), out tmp))
            {
                return(new TranslatedQualifiedName(tmp, qname.Span, qname, null));
            }

            //
            QualifiedName translatedQName;
            bool          translated = TranslateNamespace(qname, out translatedQName);

            if (!translatedQName.IsFullyQualifiedName && translatedQName.IsSimpleName && !IsInGlobalNamespace)
            {
                // "\foo"
                var fallbackQName = new QualifiedName(translatedQName.Name)
                {
                    IsFullyQualifiedName = true
                };
                // "namespace\foo"
                translatedQName = new QualifiedName(translatedQName.Name, namingContext.CurrentNamespace.Value.Namespaces)
                {
                    IsFullyQualifiedName = true
                };
                return(new TranslatedQualifiedName(translatedQName, qname.Span, qname, fallbackQName));
            }
            else
            {
                translatedQName.IsFullyQualifiedName = true;  // just ensure
                return(new TranslatedQualifiedName(translatedQName, qname.Span, qname, null));
            }
        }
Beispiel #2
0
        TypeRef CreateTypeRef(Span span, QualifiedNameRef tname)
        {
            var qname = tname.QualifiedName;

            // primitive type name ?
            if (qname.IsSimpleName)
            {
                ReservedTypeRef.ReservedType   reserved;
                PrimitiveTypeRef.PrimitiveType primitive;
                if ((_languageFeatures.HasFeature(LanguageFeatures.Php71Set)) && PHP71PrimitiveTypes.TryGetValue(qname, out primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
                if ((_languageFeatures.HasFeature(LanguageFeatures.Php70Set)) && PHP70PrimitiveTypes.TryGetValue(qname, out primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
                if ((_languageFeatures.HasFeature(LanguageFeatures.Php56Set)) && PHP56PrimitiveTypes.TryGetValue(qname, out primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
                if (ReservedTypeRef.ReservedTypes.TryGetValue(qname.Name, out reserved))
                {
                    var reservedRef = _astFactory.ReservedTypeReference(span, reserved);
                    if (ClassContexts.Count != 0)
                    {
                        var context = ClassContexts.Peek();
                        switch (reserved)
                        {
                        case ReservedTypeRef.ReservedType.parent:
                            if (context.Base == null)
                            {
                                this.ErrorSink.Error(span, FatalErrors.ParentAccessedInParentlessClass);
                                return(reservedRef);
                            }
                            return(_astFactory.AliasedTypeReference(span, context.Base.QualifiedName.Value, reservedRef));

                        case ReservedTypeRef.ReservedType.self:
                            return(_astFactory.AliasedTypeReference(span, context.Name, reservedRef));

                        default:
                            throw new ArgumentException();
                        }
                    }
                    return(reservedRef);
                }
            }

            // direct type reference
            QualifiedName translated;

            return((TryTranslateAny(tname, out translated)) ?
                   _astFactory.AliasedTypeReference(span, translated, _astFactory.TypeReference(span, tname)) :
                   _astFactory.TypeReference(span, tname));
        }
Beispiel #3
0
 private TranslatedQualifiedName TranslateQNRConstant(QualifiedNameRef nref)
 {
     var qname = nref.QualifiedName;
     if (qname.IsSimpleName && (qname == QualifiedName.Null || qname == QualifiedName.True || qname == QualifiedName.False))
     {
         // special exit_scope consts
         qname.IsFullyQualifiedName = true;
         return new TranslatedQualifiedName(qname, nref.Span, qname, null);
     }
     else return TranslateFallbackQualifiedName(nref, AliasKind.Constant);
 }
Beispiel #4
0
 public TranslatedQualifiedName(QualifiedName name, Span nameSpan, QualifiedName originalName, QualifiedName?nameFallback)
 {
     _name         = new QualifiedNameRef(nameSpan, name);
     _originalName = originalName;
     _fallbackName = nameFallback;
 }
Beispiel #5
0
 TranslatedQualifiedName TranslateQNRFunction(QualifiedNameRef nref) => TranslateFallbackQualifiedName(nref, AliasKind.Function);
Beispiel #6
0
        /// <summary>
        /// Creates type reference from a given qualified name.
        /// The given name will be translated using current naming context.
        /// </summary>
        public TypeRef CreateTypeRef(QualifiedNameRef tname, bool allowPrimitiveTypes = false)
        {
            var qname = tname.QualifiedName;
            var span  = tname.Span;

            // primitive type name ?
            if (qname.IsSimpleName)
            {
                if (ReservedTypeRef.ReservedTypes.TryGetValue(qname.Name, out ReservedTypeRef.ReservedType reserved))
                {
                    var reservedRef = _astFactory.ReservedTypeReference(span, reserved);
                    if (IsInClassContext)
                    {
                        var context = ClassContexts.Peek();
                        switch (reserved)
                        {
                        case ReservedTypeRef.ReservedType.parent:
                            if (context.Base != null)
                            {
                                reservedRef = _astFactory.AliasedTypeReference(span, context.Base.QualifiedName.Value, reservedRef);
                            }
                            else if (context.Attributes.IsTrait())
                            {
                                // keep unbound
                                // {parent} refers to actual class where the trait is used
                            }
                            else
                            {
                                this.ErrorSink.Error(span, FatalErrors.ParentAccessedInParentlessClass);
                            }
                            break;

                        case ReservedTypeRef.ReservedType.self:

                            if (context.Attributes.IsTrait())
                            {
                                // keep unbound
                                // {self} refers to actual class where the trait is used
                            }
                            else if (context.Name.Name == Name.AnonymousClassName)
                            {
                                // we don't translate {self} in the context of an anonymous type name
                                // since the translated name is platform specific and may differ from how it is handled by caller
                            }
                            else
                            {
                                reservedRef = _astFactory.AliasedTypeReference(span, context.Name, reservedRef);
                            }
                            break;

                        case ReservedTypeRef.ReservedType.@static:
                            // keep unbound
                            break;

                        default:
                            throw new ArgumentException();
                        }
                    }
                    else
                    {
                        // TODO: Error: self|parent|static used outside a class context
                        // NOTE: allowed in global code
                    }

                    return(reservedRef);
                }

                if (allowPrimitiveTypes && PrimitiveTypes.TryGetValue(qname, out PrimitiveTypeRef.PrimitiveType primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
            }

            // direct type reference
            return(CreateNamedTypeRef(span, tname));
        }
Beispiel #7
0
        TypeRef CreateTypeRef(Span span, QualifiedNameRef tname)
        {
            var qname = tname.QualifiedName;

            // primitive type name ?
            if (qname.IsSimpleName)
            {
                ReservedTypeRef.ReservedType   reserved;
                PrimitiveTypeRef.PrimitiveType primitive;
                if ((_languageFeatures.HasFeature(LanguageFeatures.Php71Set)) && PHP71PrimitiveTypes.TryGetValue(qname, out primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
                if ((_languageFeatures.HasFeature(LanguageFeatures.Php70Set)) && PHP70PrimitiveTypes.TryGetValue(qname, out primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
                if ((_languageFeatures.HasFeature(LanguageFeatures.Php56Set)) && PHP56PrimitiveTypes.TryGetValue(qname, out primitive))
                {
                    return(_astFactory.PrimitiveTypeReference(span, primitive));
                }
                if (ReservedTypeRef.ReservedTypes.TryGetValue(qname.Name, out reserved))
                {
                    var reservedRef = _astFactory.ReservedTypeReference(span, reserved);
                    if (IsInClassContext)
                    {
                        var context = ClassContexts.Peek();
                        switch (reserved)
                        {
                        case ReservedTypeRef.ReservedType.parent:
                            if (context.Base != null)
                            {
                                reservedRef = _astFactory.AliasedTypeReference(span, context.Base.QualifiedName.Value, reservedRef);
                            }
                            else
                            {
                                this.ErrorSink.Error(span, FatalErrors.ParentAccessedInParentlessClass);
                            }
                            break;

                        case ReservedTypeRef.ReservedType.self:

                            // we don't translate {self} in the context of an anonymous type name
                            // since the translated name is platform specific and may differ from how it is handled by caller

                            if (context.Name.Name != Name.AnonymousClassName)
                            {
                                reservedRef = _astFactory.AliasedTypeReference(span, context.Name, reservedRef);
                            }
                            break;

                        case ReservedTypeRef.ReservedType.@static:
                            // keep unbound
                            break;

                        default:
                            throw new ArgumentException();
                        }
                    }
                    else
                    {
                        // TODO: Error: self|parent|static used outside a class context
                    }

                    return(reservedRef);
                }
            }

            // direct type reference
            return(CreateNamedTypeRef(span, tname));
        }