]> O.S.I.I.S - jp/crowedit.git/commitdiff
wip
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 13 Jul 2025 20:43:09 +0000 (22:43 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 13 Jul 2025 20:43:09 +0000 (22:43 +0200)
23 files changed:
CrowEditBase/src/Compiler/SourceDocument.cs
CrowEditBase/src/Compiler/TokenType.cs
CrowEditBase/src/Compiler/Tokenizer.cs
CrowEditBase/src/Compiler/TokenizerException.cs [new file with mode: 0644]
CrowEditBase/src/CrowEditBase.cs
CrowEditBase/src/Editor.cs
CrowEditBase/src/LogViewerWidget.cs
CrowEditBase/src/Logger.cs
CrowEditBase/src/ReadOnlyTextBuffer.cs [new file with mode: 0644]
CrowEditBase/src/SourceEditor.cs
CrowEditBase/src/TextDocument.cs
plugins/CECrowPlugin/src/CrowService.cs
plugins/CECrowPlugin/src/PropertyContainer.cs
plugins/CENetcoreDbgPlugin/src/NetcoreDbgService.cs
plugins/CERoslynPlugin/CERoslynPlugin.csproj
plugins/CERoslynPlugin/src/CSDocument.cs
plugins/CERoslynPlugin/src/MSBuildProject.cs
plugins/CERoslynPlugin/src/Parsing/CSSyntaxAnalyser.cs
plugins/CERoslynPlugin/src/Parsing/CsharpSyntaxWalkerBridge.cs
plugins/CERoslynPlugin/src/Parsing/SyntaxNodes.cs
plugins/CERoslynPlugin/src/SolutionProject.cs
plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs
plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs

index e9245eb7ea59654690ca4fb9ba2d1a40613cbe04..8518ca825e19c93c68af65d40df770b9e0fb1c21 100644 (file)
@@ -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
index 1d25015b31d1864059d882232ecd6ef62c8419ee..709a999d7e88beb58ae797c493da18bcc953e87a 100644 (file)
@@ -13,6 +13,7 @@ namespace CrowEditBase
                WhiteSpace                              = 0x4100,
                Tabulation                              = 0x4101,
                LineBreak                               = 0x4102,
+               LineCommentStart                = 0x0102,
                LineComment                             = 0x0103,
                BlockCommentStart               = 0x0104,
                BlockComment                    = 0x0105,
index b9788a8bee9c8b507634ae2fd46624d2d6ce373c..75122e4ee4da27775fff80b0d881d31154a3df97 100644 (file)
@@ -1,4 +1,4 @@
-// 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;
@@ -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<Token> 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 (file)
index 0000000..768d031
--- /dev/null
@@ -0,0 +1,14 @@
+// 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;
+               }
+       }
+}
index 4936f626071d385cff79ac156d385f15a7e2ee6f..9be1cc79d314a35bfbe5a5f8fdaebcef6ac8231d 100644 (file)
@@ -72,10 +72,10 @@ namespace CrowEditBase
                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) {
index 596e44ca194cd493f9de2d0c0e553040f7b38f31..50128dad61f0e23585c2fb0fffa9302177c17eeb 100644 (file)
@@ -1,4 +1,4 @@
-// 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)
 
@@ -15,9 +15,6 @@ using Crow;
 
 namespace CrowEditBase
 {
-       public interface IDocumentClient {
-
-       }
        public class Editor : ScrollingObject, IEditableTextWidget {
                #region CTOR
                protected Editor () : base () {
index 898435b4d4b323a20d132c6cd155746c7e71b1d9..8d575cbdaeb132db38c6e9d6d50607f2d451c903 100644 (file)
@@ -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));
                                }
                        }
index 1b8cc73d5c6c6aa0b289623abcf7659e6594eaec..e4f03bdf41cd97cfe2028cf996c80f008f0e4182 100644 (file)
@@ -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 (file)
index 0000000..baba4c6
--- /dev/null
@@ -0,0 +1,18 @@
+// 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
index a7553cedacbe6ee147f3cb9550acc4353b9b9aa1..6208f0d6f94dfbb9d910745685559f79f38d2f6e 100644 (file)
@@ -1,4 +1,4 @@
-// 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)
 
@@ -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
 {
index 9f4603dba62ceacc898e6662509e79d2044a65a8..e4b5cb70e7e84767d8ac5adcf7929f9490223942 100644 (file)
@@ -12,14 +12,6 @@ using static CrowEditBase.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")
index 6356f44fb868a97bf587c49b7eaef1e54c759d0e..770820d55adbd8a26e7c1cb275cfcc085061931f 100644 (file)
@@ -412,6 +412,7 @@ namespace CECrowPlugin
                                        }
                                }
                        }
+                       //TODO get styling from nuget package refs
                        /*foreach (String item in crowAssemblies)
                        {
                                yield return Assembly.LoadFile();
index 458d678004ab8ea4187c200c78d34a7cb14e6d03..3c40b7d33aaa426d49033a1d347fb1bd7fe0a4e5 100644 (file)
@@ -108,6 +108,7 @@ namespace CECrowPlugin
                        if (!HasStyling)
                                return;
                        FileLocation fl = host.StyleLocation[Name];
+                       Debug.WriteLine($"goto style: {fl.FilePath}");
 
                        CrowService srv = App.GetService<CrowService> ();
                        if (srv?.CurrentSolution == null)
index c4822895f6c556b50f81ab53a9b6c850c8e6ad5a..83a9e12a2b719d69eb61eda28f108460d66947da 100644 (file)
@@ -1,16 +1,8 @@
-// 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;
 
index e9289e2e22e68310d5bf9a4fd03f7645d267d39d..0aa3ed12e12129fc1e68005efccc3f82688f66c5 100644 (file)
        </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>
 
 
index bf0bbcb1508fc675938a840921caec2ba9ec6814..292317e5f972a286563bb52068c8d9047f60d193 100644 (file)
@@ -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;
                        
index 0f4fa7c31a44842227caaea9d231d3a90a9aac06..2e0c66a89198ebf8b69ed1a806b8e59180c3eea3 100644 (file)
@@ -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<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("\\","/"));
index 41698cbfbdebd74cb7c463a1c54601cf289e7ad1..2981ed96abbadab2d8a183e386f5a79a90764392 100644 (file)
@@ -1,6 +1,8 @@
 // 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;
@@ -11,17 +13,40 @@ namespace CERoslynPlugin
        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;
                }
        }
index 7918f783895b1edbe939d5eba0bf35f4f32c6e22..63456b76a8189111aa676a3208590f5e88026885 100644 (file)
@@ -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
index 3f6f267c88037a8451e08a2e215471945d5ac5d7..d502494e769570ba93e7d5da5be42f1e068ccba4 100644 (file)
@@ -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
index 9248f75207812ef595179448f5e0fb1a679f3249..de80c829369659e11e432ae1f936e558f1a36169 100644 (file)
@@ -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";
index 3404522eada8b9cc0626cad90406c593920177f1..2259b57248fa19b0ee189e6b26d0f99bfc965bed 100644 (file)
@@ -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) {
index 400d5a88464fa1933b347b4298023d33617d9c10..0c627acb68c866451b98f5b2de7ea1af7a072b38 100644 (file)
@@ -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;