/// <summary>Get the access-token by username and password</summary>
        /// <param name="parameters"></param>
        /// <param name="_repo"></param>
        /// <param name="_settings"></param>
        public ResponseData DoPassword(Parameters parameters, IRTokenRepository _repo, IOptions <Audience> _settings)
        {
            var refresh_token = Guid.NewGuid().ToString().Replace("-", "");
            var rToken        = new RToken
            {
                ClientId     = parameters.username,
                RefreshToken = refresh_token,
                Id           = Guid.NewGuid().ToString(),
                IsStop       = 0
            };

            if (_repo.AddToken(rToken).Result)
            {
                dynamic UserInfo = new System.Dynamic.ExpandoObject();
                UserInfo.FirstName = parameters.fullname;
                UserInfo.UserName  = parameters.username;
                return(new ResponseData
                {
                    Code = "999",
                    Message = "OK",
                    Content = UserInfo,
                    Data = GetJwt(parameters.username, refresh_token, _settings)
                });
            }
            else
            {
                return(new ResponseData
                {
                    Code = "909",
                    Message = "can not add token to database",
                    Data = null
                });
            }
        }
Пример #2
0
        /// <summary>
        ///     get the access-token by username and password
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        private ResponseData GenerateJwt(Parameters parameters)
        {
            var refresh_token = Guid.NewGuid().ToString().Replace("-", "");
            var rToken        = new RToken
            {
                ClientName   = parameters.username,
                RefreshToken = refresh_token,
                Id           = Guid.NewGuid().ToString(),
                IsStop       = 0
            };

            //store the refresh_token
            if (_tokenRepository.AddToken(rToken))
            {
                return(new ResponseData
                {
                    Code = "999",
                    Message = "Ok",
                    Data = GetJwt(parameters.username.Trim(), refresh_token)
                });
            }

            return(new ResponseData
            {
                Code = "909",
                Message = "can not add token to database",
                Data = null
            });
        }
Пример #3
0
        public ResponseModel <Office365Model> GenerateToken(string email)
        {
            var refresh_token = Guid.NewGuid().ToString().Replace("-", "");

            var rToken = new RToken
            {
                Email        = email,
                RefreshToken = refresh_token,
                Id           = Guid.NewGuid().ToString(),
                IsStop       = 0
            };

            //store the refresh_token
            if (RToken.AddToken(rToken))
            {
                return(new ResponseModel <Office365Model>
                {
                    status = true,
                    message = "OK",
                    Data = GetJwt(email, refresh_token)
                });
            }
            else
            {
                return(new ResponseModel <Office365Model>
                {
                    status = false,
                    message = "can not add token to database",
                    Data = null
                });
            }
        }
Пример #4
0
        public override bool Parse(ParseContext context, IAstNode parent)
        {
            RToken currentToken = context.Tokens.CurrentToken;
            string text         = context.TextProvider.GetText(currentToken);
            double result;

            Debug.Assert(currentToken.TokenType == RTokenType.Number ||
                         currentToken.TokenType == RTokenType.Infinity ||
                         currentToken.TokenType == RTokenType.NaN);

            if (currentToken.TokenType == RTokenType.Infinity)
            {
                Value = new RNumber(Double.PositiveInfinity);
            }
            else if (currentToken.TokenType == RTokenType.NaN)
            {
                Value = new RNumber(Double.NaN);
            }
            else
            {
                // If parsing fails we still need to create node
                // since we need a range to squiggle
                result = Double.NaN;
                if (!Number.TryParse(text, out result))
                {
                    // Something unparsable
                    context.AddError(new ParseError(ParseErrorType.NumberExpected, ErrorLocation.Token, currentToken));
                }
                Value = new RNumber(result);
            }
            return(base.Parse(context, parent));
        }
Пример #5
0
        public override bool Parse(ParseContext context, IAstNode parent)
        {
            RToken currentToken = context.Tokens.CurrentToken;
            string text         = context.TextProvider.GetText(currentToken);
            bool?  result       = null;

            Debug.Assert(currentToken.TokenType == RTokenType.Logical);

            if (text.Equals("TRUE", StringComparison.Ordinal) || text.Equals("T", StringComparison.Ordinal))
            {
                result = true;
            }
            else if (text.Equals("FALSE", StringComparison.Ordinal) || text.Equals("F", StringComparison.Ordinal))
            {
                result = false;
            }

            if (result.HasValue)
            {
                Value = new RLogical(result.Value);
                return(base.Parse(context, parent));
            }

            context.AddError(new ParseError(ParseErrorType.LogicalExpected, ErrorLocation.Token, currentToken));
            return(false);
        }
Пример #6
0
        private void CalculateVirtualEnd(ParseContext context)
        {
            int position = this.Arguments.Count > 0 ? this.Arguments.End : this.OpenBrace.End;

            if (!context.Tokens.IsEndOfStream())
            {
                TokenStream <RToken> tokens = context.Tokens;

                // Walk through tokens allowing numbers, identifiers and operators
                // as part of the function signature. Stop at keywords (except 'if'),
                // or curly braces.
                int i = tokens.Position;
                _virtualEnd = 0;

                for (; i < tokens.Length; i++)
                {
                    RToken token = tokens[i];

                    if (token.TokenType == RTokenType.Keyword || RParser.IsListTerminator(context, RTokenType.OpenBrace, token))
                    {
                        _virtualEnd = token.Start;
                        break;
                    }
                }
            }

            if (_virtualEnd == 0)
            {
                _virtualEnd = context.TextProvider.Length;
            }
        }
Пример #7
0
        public override bool Parse(ParseContext context, IAstNode parent)
        {
            RToken currentToken  = context.Tokens.CurrentToken;
            string text          = context.TextProvider.GetText(currentToken);
            double realPart      = 0;
            double imaginaryPart = 0;

            Debug.Assert(currentToken.TokenType == RTokenType.Complex);

            // Split into real and imaginary parts. Imaginary part
            // should always be there since otherwise tokenizer would
            // not have idenfified the number as complex. Note that
            // real part may be missing as in '+0i'. Operator may also
            // be missing: 1i is a legal complex number.

            Debug.Assert(text[text.Length - 1] == 'i');

            // Drop trailing i and retokenize as two numbers
            RTokenizer tokenizer = new RTokenizer(separateComments: false);
            IReadOnlyTextRangeCollection <RToken> tokens = tokenizer.Tokenize(text.Substring(0, text.Length - 1));

            if (tokens.Count == 1)
            {
                // Only imaginary part is present
                Debug.Assert(tokens[0].TokenType == RTokenType.Number);
                // TODO: handle complex numbers in Hex
                if (!Double.TryParse(text.Substring(tokens[0].Start, tokens[0].Length), out imaginaryPart))
                {
                    imaginaryPart = 0;
                }
            }
            else if (tokens.Count == 3)
            {
                // Real and imaginary parts present
                Debug.Assert(tokens[0].TokenType == RTokenType.Number);
                Debug.Assert(tokens[1].TokenType == RTokenType.Operator);
                Debug.Assert(tokens[2].TokenType == RTokenType.Number);

                // TODO: handle complex numbers in Hex
                if (!Double.TryParse(text.Substring(tokens[0].Start, tokens[0].Length), out realPart))
                {
                    realPart = 0;
                }
                if (!Double.TryParse(text.Substring(tokens[2].Start, tokens[2].Length), out imaginaryPart))
                {
                    imaginaryPart = 0;
                }
            }
            else
            {
                context.AddError(new MissingItemParseError(ParseErrorType.NumberExpected, context.Tokens.PreviousToken));
                return(false);
            }

            Complex complex = new Complex(realPart, imaginaryPart);

            NodeValue = new RComplex(complex);
            return(base.Parse(context, parent));
        }
Пример #8
0
 private RToken TryPopMatchingBrace(RToken token)
 {
     if (_openBraces.Peek().TokenType == GetMatchingBraceToken(token.TokenType))
     {
         return(_openBraces.Pop());
     }
     return(null);
 }
Пример #9
0
        public override bool Parse(ParseContext context, IAstNode parent) {
            RToken currentToken = context.Tokens.CurrentToken;

            this.Token = currentToken;
            context.Tokens.MoveToNextToken();

            return base.Parse(context, parent);
        }
Пример #10
0
        private static TextChangeType CheckChangeInsideComment(TextChangeContext context)
        {
            var comments = context.EditorTree.AstRoot.Comments;

            IReadOnlyList <int> affectedComments = comments.GetItemsContainingInclusiveEnd(context.NewStart);

            if (affectedComments.Count == 0)
            {
                return(TextChangeType.Trivial);
            }

            if (affectedComments.Count > 1)
            {
                return(TextChangeType.Structure);
            }

            // Make sure user is not deleting leading # effectively
            // destroying the comment
            RToken comment = comments[affectedComments[0]];

            if (comment.Start == context.NewStart && context.OldLength > 0)
            {
                return(TextChangeType.Structure);
            }

            // The collection will return a match if the comment starts
            // at the requested location. However, the change is not
            // inside the comment if it's at the comment start and
            // the old length of the change is zero.

            if (comment.Start == context.NewStart && context.OldLength == 0)
            {
                if (context.NewText.IndexOf('#') < 0)
                {
                    context.ChangedComment = comment;
                    return(TextChangeType.Comment);
                }
            }

            if (context.NewText.IndexOfAny(CharExtensions.LineBreakChars) >= 0)
            {
                return(TextChangeType.Structure);
            }

            // The change is not safe if old or new text contains line breaks
            // as in R comments runs to the end of the line and deleting
            // line break at the end of the comment may bring code into
            // the comment range and change the entire file structure.

            if (context.OldText.IndexOfAny(CharExtensions.LineBreakChars) >= 0)
            {
                return(TextChangeType.Structure);
            }

            context.ChangedComment = comment;
            return(TextChangeType.Comment);
        }
Пример #11
0
        public override bool Parse(ParseContext context, IAstNode parent)
        {
            RToken currentToken = context.Tokens.CurrentToken;

            this.Token = currentToken;
            context.Tokens.MoveToNextToken();

            return(base.Parse(context, parent));
        }
Пример #12
0
        public ResponseModel <Office365Model> DoRefreshToken(JWModel parameters)
        {
            var token = RToken.GetToken(parameters.RefreshToken, parameters.Email);

            if (token == null)
            {
                return(new ResponseModel <Office365Model>
                {
                    status = false,
                    message = "can not refresh token",
                    Data = null
                });
            }

            if (token.IsStop == 1)
            {
                return(new ResponseModel <Office365Model>
                {
                    status = false,
                    message = "refresh token has expired",
                    Data = null
                });
            }

            var refresh_token = Guid.NewGuid().ToString().Replace("-", "");

            token.IsStop = 1;
            //expire the old refresh_token and add a new refresh_token
            var updateFlag = RToken.ExpireToken(token);

            var addFlag = RToken.AddToken(new RToken
            {
                Email        = parameters.Email,
                RefreshToken = refresh_token,
                Id           = Guid.NewGuid().ToString(),
                IsStop       = 0
            });

            if (updateFlag && addFlag)
            {
                return(new ResponseModel <Office365Model>
                {
                    status = true,
                    message = "OK",
                    Data = GetJwt(parameters.Email, refresh_token)
                });
            }
            else
            {
                return(new ResponseModel <Office365Model>
                {
                    status = false,
                    message = "can not expire token or a new token",
                    Data = null
                });
            }
        }
Пример #13
0
        /// <summary>
        /// Propagates keyword association to the target token.
        /// <seealso cref="AssociateKeywordPositionWithOpenBrace"/>
        /// </summary>
        private void AssociateKeywordPositionWithToken(RToken source, RToken target)
        {
            int keywordPosition;

            if (_bracetoKeywordPositionMap.TryGetValue(source, out keywordPosition))
            {
                _bracetoKeywordPositionMap[target] = keywordPosition;
            }
        }
        public bool ExpireToken(RToken token)
        {
            using (var db = new TokenDbContext())
            {
                db.RTokens.Update(token);

                return(db.SaveChanges() > 0);
            }
        }
        public bool AddToken(RToken token)
        {
            using (var db = new TokenDbContext())
            {
                db.RTokens.Add(token);

                return(db.SaveChanges() > 0);
            }
        }
Пример #16
0
        internal static bool IsPackageListCompletion(ITextBuffer textBuffer, int position)
        {
            ITextSnapshot     snapshot = textBuffer.CurrentSnapshot;
            ITextSnapshotLine line     = snapshot.GetLineFromPosition(position);
            string            lineText = line.GetText();
            int linePosition           = position - line.Start;

            // We should be either at library(| or inside library(|)
            // or over package name like in library(ba|se)

            // Go left and right looking for
            RTokenizer    tokenizer    = new RTokenizer();
            ITextProvider textProvider = new TextStream(lineText);
            IReadOnlyTextRangeCollection <RToken> c = tokenizer.Tokenize(textProvider, 0, textProvider.Length);
            TokenStream <RToken> tokens             = new TokenStream <RToken>(c, RToken.EndOfStreamToken);

            while (!tokens.IsEndOfStream())
            {
                if (tokens.CurrentToken.Start >= linePosition)
                {
                    break;
                }

                if (tokens.CurrentToken.TokenType == RTokenType.Identifier)
                {
                    string identifier = textProvider.GetText(tokens.CurrentToken);
                    if (identifier == "library" || identifier == "require")
                    {
                        tokens.MoveToNextToken();

                        if (tokens.CurrentToken.TokenType == RTokenType.OpenBrace)
                        {
                            RToken openBrace = tokens.CurrentToken;
                            while (!tokens.IsEndOfStream())
                            {
                                if (tokens.CurrentToken.TokenType == RTokenType.CloseBrace)
                                {
                                    if (linePosition >= openBrace.End && linePosition <= tokens.CurrentToken.Start)
                                    {
                                        return(true);
                                    }
                                    return(false);
                                }
                                else if (tokens.NextToken.TokenType == RTokenType.EndOfStream)
                                {
                                    return(true);
                                }
                                tokens.MoveToNextToken();
                            }
                        }
                    }
                }
                tokens.MoveToNextToken();
            }
            return(false);
        }
Пример #17
0
        /// <summary>Expire token</summary>
        /// <param name="token"></param>
        public async Task <bool> ExpireToken(RToken token)
        {
            var filter = Builders <RToken> .Filter.Eq("client_id", token.ClientId) & Builders <RToken> .Filter.Eq("refresh_token", token.RefreshToken);;
            var update = Builders <RToken> .Update.Set("isstop", token.IsStop);

            var collection = _db.GetCollection <RToken>("RToken");
            var result     = await collection.UpdateOneAsync(filter, update);

            return(result.ModifiedCount > 0);
        }
Пример #18
0
        public override bool Parse(ParseContext context, IAstNode parent)
        {
            RToken currentToken = context.Tokens.CurrentToken;
            string text         = context.TextProvider.GetText(currentToken);

            Debug.Assert(currentToken.TokenType == RTokenType.String);

            Value = new RString(text);
            return(base.Parse(context, parent));
        }
Пример #19
0
        public IActionResult DeleteToken()
        {
            var     ident  = User.Identity as ClaimsIdentity;
            var     userID = ident.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
            AppUser user   = _userManager.Users.SingleOrDefault(r => r.Id == userID);

            RToken rToken = (RToken)this._repo;

            rToken.DeleteByUserId(user.Id);
            return(Ok());
        }
Пример #20
0
        /// <summary>
        /// Given opening curly brace tries to find keyword that is associated
        /// with the scope and calculate indentation based on the keyword line.
        /// </summary>
        public int GetOpenCurlyBraceIndentSize(RToken openCurlyBraceToken, TextBuilder tb, RFormatOptions options)
        {
            Debug.Assert(openCurlyBraceToken.TokenType == RTokenType.OpenCurlyBrace);

            int keywordPosition = -1;

            if (_bracetoKeywordPositionMap.TryGetValue(openCurlyBraceToken, out keywordPosition))
            {
                return(IndentBuilder.GetLineIndentSize(tb, keywordPosition, options.TabSize));
            }
            return(0);
        }
Пример #21
0
        private string GetClassificationName(RToken t)
        {
            switch (t.TokenType)
            {
            case RTokenType.Keyword:
                return(RoxygenClassificationDefinitions.RoxygenKeywordClassificationFormatName);

            case RTokenType.Identifier:
                return(RoxygenClassificationDefinitions.RoxygenExportClassificationFormatName);
            }
            return(string.Empty);
        }
Пример #22
0
        /// <summary>
        /// Given closing curly brace tries to find keyword that is associated
        /// with the scope and calculate indentation based on the keyword line.
        /// </summary>
        public int GetCloseCurlyBraceIndentSize(RToken closeCurlyBraceToken, TextBuilder tb, RFormatOptions options)
        {
            Debug.Assert(closeCurlyBraceToken.TokenType == RTokenType.CloseCurlyBrace);

            // Search stack for the first matching brace. Stack enumerates from the top down.
            var openCurlyBraceToken = _openBraces.FirstOrDefault(t => t.TokenType == RTokenType.OpenCurlyBrace);

            if (openCurlyBraceToken != null)
            {
                return(GetOpenCurlyBraceIndentSize(openCurlyBraceToken, tb, options));
            }
            return(0);
        }
Пример #23
0
        public override bool Parse(ParseContext context, IAstNode parent = null)
        {
            RToken currentToken = context.Tokens.CurrentToken;

            Debug.Assert(currentToken.IsVariableKind());

            // Not calling base since expression parser will decide
            // what parent node the variable belongs to.
            Token = currentToken;
            context.Tokens.MoveToNextToken();

            return(true);
        }
Пример #24
0
        private bool IsClosingToken(RToken token, AstRoot ast = null)
        {
            switch (token.TokenType)
            {
            case RTokenType.Comma:
            case RTokenType.CloseBrace:
            case RTokenType.CloseSquareBracket:
            case RTokenType.CloseDoubleSquareBracket:
            case RTokenType.Semicolon:
                return(true);
            }

            return(false);
        }
Пример #25
0
        /// <summary>Add token</summary>
        /// <param name="token"></param>
        public async Task <bool> AddToken(RToken token)
        {
            var collection = _db.GetCollection <RToken>("RToken");

            try
            {
                await collection.InsertOneAsync(token);

                return(true);
            }
            catch
            {
                return(false);
            }
        }
Пример #26
0
        private static ITextRange GetLocationRange(IAstNode node, RToken token, ErrorLocation location)
        {
            ITextRange itemRange = node != null ? node : token as ITextRange;

            //switch (location)
            //{
            //    case ErrorLocation.BeforeToken:
            //        return new TextRange(Math.Max(0, itemRange.Start-1), 1);

            //    case ErrorLocation.AfterToken:
            //        return new TextRange(itemRange.End, 1);
            //}

            return itemRange;
        }
Пример #27
0
        private static ITextRange GetLocationRange(IAstNode node, RToken token, ErrorLocation location)
        {
            ITextRange itemRange = node != null ? node : token as ITextRange;

            //switch (location)
            //{
            //    case ErrorLocation.BeforeToken:
            //        return new TextRange(Math.Max(0, itemRange.Start-1), 1);

            //    case ErrorLocation.AfterToken:
            //        return new TextRange(itemRange.End, 1);
            //}

            return(itemRange);
        }
Пример #28
0
        //scenario 1 : get the access-token by username and password
        private ResponseData DoPassword(Parameters parameters)
        {
            //validate the client_id/client_secret/username/password
            var isValidated = UserInfo.GetAllUsers().Any(x => x.ClientId == parameters.client_id &&
                                                         x.ClientSecret == parameters.client_secret &&
                                                         x.UserName == parameters.username &&
                                                         x.Password == parameters.password);

            if (!isValidated)
            {
                return(new ResponseData
                {
                    Code = "902",
                    Message = "invalid user infomation",
                    Data = null
                });
            }

            var refresh_token = Guid.NewGuid().ToString().Replace("-", "");

            var rToken = new RToken
            {
                ClientId     = parameters.client_id,
                RefreshToken = refresh_token,
                Id           = Guid.NewGuid().ToString(),
                IsStop       = 0
            };

            //store the refresh_token
            if (_repo.AddToken(rToken))
            {
                return(new ResponseData
                {
                    Code = "999",
                    Message = "OK",
                    Data = GetJwt(parameters.client_id, refresh_token)
                });
            }
            else
            {
                return(new ResponseData
                {
                    Code = "909",
                    Message = "can not add token to database",
                    Data = null
                });
            }
        }
Пример #29
0
 /// <summary>Get the access-token by username and password</summary>
 /// <param name="parameters"></param>
 /// <param name="_repo"></param>
 /// <param name="_settings"></param>
 public ResponseData DoPassword(Parameters parameters, IRTokenRepository _repo, IOptions <Audience> _settings)
 {
     try
     {
         var refresh_token = Guid.NewGuid().ToString().Replace("-", "");
         var rToken        = new RToken
         {
             ClientId     = parameters.username,
             RefreshToken = refresh_token,
             Id           = Guid.NewGuid().ToString(),
             IsStop       = 0
         };
         if (_repo.AddToken(rToken).Result)
         {
             dynamic UserInfo = new System.Dynamic.ExpandoObject();
             UserInfo.FirstName = parameters.fullname;
             UserInfo.UserName  = parameters.username;
             return(new ResponseData
             {
                 Code = "999",
                 Message = "OK",
                 Content = UserInfo,
                 Data = GetJwt(parameters.username, refresh_token, _settings, BsonSerializer.Deserialize <RegisterModel>(MongoHelper.CheckForDatas("UserName", parameters.username, null, null, "Authentication", "Authentication")).UserRole)
             });
         }
         else
         {
             return(new ResponseData
             {
                 Code = "909",
                 Message = "can not add token to database",
                 Data = null
             });
         }
     }
     catch (Exception ex)
     {
         LoggerDataAccess.CreateLog("AuthHelper", "DoPassword", ex.Message);
         return(new ResponseData
         {
             Code = "400",
             Message = "Failed",
             Data = null
         });
     }
 }
Пример #30
0
        private int TryFindNextArgument(ParseContext context, int startPosition)
        {
            for (int i = startPosition; i < context.Tokens.Length; i++)
            {
                RToken token = context.Tokens[i];
                if (token.TokenType == RTokenType.Comma || token.TokenType == RTokenType.CloseBrace)
                {
                    return(i);
                }

                if (RParser.IsListTerminator(context, RTokenType.OpenBrace, token))
                {
                    break;
                }
            }

            return(-1);
        }
Пример #31
0
 private static bool IsVariableNameToken(string lineText, RToken token)
 {
     if (token.TokenType == RTokenType.Identifier)
     {
         return(true);
     }
     if (token.TokenType == RTokenType.Operator)
     {
         if (token.Length == 1)
         {
             return(lineText[token.Start] == '$' || lineText[token.Start] == '@');
         }
         else if (token.Length == 2)
         {
             return(lineText[token.Start] == ':' && lineText[token.Start + 1] == ':');
         }
     }
     return(false);
 }
Пример #32
0
        public IActionResult Refresh(RToken refresh)
        {
            var refreshedToken = tokenService.RefreshTokinValidation(refresh.Refresh);

            if (refreshedToken == null)
            {
                return(BadRequest("invalid_grant"));
            }


            User user = _context.Users.Find(refreshedToken.UserId);

            return(Ok(new
            {
                access_token = new JwtSecurityTokenHandler().WriteToken(tokenService.GenerateAccessToken(user)),
                refresh_token = refreshedToken.Token,
                user_id = user.Id,
                user_email = user.FirstName
            }));
        }
 public MissingItemParseError(ParseErrorType errorType, RToken token) :
     base(errorType, ErrorLocation.AfterToken, token) {
 }
Пример #34
0
 /// <summary>
 /// Propagates keyword association to the target token.
 /// <seealso cref="AssociateKeywordPositionWithOpenBrace"/>
 /// </summary>
 private void AssociateKeywordPositionWithToken(RToken source, RToken target) {
     int keywordPosition;
     if (_bracetoKeywordPositionMap.TryGetValue(source, out keywordPosition)) {
         _bracetoKeywordPositionMap[target] = keywordPosition;
     }
 }
Пример #35
0
 private RToken TryPopMatchingBrace(RToken token) {
     if (_openBraces.Peek().TokenType == GetMatchingBraceToken(token.TokenType)) {
         return _openBraces.Pop();
     }
     return null;
 }
Пример #36
0
 private static bool IsVariableNameToken(string lineText, RToken token) {
     if (token.TokenType == RTokenType.Identifier) {
         return true;
     }
     if (token.TokenType == RTokenType.Operator) {
         if (token.Length == 1) {
             return lineText[token.Start] == '$' || lineText[token.Start] == '@';
         } else if (token.Length == 2) {
             return lineText[token.Start] == ':' && lineText[token.Start + 1] == ':';
         }
     }
     return false;
 }
Пример #37
0
        /// <summary>
        /// Given closing curly brace tries to find keyword that is associated
        /// with the scope and calculate indentation based on the keyword line.
        /// </summary>
        public int GetCloseCurlyBraceIndentSize(RToken closeCurlyBraceToken, TextBuilder tb, RFormatOptions options) {
            Debug.Assert(closeCurlyBraceToken.TokenType == RTokenType.CloseCurlyBrace);

            // Search stack for the first matching brace. Stack enumerates from the top down.
            var openCurlyBraceToken = _openBraces.FirstOrDefault(t => t.TokenType == RTokenType.OpenCurlyBrace);
            if (openCurlyBraceToken != null) {
                return GetOpenCurlyBraceIndentSize(openCurlyBraceToken, tb, options);
            }
            return 0;
        }
Пример #38
0
 internal TokenNode(RToken token) {
     Token = token;
 }
Пример #39
0
        public static bool IsListTerminator(ParseContext context, RTokenType openingTokenType, RToken token) {
            RTokenType tokenType = token.TokenType;

            if (tokenType == RTokenType.CloseCurlyBrace ||
                tokenType == RTokenType.Semicolon) {
                return true;
            }

            switch (openingTokenType) {
                case RTokenType.OpenBrace:
                    if (tokenType == RTokenType.CloseSquareBracket || tokenType == RTokenType.CloseDoubleSquareBracket) {
                        return true;
                    }
                    break;

                case RTokenType.OpenSquareBracket:
                    if (tokenType == RTokenType.CloseBrace || tokenType == RTokenType.CloseDoubleSquareBracket) {
                        return true;
                    }
                    break;

                case RTokenType.OpenDoubleSquareBracket:
                    if (tokenType == RTokenType.CloseBrace || tokenType == RTokenType.CloseSquareBracket) {
                        return true;
                    }
                    break;
            }

            if (tokenType == RTokenType.Operator && token.IsKeywordText(context.TextProvider, "<-")) {
                return true;
            }

            if (tokenType == RTokenType.Keyword &&
                !token.IsKeywordText(context.TextProvider, "if") &&
                !token.IsKeywordText(context.TextProvider, "function")) {
                return true;
            }

            return false;
        }
Пример #40
0
        /// <summary>
        /// Associates keyword with the open brace. Used when formatter needs to determine
        /// indentation level of the new formatting scope when it encounters { token.
        /// </summary>
        /// <remarks>
        /// Closing curly indentation is defined by the line that either holds the opening curly brace
        /// or the line that holds keyword that defines the expression that the curly belongs to.
        /// Examples: 
        ///
        ///      x &lt;- 
        ///          function(a) {
        ///          }
        ///
        ///      x &lt;- function(a) {
        ///      }
        ///
        /// First keyword is associated with the open brace, then, when brace pair closes, association
        /// is propagated to the closing brace and then to the opening curly. When curly pair closes
        /// formatter then finds appropriate indentation based on the line that contains the keyword token.
        /// </remarks>

        private void AssociateKeywordPositionWithOpenBrace(RToken openBrace, int keywordPosition) {
            _bracetoKeywordPositionMap[openBrace] = keywordPosition;
        }
Пример #41
0
        /// <summary>
        /// Given opening curly brace tries to find keyword that is associated
        /// with the scope and calculate indentation based on the keyword line.
        /// </summary>
        public int GetOpenCurlyBraceIndentSize(RToken openCurlyBraceToken, TextBuilder tb, RFormatOptions options) {
            Debug.Assert(openCurlyBraceToken.TokenType == RTokenType.OpenCurlyBrace);

            int keywordPosition = -1;
            if (_bracetoKeywordPositionMap.TryGetValue(openCurlyBraceToken, out keywordPosition)) {
                return IndentBuilder.GetLineIndentSize(tb, keywordPosition, options.TabSize);
            }
            return 0;
        }
Пример #42
0
        private bool IsClosingToken(RToken token, AstRoot ast = null) {
            switch (token.TokenType) {
                case RTokenType.Comma:
                case RTokenType.CloseBrace:
                case RTokenType.CloseSquareBracket:
                case RTokenType.CloseDoubleSquareBracket:
                case RTokenType.Semicolon:
                    return true;
            }

            return false;
        }