using System;
using Crow;
using Crow.Text;
-using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using Drawing2D;
-using System.Security;
using System.Threading;
using System.Threading.Tasks;
//Console.WriteLine ($"CurrentToken: idx({currentTokenIndex}) {currentToken} {RootNode.Root.GetTokenStringByIndex(currentTokenIndex)}");
}
#endregion
-
+ protected abstract SyntaxAnalyser CreateSyntaxAnalyser ();
public virtual Color GetColorForToken (Token token)
{
TokenType tokType = token.Type;
public virtual string GetTokenTypeString (TokenType tokenType) => tokenType.ToString();
//protected abstract Tokenizer CreateTokenizer ();
public abstract IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode currentNode, CharLocation loc);
- protected virtual async void parse () {
+ protected virtual void parse () {
+ cancelSource = new CancellationTokenSource();
+ parseAssync(cancelSource.Token);
+ }
+ protected virtual async void parseAsync () {
if (backgroundCompilationTask != null && !backgroundCompilationTask.IsCompleted) {
cancelSource.Cancel();
await backgroundCompilationTask;
//CrowEditBase.App.Log (LogType.Low, $"Syntax Analysis done in {sw.ElapsedMilliseconds}(ms) {sw.ElapsedTicks}(ticks)");
}
- protected abstract SyntaxAnalyser CreateSyntaxAnalyser ();
async void parseAssync(CancellationToken cancel) {
SyntaxAnalyser syntaxAnalyser = CreateSyntaxAnalyser ();
NotifyValueChanged("Exceptions", Exceptions);
NotifyValueChanged ("SyntaxRootChildNodes", (object)null);
NotifyValueChanged ("SyntaxRootChildNodes", SyntaxRootChildNodes);
+ Console.WriteLine("parse async finished");
}
-
-
}
}
\ No newline at end of file
WhiteSpace = 0x4100,
Tabulation = 0x4101,
LineBreak = 0x4102,
+ LineCommentStart = 0x0102,
LineComment = 0x0103,
BlockCommentStart = 0x0104,
BlockComment = 0x0105,
-// Copyright (c) 2013-2021 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
+// Copyright (c) 2013-2025 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
using System;
namespace CrowEditBase
{
- public class TokenizerException : Exception {
- public readonly int Position;
- public TokenizerException (int position, string message) : base (message) {
- Position = position;
- }
- }
public abstract class Tokenizer {
protected List<Token> Toks;
protected int startOfTok;
}
}
}
-
}
}
--- /dev/null
+// Copyright (c) 2013-2025 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
+//
+// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
+using System;
+
+namespace CrowEditBase
+{
+ public class TokenizerException : Exception {
+ public readonly int Position;
+ public TokenizerException (int position, string message) : base (message) {
+ Position = position;
+ }
+ }
+}
public ObservableList<LogItem> Logs = new ObservableList<LogItem>();
public ObservableList<LogItem> OpenedLogs = new ObservableList<LogItem>();
internal LogItem MainLog;
- [Obsolete]public void Log(LogType type, string message) {
+ public void Log(LogType type, string message) {
MainLog.Add (type, message);
}
- [Obsolete]public void ResetLog () {
+ public void ResetLog () {
MainLog.ResetLog();
}
public LogItem GetLog(string name) {
-// Copyright (c) 2013-2021 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
+// Copyright (c) 2013-2025 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
namespace CrowEditBase
{
- public interface IDocumentClient {
-
- }
public class Editor : ScrollingObject, IEditableTextWidget {
#region CTOR
protected Editor () : base () {
//Console.WriteLine("updatefilteredlines");
lock (logger.LogMutext)
filteredLines = logger.log.Where (l=>((int)l.Type & (int)filter) > 0).ToArray();
- MaxScrollY = filteredLines == null ? 0 : filteredLines.Count() - visibleLines;
- NotifyValueChanged ("ChildHeightRatio", Math.Min (1.0, (double)visibleLines / filteredLines.Count()));
+ int count = filteredLines == null ? 0 : filteredLines.Count();
+ MaxScrollY = count - visibleLines;
+ NotifyValueChanged ("ChildHeightRatio", Math.Min (1.0, (double)visibleLines / count));
}
if (scrollOnOutput)
ScrollY = MaxScrollY;
else {
int count = 0;
lock (filteredLinesMutex)
- count = filteredLines.Count();
- MaxScrollY = filteredLines == null ? 0 : count - visibleLines;
+ count = filteredLines == null ? 0 : filteredLines.Count();
+ MaxScrollY = count - visibleLines;
NotifyValueChanged ("ChildHeightRatio", Math.Min (1.0, (double)visibleLines / count));
}
}
if (isOpened) {
App.OpenLog(this);
} else
- App.CloseLog(this);
+ App.CloseLog(this);
}
IsSelected = value;
}
--- /dev/null
+// Copyright (c) 2021-2025 Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
+
+using System;
+using Crow.Text;
+
+namespace CrowEditBase
+{
+ public class ReadOnlyTextBuffer {
+ public readonly ReadOnlyMemory<char> Source;
+ public readonly LineCollection Lines;
+ public ReadOnlyTextBuffer(ReadOnlyMemory<char> source, LineCollection lines) {
+ Source = source;
+ Lines = lines;
+ }
+ }
+}
\ No newline at end of file
-// Copyright (c) 2013-2021 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
+// Copyright (c) 2013-2025 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
using static CrowEditBase.CrowEditBase;
using System.Collections.Generic;
using System.Linq;
-using System.Text.Unicode;
using System.Text;
-using System.Threading.Tasks;
namespace CrowEditBase
{
namespace CrowEditBase
{
- public class ReadOnlyTextBuffer {
- public readonly ReadOnlyMemory<char> Source;
- public readonly LineCollection Lines;
- public ReadOnlyTextBuffer(ReadOnlyMemory<char> source, LineCollection lines) {
- Source = source;
- Lines = lines;
- }
- }
public class TextDocument : Document {
#region CTOR
public TextDocument (string fullPath, string editorPath = "default")
}
}
}
+ //TODO get styling from nuget package refs
/*foreach (String item in crowAssemblies)
{
yield return Assembly.LoadFile();
if (!HasStyling)
return;
FileLocation fl = host.StyleLocation[Name];
+ Debug.WriteLine($"goto style: {fl.FilePath}");
CrowService srv = App.GetService<CrowService> ();
if (srv?.CurrentSolution == null)
-// Copyright (c) 2013-2019 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
+// Copyright (c) 2013-2025 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
-using System;
-using System.IO;
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-using System.Runtime.Loader;
using CrowEditBase;
-using System.Runtime.InteropServices;
-using System.Runtime.CompilerServices;
using static CrowEditBase.CrowEditBase;
using Crow;
</ItemGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.7.*" >
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.3.*" >
<IncludeAssets>all</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
<ExcludeAssets>runtime</ExcludeAssets>
<Visible>False</Visible>
</PackageReference>
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.*" >
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.*" >
<IncludeAssets>all</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
<ExcludeAssets>runtime</ExcludeAssets>
<Visible>False</Visible>
</PackageReference>
- <!--<PackageReference Include="Microsoft.VisualStudio.TestPlatform.ObjectModel" />-->
</ItemGroup>
SyntaxKind syntaxKind = (SyntaxKind)token.Type;
TokenType tokType = token.Type;
CSTokenType xmlTokType = (CSTokenType)tokType;
+
+ if (SyntaxFacts.IsPredefinedType(syntaxKind))
+ return Colors.Fuchsia;
+ if (SyntaxFacts.IsLiteralExpression(syntaxKind))
+ return Colors.DarkGoldenRod;
+ if (SyntaxFacts.IsPreprocessorKeyword(syntaxKind))
+ return Colors.Indigo;
+ if (SyntaxFacts.IsKeywordKind(syntaxKind))
+ return Colors.DodgerBlue;
+ if (SyntaxFacts.IsPunctuation(syntaxKind))
+ return Colors.Black;
+
if (syntaxKind == SyntaxKind.IdentifierToken)
return Colors.Blue;
}
IsLoaded = false;
}
+ public override void Close()
+ {
+ //TODO: close all opened project's files
+ //App.OpenedDocuments.Where(doc=>doc)
+ base.Close();
+ }
public void Build () => Build ("Build");
public void Build (params string[] targets)
/*var test = lastBuildResult.ProjectStateAfterBuild.GetItems ("Reference");*/
//Console.WriteLine (IsCrowProject);
- foreach (var type in lastBuildResult.ProjectStateAfterBuild.ItemTypes)
+ /*foreach (var type in lastBuildResult.ProjectStateAfterBuild.ItemTypes)
{
Console.WriteLine ($"{type}");
foreach (var item in lastBuildResult.ProjectStateAfterBuild.GetItems(type))
{
Console.WriteLine ($"\t{item}");
}
- }
+ }*/
//}
get {
string rootPath = Path.GetDirectoryName(FullPath);
var allProjects = solutionProject.FlattenProjetcs.OfType<MSBuildProject>();
- var refProjs = Flatten.OfType<CERoslynPlugin.MSBuildProjectItemNode>().
+ var refProjs = Flatten.OfType<MSBuildProjectItemNode>().
Where (r=>r.NodeType == NodeType.ProjectReference);
foreach (var r in refProjs) {
var refP = allProjects.FirstOrDefault(p=>Path.GetRelativePath(rootPath, p.FullPath) == r.EvaluatedInclude.Replace("\\","/"));
// Copyright (c) 2021-2025 Bruyère Jean-Philippe <jp_bruyere@hotmail.com>
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
+using System;
+using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using CrowEditBase;
public class CSSyntaxAnalyser : SyntaxAnalyser {
public CSSyntaxAnalyser (ReadOnlyTextBuffer document) : base (document) { }
+ Stopwatch timer = new Stopwatch();
+
public override async Task<SyntaxRootNode> Process (CancellationToken cancel = default) {
+ timer.Restart();
CSharpSyntaxTree tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText (source.Source.Span.ToString(), CSharpParseOptions.Default, "", null);
+ timer.Stop();
+ Console.WriteLine($"CSharpSyntaxTree.ParseText : {timer.ElapsedMilliseconds,-20}");
+ timer.Start();
CsharpSyntaxWalkerBridge bridge = new CsharpSyntaxWalkerBridge(new CSRootSyntax (source), cancel);
CSharpSyntaxNode csroot = await tree.GetRootAsync(cancel);
+ timer.Stop();
+ Console.WriteLine($"tree.GetRootAsync : {timer.ElapsedMilliseconds,-20}");
+ timer.Start();
+
if (cancel.IsCancellationRequested)
return null;
bridge.Visit(csroot);
+
+ timer.Stop();
+ Console.WriteLine($"CsharpSyntaxWalkerBridge.Visit : {timer.ElapsedMilliseconds,-20}");
+
bridge.Root.SetTokens (bridge.Toks.ToArray());
Root = bridge.Root;
+
+ /*foreach (var item in Enum.GetNames<SyntaxKind>())
+ {
+ ushort sk = (ushort)Enum.Parse<SyntaxKind>(item);
+ Console.WriteLine($"{item,-50} {sk,-6:X4} {sk,-16:b16}");
+ }*/
+
+
+ Console.WriteLine($"CsharpSyntaxWalkerBridge.Visit : {timer.ElapsedMilliseconds,-20}");
return Root;
}
}
using CrowEditBase;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace CERoslynPlugin
{
{
if (cancel.IsCancellationRequested)
return;
- currentNode = currentNode.AddChild(new CSSyntaxNode(node)) as MultiNodeSyntax;
+
+ if (node.IsKind(SyntaxKind.UsingDirective))
+ currentNode = currentNode.AddChild(new CSUsingDirectiveSyntax(node)) as MultiNodeSyntax;
+ else
+ currentNode = currentNode.AddChild(new CSSyntaxNode(node)) as MultiNodeSyntax;
base.Visit (node);
currentNode = currentNode.Parent;
}
+ /*public override void VisitUsingDirective(UsingDirectiveSyntax node)
+ {
+ currentNode = currentNode.AddChild(new CSUsingDirectiveSyntax(node)) as MultiNodeSyntax;
+ base.VisitUsingDirective(node);
+ currentNode = currentNode.Parent;
+ }*/
public override void VisitToken (SyntaxToken token)
{
if (cancel.IsCancellationRequested)
VisitTrailingTrivia (token);
}
+ TriviaPos triviaPos = TriviaPos.none;
+ public override void VisitLeadingTrivia(SyntaxToken token)
+ {
+ triviaPos = TriviaPos.leading;
+ base.VisitLeadingTrivia(token);
+ triviaPos = TriviaPos.none;
+ }
+ public override void VisitTrailingTrivia(SyntaxToken token)
+ {
+ triviaPos = TriviaPos.trailing;
+ base.VisitTrailingTrivia(token);
+ triviaPos = TriviaPos.none;
+ }
+
public override void VisitTrivia (SyntaxTrivia trivia)
{
+
if (cancel.IsCancellationRequested)
return;
+
+ //currentNode = currentNode.AddChild(new CSTriviaSyntax(trivia, triviaPos)) as MultiNodeSyntax;
SyntaxKind kind = trivia.Kind ();
Microsoft.CodeAnalysis.Text.TextSpan span = trivia.Span;
- if (kind == SyntaxKind.EndOfLineTrivia) {
+ if (kind == SyntaxKind.EndOfLineTrivia)
Toks.Add (new Token(span.Start, span.Length, TokenType.LineBreak));
- return;
- }
- if (trivia.HasStructure)
+ else if (trivia.HasStructure)
this.Visit ((CSharpSyntaxNode)trivia.GetStructure());
- else if (trivia.IsKind (SyntaxKind.DisabledTextTrivia) || trivia.IsKind (SyntaxKind.MultiLineCommentTrivia))
+ else if (trivia.IsKind (SyntaxKind.MultiLineCommentTrivia)) {
+ currentNode = currentNode.AddChild(new CSTriviaSyntax(trivia, triviaPos)) as MultiNodeSyntax;
+ addMultilineToken(trivia.ToString(), trivia.Span, TokenType.BlockComment);
+ currentNode = currentNode.Parent;
+ } else if (trivia.IsKind (SyntaxKind.DisabledTextTrivia)) {
+ currentNode = currentNode.AddChild(new CSTriviaSyntax(trivia, triviaPos)) as MultiNodeSyntax;
addMultilineToken(trivia.ToString(), trivia.Span, (TokenType)trivia.RawKind);
- else {
- Toks.Add (new Token(span.Start, span.Length, (TokenType)trivia.RawKind));
+ currentNode = currentNode.Parent;
}
+ else
+ Toks.Add (new Token(span.Start, span.Length, (TokenType)trivia.RawKind));
+
+ //currentNode = currentNode.Parent;
}
+ /*public override void VisitDeclarationExpression(DeclarationExpressionSyntax node)
+ {
+ Console.WriteLine($"DeclarationExpression:{node}");
+ base.VisitDeclarationExpression(node);
+ }
+ public override void VisitDeclarationPattern(DeclarationPatternSyntax node)
+ {
+ Console.WriteLine($"DeclarationPattern: {node}");
+ base.VisitDeclarationPattern(node);
+ }*/
- void addTok (ref SpanCharReader reader, int offset, Enum tokType) {
+ void addTok (ref SpanCharReader reader, int offset, Enum tokType, bool createNode = true) {
if (reader.CurrentPosition == startOfTok)
return;
- Token tok = new Token((TokenType)tokType,startOfTok + offset, reader.CurrentPosition + offset);
+ Token tok = new Token((TokenType)tokType, startOfTok + offset, reader.CurrentPosition + offset);
Toks.Add (tok);
- currentNode.AddChild(new CSToken(default, tok));
+
+ if (createNode)
+ currentNode.AddChild(new CSToken(default, tok));
startOfTok = reader.CurrentPosition;
}
case '\x85':
case '\x2028':
case '\xA':
- addTok (ref reader, span.Start, mainType);
+ addTok (ref reader, span.Start, mainType, true);
reader.Read();
- addTok (ref reader, span.Start, TokenType.LineBreak);
+ addTok (ref reader, span.Start, TokenType.LineBreak, false);
break;
case '\xD':
- addTok (ref reader, span.Start, mainType);
+ addTok (ref reader, span.Start, mainType, true);
reader.Read();
if (reader.IsNextCharIn ('\xA', '\x85'))
reader.Read();
- addTok (ref reader, span.Start, TokenType.LineBreak);
+ addTok (ref reader, span.Start, TokenType.LineBreak, false);
break;
- case '\x20':
+ /*case '\x20':
case '\x9':
- addTok (ref reader, span.Start, mainType);
+ addTok (ref reader, span.Start, mainType, false);
char c = reader.Read();
while (reader.TryPeek (c))
reader.Read();
- addTok (ref reader, span.Start, c == '\x20' ? TokenType.WhiteSpace : TokenType.Tabulation);
- break;
+ addTok (ref reader, span.Start, c == '\x20' ? TokenType.WhiteSpace : TokenType.Tabulation, false);
+ break;*/
default:
reader.Read();
break;
}
}
- addTok (ref reader, span.Start, mainType);
- }
+ addTok (ref reader, span.Start, mainType, true);
+ }
}
}
\ No newline at end of file
using CrowEditBase;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace CERoslynPlugin
{
+ public enum TriviaPos { none, leading, trailing };
public class CSRootSyntax : SyntaxRootNode {
public CSRootSyntax (ReadOnlyTextBuffer source) : base (source, null) { }
internal void SetTokens(Token[] tokens) {
}
public override string ToString() => $"TOK: {cstoken.Kind()}";
}
+ public class CSTriviaSyntax : MultiNodeSyntax {
+ public TriviaPos TriviaPos;
+ public SyntaxTrivia Trivia;
+ public CSTriviaSyntax(SyntaxTrivia trivia, TriviaPos triviaPos) {
+ Trivia = trivia;
+ TriviaPos = triviaPos;
+ }
+ public override string ToString() => $"TriviaSyntax({TriviaPos}): {Trivia}";
+ }
public class CSTrivia : SingleTokenSyntax {
SyntaxTrivia cstrivia;
public CSTrivia(SyntaxTrivia token, Token tok) : base (tok) {
public override string ToString() => $"Trivia: {cstrivia.Kind()}";
}
public class CSSyntaxNode : MultiNodeSyntax {
- Microsoft.CodeAnalysis.SyntaxNode node;
+ protected Microsoft.CodeAnalysis.SyntaxNode node;
public CSSyntaxNode(Microsoft.CodeAnalysis.SyntaxNode node) {
this.node = node;
}
public override string ToString() => $"{node.Kind()}";
-
}
+ public class CSUsingDirectiveSyntax : CSSyntaxNode {
+ public CSUsingDirectiveSyntax(Microsoft.CodeAnalysis.SyntaxNode node) : base(node) { }
+ /*public override int FoldedLineCount => base.FoldedLineCount;
+ public override bool IsFoldable => (PreviousSibling == null || !PreviousSibling.GetType().IsAssignableFrom(typeof(UsingDirectiveSyntax)))
+ && NextSibling != null && NextSibling.GetType().IsAssignableFrom(typeof(UsingDirectiveSyntax));*/
+ }
}
\ No newline at end of file
fileNode = null;
return false;
}
-
public override string Name => Path.GetFileNameWithoutExtension (FullPath);
public override string Icon => "#icons.file_type_sln2.svg";
public class XMLSingleTokenSyntax : SingleTokenSyntax {
public XMLSingleTokenSyntax(Token tok) : base(tok) { }
public static implicit operator XmlTokenType (XMLSingleTokenSyntax sts) => sts == null ? XmlTokenType.Unknown : (XmlTokenType)sts.Type;
+ public override string ToString() => token.GetTokenType().ToString();
}
public abstract class ElementTagSyntax : MultiNodeSyntax {
// public override bool IsComplete => base.IsComplete & name.HasValue & close.HasValue;
protected ElementTagSyntax (Token openTok) {
AddChild(new XMLSingleTokenSyntax(openTok));
}
- public override bool IsComplete => ChildSequenceIs();
+ public override bool IsComplete => HasOpeningToken && HasName && HasClosingToken;
+ public bool HasName => HasChilds && Children.ElementAtOrDefault(1).IsSimilar(XmlTokenType.ElementName);
public string Name => Children.ElementAtOrDefault(1) is SingleTokenSyntax sts &&
sts.token.GetTokenType() == XmlTokenType.ElementName ? sts.AsText(): "";
- public abstract bool HasClosingToken { get; }
+ public virtual bool HasOpeningToken => Children.FirstOrDefault() is SingleTokenSyntax sts && sts.token.GetTokenType() == XmlTokenType.ElementOpen;
+ public virtual bool HasClosingToken => Children.LastOrDefault() is SingleTokenSyntax sts && sts.token.GetTokenType() == XmlTokenType.ClosingSign;
}
public class ElementStartTagSyntax : ElementTagSyntax {
public ElementStartTagSyntax (Token openTok) : base(openTok) {}
- public override bool HasClosingToken => Children.LastOrDefault() is SingleTokenSyntax sts && sts.token.GetTokenType() == XmlTokenType.ClosingSign;
}
public class ElementEndTagSyntax : ElementTagSyntax {
public ElementEndTagSyntax (Token openTok) : base(openTok) {}
- public override bool HasClosingToken => Children.LastOrDefault() is SingleTokenSyntax sts && sts.token.GetTokenType() == XmlTokenType.ClosingSign;
+ public override bool HasOpeningToken => Children.FirstOrDefault() is SingleTokenSyntax sts && sts.token.GetTokenType() == XmlTokenType.EndElementOpen;
}
public class EmptyElementSyntax : ElementTagSyntax {
public EmptyElementSyntax (ElementStartTagSyntax startNode) {
switch (reader.Peek) {
case '<':
reader.Advance ();
- if (reader.TryPeek ('?')) {
- reader.Advance ();
+ if (reader.TryRead ('?')) {
addTok (ref reader, XmlTokenType.PI_Start);
readName (ref reader);
addTok (ref reader, XmlTokenType.PI_Target);
curState = States.ProcessingInstrucitons;
- } else if (reader.TryPeek ('!')) {
- reader.Advance ();
+ } else if (reader.TryRead ('!')) {
if (reader.TryPeek ("--")) {
reader.Advance (2);
addTok (ref reader, XmlTokenType.BlockCommentStart);
addTok (ref reader, XmlTokenType.UnexpectedChar);
levelup = true;
}
- if (reader.TryPeek('/')) {
- reader.Advance ();
+ if (reader.TryRead('/')) {
addTok (ref reader, XmlTokenType.EndElementOpen);
if (readName (ref reader)) {
addTok (ref reader, XmlTokenType.ElementName);
break;
case '?':
reader.Advance ();
- if (reader.TryPeek ('>')){
- reader.Advance ();
+ if (reader.TryRead ('>')){
addTok (ref reader, XmlTokenType.PI_End);
}else
addTok (ref reader, XmlTokenType.Unknown);
break;
case '/':
reader.Advance();
- if (reader.TryPeek ('>')) {
- reader.Advance();
+ if (reader.TryRead ('>')) {
addTok (ref reader, XmlTokenType.EmptyElementClosing);
if (--curObjectLevel > 0)
curState = States.Content;