示例#1
0
        private bool ContainsOnlyWhitespace(Analyzer.AnalysisResult result)
        {
            if (result.HasComments || result.HasPreprocessor || result.HasSkippedTokens || result.HasSkippedOrDisabledText)
            {
                return(false);
            }

            return(true);
        }
示例#2
0
        private int GetSpaceOnSingleLine(Analyzer.AnalysisResult result)
        {
            if (result.HasTrailingSpace || result.HasUnknownWhitespace || result.LineBreaks > 0 || result.Tab > 0)
            {
                return(-1);
            }

            return(result.Space);
        }
示例#3
0
 private bool ContainsOnlyWhitespace(Analyzer.AnalysisResult result)
 {
     return
         (!result.HasComments &&
          !result.HasPreprocessor &&
          !result.HasSkippedTokens &&
          !result.HasSkippedOrDisabledText &&
          !result.HasConflictMarker);
 }
示例#4
0
        private ValueTuple <bool, int, int> GetLineBreaksAndIndentation(Analyzer.AnalysisResult result)
        {
            Debug.Assert(result.Tab >= 0);
            Debug.Assert(result.LineBreaks >= 0);

            var indentation = result.Tab * this.OptionSet.GetOption(FormattingOptions.TabSize, LanguageNames.CSharp) + result.Space;

            if (result.HasTrailingSpace || result.HasUnknownWhitespace)
            {
                return(ValueTuple.Create(false, result.LineBreaks, indentation));
            }

            if (!this.OptionSet.GetOption(FormattingOptions.UseTabs, LanguageNames.CSharp))
            {
                if (result.Tab > 0)
                {
                    return(ValueTuple.Create(false, result.LineBreaks, indentation));
                }

                return(ValueTuple.Create(true, result.LineBreaks, indentation));
            }

            Debug.Assert(this.OptionSet.GetOption(FormattingOptions.UseTabs, LanguageNames.CSharp));

            // tab can only appear before space to be a valid tab for indentation
            if (result.HasTabAfterSpace)
            {
                return(ValueTuple.Create(false, result.LineBreaks, indentation));
            }

            if (result.Space >= this.OptionSet.GetOption(FormattingOptions.TabSize, LanguageNames.CSharp))
            {
                return(ValueTuple.Create(false, result.LineBreaks, indentation));
            }

            Debug.Assert((indentation / this.OptionSet.GetOption(FormattingOptions.TabSize, LanguageNames.CSharp)) == result.Tab);
            Debug.Assert((indentation % this.OptionSet.GetOption(FormattingOptions.TabSize, LanguageNames.CSharp)) == result.Space);

            return(ValueTuple.Create(true, result.LineBreaks, indentation));
        }
示例#5
0
        private TriviaData GetWhitespaceOnlyTriviaInfo(SyntaxToken token1, SyntaxToken token2, Analyzer.AnalysisResult result)
        {
            if (!ContainsOnlyWhitespace(result))
            {
                return(null);
            }

            // only whitespace in between
            int space = GetSpaceOnSingleLine(result);

            Contract.ThrowIfFalse(space >= -1);

            if (space >= 0)
            {
                // check whether we can use cache
                return(GetSpaceTriviaData(space, result.TreatAsElastic));
            }

            // tab is used in a place where it is not an indentation
            if (result.LineBreaks == 0 && result.Tab > 0)
            {
                // calculate actual space size from tab
                var spaces = CalculateSpaces(token1, token2);
                return(new ModifiedWhitespace(this.OptionSet, result.LineBreaks, indentation: spaces, elastic: result.TreatAsElastic, language: LanguageNames.CSharp));
            }

            // check whether we can cache trivia info for current indentation
            var lineCountAndIndentation = GetLineBreaksAndIndentation(result);

            var canUseTriviaAsItIs = lineCountAndIndentation.Item1;

            return(GetWhitespaceTriviaData(lineCountAndIndentation.Item2, lineCountAndIndentation.Item3, canUseTriviaAsItIs, result.TreatAsElastic));
        }