コード例 #1
0
            public override void Format(
                FormattingContext context,
                ChainedFormattingRules formattingRules,
                Action<int, TriviaData> formattingResultApplier,
                CancellationToken cancellationToken,
                int tokenPairIndex = TokenPairIndexNotNeeded)
            {
                Contract.ThrowIfFalse(this.SecondTokenIsFirstTokenOnLine);

                var token1 = _original.Token1;
                var token2 = _original.Token2;

                var triviaList = new TriviaList(token1.TrailingTrivia, token2.LeadingTrivia);
                Contract.ThrowIfFalse(triviaList.Count > 0);

                // okay, now, check whether we need or are able to format noisy tokens
                if (CodeShapeAnalyzer.ContainsSkippedTokensOrText(triviaList))
                {
                    return;
                }

                formattingResultApplier(tokenPairIndex,
                    new FormattedComplexTrivia(
                        context,
                        formattingRules,
                        _original.Token1,
                        _original.Token2,
                        this.LineBreaks,
                        this.Spaces,
                        _original.OriginalString,
                        cancellationToken));
            }
コード例 #2
0
            public override TriviaData WithSpace(int space, FormattingContext context, ChainedFormattingRules formattingRules)
            {
                if (this.LineBreaks == 0 && this.Spaces == space)
                {
                    return this;
                }

                return new ModifiedWhitespace(this.OptionSet, this, /*lineBreak*/0, space, elastic: false, language: this.Language);
            }
コード例 #3
0
 public override void Format(
     FormattingContext context,
     ChainedFormattingRules formattingRules,
     Action<int, TriviaData> formattingResultApplier,
     CancellationToken cancellationToken,
     int tokenPairIndex = TokenPairIndexNotNeeded)
 {
     formattingResultApplier(tokenPairIndex, new FormattedWhitespace(this.OptionSet, this.LineBreaks, this.Spaces, this.Language));
 }
コード例 #4
0
            public override TriviaData WithIndentation(
                int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                if (this.Spaces == indentation)
                {
                    return this;
                }

                return new ModifiedWhitespace(this.OptionSet, this, this.LineBreaks, indentation, elastic: false, language: this.Language);
            }
コード例 #5
0
            public override TriviaData WithLine(int line, int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                Contract.ThrowIfFalse(line > 0);

                if (this.LineBreaks == line && this.Spaces == indentation)
                {
                    return this;
                }

                return new ModifiedWhitespace(this.OptionSet, this, line, indentation, elastic: false, language: this.Language);
            }
コード例 #6
0
 public static IFormattingResult Format(
     SyntaxTrivia trivia,
     int initialColumn,
     OptionSet optionSet,
     ChainedFormattingRules formattingRules,
     CancellationToken cancellationToken)
 {
     var root = trivia.GetStructure();
     var formatter = new CSharpStructuredTriviaFormatEngine(trivia, initialColumn, optionSet, formattingRules, root.GetFirstToken(includeZeroWidth: true), root.GetLastToken(includeZeroWidth: true));
     return formatter.FormatAsync(cancellationToken).WaitAndGetResult_CanCallOnBackground(cancellationToken);
 }
コード例 #7
0
 public CSharpTriviaFormatter(
     FormattingContext context,
     ChainedFormattingRules formattingRules,
     SyntaxToken token1,
     SyntaxToken token2,
     string originalString,
     int lineBreaks,
     int spaces) :
     base(context, formattingRules, token1, token2, originalString, lineBreaks, spaces)
 {
 }
コード例 #8
0
            public InitialContextFinder(
                TokenStream tokenStream,
                ChainedFormattingRules formattingRules,
                SyntaxNode rootNode)
            {
                Contract.ThrowIfNull(tokenStream);
                Contract.ThrowIfNull(formattingRules);
                Contract.ThrowIfNull(rootNode);

                this.tokenStream = tokenStream;
                this.formattingRules = formattingRules;
                this.rootNode = rootNode;
            }
コード例 #9
0
        public BottomUpBaseIndentationFinder(
            ChainedFormattingRules formattingRules,
            int tabSize,
            int indentationSize,
            TokenStream tokenStream)
        {
            Contract.ThrowIfNull(formattingRules);

            _formattingRules = formattingRules;
            _tabSize = tabSize;
            _indentationSize = indentationSize;
            _tokenStream = tokenStream;
        }
コード例 #10
0
            public override TriviaData WithSpace(int space, FormattingContext context, ChainedFormattingRules formattingRules)
            {
                if (_original == null)
                {
                    return base.WithSpace(space, context, formattingRules);
                }

                if (this.LineBreaks == _original.LineBreaks && _original.Spaces == space)
                {
                    return _original;
                }

                return base.WithSpace(space, context, formattingRules);
            }
コード例 #11
0
            public override TriviaData WithLine(int line, int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                if (_original == null)
                {
                    return base.WithLine(line, indentation, context, formattingRules, cancellationToken);
                }

                if (_original.LineBreaks == line && _original.Spaces == indentation)
                {
                    return _original;
                }

                return base.WithLine(line, indentation, context, formattingRules, cancellationToken);
            }
コード例 #12
0
 private CSharpStructuredTriviaFormatEngine(
     SyntaxTrivia trivia,
     int initialColumn,
     OptionSet optionSet,
     ChainedFormattingRules formattingRules,
     SyntaxToken token1,
     SyntaxToken token2) :
     base(TreeData.Create(trivia, initialColumn),
          optionSet,
          formattingRules,
          token1,
          token2,
          TaskExecutor.Synchronous)
 {
 }
            public override TriviaData WithIndentation(
                int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                if (this.original == null)
                {
                    return base.WithIndentation(indentation, context, formattingRules, cancellationToken);
                }

                if (this.LineBreaks == this.original.LineBreaks && this.original.Spaces == indentation)
                {
                    return this.original;
                }

                return base.WithIndentation(indentation, context, formattingRules, cancellationToken);
            }
コード例 #14
0
            public InitialContextFinder(
                TokenStream tokenStream,
                ChainedFormattingRules formattingRules,
                SyntaxNode rootNode,
                SyntaxToken lastToken)
            {
                Contract.ThrowIfNull(tokenStream);
                Contract.ThrowIfNull(formattingRules);
                Contract.ThrowIfNull(rootNode);

                _tokenStream = tokenStream;
                _formattingRules = formattingRules;
                _rootNode = rootNode;
                _lastToken = lastToken;
            }
コード例 #15
0
        public void Initialize(
            ChainedFormattingRules formattingRules,
            SyntaxToken startToken,
            SyntaxToken endToken,
            CancellationToken cancellationToken)
        {
            var rootNode = this.TreeData.Root;
            if (_tokenStream.IsFormattingWholeDocument)
            {
                // if we are trying to format whole document, there is no reason to get initial context. just set
                // initial indentation.
                var data = new RootIndentationData(rootNode);
                _indentationTree.AddIntervalInPlace(data);
                _indentationMap.Add(data.TextSpan);
                return;
            }

            var initialContextFinder = new InitialContextFinder(_tokenStream, formattingRules, rootNode, endToken);
            var results = initialContextFinder.Do(startToken, endToken);

            if (results.indentOperations != null)
            {
                var indentationOperations = results.indentOperations;

                var initialOperation = indentationOperations[0];
                var baseIndentationFinder = new BottomUpBaseIndentationFinder(
                                                formattingRules,
                                                this.OptionSet.GetOption(FormattingOptions.TabSize, _language),
                                                this.OptionSet.GetOption(FormattingOptions.IndentationSize, _language),
                                                _tokenStream,
                                                endToken);
                var initialIndentation = baseIndentationFinder.GetIndentationOfCurrentPosition(
                    rootNode,
                    initialOperation,
                    t => _tokenStream.GetCurrentColumn(t), cancellationToken);

                var data = new SimpleIndentationData(initialOperation.TextSpan, initialIndentation);
                _indentationTree.AddIntervalInPlace(data);
                _indentationMap.Add(data.TextSpan);

                // hold onto initial operations
                _initialIndentBlockOperations = indentationOperations;
            }

            results.suppressOperations?.Do(o => this.AddInitialSuppressOperation(o));
        }
            public override TriviaData WithSpace(int space, FormattingContext context, ChainedFormattingRules formattingRules)
            {
                // two tokens are on a single line, we don't allow changing spaces between two
                // tokens that contain noisy characters between them.
                if (!this.SecondTokenIsFirstTokenOnLine)
                {
                    return this;
                }

                // okay, two tokens are on different lines, we are basically asked to remove line breaks between them
                // and make them to be on a single line. well, that is not allowed when there are noisy chars between them
                if (this.SecondTokenIsFirstTokenOnLine)
                {
                    return this;
                }

                return Contract.FailWithReturn<TriviaData>("Can not reach here");
            }
            public override TriviaData WithLine(
                int line, int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                Contract.ThrowIfFalse(line > 0);

                // if we have elastic trivia, always let it be modified
                if (this.TreatAsElastic)
                {
                    return CreateComplexTrivia(line, indentation);
                }

                // two tokens are on a single line, it is always allowed to put those two tokens on a different lines
                if (!this.SecondTokenIsFirstTokenOnLine)
                {
                    return CreateComplexTrivia(line, indentation);
                }

                // okay, two tokens are on different lines, now we need to see whether we can add more lines or not
                if (this.SecondTokenIsFirstTokenOnLine)
                {
                    // we are asked to add more lines. sure, no problem
                    if (this.LineBreaks < line)
                    {
                        return CreateComplexTrivia(line, indentation);
                    }

                    // we already has same number of lines, but it is asking changing indentation
                    if (this.LineBreaks == line)
                    {
                        return WithIndentation(indentation, context, formattingRules, cancellationToken);
                    }

                    // sorry, we can't reduce lines if it contains noisy chars
                    if (this.LineBreaks > line)
                    {
                        return this;
                    }
                }

                return Contract.FailWithReturn<TriviaData>("Can not reach here");
            }
コード例 #18
0
            public FormattedComplexTrivia(
                FormattingContext context,
                ChainedFormattingRules formattingRules,
                SyntaxToken token1,
                SyntaxToken token2,
                int lineBreaks,
                int spaces,
                string originalString,
                CancellationToken cancellationToken) :
                base(context.OptionSet, LanguageNames.CSharp)
            {
                Contract.ThrowIfNull(context);
                Contract.ThrowIfNull(formattingRules);
                Contract.ThrowIfNull(originalString);

                this.LineBreaks = Math.Max(0, lineBreaks);
                this.Spaces = Math.Max(0, spaces);

                _formatter = new CSharpTriviaFormatter(context, formattingRules, token1, token2, originalString, this.LineBreaks, this.Spaces);
                _textChanges = _formatter.FormatToTextChanges(cancellationToken);
            }
 protected abstract TriviaDataWithList Format(FormattingContext context, ChainedFormattingRules formattingRules, int lines, int spaces, CancellationToken cancellationToken);
            public override TriviaData WithIndentation(
                int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                // if tokens are not in different line, there is nothing we can do here
                if (!this.SecondTokenIsFirstTokenOnLine)
                {
                    return this;
                }

                // well, we are already in a desired format, nothing to do. return as it is.
                if (this.Spaces == indentation)
                {
                    return this;
                }

                // do expansive check
                // we need to actually format here to find out indentation
                var list = new TriviaList(_token1.TrailingTrivia, _token2.LeadingTrivia);
                Contract.ThrowIfFalse(list.Count > 0);

                if (ContainsSkippedTokensOrText(list))
                {
                    // we can't format
                    return this;
                }

                // okay, we need to do expansive calculation to find out actual space between two tokens
                var trivia = Format(context, formattingRules, this.LineBreaks, indentation, cancellationToken);
                var triviaString = CreateString(trivia, cancellationToken);

                int lineBreaks;
                int spaces;
                ExtractLineAndSpace(triviaString, out lineBreaks, out spaces);

                return CreateComplexTrivia(lineBreaks, spaces, indentation);
            }
コード例 #21
0
ファイル: TriviaData.cs プロジェクト: Rickinio/roslyn
 public abstract void Format(
     FormattingContext context,
     ChainedFormattingRules formattingRules,
     Action<int, TriviaData> formattingResultApplier,
     CancellationToken cancellationToken,
     int tokenPairIndex = TokenPairIndexNotNeeded);
コード例 #22
0
ファイル: TriviaData.cs プロジェクト: Rickinio/roslyn
 public abstract TriviaData WithIndentation(int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken);
コード例 #23
0
ファイル: TriviaData.cs プロジェクト: Rickinio/roslyn
 public abstract TriviaData WithSpace(int space, FormattingContext context, ChainedFormattingRules formattingRules);
コード例 #24
0
 public override TriviaData WithIndentation(
     int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
 {
     return(_original.WithIndentation(indentation, context, formattingRules, cancellationToken));
 }
コード例 #25
0
 public OperationApplier(FormattingContext context, TokenStream tokenStream, ChainedFormattingRules formattingRules)
 {
     _context = context;
     _tokenStream = tokenStream;
     _formattingRules = formattingRules;
 }
コード例 #26
0
 protected override TriviaDataWithList Format(
     FormattingContext context, ChainedFormattingRules formattingRules, int lines, int spaces, CancellationToken cancellationToken)
 {
     return(new FormattedComplexTrivia(context, formattingRules, this.Token1, this.Token2, lines, spaces, this.OriginalString, cancellationToken));
 }
 public override TriviaData WithIndentation(int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
 => throw new NotImplementedException();
 public override void Format(
     FormattingContext context, ChainedFormattingRules formattingRules, Action<int, TriviaData> formattingResultApplier, CancellationToken cancellationToken, int tokenPairIndex = TokenPairIndexNotNeeded)
 {
     throw new NotImplementedException();
 }
コード例 #29
0
 public override TriviaData WithSpace(int space, FormattingContext context, ChainedFormattingRules formattingRules)
 {
     return(_original.WithSpace(space, context, formattingRules));
 }
コード例 #30
0
        internal static AdjustSpacesOperation?GetAdjustSpacesOperation(IEnumerable <AbstractFormattingRule> formattingRules, SyntaxToken previousToken, SyntaxToken currentToken, AnalyzerConfigOptions options)
        {
            var chainedFormattingRules = new ChainedFormattingRules(formattingRules, options);

            return(chainedFormattingRules.GetAdjustSpacesOperation(previousToken, currentToken));
        }
 public override TriviaData WithIndentation(int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
 {
     throw new NotImplementedException();
 }
コード例 #32
0
 public OperationApplier(FormattingContext context, TokenStream tokenStream, ChainedFormattingRules formattingRules)
 {
     this.context = context;
     this.tokenStream = tokenStream;
     this.formattingRules = formattingRules;
 }
コード例 #33
0
        /// <summary>
        /// return AlignTokensOperation for the node provided by the given formatting rules
        /// </summary>
        internal static IEnumerable<AlignTokensOperation> GetAlignTokensOperations(IEnumerable<IFormattingRule> formattingRules, SyntaxNode node, OptionSet optionSet)
        {
            var chainedFormattingRules = new ChainedFormattingRules(formattingRules, optionSet);

            var list = new List<AlignTokensOperation>();
            chainedFormattingRules.AddAlignTokensOperations(list, node);
            return list;
        }
 public override TriviaData WithSpace(int space, FormattingContext context, ChainedFormattingRules formattingRules)
 => throw new NotImplementedException();
コード例 #35
0
 public override void Format(
     FormattingContext context,
     ChainedFormattingRules formattingRules,
     Action<int, TriviaData> formattingResultApplier,
     CancellationToken cancellationToken,
     int tokenPairIndex = TokenPairIndexNotNeeded)
 {
     // nothing changed, nothing to format
 }
コード例 #36
0
 /// <summary>
 /// return AdjustSpacesOperation for the node provided by the given formatting rules
 /// </summary>
 internal static AdjustSpacesOperation GetAdjustSpacesOperation(IEnumerable<IFormattingRule> formattingRules, SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet)
 {
     var chainedFormattingRules = new ChainedFormattingRules(formattingRules, optionSet);
     return chainedFormattingRules.GetAdjustSpacesOperation(previousToken, currentToken);
 }
コード例 #37
0
        /// <summary>
        /// return AdjustSpacesOperation for the node provided by the given formatting rules
        /// </summary>
        internal static AdjustSpacesOperation GetAdjustSpacesOperation(IEnumerable <IFormattingRule> formattingRules, SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet)
        {
            var chainedFormattingRules = new ChainedFormattingRules(formattingRules, optionSet);

            return(chainedFormattingRules.GetAdjustSpacesOperation(previousToken, currentToken));
        }
 public override void Format(FormattingContext context, ChainedFormattingRules formattingRules, Action <int, TokenStream, TriviaData> formattingResultApplier, CancellationToken cancellationToken, int tokenPairIndex = TokenPairIndexNotNeeded)
 => throw new NotImplementedException();