Skip to content

Commit 668c6f7

Browse files
Print proper error messages to console again;
Fix stack overflow when parsing an expression;
1 parent 0e1f264 commit 668c6f7

File tree

5 files changed

+54
-9
lines changed

5 files changed

+54
-9
lines changed

XtractQuery/Logic.Business.Level5ScriptManagement/Logic.Business.Level5ScriptManagement/Level5ScriptManagementWorkflow.cs

+27-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Linq;
45
using System.Text;
56
using System.Threading.Tasks;
@@ -82,7 +83,8 @@ private void ExtractScripts()
8283
PopulateStringHashCache();
8384

8485
// Collect files to extract
85-
string[] files = Directory.Exists(_config.FilePath) ?
86+
bool isDirectory = Directory.Exists(_config.FilePath);
87+
string[] files = isDirectory ?
8688
Directory.GetFiles(_config.FilePath, "*.xq", SearchOption.AllDirectories) :
8789
new[] { _config.FilePath };
8890

@@ -97,7 +99,10 @@ private void ExtractScripts()
9799
}
98100
catch (Exception e)
99101
{
100-
Console.WriteLine($"Error ({e.Message})");
102+
string relativePath = isDirectory ?
103+
Path.GetRelativePath(_config.FilePath, file) :
104+
Path.GetFileName(file);
105+
Console.WriteLine($"Could not extract {relativePath}: {GetInnermostException(e).Message}");
101106
}
102107
}
103108
}
@@ -128,7 +133,8 @@ private void ExtractScript(string filePath)
128133
private void CreateScripts()
129134
{
130135
// Collect files to extract
131-
string[] files = Directory.Exists(_config.FilePath) ?
136+
bool isDirectory = Directory.Exists(_config.FilePath);
137+
string[] files = isDirectory ?
132138
Directory.GetFiles(_config.FilePath, "*.txt", SearchOption.AllDirectories) :
133139
new[] { _config.FilePath };
134140

@@ -143,7 +149,10 @@ private void CreateScripts()
143149
}
144150
catch (Exception e)
145151
{
146-
Console.WriteLine($"Error ({e.Message})");
152+
string relativePath = isDirectory ?
153+
Path.GetRelativePath(_config.FilePath, file) :
154+
Path.GetFileName(file);
155+
Console.WriteLine($"Could not compile {relativePath}: {GetInnermostException(e).Message}");
147156
}
148157
}
149158
}
@@ -173,7 +182,8 @@ private void CreateScript(string filePath)
173182
private void DecompressScripts()
174183
{
175184
// Collect files to extract
176-
string[] files = Directory.Exists(_config.FilePath) ?
185+
bool isDirectory = Directory.Exists(_config.FilePath);
186+
string[] files = isDirectory ?
177187
Directory.GetFiles(_config.FilePath, "*.xq", SearchOption.AllDirectories) :
178188
new[] { _config.FilePath };
179189

@@ -188,7 +198,10 @@ private void DecompressScripts()
188198
}
189199
catch (Exception e)
190200
{
191-
Console.WriteLine($"Error ({e.Message})");
201+
string relativePath = isDirectory ?
202+
Path.GetRelativePath(_config.FilePath, file) :
203+
Path.GetFileName(file);
204+
Console.WriteLine($"Could not decompress {relativePath}: {GetInnermostException(e).Message}");
192205
}
193206
}
194207
}
@@ -266,5 +279,13 @@ private void PrintHelp()
266279
Console.WriteLine($"\tExtract any script to human readable text: {Environment.ProcessPath} -o e -f Path/To/File.xq");
267280
Console.WriteLine($"\tCreate a xq32 script from human readable text: {Environment.ProcessPath} -o c -t xq32 -f Path/To/File.txt");
268281
}
282+
283+
private Exception GetInnermostException(Exception e)
284+
{
285+
while (e.InnerException != null)
286+
e = e.InnerException;
287+
288+
return e;
289+
}
269290
}
270291
}

XtractQuery/Logic.Domain.CodeAnalysis/Logic.Domain.CodeAnalysis.Contract/Exceptions/LexerException.cs

+9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ namespace Logic.Domain.CodeAnalysis.Contract.Exceptions
55
[Serializable]
66
public class LexerException : Exception
77
{
8+
public int Line { get; }
9+
public int Column { get; }
10+
811
public LexerException()
912
{
1013
}
@@ -17,6 +20,12 @@ public LexerException(string message, Exception inner) : base(message, inner)
1720
{
1821
}
1922

23+
public LexerException(string message, int line, int column) : base(message)
24+
{
25+
Line = line;
26+
Column = column;
27+
}
28+
2029
protected LexerException(
2130
SerializationInfo info,
2231
StreamingContext context) : base(info, context)

XtractQuery/Logic.Domain.CodeAnalysis/Logic.Domain.CodeAnalysis.Contract/Level5/Exceptions/Level5ScriptParserException.cs

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ namespace Logic.Domain.CodeAnalysis.Contract.Level5.Exceptions
99
{
1010
public class Level5ScriptParserException:Exception
1111
{
12+
public int Line { get; }
13+
public int Column { get; }
14+
1215
public Level5ScriptParserException()
1316
{
1417
}
@@ -21,6 +24,12 @@ public Level5ScriptParserException(string message, Exception inner) : base(messa
2124
{
2225
}
2326

27+
public Level5ScriptParserException(string message, int line, int column) : base(message)
28+
{
29+
Line = line;
30+
Column = column;
31+
}
32+
2433
protected Level5ScriptParserException(
2534
SerializationInfo info,
2635
StreamingContext context) : base(info, context)

XtractQuery/Logic.Domain.CodeAnalysis/Logic.Domain.CodeAnalysis/Level5/Level5ScriptLexer.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text;
55
using System.Threading.Tasks;
66
using Logic.Domain.CodeAnalysis.Contract;
7+
using Logic.Domain.CodeAnalysis.Contract.Exceptions;
78
using Logic.Domain.CodeAnalysis.Contract.Level5.DataClasses;
89
using Logic.Domain.CodeAnalysis.Level5.InternalContract.DataClasses;
910

@@ -634,7 +635,7 @@ private Exception CreateException(string message, string? expected = null)
634635
if (!string.IsNullOrEmpty(expected))
635636
message = $"{message} (Expected \"{expected}\")";
636637

637-
throw new InvalidOperationException(message);
638+
throw new LexerException(message, Line, Column);
638639
}
639640
}
640641
}

XtractQuery/Logic.Domain.CodeAnalysis/Logic.Domain.CodeAnalysis/Level5/Level5ScriptParser.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Logic.Domain.CodeAnalysis.Contract.DataClasses;
88
using Logic.Domain.CodeAnalysis.Contract.Level5;
99
using Logic.Domain.CodeAnalysis.Contract.Level5.DataClasses;
10+
using Logic.Domain.CodeAnalysis.Contract.Level5.Exceptions;
1011
using Logic.Domain.CodeAnalysis.Level5.InternalContract.DataClasses;
1112

1213
namespace Logic.Domain.CodeAnalysis.Level5
@@ -431,7 +432,11 @@ private ExpressionSyntax ParseExpression(IBuffer<Level5SyntaxToken> buffer)
431432
left = ParseArrayIndexExpression(buffer, value);
432433
}
433434
else
434-
left = ParseExpression(buffer);
435+
throw CreateException(buffer, "Invalid expression.", SyntaxTokenKind.Variable,
436+
SyntaxTokenKind.StringLiteral,
437+
SyntaxTokenKind.NumericLiteral, SyntaxTokenKind.FloatingNumericLiteral,
438+
SyntaxTokenKind.HashStringLiteral,
439+
SyntaxTokenKind.HashNumericLiteral);
435440

436441
if (HasTokenKind(buffer, SyntaxTokenKind.SwitchKeyword))
437442
return ParseSwitchExpression(buffer, left);
@@ -1226,7 +1231,7 @@ private Exception CreateException(string message, int line, int column, params S
12261231
$"{message} (Expected any of {string.Join(", ", expected)})";
12271232
}
12281233

1229-
throw new InvalidOperationException(message);
1234+
throw new Level5ScriptParserException(message, line, column);
12301235
}
12311236
}
12321237
}

0 commit comments

Comments
 (0)