Пример #1
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
                );

            var(indentOperations, suppressOperations) = initialContextFinder.Do(
                startToken,
                endToken
                );

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

                var initialOperation      = indentationOperations[0];
                var baseIndentationFinder = new BottomUpBaseIndentationFinder(
                    formattingRules,
                    this.Options.GetOption(FormattingOptions2.TabSize),
                    this.Options.GetOption(FormattingOptions2.IndentationSize),
                    _tokenStream,
                    _engine.SyntaxFacts
                    );
                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;
            }

            suppressOperations?.Do(o => this.AddInitialSuppressOperation(o));
        }
Пример #2
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));
        }