Skip to content

Commit f6dfafc

Browse files
committed
Fixed a Calculation-issue with wrong lines in GapFiller
1 parent aba2624 commit f6dfafc

File tree

5 files changed

+67
-27
lines changed

5 files changed

+67
-27
lines changed

Parser/GapFiller.cs

+41-25
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Collections.Generic;
2-
using System.Linq;
1+
using System.Linq;
32

43
using MiKoSolutions.SemanticParsers.TypeScript.Yaml;
54

@@ -9,69 +8,78 @@ public static class GapFiller
98
{
109
public static void Fill(File file, CharacterPositionFinder finder)
1110
{
12-
var children = file.Children;
13-
for (var index = 0; index < children.Count; index++)
11+
for (var index = 0; index < file.Children.Count; index++)
1412
{
15-
AdjustNode(children, index, finder);
13+
AdjustNode(file, index, finder);
1614
}
1715
}
1816

19-
private static void AdjustNode(IList<ContainerOrTerminalNode> parentChildren, int indexInParentChildren, CharacterPositionFinder finder)
17+
private static void AdjustNode(IParent parent, int indexInParentChildren, CharacterPositionFinder finder)
2018
{
19+
var parentChildren = parent.Children;
20+
2121
var child = parentChildren[indexInParentChildren];
2222

2323
if (parentChildren.Count == 1)
2424
{
25-
AdjustSingleChild(child, finder);
25+
AdjustSingleChild(parent, finder);
2626
}
2727
else
2828
{
2929
// first child, so adjust end-position to next sibling
3030
if (indexInParentChildren == 0 && parentChildren.Count > 0)
3131
{
32-
AdjustFirstChild(child, parentChildren, indexInParentChildren, finder);
32+
AdjustFirstChild(parent, indexInParentChildren, finder);
3333
}
3434

3535
// child between first and last one, adjust gaps to previous sibling
3636
if (indexInParentChildren > 0 && indexInParentChildren < parentChildren.Count - 1)
3737
{
38-
AdjustMiddleChild(child, parentChildren, indexInParentChildren, finder);
38+
AdjustMiddleChild(parent, indexInParentChildren, finder);
3939
}
4040

4141
// last child, adjust start-position and end-position (on same line)
4242
if (indexInParentChildren == parentChildren.Count - 1)
4343
{
44-
AdjustLastChild(child, parentChildren, indexInParentChildren, finder);
44+
AdjustLastChild(parent, indexInParentChildren, finder);
4545
}
4646
}
4747

4848
if (child is Container c)
4949
{
50-
AdjustContainerChild(c, finder);
50+
AdjustContainerChild(parent, c, finder);
5151
}
5252
else if (child is TerminalNode t)
5353
{
54-
AdjustTerminalNodeChild(t, finder);
54+
AdjustTerminalNodeChild(parent, t, finder);
5555
}
5656
}
5757

58-
private static void AdjustSingleChild(ContainerOrTerminalNode child, CharacterPositionFinder finder)
58+
private static void AdjustSingleChild(IParent parent, CharacterPositionFinder finder)
5959
{
6060
// TODO: RKN find out how to adjust
6161
}
6262

63-
private static void AdjustFirstChild(ContainerOrTerminalNode child, IList<ContainerOrTerminalNode> parentChildren, int indexInParentChildren, CharacterPositionFinder finder)
63+
private static void AdjustFirstChild(IParent parent, int indexInParentChildren, CharacterPositionFinder finder)
6464
{
65+
var parentChildren = parent.Children;
66+
var child = parentChildren[indexInParentChildren];
6567
var nextSibling = parentChildren[indexInParentChildren + 1];
6668

67-
var startPos = new LineInfo(child.LocationSpan.Start.LineNumber, 1);
69+
// same line, so start immediately after
70+
var startPos = parent is Container c && c.LocationSpan.Start.LineNumber == child.LocationSpan.Start.LineNumber
71+
? finder.GetLineInfo(c.HeaderSpan.End + 1)
72+
: new LineInfo(child.LocationSpan.Start.LineNumber, 1);
73+
6874
var endPos = FindNewEndPos(child, nextSibling, finder);
6975

7076
child.LocationSpan = new LocationSpan(startPos, endPos);
7177
}
7278

73-
private static void AdjustMiddleChild(ContainerOrTerminalNode child, IList<ContainerOrTerminalNode> parentChildren, int indexInParentChildren, CharacterPositionFinder finder)
79+
private static void AdjustMiddleChild(IParent parent, int indexInParentChildren, CharacterPositionFinder finder)
7480
{
81+
var parentChildren = parent.Children;
82+
var child = parentChildren[indexInParentChildren];
7583
var previousSibling = parentChildren[indexInParentChildren - 1];
7684
var nextSibling = parentChildren[indexInParentChildren + 1];
7785

@@ -82,8 +90,10 @@ private static void AdjustMiddleChild(ContainerOrTerminalNode child, IList<Conta
8290
child.LocationSpan = new LocationSpan(startPos, endPos);
8391
}
8492

85-
private static void AdjustLastChild(ContainerOrTerminalNode child, IList<ContainerOrTerminalNode> parentChildren, int indexInParentChildren, CharacterPositionFinder finder)
93+
private static void AdjustLastChild(IParent parent, int indexInParentChildren, CharacterPositionFinder finder)
8694
{
95+
var parentChildren = parent.Children;
96+
var child = parentChildren[indexInParentChildren];
8797
var previousSibling = parentChildren[indexInParentChildren - 1];
8898

8999
var indexAfter = finder.GetCharacterPosition(previousSibling.LocationSpan.End) + 1;
@@ -93,7 +103,7 @@ private static void AdjustLastChild(ContainerOrTerminalNode child, IList<Contain
93103
child.LocationSpan = new LocationSpan(startPos, endPos);
94104
}
95105

96-
private static void AdjustContainerChild(Container child, CharacterPositionFinder finder)
106+
private static void AdjustContainerChild(IParent parent, Container child, CharacterPositionFinder finder)
97107
{
98108
AdjustChildren(child, finder);
99109

@@ -118,12 +128,20 @@ private static void AdjustContainerChild(Container child, CharacterPositionFinde
118128
var firstChild = child.Children.First();
119129
var lastChild = child.Children.Last();
120130

121-
var headerStartLine = firstChild.LocationSpan.Start.LineNumber - 1;
131+
var headerOffset = child.LocationSpan.Start.LineNumber == firstChild.LocationSpan.Start.LineNumber
132+
? 0 // it's on the same line
133+
: -1;
134+
135+
var footerOffset = child.LocationSpan.Start.LineNumber == firstChild.LocationSpan.Start.LineNumber
136+
? 0 // it's on the same line
137+
: 1;
138+
139+
var headerStartLine = firstChild.LocationSpan.Start.LineNumber + headerOffset;
122140

123141
var headerStart = child.HeaderSpan.Start;
124142
var headerEnd = finder.GetCharacterPosition(headerStartLine, finder.GetLineLength(headerStartLine));
125143

126-
var footerStartLine = lastChild.LocationSpan.End.LineNumber + 1;
144+
var footerStartLine = lastChild.LocationSpan.End.LineNumber + footerOffset;
127145
var footerStart = finder.GetCharacterPosition(footerStartLine, 1);
128146
var footerEnd = finder.GetCharacterPosition(child.LocationSpan.End);
129147

@@ -134,7 +152,7 @@ private static void AdjustContainerChild(Container child, CharacterPositionFinde
134152
}
135153
}
136154

137-
private static void AdjustTerminalNodeChild(TerminalNode child, CharacterPositionFinder finder)
155+
private static void AdjustTerminalNodeChild(IParent parent, TerminalNode child, CharacterPositionFinder finder)
138156
{
139157
var start = finder.GetCharacterPosition(child.LocationSpan.Start);
140158
var end = finder.GetCharacterPosition(child.LocationSpan.End);
@@ -143,11 +161,9 @@ private static void AdjustTerminalNodeChild(TerminalNode child, CharacterPositio
143161

144162
private static void AdjustChildren(Container container, CharacterPositionFinder finder)
145163
{
146-
var children = container.Children;
147-
148-
for (var index = 0; index < children.Count; index++)
164+
for (var index = 0; index < container.Children.Count; index++)
149165
{
150-
AdjustNode(children, index, finder);
166+
AdjustNode(container, index, finder);
151167
}
152168
}
153169

Parser/Parser.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
<Compile Include="Yaml\Converters\LocationSpanConverter.cs" />
7070
<Compile Include="Yaml\Converters\ParsingErrorConverter.cs" />
7171
<Compile Include="Yaml\File.cs" />
72+
<Compile Include="Yaml\IParent.cs" />
7273
<Compile Include="Yaml\LineInfo.cs" />
7374
<Compile Include="Yaml\LocationSpan.cs" />
7475
<Compile Include="Yaml\ParsingError.cs" />

Parser/Yaml/Container.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace MiKoSolutions.SemanticParsers.TypeScript.Yaml
77
{
88
[DebuggerDisplay("[{GetType().Name}] Name={Name}, Type={Type}")]
9-
public sealed class Container : ContainerOrTerminalNode
9+
public sealed class Container : ContainerOrTerminalNode, IParent
1010
{
1111
[YamlMember(Alias = "headerSpan", Order = 4)]
1212
public CharacterSpan HeaderSpan { get; set; }

Parser/Yaml/File.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
using System.Collections.Generic;
22
using System.Diagnostics;
3+
using System.IO;
34
using System.Linq;
5+
using System.Text;
46

57
using YamlDotNet.Serialization;
68

79
namespace MiKoSolutions.SemanticParsers.TypeScript.Yaml
810
{
911
[DebuggerDisplay("[{GetType().Name}] Name={Name}, Type={Type}")]
10-
public sealed class File
12+
public sealed class File : IParent
1113
{
1214
[YamlMember(Alias = "type", Order = 1)]
1315
public string Type { get; } = "file";
@@ -29,5 +31,17 @@ public sealed class File
2931

3032
[YamlMember(Alias = "parsingError", Order = 6)]
3133
public List<ParsingError> ParsingErrors { get; } = new List<ParsingError>();
34+
35+
public string ToYaml()
36+
{
37+
var sb = new StringBuilder();
38+
39+
using (var writer = new StringWriter(sb))
40+
{
41+
YamlWriter.Write(writer, this);
42+
}
43+
44+
return sb.ToString();
45+
}
3246
}
3347
}

Parser/Yaml/IParent.cs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Collections.Generic;
2+
3+
namespace MiKoSolutions.SemanticParsers.TypeScript.Yaml
4+
{
5+
public interface IParent
6+
{
7+
List<ContainerOrTerminalNode> Children { get; }
8+
}
9+
}

0 commit comments

Comments
 (0)