/// <summary>
        /// Append text.
        /// </summary>
        public void Append(TextSpan textSpan, TextWriter writer)
        {
            // Skip empty spans
            if (textSpan.IsEmpty) {
                return;
            }

            var index = textSpan.BeginIndex;
            while (index < textSpan.EndIndex) {
                if (currentLineEmpty) {
                    writer.Write(indentation);
                    Column += indentation.Length;
                    currentLineEmpty = false;
                }

                var lineBreakIndex = textSpan.OriginalText.IndexOf(index, textSpan.EndIndex, ch => ch == '\n');
                if (lineBreakIndex == -1) { // No line break found
                    writer.Write(index, textSpan.EndIndex, textSpan.OriginalText);
                    index += (textSpan.EndIndex - index);
                }
                else {  // Line break found
                    ++lineBreakIndex;
                    writer.Write(index, lineBreakIndex, textSpan.OriginalText);
                    index += (lineBreakIndex - index);

                    ++Line;
                    currentLineEmpty = true;
                    Column = 1;
                }
            }
        }
        public List<AsbtractCodeFragment> Parse(FileLine line, IMessageHandler messageHandler)
        {
            List<AsbtractCodeFragment> fragments = new List<AsbtractCodeFragment>();

            while (true) {
                var index = (line.BeginIndexNonSpace + 1); // Skip #

                // Find 'pragma'
                string preproDirective;
                index = this.MatchNextToken(line.Text, index, line.EndIndex, out preproDirective);
                if (index == -1) {
                    break;
                }
                if (string.Compare(preproDirective, "pragma") != 0) {
                    break;
                }

                // Find 'include'
                string pragmaName;
                index = this.MatchNextToken(line.Text, index, line.EndIndex, out pragmaName);
                if (index == -1) {
                    break;
                }
                if (string.Compare(pragmaName, "include") != 0) {
                    break;
                }

                // Find '"<Filename>"'
                var pragmaArgIndex = line.Text.IndexOf(index, line.EndIndex, ch => ch == '"');
                if (pragmaArgIndex == -1) {
                    break;
                }
                index = (pragmaArgIndex + 1);

                var pragmaArgEndIndex = BraceCounter.FindQuoteEnd(index, line.EndIndex, line.Text);
                if (pragmaArgEndIndex == -1) {
                    break;
                }
                index = (pragmaArgEndIndex + 1);

                string pragmaArgument = line.Text.Substring(pragmaArgIndex + 1, (pragmaArgEndIndex - pragmaArgIndex - 1));
                var textSpan = new TextSpan(line.BeginIndex, line.EndIndex, line.Text);
                fragments.Add(new OriginPragma(pragmaName, pragmaArgument, line, textSpan));

                break;
            }

            fragments.Add(new OriginScript(line, new TextSpan(line.BeginIndex, line.EndIndex, line.Text)));
            return fragments;
        }