コード例 #1
0
        /// <summary>
        /// Gets parameter type from given PHPDoc block.
        /// </summary>
        public static PHPDocBlock.ParamTag GetParamTag(PHPDocBlock phpdoc, int paramIndex, string paramName)
        {
            PHPDocBlock.ParamTag result = null;

            if (phpdoc != null)
            {
                int pi       = 0;
                var elements = phpdoc.Elements;
                foreach (var element in elements)
                {
                    var ptag = element as PHPDocBlock.ParamTag;
                    if (ptag != null)
                    {
                        if (string.IsNullOrEmpty(ptag.VariableName))
                        {
                            if (pi == paramIndex)
                            {
                                result = ptag;  // found @param by index
                            }
                        }
                        else if (string.Equals(ptag.VariableName.Substring(1), paramName, StringComparison.OrdinalIgnoreCase))
                        {
                            result = ptag;
                            break;
                        }

                        //
                        pi++;
                    }
                }
            }

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// Add field as a property with getter &amp; setter
        /// </summary>
        private CodeMemberProperty GenerateFieldCode(PHPDocBlock cmt, string name)
        {
            CodeMemberProperty prop = new CodeMemberProperty();

            var vartag = cmt.GetElement <PHPDocBlock.VarTag>();

            if (vartag != null)
            {
                prop.Type = ParseType(vartag.TypeNamesArray);
            }
            else
            {
                prop.Type = new CodeTypeReference(typeof(object));
            }

            prop.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DuckNameAttribute)),
                                                                   new CodeAttributeArgument(new CodePrimitiveExpression(name))));

            var summary = cmt.Summary;

            if (!string.IsNullOrEmpty(summary))
            {
                prop.Comments.Add(new CodeCommentStatement("<summary>\n " + summary + "\n </summary>", true));
            }

            prop.HasGet = prop.HasSet = true;
            prop.Name   = MakeCSharpName(name);
            return(prop);
        }
コード例 #3
0
        public SourceFieldSymbol(
            SourceTypeSymbol type, string name, Location location, Accessibility accessibility,
            PHPDocBlock phpdoc, PhpPropertyKind kind,
            BoundExpression initializer = null,
            ImmutableArray <AttributeData> attributes = default)
        {
            Contract.ThrowIfNull(type);
            Contract.ThrowIfNull(name);

            _containingType = type;
            _fieldName      = name;
            _fieldKind      = kind;
            _accessibility  = accessibility;
            _initializer    = initializer;
            _location       = location;
            _attributes     = attributes.IsDefault ? ImmutableArray <AttributeData> .Empty : attributes;
            PHPDocBlock     = phpdoc;

            // implicit attributes from PHPDoc
            var deprecated = phpdoc?.GetElement <PHPDocBlock.DeprecatedTag>();

            if (deprecated != null)
            {
                // [ObsoleteAttribute(message, false)]
                _attributes = _attributes.Add(DeclaringCompilation.CreateObsoleteAttribute(deprecated));
            }
        }
コード例 #4
0
 void Update(PHPDocBlock phpdoc)
 {
     if (phpdoc != null)
     {
         phpdoc.ContainingElement = _parent;
     }
 }
コード例 #5
0
 void SerializePHPDoc(PHPDocBlock doc)
 {
     if (doc != null)
     {
         _serializer.Serialize("PHPDoc", SerializeSpan(doc.Span), new NodeObj("Comment", doc.ToString() ?? string.Empty));
     }
 }
コード例 #6
0
        protected virtual TypeSymbol BuildReturnType(Signature signature, PHPDocBlock phpdocOpt, TypeRefMask return_tmask)
        {
            if (signature.AliasReturn)
            {
                return(DeclaringCompilation.CoreTypes.PhpAlias);
            }

            // TODO: PHP7 return type
            //signature.ReturnTypeHint

            //
            if (phpdocOpt != null)
            {
                var returnTag = phpdocOpt.Returns;
                if (returnTag != null && returnTag.TypeNames.Length != 0)
                {
                    var typeCtx = this.TypeRefContext;
                    var tmask   = PHPDoc.GetTypeMask(typeCtx, returnTag.TypeNamesArray);
                    if (!tmask.IsVoid && !tmask.IsAnyType)
                    {
                        return(DeclaringCompilation.GetTypeFromTypeRef(typeCtx, tmask));
                    }
                }
            }

            //
            return(DeclaringCompilation.GetTypeFromTypeRef(this.TypeRefContext, return_tmask));
        }
コード例 #7
0
        /// <summary>
        /// Process function or method declaration and return corresponding CodeDom object.
        /// </summary>
        private CodeMemberMethod GenerateFunctionCode(PHPDocBlock cmt, string name)
        {
            // Add method for each global function
            CodeMemberMethod meth = new CodeMemberMethod();

            meth.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DuckNameAttribute)),
                                                                   new CodeAttributeArgument(new CodePrimitiveExpression(name))));
            meth.Name = MakeCSharpName(name);

            // Return & Summary comment
            string summary = cmt.Summary;

            if (!string.IsNullOrEmpty(summary))
            {
                meth.Comments.Add(new CodeCommentStatement("<summary>\n " + summary + "\n </summary>", true));
            }
            if (cmt.Returns != null)
            {
                string retHelp = cmt.Returns.Description;
                if (retHelp.Length > 0)
                {
                    meth.Comments.Add(new CodeCommentStatement("<returns>" + retHelp + "</returns>", true));
                }
            }

            // Parse return type
            if (cmt.Returns != null && cmt.Returns.TypeNames != null)
            {
                var types = cmt.Returns.TypeNamesArray;
                if (types.Length > 1)
                {
                    meth.Comments.Add(new CodeCommentStatement("NOT SUPPORTED: Multiple return types are currently TODO."));
                }

                meth.ReturnType = ParseType(types);
            }

            // Process parameters
            foreach (var p in cmt.Params)
            {
                string paramName = p.VariableName;
                string paramHelp = p.Description;
                if (paramName != null && paramHelp.Length > 0)
                {
                    paramName = paramName.TrimStart('$');
                    meth.Comments.Add(new CodeCommentStatement("<param name=\"" + paramName + "\">" + paramHelp + "</param>", true));
                }

                CodeTypeReference paramType = ParseType(p.TypeNamesArray);
                meth.Parameters.Add(new CodeParameterDeclarationExpression(paramType, paramName));
            }

            return(meth);
        }
コード例 #8
0
ファイル: SourceFieldSymbol.cs プロジェクト: ruo2012/peachpie
        public SourceFieldSymbol(SourceNamedTypeSymbol type, string name, PhpMemberAttributes modifiers, PHPDocBlock phpdoc, BoundExpression initializer = null)
        {
            Contract.ThrowIfNull(type);
            Contract.ThrowIfNull(name);

            _type           = type;
            _name           = name;
            _modifiers      = modifiers;
            _phpdoc         = phpdoc;
            _initializerOpt = initializer;
        }
コード例 #9
0
ファイル: SourceFieldSymbol.cs プロジェクト: wushian/peachpie
        public SourceFieldSymbol(SourceTypeSymbol type, string name, Accessibility accessibility, PHPDocBlock phpdoc, KindEnum kind, BoundExpression initializer = null)
        {
            Contract.ThrowIfNull(type);
            Contract.ThrowIfNull(name);

            _containingType = type;
            _fieldName      = name;
            _fieldKind      = kind;
            _accessibility  = accessibility;
            _phpDoc         = phpdoc;
            _initializer    = initializer;
        }
コード例 #10
0
ファイル: StateBinder.cs プロジェクト: ruo2012/peachpie
 /// <summary>
 /// Sets the initial routine return type.
 /// </summary>
 /// <param name="ctx"></param>
 /// <param name="initialState"></param>
 /// <param name="phpdoc"></param>
 static void InitReturn(FlowContext /*!*/ ctx, FlowState /*!*/ initialState, PHPDocBlock phpdoc)
 {
     Debug.Assert(ctx.ReturnVarIndex >= 0);
     if (phpdoc != null)
     {
         var returnTag = phpdoc.Returns;
         if (returnTag != null && returnTag.TypeNamesArray.Length != 0)
         {
             initialState.SetVar(ctx.ReturnVarIndex, PHPDoc.GetTypeMask(ctx.TypeRefContext, returnTag.TypeNamesArray));
         }
     }
 }
コード例 #11
0
        /// <summary>
        /// Gets PHPDoc assoviated with given source symbol.
        /// </summary>
        internal static bool TryGetPHPDocBlock(this Symbol symbol, out PHPDocBlock phpdoc)
        {
            phpdoc = symbol?.OriginalDefinition switch
            {
                SourceRoutineSymbol routine => routine.PHPDocBlock,
                SourceFieldSymbol field => field.PHPDocBlock,
                SourceTypeSymbol type => type.Syntax.PHPDoc,
                                    _ => null
            };

            return(phpdoc != null);
        }
コード例 #12
0
ファイル: SourceFieldSymbol.cs プロジェクト: iolevel/peachpie
        public SourceFieldSymbol(SourceTypeSymbol type, string name, Accessibility accessibility, PHPDocBlock phpdoc, KindEnum kind, BoundExpression initializer = null)
        {
            Contract.ThrowIfNull(type);
            Contract.ThrowIfNull(name);

            _containingType = type;
            _fieldName = name;
            _fieldKind = kind;
            _accessibility = accessibility;
            _phpDoc = phpdoc;
            _initializer = initializer;
        }
コード例 #13
0
        public SourceFieldSymbol(SourceTypeSymbol type, string name, Location location, Accessibility accessibility, PHPDocBlock phpdoc, PhpPropertyKind kind, BoundExpression initializer = null, ImmutableArray <AttributeData> customAttributes = default)
        {
            Contract.ThrowIfNull(type);
            Contract.ThrowIfNull(name);

            _containingType   = type;
            _fieldName        = name;
            _fieldKind        = kind;
            _accessibility    = accessibility;
            _phpDoc           = phpdoc;
            _initializer      = initializer;
            _location         = location;
            _customAttributes = customAttributes;
        }
コード例 #14
0
        public SourceParameterSymbol(SourceRoutineSymbol routine, FormalParam syntax, int index, PHPDocBlock.ParamTag ptagOpt)
        {
            Contract.ThrowIfNull(routine);
            Contract.ThrowIfNull(syntax);
            Debug.Assert(index >= 0);

            _routine = routine;
            _syntax = syntax;
            _index = index;
            _ptagOpt = ptagOpt;
            _initializer = (syntax.InitValue != null)
                ? new SemanticsBinder(null).BindExpression(syntax.InitValue, BoundAccess.Read)
                : null;
        }
コード例 #15
0
        ///// <summary>
        ///// Process eval expression - if the eval was produced by the TypeDecl, we process the original TypeDecl.
        ///// </summary>
        //public override void VisitEvalEx(EvalEx x)
        //{
        //    TypeDecl typeDecl;

        //    if (x.Annotations.TryGet<TypeDecl>(out typeDecl))
        //    {
        //        docResolver.VisitTypeDecl(typeDecl);
        //        VisitTypeDecl(typeDecl);
        //    }

        //    base.VisitEvalEx(x);
        //}

        /// <summary>
        /// Generate type declaration
        /// </summary>
        public CodeTypeDeclaration GenerateTypeDecl(PHPDocBlock cmt, TypeDecl x)
        {
            CodeTypeDeclaration cls = new CodeTypeDeclaration(MakeCSharpName(x.Name.Value));

            var summary = cmt.Summary;

            if (!string.IsNullOrEmpty(summary))
            {
                cls.Comments.Add(new CodeCommentStatement("<summary>\n " + summary + "\n </summary>", true));
            }

            cls.IsInterface = true;
            cls.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DuckTypeAttribute))));

            return(cls);
        }
コード例 #16
0
ファイル: DocCommentList.cs プロジェクト: dw4dev/Phalanger
        /// <summary>
        /// Finds DOC comment above given position, removes it from the internal list and returns its reference.
        /// </summary>
        public bool TryReleaseBlock(int position, out PHPDocBlock phpdoc)
        {
            var index = this.FindIndex(position - 1);
            if (index >= 0)
            {
                var list = _doclist;
                phpdoc = list[index].PhpDoc;
                list.RemoveAt(index);
                this.UpdateSpan();

                //
                return true;
            }

            //
            phpdoc = null;
            return false;
        }
コード例 #17
0
ファイル: DocCommentList.cs プロジェクト: ruo2012/peachpie
        /// <summary>
        /// Finds DOC comment above given position, removes it from the internal list and returns its reference.
        /// </summary>
        public bool TryReleaseBlock(int position, out PHPDocBlock phpdoc)
        {
            var index = this.FindIndex(position - 1);

            if (index >= 0)
            {
                var list = _doclist;
                phpdoc = list[index].PhpDoc;
                list.RemoveAt(index);
                this.UpdateSpan();

                //
                return(true);
            }

            //
            phpdoc = null;
            return(false);
        }
コード例 #18
0
ファイル: DocCommentList.cs プロジェクト: dw4dev/Phalanger
        /// <summary>
        /// Inserts DOC block into the list.
        /// </summary>
        public void AppendBlock(PHPDocBlock/*!*/phpDoc, int endPosition)
        {
            Debug.Assert(phpDoc != null);
            Debug.Assert(endPosition >= phpDoc.Span.End);
            Debug.Assert(_doclist == null || _doclist.Count == 0 || _doclist.Last().Extent.Start < phpDoc.Span.Start, "Blocks have to be appended in order.");

            var docinfo = new DocInfo()
            {
                PhpDoc = phpDoc,
                Extent = Span.FromBounds(phpDoc.Span.Start, endPosition)
            };

            var list = _doclist;
            if (list == null)
            {
                _doclist = list = new List<DocInfo>(4);
            }
            
            list.Add(docinfo);

            _span = Span.FromBounds(list[0].Extent.Start, list.Last().Extent.End);
        }
コード例 #19
0
ファイル: DocCommentList.cs プロジェクト: ruo2012/peachpie
        /// <summary>
        /// Inserts DOC block into the list.
        /// </summary>
        public void AppendBlock(PHPDocBlock /*!*/ phpDoc, int endPosition)
        {
            Debug.Assert(phpDoc != null);
            Debug.Assert(endPosition >= phpDoc.Span.End);
            Debug.Assert(_doclist == null || _doclist.Count == 0 || _doclist.Last().Extent.Start < phpDoc.Span.Start, "Blocks have to be appended in order.");

            var docinfo = new DocInfo()
            {
                PhpDoc = phpDoc,
                Extent = Span.FromBounds(phpDoc.Span.Start, endPosition)
            };

            var list = _doclist;

            if (list == null)
            {
                _doclist = list = new List <DocInfo>(4);
            }

            list.Add(docinfo);

            _span = Span.FromBounds(list[0].Extent.Start, list.Last().Extent.End);
        }
コード例 #20
0
ファイル: Statement.cs プロジェクト: dw4dev/Phalanger
 public PHPDocStmt(PHPDocBlock/*!*/phpdoc) : base(phpdoc.Span)
 {
     Debug.Assert(phpdoc != null);
     _phpdoc = phpdoc;
 }
コード例 #21
0
 protected override IEnumerable<ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null)
 {
     throw Roslyn.Utilities.ExceptionUtilities.Unreachable;
 }
コード例 #22
0
ファイル: SourceFieldSymbol.cs プロジェクト: ruo2012/peachpie
 public SourceConstSymbol(SourceNamedTypeSymbol type, string name, PHPDocBlock phpdoc, Syntax.AST.Expression value)
     : base(type, name, PhpMemberAttributes.Public | PhpMemberAttributes.Static, phpdoc)
 {
     _value = value;
 }
コード例 #23
0
ファイル: Generator.CLR.cs プロジェクト: dw4dev/Phalanger
		/// <summary>
		/// Process function or method declaration and return corresponding CodeDom object.
		/// </summary>
		private CodeMemberMethod GenerateFunctionCode(PHPDocBlock cmt, string name)
		{
			// Add method for each global function
			CodeMemberMethod meth = new CodeMemberMethod();
			meth.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DuckNameAttribute)),
				new CodeAttributeArgument(new CodePrimitiveExpression(name))));
			meth.Name = MakeCSharpName(name);

			// Return & Summary comment
            string summary = cmt.Summary;
				
			if (!string.IsNullOrEmpty(summary))
			{
				meth.Comments.Add(new CodeCommentStatement("<summary>\n " + summary + "\n </summary>", true));
			}
			if (cmt.Returns != null)
			{
                string retHelp = cmt.Returns.Description;
				if (retHelp.Length > 0)
					meth.Comments.Add(new CodeCommentStatement("<returns>" + retHelp + "</returns>", true));
			}

			// Parse return type 
			if (cmt.Returns != null && cmt.Returns.TypeNames != null)
			{
                var types = cmt.Returns.TypeNamesArray;
                if (types.Length > 1)
					meth.Comments.Add(new CodeCommentStatement("NOT SUPPORTED: Multiple return types are currently TODO."));

                meth.ReturnType = ParseType(types);
			}

			// Process parameters
			foreach (var p in cmt.Params)
			{
                string paramName = p.VariableName;
				string paramHelp = p.Description;
                if (paramName != null && paramHelp.Length > 0)
                {
                    paramName = paramName.TrimStart('$');
                    meth.Comments.Add(new CodeCommentStatement("<param name=\"" + paramName + "\">" + paramHelp + "</param>", true));
                }

				CodeTypeReference paramType = ParseType(p.TypeNamesArray);
				meth.Parameters.Add(new CodeParameterDeclarationExpression(paramType, paramName));
			}

			return meth;
		}
コード例 #24
0
        /// <summary>
        /// Builds CLR method parameters.
        /// </summary>
        /// <remarks>(Context, arg1, arg2, ...)</remarks>
        protected virtual IEnumerable<ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null)
        {
            int index = 0;

            if (this.IsStatic)  // instance methods have <ctx> in <this>.<ctx> field, see SourceNamedTypeSymbol._lazyContextField
            {
                yield return new SpecialParameterSymbol(this, DeclaringCompilation.CoreTypes.Context, SpecialParameterSymbol.ContextName, index++);
            }

            int pindex = 0;

            foreach (var p in signature.FormalParams)
            {
                var ptag = (phpdocOpt != null) ? PHPDoc.GetParamTag(phpdocOpt, pindex, p.Name.Name.Value) : null;

                yield return new SourceParameterSymbol(this, p, index++, ptag);

                pindex++;
            }
        }
コード例 #25
0
ファイル: Generator.CLR.cs プロジェクト: dw4dev/Phalanger
        ///// <summary>
        ///// Process eval expression - if the eval was produced by the TypeDecl, we process the original TypeDecl.
        ///// </summary>
        //public override void VisitEvalEx(EvalEx x)
        //{
        //    TypeDecl typeDecl;

        //    if (x.Annotations.TryGet<TypeDecl>(out typeDecl))
        //    {
        //        docResolver.VisitTypeDecl(typeDecl);
        //        VisitTypeDecl(typeDecl);
        //    }

        //    base.VisitEvalEx(x);
        //}

		/// <summary>
		/// Generate type declaration
		/// </summary>
		public CodeTypeDeclaration GenerateTypeDecl(PHPDocBlock cmt, TypeDecl x)
		{
			CodeTypeDeclaration cls = new CodeTypeDeclaration(MakeCSharpName(x.Name.Value));

            var summary = cmt.Summary;
			if (!string.IsNullOrEmpty(summary))
			{
				cls.Comments.Add(new CodeCommentStatement("<summary>\n " + summary + "\n </summary>", true));
			}

			cls.IsInterface = true;
			cls.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DuckTypeAttribute))));

			return cls;			
		}
コード例 #26
0
ファイル: Scanner.cs プロジェクト: ikvm/Phalanger
        public new Tokens GetNextToken()
        {
            for (; ;)
            {
                inString = false;
                isCode   = false;

                Tokens token = base.GetNextToken();
                UpdateTokenPosition();

                switch (token)
                {
                    #region Comments

                // ignored tokens:
                case Tokens.T_WHITESPACE: break;

                case Tokens.T_COMMENT: this.commentsSink.OnComment(this, this.tokenPosition); break;

                case Tokens.T_LINE_COMMENT: this.commentsSink.OnLineComment(this, this.tokenPosition); break;

                case Tokens.T_OPEN_TAG: this.commentsSink.OnOpenTag(this, this.tokenPosition); break;

                case Tokens.T_DOC_COMMENT:
                    // remember token value to be used by the next token and skip the current:
                    this.lastDocComment = new PHPDocBlock(base.GetTokenString(), this.tokenPosition);
                    this.commentsSink.OnPhpDocComment(this, this.lastDocComment);
                    break;

                case Tokens.T_PRAGMA_FILE:
                    sourceUnit.AddSourceFileMapping(tokenPosition.FirstLine, base.GetTokenAsFilePragma());
                    break;

                case Tokens.T_PRAGMA_LINE:
                {
                    int?value = base.GetTokenAsLinePragma();

                    if (value.HasValue)
                    {
                        sourceUnit.AddSourceLineMapping(tokenPosition.FirstLine, value.Value);
                    }
                    else
                    {
                        errors.Add(Warnings.InvalidLinePragma, sourceUnit, tokenPosition);
                    }

                    break;
                }

                case Tokens.T_PRAGMA_DEFAULT_FILE:
                    sourceUnit.AddSourceFileMapping(tokenPosition.FirstLine, SourceUnit.DefaultFile);
                    break;

                case Tokens.T_PRAGMA_DEFAULT_LINE:
                    sourceUnit.AddSourceLineMapping(tokenPosition.FirstLine, SourceUnit.DefaultLine);
                    break;

                    #endregion

                    #region String Semantics

                case Tokens.T_VARIABLE:
                    // exclude initial $ from the name:
                    Debug.Assert(GetTokenChar(0) == '$');
                    tokenSemantics.Object = base.GetTokenSubstring(1);
                    goto default;

                case Tokens.T_STRING:
                    if (inString)
                    {
                        StoreEncapsedString();
                    }
                    else
                    {
                        tokenSemantics.Object = base.GetTokenString();
                    }

                    goto default;

                case Tokens.T_ARRAY:
                case Tokens.T_LIST:
                case Tokens.T_ASSERT:
                    tokenSemantics.Object = base.GetTokenString();      // remember the token string, so we can use these tokens as literals later, case sensitively
                    goto default;

                case Tokens.T_STRING_VARNAME:
                case Tokens.T_NUM_STRING:
                case Tokens.T_ENCAPSED_AND_WHITESPACE:
                case Tokens.T_BAD_CHARACTER:
                    StoreEncapsedString();
                    goto default;

                case Tokens.T_INLINE_HTML:
                    tokenSemantics.Object = base.GetTokenString();
                    goto default;


                // \[uU]#{0-6}
                case Tokens.UnicodeCharCode:
                {
                    Debug.Assert(inString);

                    //if (GetTokenChar(1) == 'u')
                    //{
                    //  if (TokenLength != 2 + 4)
                    //    errors.Add(Warnings.InvalidEscapeSequenceLength, sourceFile, tokenPosition.Short, GetTokenString(), 4);
                    //}
                    //else
                    //{
                    //  if (TokenLength != 2 + 6)
                    //    errors.Add(Warnings.InvalidEscapeSequenceLength, sourceFile, tokenPosition.Short, GetTokenString(), 6);
                    //}

                    int code_point = GetTokenAsInteger(2, 16);

                    try
                    {
                        if ((code_point < 0 || code_point > 0x10ffff) || (code_point >= 0xd800 && code_point <= 0xdfff))
                        {
                            errors.Add(Errors.InvalidCodePoint, SourceUnit, tokenPosition, GetTokenString());
                            StoreEncapsedString("?");
                        }
                        else
                        {
                            StoreEncapsedString(StringUtils.Utf32ToString(code_point));
                        }
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                        errors.Add(Errors.InvalidCodePoint, SourceUnit, tokenPosition, GetTokenString());
                        StoreEncapsedString("?");
                    }
                    token = Tokens.T_STRING;
                    goto default;
                }

                // \C{name}
                case Tokens.UnicodeCharName:
                    Debug.Assert(inString);
                    StoreEncapsedString();                             // N/S
                    token = Tokens.T_STRING;
                    goto default;

                // b?"xxx"
                case Tokens.DoubleQuotedString:
                {
                    bool forceBinaryString = GetTokenChar(0) == 'b';

                    tokenSemantics.Object = GetTokenAsDoublyQuotedString(forceBinaryString ? 1 : 0, encoding, forceBinaryString);
                    token = Tokens.T_CONSTANT_ENCAPSED_STRING;
                    goto default;
                }

                // b?'xxx'
                case Tokens.SingleQuotedString:
                {
                    bool forceBinaryString = GetTokenChar(0) == 'b';

                    tokenSemantics.Object = GetTokenAsSinglyQuotedString(forceBinaryString ? 1 : 0, encoding, forceBinaryString);
                    token = Tokens.T_CONSTANT_ENCAPSED_STRING;
                    goto default;
                }

                    #endregion

                    #region Numeric Semantics

                case Tokens.T_CURLY_OPEN:
                    tokenSemantics.Integer = (int)Tokens.T_CURLY_OPEN;
                    goto default;

                case Tokens.T_CHARACTER:
                    tokenSemantics.Integer = (int)GetTokenChar(0);
                    goto default;

                case Tokens.EscapedCharacter:
                    tokenSemantics.Integer = (int)GetTokenAsEscapedCharacter(0);
                    token = Tokens.T_CHARACTER;
                    goto default;

                case Tokens.T_LINE:
                    // TODO:
                    tokenSemantics.Integer = 1;
                    goto default;

                // "\###"
                case Tokens.OctalCharCode:
                    tokenSemantics.Integer = GetTokenAsInteger(1, 10);
                    token = Tokens.T_CHARACTER;
                    goto default;

                // "\x##"
                case Tokens.HexCharCode:
                    tokenSemantics.Integer = GetTokenAsInteger(2, 16);
                    token = Tokens.T_CHARACTER;
                    goto default;

                // {LNUM}
                case Tokens.ParseDecimalNumber:
                {
                    // [0-9]* - value is either in octal or in decimal
                    if (GetTokenChar(0) == '0')
                    {
                        token = GetTokenAsDecimalNumber(1, 8, ref tokenSemantics);
                    }
                    else
                    {
                        token = GetTokenAsDecimalNumber(0, 10, ref tokenSemantics);
                    }

                    if (token == Tokens.T_DNUMBER)
                    {
                        // conversion to double causes data loss
                        errors.Add(Warnings.TooBigIntegerConversion, SourceUnit, tokenPosition, GetTokenString());
                    }
                    goto default;
                }

                // {HNUM}
                case Tokens.ParseHexadecimalNumber:
                {
                    // parse hexadecimal value
                    token = GetTokenAsDecimalNumber(2, 16, ref tokenSemantics);

                    if (token == Tokens.T_DNUMBER)
                    {
                        // conversion to double causes data loss
                        errors.Add(Warnings.TooBigIntegerConversion, SourceUnit, tokenPosition, GetTokenString());
                    }
                    goto default;
                }

                // {BNUM}
                case Tokens.ParseBinaryNumber:
                    // parse binary number value
                    token = GetTokenAsDecimalNumber(2, 2, ref tokenSemantics);

                    if (token == Tokens.T_DNUMBER)
                    {
                        // conversion to double causes data loss
                        errors.Add(Warnings.TooBigIntegerConversion, SourceUnit, tokenPosition, GetTokenString());
                    }
                    goto default;

                // {DNUM}|{EXPONENT_DNUM}
                case Tokens.ParseDouble:
                    tokenSemantics.Double = GetTokenAsDouble(0);
                    token = Tokens.T_DNUMBER;
                    goto default;

                    #endregion

                    #region Another Semantics

                // i'xxx'
                case Tokens.SingleQuotedIdentifier:
                    tokenSemantics.Object = (string)GetTokenAsSinglyQuotedString(1, encoding, false);
                    token = Tokens.T_STRING;
                    goto default;

                    #endregion

                    #region Token Reinterpreting

                case Tokens.T_OPEN_TAG_WITH_ECHO:
                    this.commentsSink.OnOpenTag(this, this.tokenPosition);
                    token = Tokens.T_ECHO;
                    goto default;

                case Tokens.T_CLOSE_TAG:
                    this.commentsSink.OnCloseTag(this, this.tokenPosition);
                    token = Tokens.T_SEMI;
                    goto case Tokens.T_SEMI;

                case Tokens.T_TRUE:
                case Tokens.T_FALSE:
                case Tokens.T_NULL:
                case Tokens.T_GET:
                case Tokens.T_SET:
                case Tokens.T_CALL:
                case Tokens.T_CALLSTATIC:
                case Tokens.T_WAKEUP:
                case Tokens.T_SLEEP:
                case Tokens.T_TOSTRING:
                case Tokens.T_CONSTRUCT:
                case Tokens.T_DESTRUCT:
                case Tokens.T_PARENT:
                case Tokens.T_SELF:
                case Tokens.T_AUTOLOAD:
                    token = Tokens.T_STRING;
                    goto case Tokens.T_STRING;

                case Tokens.T_TRY:
                case Tokens.T_CATCH:
                case Tokens.T_FINALLY:
                case Tokens.T_THROW:
                case Tokens.T_IMPLEMENTS:
                case Tokens.T_CLONE:
                case Tokens.T_ABSTRACT:
                case Tokens.T_FINAL:
                case Tokens.T_PRIVATE:
                case Tokens.T_PROTECTED:
                case Tokens.T_PUBLIC:
                case Tokens.T_INSTANCEOF:
                case Tokens.T_INTERFACE:
                case Tokens.T_GOTO:
                case Tokens.T_NAMESPACE:
                case Tokens.T_NAMESPACE_C:
                case Tokens.T_NS_SEPARATOR:
                case Tokens.T_USE:
                {
                    if ((features & LanguageFeatures.V5Keywords) == 0)
                    {
                        token = Tokens.T_STRING;
                        goto case Tokens.T_STRING;
                    }

                    if (token == Tokens.T_ABSTRACT)
                    {
                        // remember this for possible CLR qualified name:
                        tokenSemantics.Object = base.GetTokenString();
                    }

                    goto default;
                }

                case Tokens.T_LINQ_FROM:
                case Tokens.T_LINQ_SELECT:
                case Tokens.T_LINQ_BY:
                case Tokens.T_LINQ_WHERE:
                case Tokens.T_LINQ_DESCENDING:
                case Tokens.T_LINQ_ASCENDING:
                case Tokens.T_LINQ_ORDERBY:
                case Tokens.T_LINQ_GROUP:
                case Tokens.T_LINQ_IN:
                {
                    if ((features & LanguageFeatures.Linq) == 0)
                    {
                        token = Tokens.T_STRING;
                        goto case Tokens.T_STRING;
                    }

                    goto default;
                }

                case Tokens.T_IMPORT:
                {
                    if (!sourceUnit.CompilationUnit.IsPure)
                    {
                        token = Tokens.T_STRING;
                        goto case Tokens.T_STRING;
                    }

                    goto default;
                }

                case Tokens.T_BOOL_TYPE:
                case Tokens.T_INT_TYPE:
                case Tokens.T_INT64_TYPE:
                case Tokens.T_DOUBLE_TYPE:
                case Tokens.T_STRING_TYPE:
                case Tokens.T_RESOURCE_TYPE:
                case Tokens.T_OBJECT_TYPE:
                case Tokens.T_TYPEOF:
                {
                    if ((features & LanguageFeatures.TypeKeywords) == 0)
                    {
                        token = Tokens.T_STRING;
                        goto case Tokens.T_STRING;
                    }

                    tokenSemantics.Object = base.GetTokenString();

                    goto default;
                }

                case Tokens.T_PARTIAL:
                {
                    if (!pure)
                    {
                        token = Tokens.T_STRING;
                        goto case Tokens.T_STRING;
                    }

                    goto default;
                }

                    #endregion

                    #region Error Tokens

                case Tokens.ERROR:
                    goto default;

                case Tokens.ErrorInvalidIdentifier:
                {
                    // invalid identifier i'XXX':
                    errors.Add(Errors.InvalidIdentifier, SourceUnit, tokenPosition, (string)GetTokenAsSinglyQuotedString(1, encoding, false));

                    tokenSemantics.Object = GetErrorIdentifier();
                    token = Tokens.T_STRING;
                    goto default;
                }

                case Tokens.ErrorNotSupported:
                    errors.Add(Errors.ConstructNotSupported, SourceUnit, tokenPosition, GetTokenString());
                    tokenSemantics.Object = GetErrorIdentifier();
                    token = Tokens.T_STRING;
                    goto default;

                    #endregion

                case Tokens.T_SEMI:
                default:

                    if (lastDocComment != null)
                    {
                        // remember PHPDoc for current token
                        if (lastDocCommentRememberTokens.Contains(token))
                        {
                            tokenSemantics.Object = this.lastDocComment;
                        }

                        // forget last doc comment text
                        if (!lastDocCommentKeepTokens.Contains(token))
                        {
                            lastDocComment = null;
                        }
                    }

                    return(token);
                }
            }
        }
コード例 #27
0
        /// <summary>
        /// Constructs routine source parameters.
        /// </summary>
        protected IEnumerable <SourceParameterSymbol> BuildSrcParams(IEnumerable <FormalParam> formalparams, PHPDocBlock phpdocOpt = null)
        {
            var pindex = 0; // zero-based relative index

            foreach (var p in formalparams)
            {
                var ptag = (phpdocOpt != null) ? PHPDoc.GetParamTag(phpdocOpt, pindex, p.Name.Name.Value) : null;

                yield return(new SourceParameterSymbol(this, p, relindex: pindex++, ptagOpt: ptag));
            }
        }
コード例 #28
0
        protected virtual IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null)
        {
            // collect diagnostics
            GetDiagnostics(DeclaringCompilation.DeclarationDiagnostics);

            //
            return(BuildSrcParams(signature.FormalParams, phpdocOpt));
        }
コード例 #29
0
        protected override IEnumerable <ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null)
        {
            int index = 0;

            // Context ctx
            yield return(new SpecialParameterSymbol(this, DeclaringCompilation.CoreTypes.Context, SpecialParameterSymbol.ContextName, index++));

            // System.Object @this
            if (_useThis)
            {
                yield return(new SourceParameterSymbol(this,
                                                       new FormalParam(
                                                           Span.Invalid,
                                                           SpecialParameterSymbol.ThisName,
                                                           Span.Invalid,
                                                           new Devsense.PHP.Syntax.Ast.ClassTypeRef(Span.Invalid, NameUtils.SpecialNames.System_Object),
                                                           FormalParam.Flags.Default,
                                                           null,
                                                           new List <CustomAttribute>()),
                                                       index++, null));
            }

            // @static + parameters
            int pindex = 0;

            foreach (var p in _syntax.UseParams.Concat(signature.FormalParams))
            {
                var ptag = (phpdocOpt != null) ? PHPDoc.GetParamTag(phpdocOpt, pindex - _syntax.UseParams.Count, p.Name.Name.Value) : null;

                yield return(new SourceParameterSymbol(this, p, index++, ptag));

                pindex++;
            }
        }
コード例 #30
0
 protected override IEnumerable <ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null)
 {
     throw Roslyn.Utilities.ExceptionUtilities.Unreachable;
 }
コード例 #31
0
ファイル: PHPDoc.cs プロジェクト: iolevel/peachpie
        /// <summary>
        /// Gets parameter type from given PHPDoc block.
        /// </summary>
        public static PHPDocBlock.ParamTag GetParamTag(PHPDocBlock phpdoc, int paramIndex, string paramName)
        {
            PHPDocBlock.ParamTag result = null;

            if (phpdoc != null)
            {
                int pi = 0;
                var elements = phpdoc.Elements;
                foreach (var element in elements)
                {
                    var ptag = element as PHPDocBlock.ParamTag;
                    if (ptag != null)
                    {
                        if (string.IsNullOrEmpty(ptag.VariableName))
                        {
                            if (pi == paramIndex)
                                result = ptag;  // found @param by index
                        }
                        else if (string.Equals(ptag.VariableName.Substring(1), paramName, StringComparison.OrdinalIgnoreCase))
                        {
                            result = ptag;
                            break;
                        }

                        //
                        pi++;
                    }
                }
            }

            return result;
        }
コード例 #32
0
 protected override IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null)
 {
     // [use params], [formal params]
     return(base.BuildSrcParams(_syntax.UseParams.Concat(signature.FormalParams), phpdocOpt));
 }
コード例 #33
0
ファイル: SourceFieldSymbol.cs プロジェクト: ruo2012/peachpie
 public SourceRuntimeConstantSymbol(SourceNamedTypeSymbol type, string name, PHPDocBlock phpdoc, BoundExpression initializer = null)
     : base(type, name, PhpMemberAttributes.Public, phpdoc, initializer)
 {
 }
コード例 #34
0
 protected virtual IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null)
 {
     return(BuildSrcParams(signature.FormalParams, phpdocOpt));
 }
コード例 #35
0
 public PHPDocStmt(PHPDocBlock /*!*/ phpdoc) : base(phpdoc.Span)
 {
     Debug.Assert(phpdoc != null);
     _phpdoc = phpdoc;
 }
コード例 #36
0
ファイル: Scanner.cs プロジェクト: ikvm/Phalanger
 public void OnPhpDocComment(Scanner scanner, PHPDocBlock phpDocBlock)
 {
 }
コード例 #37
0
        protected virtual TypeSymbol BuildReturnType(Signature signature, TypeRef tref, PHPDocBlock phpdocOpt, TypeRefMask rtype)
        {
            if (signature.AliasReturn)
            {
                return(DeclaringCompilation.CoreTypes.PhpAlias);
            }

            // PHP7 return type
            if (tref != null)
            {
                return(DeclaringCompilation.GetTypeFromTypeRef(tref));
            }

            //
            var typeCtx = this.TypeRefContext;

            //
            if (phpdocOpt != null && (DeclaringCompilation.Options.PhpDocTypes & PhpDocTypes.ReturnTypes) != 0)
            {
                var returnTag = phpdocOpt.Returns;
                if (returnTag != null && returnTag.TypeNames.Length != 0)
                {
                    var tmask = PHPDoc.GetTypeMask(typeCtx, returnTag.TypeNamesArray, this.GetNamingContext());
                    if (!tmask.IsVoid && !tmask.IsAnyType)
                    {
                        return(DeclaringCompilation.GetTypeFromTypeRef(typeCtx, tmask));
                    }
                }
            }

            //
            return(DeclaringCompilation.GetTypeFromTypeRef(typeCtx, rtype));
        }
コード例 #38
0
ファイル: Generator.CLR.cs プロジェクト: dw4dev/Phalanger
		/// <summary>
		/// Add field as a property with getter &amp; setter
		/// </summary>
		private CodeMemberProperty GenerateFieldCode(PHPDocBlock cmt, string name)
		{
			CodeMemberProperty prop = new CodeMemberProperty();

            var vartag = cmt.GetElement<PHPDocBlock.VarTag>();
            if (vartag != null)
                prop.Type = ParseType(vartag.TypeNamesArray);
			else
				prop.Type = new CodeTypeReference(typeof(object));

			prop.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DuckNameAttribute)),
				new CodeAttributeArgument(new CodePrimitiveExpression(name))));

            var summary = cmt.Summary;
			if (!string.IsNullOrEmpty(summary))
			{
				prop.Comments.Add(new CodeCommentStatement("<summary>\n " + summary + "\n </summary>", true));
			}

			prop.HasGet = prop.HasSet = true;
			prop.Name = MakeCSharpName(name);
			return prop;
		}
コード例 #39
0
        /// <summary>
        /// Builds CLR method parameters.
        /// </summary>
        /// <remarks>(Context, arg1, arg2, ...)</remarks>
        protected virtual IEnumerable <ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null)
        {
            int index = 0;

            if (this.IsStatic)  // instance methods have <ctx> in <this>.<ctx> field, see SourceNamedTypeSymbol._lazyContextField
            {
                yield return(new SpecialParameterSymbol(this, DeclaringCompilation.CoreTypes.Context, SpecialParameterSymbol.ContextName, index++));
            }

            int pindex = 0;

            foreach (var p in signature.FormalParams)
            {
                var ptag = (phpdocOpt != null) ? PHPDoc.GetParamTag(phpdocOpt, pindex, p.Name.Value) : null;

                yield return(new SourceParameterSymbol(this, p, index++, ptag));

                pindex++;
            }
        }
コード例 #40
0
 protected override IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null)
 {
     return(Array.Empty <SourceParameterSymbol>());
 }
コード例 #41
0
        protected virtual TypeSymbol BuildReturnType(Signature signature, TypeRef tref, PHPDocBlock phpdocOpt, TypeRefMask rtype)
        {
            if (signature.AliasReturn)
            {
                return DeclaringCompilation.CoreTypes.PhpAlias;
            }

            // PHP7 return type
            if (tref != null)
            {
                return DeclaringCompilation.GetTypeFromTypeRef(tref);
            }

            //
            var typeCtx = this.TypeRefContext;

            //
            if (phpdocOpt != null)
            {
                var returnTag = phpdocOpt.Returns;
                if (returnTag != null && returnTag.TypeNames.Length != 0)
                {
                    var tmask = PHPDoc.GetTypeMask(typeCtx, returnTag.TypeNamesArray, this.GetNamingContext());
                    if (!tmask.IsVoid && !tmask.IsAnyType)
                    {
                        return DeclaringCompilation.GetTypeFromTypeRef(typeCtx, tmask);
                    }
                }
            }

            //
            return DeclaringCompilation.GetTypeFromTypeRef(typeCtx, rtype);
        }