From: Jean-Philippe Bruyère Date: Sun, 13 Jul 2025 20:43:09 +0000 (+0200) Subject: wip X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=f9689ffcc57978eba2db3599d8d84bcf05b34db1;p=jp%2Fcrowedit.git wip --- diff --git a/CrowEditBase/src/Compiler/SourceDocument.cs b/CrowEditBase/src/Compiler/SourceDocument.cs index e9245eb..8518ca8 100644 --- a/CrowEditBase/src/Compiler/SourceDocument.cs +++ b/CrowEditBase/src/Compiler/SourceDocument.cs @@ -5,11 +5,9 @@ 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; @@ -129,7 +127,7 @@ namespace CrowEditBase //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; @@ -146,7 +144,11 @@ namespace CrowEditBase 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; @@ -161,7 +163,6 @@ namespace CrowEditBase //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 (); @@ -172,8 +173,7 @@ namespace CrowEditBase NotifyValueChanged("Exceptions", Exceptions); NotifyValueChanged ("SyntaxRootChildNodes", (object)null); NotifyValueChanged ("SyntaxRootChildNodes", SyntaxRootChildNodes); + Console.WriteLine("parse async finished"); } - - } } \ No newline at end of file diff --git a/CrowEditBase/src/Compiler/TokenType.cs b/CrowEditBase/src/Compiler/TokenType.cs index 1d25015..709a999 100644 --- a/CrowEditBase/src/Compiler/TokenType.cs +++ b/CrowEditBase/src/Compiler/TokenType.cs @@ -13,6 +13,7 @@ namespace CrowEditBase WhiteSpace = 0x4100, Tabulation = 0x4101, LineBreak = 0x4102, + LineCommentStart = 0x0102, LineComment = 0x0103, BlockCommentStart = 0x0104, BlockComment = 0x0105, diff --git a/CrowEditBase/src/Compiler/Tokenizer.cs b/CrowEditBase/src/Compiler/Tokenizer.cs index b9788a8..75122e4 100644 --- a/CrowEditBase/src/Compiler/Tokenizer.cs +++ b/CrowEditBase/src/Compiler/Tokenizer.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2021 Bruyère Jean-Philippe +// Copyright (c) 2013-2025 Bruyère Jean-Philippe // // This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) using System; @@ -7,12 +7,6 @@ using Crow.Text; 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 Toks; protected int startOfTok; @@ -70,6 +64,5 @@ namespace CrowEditBase } } } - } } diff --git a/CrowEditBase/src/Compiler/TokenizerException.cs b/CrowEditBase/src/Compiler/TokenizerException.cs new file mode 100644 index 0000000..768d031 --- /dev/null +++ b/CrowEditBase/src/Compiler/TokenizerException.cs @@ -0,0 +1,14 @@ +// Copyright (c) 2013-2025 Bruyère Jean-Philippe +// +// 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; + } + } +} diff --git a/CrowEditBase/src/CrowEditBase.cs b/CrowEditBase/src/CrowEditBase.cs index 4936f62..9be1cc7 100644 --- a/CrowEditBase/src/CrowEditBase.cs +++ b/CrowEditBase/src/CrowEditBase.cs @@ -72,10 +72,10 @@ namespace CrowEditBase public ObservableList Logs = new ObservableList(); public ObservableList OpenedLogs = new ObservableList(); 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) { diff --git a/CrowEditBase/src/Editor.cs b/CrowEditBase/src/Editor.cs index 596e44c..50128da 100644 --- a/CrowEditBase/src/Editor.cs +++ b/CrowEditBase/src/Editor.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2021 Bruyère Jean-Philippe +// Copyright (c) 2013-2025 Bruyère Jean-Philippe // // This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) @@ -15,9 +15,6 @@ using Crow; namespace CrowEditBase { - public interface IDocumentClient { - - } public class Editor : ScrollingObject, IEditableTextWidget { #region CTOR protected Editor () : base () { diff --git a/CrowEditBase/src/LogViewerWidget.cs b/CrowEditBase/src/LogViewerWidget.cs index 898435b..8d575cb 100644 --- a/CrowEditBase/src/LogViewerWidget.cs +++ b/CrowEditBase/src/LogViewerWidget.cs @@ -137,8 +137,9 @@ namespace Crow //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; @@ -292,8 +293,8 @@ namespace Crow 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)); } } diff --git a/CrowEditBase/src/Logger.cs b/CrowEditBase/src/Logger.cs index 1b8cc73..e4f03bd 100644 --- a/CrowEditBase/src/Logger.cs +++ b/CrowEditBase/src/Logger.cs @@ -38,7 +38,7 @@ namespace CrowEditBase if (isOpened) { App.OpenLog(this); } else - App.CloseLog(this); + App.CloseLog(this); } IsSelected = value; } diff --git a/CrowEditBase/src/ReadOnlyTextBuffer.cs b/CrowEditBase/src/ReadOnlyTextBuffer.cs new file mode 100644 index 0000000..baba4c6 --- /dev/null +++ b/CrowEditBase/src/ReadOnlyTextBuffer.cs @@ -0,0 +1,18 @@ +// Copyright (c) 2021-2025 Jean-Philippe Bruyère +// +// 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 Source; + public readonly LineCollection Lines; + public ReadOnlyTextBuffer(ReadOnlyMemory source, LineCollection lines) { + Source = source; + Lines = lines; + } + } +} \ No newline at end of file diff --git a/CrowEditBase/src/SourceEditor.cs b/CrowEditBase/src/SourceEditor.cs index a7553ce..6208f0d 100644 --- a/CrowEditBase/src/SourceEditor.cs +++ b/CrowEditBase/src/SourceEditor.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2021 Bruyère Jean-Philippe +// Copyright (c) 2013-2025 Bruyère Jean-Philippe // // This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) @@ -11,9 +11,7 @@ using System.Collections; using static CrowEditBase.CrowEditBase; using System.Collections.Generic; using System.Linq; -using System.Text.Unicode; using System.Text; -using System.Threading.Tasks; namespace CrowEditBase { diff --git a/CrowEditBase/src/TextDocument.cs b/CrowEditBase/src/TextDocument.cs index 9f4603d..e4b5cb7 100644 --- a/CrowEditBase/src/TextDocument.cs +++ b/CrowEditBase/src/TextDocument.cs @@ -12,14 +12,6 @@ using static CrowEditBase.CrowEditBase; namespace CrowEditBase { - public class ReadOnlyTextBuffer { - public readonly ReadOnlyMemory Source; - public readonly LineCollection Lines; - public ReadOnlyTextBuffer(ReadOnlyMemory source, LineCollection lines) { - Source = source; - Lines = lines; - } - } public class TextDocument : Document { #region CTOR public TextDocument (string fullPath, string editorPath = "default") diff --git a/plugins/CECrowPlugin/src/CrowService.cs b/plugins/CECrowPlugin/src/CrowService.cs index 6356f44..770820d 100644 --- a/plugins/CECrowPlugin/src/CrowService.cs +++ b/plugins/CECrowPlugin/src/CrowService.cs @@ -412,6 +412,7 @@ namespace CECrowPlugin } } } + //TODO get styling from nuget package refs /*foreach (String item in crowAssemblies) { yield return Assembly.LoadFile(); diff --git a/plugins/CECrowPlugin/src/PropertyContainer.cs b/plugins/CECrowPlugin/src/PropertyContainer.cs index 458d678..3c40b7d 100644 --- a/plugins/CECrowPlugin/src/PropertyContainer.cs +++ b/plugins/CECrowPlugin/src/PropertyContainer.cs @@ -108,6 +108,7 @@ namespace CECrowPlugin if (!HasStyling) return; FileLocation fl = host.StyleLocation[Name]; + Debug.WriteLine($"goto style: {fl.FilePath}"); CrowService srv = App.GetService (); if (srv?.CurrentSolution == null) diff --git a/plugins/CENetcoreDbgPlugin/src/NetcoreDbgService.cs b/plugins/CENetcoreDbgPlugin/src/NetcoreDbgService.cs index c482289..83a9e12 100644 --- a/plugins/CENetcoreDbgPlugin/src/NetcoreDbgService.cs +++ b/plugins/CENetcoreDbgPlugin/src/NetcoreDbgService.cs @@ -1,16 +1,8 @@ -// Copyright (c) 2013-2019 Bruyère Jean-Philippe +// Copyright (c) 2013-2025 Bruyère Jean-Philippe // // 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; diff --git a/plugins/CERoslynPlugin/CERoslynPlugin.csproj b/plugins/CERoslynPlugin/CERoslynPlugin.csproj index e9289e2..0aa3ed1 100644 --- a/plugins/CERoslynPlugin/CERoslynPlugin.csproj +++ b/plugins/CERoslynPlugin/CERoslynPlugin.csproj @@ -23,19 +23,18 @@ - + all all runtime False - + all all runtime False - diff --git a/plugins/CERoslynPlugin/src/CSDocument.cs b/plugins/CERoslynPlugin/src/CSDocument.cs index bf0bbcb..292317e 100644 --- a/plugins/CERoslynPlugin/src/CSDocument.cs +++ b/plugins/CERoslynPlugin/src/CSDocument.cs @@ -53,6 +53,18 @@ namespace CERoslynPlugin 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; diff --git a/plugins/CERoslynPlugin/src/MSBuildProject.cs b/plugins/CERoslynPlugin/src/MSBuildProject.cs index 0f4fa7c..2e0c66a 100644 --- a/plugins/CERoslynPlugin/src/MSBuildProject.cs +++ b/plugins/CERoslynPlugin/src/MSBuildProject.cs @@ -135,6 +135,12 @@ namespace CERoslynPlugin } 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) @@ -157,14 +163,14 @@ namespace CERoslynPlugin /*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}"); } - } + }*/ //} @@ -381,7 +387,7 @@ namespace CERoslynPlugin get { string rootPath = Path.GetDirectoryName(FullPath); var allProjects = solutionProject.FlattenProjetcs.OfType(); - var refProjs = Flatten.OfType(). + var refProjs = Flatten.OfType(). Where (r=>r.NodeType == NodeType.ProjectReference); foreach (var r in refProjs) { var refP = allProjects.FirstOrDefault(p=>Path.GetRelativePath(rootPath, p.FullPath) == r.EvaluatedInclude.Replace("\\","/")); diff --git a/plugins/CERoslynPlugin/src/Parsing/CSSyntaxAnalyser.cs b/plugins/CERoslynPlugin/src/Parsing/CSSyntaxAnalyser.cs index 41698cb..2981ed9 100644 --- a/plugins/CERoslynPlugin/src/Parsing/CSSyntaxAnalyser.cs +++ b/plugins/CERoslynPlugin/src/Parsing/CSSyntaxAnalyser.cs @@ -1,6 +1,8 @@ // Copyright (c) 2021-2025 Bruyère Jean-Philippe // // 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; @@ -11,17 +13,40 @@ namespace CERoslynPlugin public class CSSyntaxAnalyser : SyntaxAnalyser { public CSSyntaxAnalyser (ReadOnlyTextBuffer document) : base (document) { } + Stopwatch timer = new Stopwatch(); + public override async Task 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()) + { + ushort sk = (ushort)Enum.Parse(item); + Console.WriteLine($"{item,-50} {sk,-6:X4} {sk,-16:b16}"); + }*/ + + + Console.WriteLine($"CsharpSyntaxWalkerBridge.Visit : {timer.ElapsedMilliseconds,-20}"); return Root; } } diff --git a/plugins/CERoslynPlugin/src/Parsing/CsharpSyntaxWalkerBridge.cs b/plugins/CERoslynPlugin/src/Parsing/CsharpSyntaxWalkerBridge.cs index 7918f78..63456b7 100644 --- a/plugins/CERoslynPlugin/src/Parsing/CsharpSyntaxWalkerBridge.cs +++ b/plugins/CERoslynPlugin/src/Parsing/CsharpSyntaxWalkerBridge.cs @@ -9,6 +9,7 @@ using Crow.Text; using CrowEditBase; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; namespace CERoslynPlugin { @@ -33,12 +34,22 @@ 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) @@ -60,32 +71,67 @@ namespace CERoslynPlugin 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; } @@ -100,31 +146,31 @@ namespace CERoslynPlugin 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 diff --git a/plugins/CERoslynPlugin/src/Parsing/SyntaxNodes.cs b/plugins/CERoslynPlugin/src/Parsing/SyntaxNodes.cs index 3f6f267..d502494 100644 --- a/plugins/CERoslynPlugin/src/Parsing/SyntaxNodes.cs +++ b/plugins/CERoslynPlugin/src/Parsing/SyntaxNodes.cs @@ -4,9 +4,11 @@ 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) { @@ -20,6 +22,15 @@ namespace CERoslynPlugin } 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) { @@ -28,11 +39,16 @@ namespace CERoslynPlugin 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 diff --git a/plugins/CERoslynPlugin/src/SolutionProject.cs b/plugins/CERoslynPlugin/src/SolutionProject.cs index 9248f75..de80c82 100644 --- a/plugins/CERoslynPlugin/src/SolutionProject.cs +++ b/plugins/CERoslynPlugin/src/SolutionProject.cs @@ -81,7 +81,6 @@ namespace CERoslynPlugin fileNode = null; return false; } - public override string Name => Path.GetFileNameWithoutExtension (FullPath); public override string Icon => "#icons.file_type_sln2.svg"; diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs index 3404522..2259b57 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs @@ -27,6 +27,7 @@ namespace CrowEdit.Xml 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; @@ -34,19 +35,20 @@ namespace CrowEdit.Xml 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) { diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs b/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs index 400d5a8..0c627ac 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs @@ -80,14 +80,12 @@ namespace CrowEdit.Xml 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); @@ -119,8 +117,7 @@ namespace CrowEdit.Xml 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); @@ -147,8 +144,7 @@ namespace CrowEdit.Xml break; case '?': reader.Advance (); - if (reader.TryPeek ('>')){ - reader.Advance (); + if (reader.TryRead ('>')){ addTok (ref reader, XmlTokenType.PI_End); }else addTok (ref reader, XmlTokenType.Unknown); @@ -170,8 +166,7 @@ namespace CrowEdit.Xml break; case '/': reader.Advance(); - if (reader.TryPeek ('>')) { - reader.Advance(); + if (reader.TryRead ('>')) { addTok (ref reader, XmlTokenType.EmptyElementClosing); if (--curObjectLevel > 0) curState = States.Content;