Example #1
0
        private Positions StmtReplacementPositions(int tokPos, int tokLen, bool hasReplace)
        {
            var lineAtEndOfTag     = Snapshot.GetLineFromPosition(tokPos + tokLen);
            var lineAtEndOfTagLen  = lineAtEndOfTag.End.Position - lineAtEndOfTag.Start.Position;
            var lineAtEndOfTagText = lineAtEndOfTag.GetText();
            var currentPos         = tokPos + tokLen - lineAtEndOfTag.Start.Position;
            var trailingSemiBrace  = false;

            for (; currentPos < lineAtEndOfTagLen; currentPos++)
            {
                var trailingSymbol = lineAtEndOfTagText[currentPos];
                if (" \t".Contains(trailingSymbol))
                {
                    continue;
                }
                trailingSemiBrace = trailingSymbol == ';' || trailingSymbol == '}';
                break;
            }
            var actualLength = trailingSemiBrace ? tokLen + 1 : tokLen;

            if (hasReplace)
            {
                return(new Positions(tokPos, actualLength));
            }

            var line              = Snapshot.GetLineFromPosition(tokPos);
            var lineText          = line.Extent.GetText();
            var trimmedLineLength = lineText.Trim().Length;
            var replacementSpan   = new SnapshotSpan(Snapshot, tokPos, actualLength).GetText();
            var linebreak         = line.GetLineBreakText()[line.LineBreakLength - 1];
            var taggedLines       = replacementSpan.Split(linebreak);

            if (taggedLines.Length > 1 || trimmedLineLength > taggedLines[0].Length + 1)
            {
                return(new Positions(tokPos, actualLength));
            }

            var startOfLine = line.Start.Position;
            var offsetToStartOfTextInLine = lineText.Length - lineText.TrimStart().Length;
            var wholeLength = actualLength + offsetToStartOfTextInLine + line.LineBreakLength;

            return(new Positions(startOfLine, wholeLength));
        }