/// <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); }
/// <summary> /// Add field as a property with getter & 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); }
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)); } }
void Update(PHPDocBlock phpdoc) { if (phpdoc != null) { phpdoc.ContainingElement = _parent; } }
void SerializePHPDoc(PHPDocBlock doc) { if (doc != null) { _serializer.Serialize("PHPDoc", SerializeSpan(doc.Span), new NodeObj("Comment", doc.ToString() ?? string.Empty)); } }
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)); }
/// <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); }
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; }
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; }
/// <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)); } } }
/// <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); }
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; }
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; }
///// <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); }
/// <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; }
/// <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); }
/// <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); }
/// <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); }
public PHPDocStmt(PHPDocBlock/*!*/phpdoc) : base(phpdoc.Span) { Debug.Assert(phpdoc != null); _phpdoc = phpdoc; }
protected override IEnumerable<ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null) { throw Roslyn.Utilities.ExceptionUtilities.Unreachable; }
public SourceConstSymbol(SourceNamedTypeSymbol type, string name, PHPDocBlock phpdoc, Syntax.AST.Expression value) : base(type, name, PhpMemberAttributes.Public | PhpMemberAttributes.Static, phpdoc) { _value = value; }
/// <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; }
/// <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++; } }
///// <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; }
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); } } }
/// <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)); } }
protected virtual IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null) { // collect diagnostics GetDiagnostics(DeclaringCompilation.DeclarationDiagnostics); // return(BuildSrcParams(signature.FormalParams, phpdocOpt)); }
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++; } }
protected override IEnumerable <ParameterSymbol> BuildParameters(Signature signature, PHPDocBlock phpdocOpt = null) { throw Roslyn.Utilities.ExceptionUtilities.Unreachable; }
/// <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; }
protected override IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null) { // [use params], [formal params] return(base.BuildSrcParams(_syntax.UseParams.Concat(signature.FormalParams), phpdocOpt)); }
public SourceRuntimeConstantSymbol(SourceNamedTypeSymbol type, string name, PHPDocBlock phpdoc, BoundExpression initializer = null) : base(type, name, PhpMemberAttributes.Public, phpdoc, initializer) { }
protected virtual IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null) { return(BuildSrcParams(signature.FormalParams, phpdocOpt)); }
public PHPDocStmt(PHPDocBlock /*!*/ phpdoc) : base(phpdoc.Span) { Debug.Assert(phpdoc != null); _phpdoc = phpdoc; }
public void OnPhpDocComment(Scanner scanner, PHPDocBlock phpDocBlock) { }
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)); }
/// <summary> /// Add field as a property with getter & 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; }
/// <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++; } }
protected override IEnumerable <SourceParameterSymbol> BuildSrcParams(Signature signature, PHPDocBlock phpdocOpt = null) { return(Array.Empty <SourceParameterSymbol>()); }
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); }