public bool ApplyAlignment(
                AlignTokensOperation operation, Dictionary<SyntaxToken, int> previousChangesMap, CancellationToken cancellationToken)
            {
                Contract.ThrowIfNull(previousChangesMap);

                IList<TokenData> tokenData;

                switch (operation.Option)
                {
                    case AlignTokensOption.AlignIndentationOfTokensToBaseToken:
                        {
                            if (!ApplyAlignment(operation.BaseToken, operation.Tokens, previousChangesMap, out tokenData, cancellationToken))
                            {
                                return false;
                            }

                            break;
                        }

                    case AlignTokensOption.AlignPositionOfTokensToIndentation:
                        {
                            // token will be align to current indentation. for this operation, we don't care
                            // about base token
                            if (operation.Tokens.IsEmpty())
                            {
                                return false;
                            }

                            tokenData = GetTokenWithIndices(operation.Tokens);

                            // no valid tokens. do nothing and return
                            if (tokenData.Count == 0)
                            {
                                return false;
                            }

                            ApplySpacesToAlignWithCurrentIndentation(tokenData, previousChangesMap, cancellationToken);
                            break;
                        }

                    case AlignTokensOption.AlignToFirstTokenOnBaseTokenLine:
                        {
                            if (!ApplyAlignment(tokenStream.FirstTokenOfBaseTokenLine(operation.BaseToken), operation.Tokens, previousChangesMap, out tokenData, cancellationToken))
                            {
                                return false;
                            }

                            break;
                        }

                    default:
                        {
                            return Contract.FailWithReturn<bool>("Unknown option");
                        }
                }

                ApplyIndentationChangesToDependentTokens(tokenData, previousChangesMap, cancellationToken);

                return true;
            }
            public bool ApplyAlignment(
                AlignTokensOperation operation, Dictionary<SyntaxToken, int> previousChangesMap, CancellationToken cancellationToken)
            {
                Contract.ThrowIfNull(previousChangesMap);

                IList<TokenData> tokenData;

                switch (operation.Option)
                {
                    case AlignTokensOption.AlignIndentationOfTokensToBaseToken:
                        {
                            if (!ApplyAlignment(operation.BaseToken, operation.Tokens, previousChangesMap, out tokenData, cancellationToken))
                            {
                                return false;
                            }

                            break;
                        }

                    case AlignTokensOption.AlignIndentationOfTokensToFirstTokenOfBaseTokenLine:
                        {
                            if (!ApplyAlignment(_tokenStream.FirstTokenOfBaseTokenLine(operation.BaseToken), operation.Tokens, previousChangesMap, out tokenData, cancellationToken))
                            {
                                return false;
                            }

                            break;
                        }

                    default:
                        {
                            return Contract.FailWithReturn<bool>("Unknown option");
                        }
                }

                ApplyIndentationChangesToDependentTokens(tokenData, previousChangesMap, cancellationToken);

                return true;
            }