From 5f85138bf04c274522950109bca3d784a6c5b484 Mon Sep 17 00:00:00 2001 From: Rekkonnect Date: Wed, 25 Dec 2024 04:34:17 +0200 Subject: [PATCH 1/4] Fix #90 round 2 --- .../Core/DisplayAnalysis/BaseSyntaxAnalysisNodeCreator.cs | 2 +- .../Core/DisplayAnalysis/CSharpSyntaxAnalysisNodeCreator.cs | 6 +++--- .../DisplayAnalysis/VisualBasicSyntaxAnalysisNodeCreator.cs | 6 +++--- Syndiesis/Core/NodeViewAnalysisExecution.cs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Syndiesis/Core/DisplayAnalysis/BaseSyntaxAnalysisNodeCreator.cs b/Syndiesis/Core/DisplayAnalysis/BaseSyntaxAnalysisNodeCreator.cs index c377508..1a354a7 100644 --- a/Syndiesis/Core/DisplayAnalysis/BaseSyntaxAnalysisNodeCreator.cs +++ b/Syndiesis/Core/DisplayAnalysis/BaseSyntaxAnalysisNodeCreator.cs @@ -103,7 +103,7 @@ public abstract AnalysisTreeListNode CreateRootNodeList( ; public abstract AnalysisTreeListNode CreateRootTokenList( - SyntaxTokenList list, TDisplayValueSource? valueSource, bool includeChildren = true) + IReadOnlyList list, TDisplayValueSource? valueSource, bool includeChildren = true) where TDisplayValueSource : IDisplayValueSource ; diff --git a/Syndiesis/Core/DisplayAnalysis/CSharpSyntaxAnalysisNodeCreator.cs b/Syndiesis/Core/DisplayAnalysis/CSharpSyntaxAnalysisNodeCreator.cs index 59a979d..926dd15 100644 --- a/Syndiesis/Core/DisplayAnalysis/CSharpSyntaxAnalysisNodeCreator.cs +++ b/Syndiesis/Core/DisplayAnalysis/CSharpSyntaxAnalysisNodeCreator.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.Contracts; using System.Linq; namespace Syndiesis.Core.DisplayAnalysis; @@ -20,6 +21,7 @@ namespace Syndiesis.Core.DisplayAnalysis; using ComplexGroupedRunInline = ComplexGroupedRunInline.Builder; using ReadOnlySyntaxNodeList = IReadOnlyList; +using SyntaxTokenList = IReadOnlyList; public sealed partial class CSharpSyntaxAnalysisNodeCreator : BaseSyntaxAnalysisNodeCreator { @@ -947,9 +949,7 @@ private static string EndOfLineTriviaText(SyntaxTrivia trivia) private static string DisabledTextTriviaText(SyntaxTrivia trivia) { - // https://github.com/dotnet/roslyn/issues/76441 - if (trivia.SyntaxTree is null) - return "[Unknown line bounds]"; + Contract.Assert(trivia.SyntaxTree is not null); var span = trivia.Span; var lineSpan = trivia.SyntaxTree.GetLineSpan(span).Span; diff --git a/Syndiesis/Core/DisplayAnalysis/VisualBasicSyntaxAnalysisNodeCreator.cs b/Syndiesis/Core/DisplayAnalysis/VisualBasicSyntaxAnalysisNodeCreator.cs index 06f7c58..1c4de2d 100644 --- a/Syndiesis/Core/DisplayAnalysis/VisualBasicSyntaxAnalysisNodeCreator.cs +++ b/Syndiesis/Core/DisplayAnalysis/VisualBasicSyntaxAnalysisNodeCreator.cs @@ -10,6 +10,7 @@ using System.Diagnostics; using System.Linq; using Garyon.Reflection; +using System.Diagnostics.Contracts; namespace Syndiesis.Core.DisplayAnalysis; @@ -20,6 +21,7 @@ namespace Syndiesis.Core.DisplayAnalysis; using ComplexGroupedRunInline = ComplexGroupedRunInline.Builder; using ReadOnlySyntaxNodeList = IReadOnlyList; +using SyntaxTokenList = IReadOnlyList; public sealed partial class VisualBasicSyntaxAnalysisNodeCreator : BaseSyntaxAnalysisNodeCreator { @@ -953,9 +955,7 @@ private static string EndOfLineTriviaText(SyntaxTrivia trivia) private static string DisabledTextTriviaText(SyntaxTrivia trivia) { - // https://github.com/dotnet/roslyn/issues/76441 - if (trivia.SyntaxTree is null) - return "[Unknown line bounds]"; + Contract.Assert(trivia.SyntaxTree is not null); var span = trivia.Span; var lineSpan = trivia.SyntaxTree.GetLineSpan(span).Span; diff --git a/Syndiesis/Core/NodeViewAnalysisExecution.cs b/Syndiesis/Core/NodeViewAnalysisExecution.cs index 62d1761..b44fc43 100644 --- a/Syndiesis/Core/NodeViewAnalysisExecution.cs +++ b/Syndiesis/Core/NodeViewAnalysisExecution.cs @@ -236,7 +236,7 @@ private static ComplexDisplayValueSource ConstructSemanticModelValueSource( return null; return _container.SyntaxCreator.CreateRootTokenList( - new SyntaxTokenList(_node?.ChildTokens() ?? []), + _node?.ChildTokens().ToList() ?? [], _childTokensValueSource); } From b5b1bba6101146694030aa45e7c0ad7a83743608 Mon Sep 17 00:00:00 2001 From: Rekkonnect Date: Wed, 25 Dec 2024 04:49:39 +0200 Subject: [PATCH 2/4] Better alias declarations --- Syndiesis/Controls/LanguageVersionDropDownItems.axaml.cs | 3 --- Syndiesis/Core/ConversionUnion.cs | 3 --- .../DisplayAnalysis/SemanticModelAnalysisNodeCreator.cs | 2 -- Syndiesis/Core/HybridSingleTreeCompilationSource.cs | 3 --- Syndiesis/Core/RoslynLanguageVersion.cs | 3 --- Syndiesis/_GlobalUsings.cs | 8 ++++++++ 6 files changed, 8 insertions(+), 14 deletions(-) create mode 100644 Syndiesis/_GlobalUsings.cs diff --git a/Syndiesis/Controls/LanguageVersionDropDownItems.axaml.cs b/Syndiesis/Controls/LanguageVersionDropDownItems.axaml.cs index b6a89c4..1f87784 100644 --- a/Syndiesis/Controls/LanguageVersionDropDownItems.axaml.cs +++ b/Syndiesis/Controls/LanguageVersionDropDownItems.axaml.cs @@ -9,9 +9,6 @@ using System.Diagnostics; using System.Linq; -using CSharpVersion = Microsoft.CodeAnalysis.CSharp.LanguageVersion; -using VisualBasicVersion = Microsoft.CodeAnalysis.VisualBasic.LanguageVersion; - namespace Syndiesis.Controls; public partial class LanguageVersionDropDownItems : UserControl diff --git a/Syndiesis/Core/ConversionUnion.cs b/Syndiesis/Core/ConversionUnion.cs index 5a430da..d23ca1f 100644 --- a/Syndiesis/Core/ConversionUnion.cs +++ b/Syndiesis/Core/ConversionUnion.cs @@ -1,9 +1,6 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Operations; -using CSharpConversion = Microsoft.CodeAnalysis.CSharp.Conversion; -using VisualBasicConversion = Microsoft.CodeAnalysis.VisualBasic.Conversion; - namespace Syndiesis.Core; public sealed record ConversionUnion( diff --git a/Syndiesis/Core/DisplayAnalysis/SemanticModelAnalysisNodeCreator.cs b/Syndiesis/Core/DisplayAnalysis/SemanticModelAnalysisNodeCreator.cs index 379113c..2bf7549 100644 --- a/Syndiesis/Core/DisplayAnalysis/SemanticModelAnalysisNodeCreator.cs +++ b/Syndiesis/Core/DisplayAnalysis/SemanticModelAnalysisNodeCreator.cs @@ -7,8 +7,6 @@ namespace Syndiesis.Core.DisplayAnalysis; -using CSharpConversion = Microsoft.CodeAnalysis.CSharp.Conversion; -using VisualBasicConversion = Microsoft.CodeAnalysis.VisualBasic.Conversion; using AnalysisTreeListNode = UIBuilder.AnalysisTreeListNode; using AnalysisTreeListNodeLine = UIBuilder.AnalysisTreeListNodeLine; using SingleRunInline = SingleRunInline.Builder; diff --git a/Syndiesis/Core/HybridSingleTreeCompilationSource.cs b/Syndiesis/Core/HybridSingleTreeCompilationSource.cs index ecaaa90..768de37 100644 --- a/Syndiesis/Core/HybridSingleTreeCompilationSource.cs +++ b/Syndiesis/Core/HybridSingleTreeCompilationSource.cs @@ -7,9 +7,6 @@ using System.Linq; using System.Threading; -using CSharpSyntaxKind = Microsoft.CodeAnalysis.CSharp.SyntaxKind; -using VisualBasicSyntaxKind = Microsoft.CodeAnalysis.VisualBasic.SyntaxKind; - namespace Syndiesis.Core; public sealed class HybridSingleTreeCompilationSource diff --git a/Syndiesis/Core/RoslynLanguageVersion.cs b/Syndiesis/Core/RoslynLanguageVersion.cs index 6166d6d..3816e61 100644 --- a/Syndiesis/Core/RoslynLanguageVersion.cs +++ b/Syndiesis/Core/RoslynLanguageVersion.cs @@ -1,8 +1,5 @@ using Microsoft.CodeAnalysis; -using CSharpVersion = Microsoft.CodeAnalysis.CSharp.LanguageVersion; -using VisualBasicVersion = Microsoft.CodeAnalysis.VisualBasic.LanguageVersion; - namespace Syndiesis.Core; public readonly record struct RoslynLanguageVersion(string LanguageName, int RawVersionValue) diff --git a/Syndiesis/_GlobalUsings.cs b/Syndiesis/_GlobalUsings.cs new file mode 100644 index 0000000..8e07dfe --- /dev/null +++ b/Syndiesis/_GlobalUsings.cs @@ -0,0 +1,8 @@ +global using CSharpVersion = Microsoft.CodeAnalysis.CSharp.LanguageVersion; +global using VisualBasicVersion = Microsoft.CodeAnalysis.VisualBasic.LanguageVersion; + +global using CSharpSyntaxKind = Microsoft.CodeAnalysis.CSharp.SyntaxKind; +global using VisualBasicSyntaxKind = Microsoft.CodeAnalysis.VisualBasic.SyntaxKind; + +global using CSharpConversion = Microsoft.CodeAnalysis.CSharp.Conversion; +global using VisualBasicConversion = Microsoft.CodeAnalysis.VisualBasic.Conversion; From d26b3484af6cf746c94f9a2b87fe2ee2d6de226a Mon Sep 17 00:00:00 2001 From: Rekkonnect Date: Wed, 25 Dec 2024 04:49:48 +0200 Subject: [PATCH 3/4] Default to C# 13 when opening the new document --- Syndiesis/Core/CSharpSingleTreeCompilationSource.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Syndiesis/Core/CSharpSingleTreeCompilationSource.cs b/Syndiesis/Core/CSharpSingleTreeCompilationSource.cs index e08b66b..17c5d8f 100644 --- a/Syndiesis/Core/CSharpSingleTreeCompilationSource.cs +++ b/Syndiesis/Core/CSharpSingleTreeCompilationSource.cs @@ -15,7 +15,7 @@ protected override CSharpParseOptions CreateDefaultParseOptions() { return CSharpParseOptions.Default .WithLanguageVersion( - Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp12); + Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp13); } protected override void AdjustLanguageVersionCore(RoslynLanguageVersion version) From a125f5756abfac756b782f5bc6854409a206340b Mon Sep 17 00:00:00 2001 From: Rekkonnect Date: Wed, 25 Dec 2024 04:50:01 +0200 Subject: [PATCH 4/4] Fix #89 --- Syndiesis/Core/NodeViewAnalysisHelpers.cs | 18 ++++++++++++++++++ Syndiesis/Core/RoslynExtensions.cs | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Syndiesis/Core/NodeViewAnalysisHelpers.cs b/Syndiesis/Core/NodeViewAnalysisHelpers.cs index 43fe07e..9f0372c 100644 --- a/Syndiesis/Core/NodeViewAnalysisHelpers.cs +++ b/Syndiesis/Core/NodeViewAnalysisHelpers.cs @@ -1,5 +1,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +using System.Diagnostics.Contracts; +using System.Linq; namespace Syndiesis.Core; @@ -32,6 +34,11 @@ public static class NodeViewAnalysisHelpers SyntaxTree syntaxTree, TextSpan span) { + if (syntaxTree.Length is 0) + { + return GetNodeViewAnalysisRootForEmptySyntaxTree(syntaxTree); + } + var rootNode = syntaxTree.SyntaxNodeAtSpanIncludingStructuredTrivia(span); if (rootNode is null) return null; @@ -40,4 +47,15 @@ public static class NodeViewAnalysisHelpers var trivia = rootNode.DeepestTriviaContainingSpan(span); return new(syntaxTree, rootNode, token, trivia); } + + private static NodeViewAnalysisRoot? GetNodeViewAnalysisRootForEmptySyntaxTree( + SyntaxTree syntaxTree) + { + Contract.Assert(syntaxTree.Length is 0); + + var rootNode = syntaxTree.GetRoot(); + var token = rootNode.GetFirstToken(); + var trivia = rootNode.GetTrailingTrivia().FirstOrDefault(); + return new(syntaxTree, rootNode, token, trivia); + } } diff --git a/Syndiesis/Core/RoslynExtensions.cs b/Syndiesis/Core/RoslynExtensions.cs index d120ac6..a96ae13 100644 --- a/Syndiesis/Core/RoslynExtensions.cs +++ b/Syndiesis/Core/RoslynExtensions.cs @@ -275,7 +275,8 @@ public static SyntaxNodeOrToken ChildThatContainsSpan(this SyntaxNode node, Text this SyntaxTree tree, TextSpan span) { var root = tree.GetRoot(); - var start = Math.Clamp(span.Start, 0, root.FullSpan.End - 1); + int lastIndex = Math.Max(0, root.FullSpan.End - 1); + var start = Math.Clamp(span.Start, 0, lastIndex); var end = Math.Clamp(span.End, 0, root.FullSpan.End); var clampedSpan = TextSpan.FromBounds(start, end); return root.DeepestNodeContainingSpanIncludingStructuredTrivia(clampedSpan);