示例#1
0
        private String GetLineContent(IVsTextLines lines, int lineNumber)
        {
            String str        = "";
            var    data       = new LINEDATA[1];
            var    markerData = new MARKERDATA[1];

            if (VSConstants.S_OK == lines.GetLineData(lineNumber, data, markerData))
            {
                str = Marshal.PtrToStringUni(data[0].pszText, data[0].iLength);

                // Clean up memory...needed?
                lines.ReleaseLineData(data);
                lines.ReleaseMarkerData(markerData);
            }
            return(str);
        }
        /// <summary>
        /// Enumerate over the lines [startIndex, endIndex) for the IVsTextLines buffer.
        /// </summary>
        /// <param name="buffer"> The buffer to enumerate. </param>
        /// <param name="startIndex"> The starting index, inclusive. </param>
        /// <param name="endIndex"> The end index, exclusive. </param>
        /// <returns>
        /// Returns an enumrator that will enumerate over the lines [startIndex, endIndex) of the buffer.
        /// </returns>
        private static IEnumerable <Tuple <int, string> > GetTextLinesEnumeratorInternal(IVsTextLines buffer, int startIndex, int endIndex)
        {
            LINEDATA[] lineData = new LINEDATA[1];
            for (int i = startIndex; i < endIndex; ++i)
            {
                int hr = buffer.GetLineData(i, lineData, null);

                // Skip the line if there is an error.
                if (ErrorHandler.Failed(hr))
                {
                    continue;
                }

                string line;
                try
                {
                    // We set an arbitrary limit on the line length that we're willing to handle. This is to avoid
                    // loading an unreasonably long string into memory. The buffer is compressed under the covers, so it
                    // can handle much longer strings.
                    // If we choose to handle the case where the string is longer, we would complicate the code significantly.
                    // Since this is an unlikely scenario to have the script tag on a line this long, we will optimize
                    // for the standard case and error;
                    if (lineData[0].iLength >= MaxLineLengthToConsider)
                    {
                        continue;
                    }

                    line = Marshal.PtrToStringUni(lineData[0].pszText);
                }
                finally
                {
                    buffer.ReleaseLineData(lineData);
                }

                yield return(new Tuple <int, string>(i, line));
            }
        }
示例#3
0
 public int ReleaseLineData(LINEDATA[] pLineData)
 {
     return(_textBuffer.ReleaseLineData(pLineData));
 }
示例#4
0
        private String GetLineContent(IVsTextLines lines, int lineNumber)
        {
            String str = "";
            var data = new LINEDATA[1];
            var markerData = new MARKERDATA[1];
            if (VSConstants.S_OK == lines.GetLineData(lineNumber, data, markerData))
            {
                str = Marshal.PtrToStringUni(data[0].pszText, data[0].iLength);

                // Clean up memory...needed?
                lines.ReleaseLineData(data);
                lines.ReleaseMarkerData(markerData);
            }
            return str;
        }