/** * Determines if a block contains the given point, and is fo returns the * CommentBlock and MatchedBlockData for the match. */ public static bool GetBlockContainingPoint( ParameterSet pset, string fileName, EnvDTE.TextPoint pt, out CommentBlock retblock, out MatchedBlockData bdata) { retblock = null; bdata = new MatchedBlockData(); bdata.mEndLine = 0; bdata.mStartLine = 0; bdata.mIndentation = 0; EnvDTE.EditPoint ep = pt.CreateEditPoint(); EnvDTE.EditPoint enddoc = pt.CreateEditPoint(); enddoc.EndOfDocument(); string line = GetUntabbedLine(enddoc,ep.Line); foreach (CommentBlock block in pset.getBlocksForFileName(fileName)) { if (block.lineHasBlockPattern(line,out bdata.mIndentation)) { int currentLineNumber = ep.Line; // scan up for block start bool foundStart = false; for ( ;currentLineNumber >= 1; currentLineNumber--) { string currentLine = GetUntabbedLine(enddoc, currentLineNumber); string previousLine = GetUntabbedLine(enddoc, currentLineNumber-1); string nextLine = GetUntabbedLine(enddoc, currentLineNumber+1); if (block.lineIsStartOfBlock(currentLine, previousLine, bdata.mIndentation, out bdata.mMatchedBlockStart, out bdata.mSpacesTrimmedOffBlockStart)) { bdata.mStartLine = currentLineNumber; foundStart = true; break; } else if (!block.lineIsBlockContinuation(currentLine,bdata.mIndentation) && !block.lineIsEndOfBlock(currentLine,nextLine,bdata.mIndentation,out bdata.mMatchedBlockEnd)) { break; } } if (foundStart) { bool foundEnd = false; for ( ; currentLineNumber <= enddoc.Line ; currentLineNumber++) { string currentLine = GetUntabbedLine(enddoc, currentLineNumber); string nextLine = GetUntabbedLine(enddoc, currentLineNumber+1); if (block.lineIsEndOfBlock(currentLine, nextLine,bdata.mIndentation,out bdata.mMatchedBlockEnd)) { bdata.mEndLine = currentLineNumber; foundEnd = true; break; } else if ((currentLineNumber != bdata.mStartLine) && (!block.lineIsBlockContinuation(currentLine,bdata.mIndentation))) { break; } } if (foundEnd) { retblock = block; return true; } // else try next block } // else try next block } } return false; }
/** * Determines if a block contains the given point, and is fo returns the * CommentBlock and MatchedBlockData for the match. */ static public bool GetBlockContainingPoint( ParameterSet pset, string fileName, EnvDTE.TextPoint pt, out CommentBlock retblock, out MatchedBlockData bdata) { retblock = null; bdata = new MatchedBlockData(); bdata.mEndLine = 0; bdata.mStartLine = 0; bdata.mIndentation = 0; EnvDTE.EditPoint ep = pt.CreateEditPoint(); EnvDTE.EditPoint enddoc = pt.CreateEditPoint(); enddoc.EndOfDocument(); string line = GetUntabbedLine(enddoc, ep.Line); foreach (CommentBlock block in pset.getBlocksForFileName(fileName)) { if (block.lineHasBlockPattern(line, out bdata.mIndentation)) { int currentLineNumber = ep.Line; // scan up for block start bool foundStart = false; for ( ; currentLineNumber >= 1; currentLineNumber--) { string currentLine = GetUntabbedLine(enddoc, currentLineNumber); string previousLine = GetUntabbedLine(enddoc, currentLineNumber - 1); string nextLine = GetUntabbedLine(enddoc, currentLineNumber + 1); if (block.lineIsStartOfBlock(currentLine, previousLine, bdata.mIndentation, out bdata.mMatchedBlockStart, out bdata.mSpacesTrimmedOffBlockStart)) { bdata.mStartLine = currentLineNumber; foundStart = true; break; } else if (!block.lineIsBlockContinuation(currentLine, bdata.mIndentation) && !block.lineIsEndOfBlock(currentLine, nextLine, bdata.mIndentation, out bdata.mMatchedBlockEnd)) { break; } } if (foundStart) { bool foundEnd = false; for ( ; currentLineNumber <= enddoc.Line; currentLineNumber++) { string currentLine = GetUntabbedLine(enddoc, currentLineNumber); string nextLine = GetUntabbedLine(enddoc, currentLineNumber + 1); if (block.lineIsEndOfBlock(currentLine, nextLine, bdata.mIndentation, out bdata.mMatchedBlockEnd)) { bdata.mEndLine = currentLineNumber; foundEnd = true; break; } else if ((currentLineNumber != bdata.mStartLine) && (!block.lineIsBlockContinuation(currentLine, bdata.mIndentation))) { break; } } if (foundEnd) { retblock = block; return(true); } // else try next block } // else try next block } } return(false); }