aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMiguel Costa <miguel.costa@qt.io>2021-04-13 14:09:03 +0200
committerMiguel Costa <miguel.costa@qt.io>2021-04-19 09:09:56 +0000
commita68a9483f60268a3b8813a1b64134cb0e09c3f12 (patch)
tree0ebf8b4f71feda6dc5e3b7e8fa429a54e50e5302 /src
parent0f17827a8d232ab869d191e2ed912d5787ee4cf8 (diff)
Allow token reuse in RegExpr (part 2)
File missing from 0f17827a8d232ab869d191e2ed912d5787ee4cf8 Change-Id: I4449c64fda46a62a82b1980b3501e8e261699783 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qtvstools.regexpr/expression/Renderer.cs36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/qtvstools.regexpr/expression/Renderer.cs b/src/qtvstools.regexpr/expression/Renderer.cs
index 4876ff3b..1a6f41ec 100644
--- a/src/qtvstools.regexpr/expression/Renderer.cs
+++ b/src/qtvstools.regexpr/expression/Renderer.cs
@@ -61,12 +61,10 @@ namespace QtVsTools.SyntaxAnalysis
{
var pattern = new StringBuilder();
var rootToken = Token.CreateRoot();
- var tokens = new Dictionary<string, Token>
- {
- // Default root token
- {rootToken.CaptureId, rootToken }
- };
- var parentToken = rootToken;
+ var tokenStack = new Stack<Token>();
+ tokenStack.Push(rootToken);
+ var tokens = new HashSet<Token>();
+
var stack = new Stack<StackFrame>();
var mode = RenderMode.Default;
@@ -81,35 +79,35 @@ namespace QtVsTools.SyntaxAnalysis
IEnumerable<RegExpr> children = context.Children;
RegExpr parent = stack.Any() ? stack.Peek() : null;
- var token = expr as Token;
- if (children == null) {
- if (expr is Token) {
- tokens[token.CaptureId] = token;
- (token.Parent = parentToken).Children.Add(token);
- parentToken = token;
- }
+ if (expr is Token token)
+ tokens.Add(token);
- children = expr.OnRender(wsExpr, parent, pattern, ref mode);
+ if (children == null) {
+ children = expr.OnRender(wsExpr, parent, pattern, ref mode, tokenStack);
if (children != null && children.Any()) {
stack.Push(new StackFrame { Expr = expr, Children = children.Skip(1) });
stack.Push(children.First());
}
} else if (children.Any()) {
- expr.OnRenderNext(wsExpr, parent, pattern, ref mode);
+ expr.OnRenderNext(wsExpr, parent, pattern, ref mode, tokenStack);
stack.Push(new StackFrame { Expr = expr, Children = children.Skip(1) });
stack.Push(children.First());
} else {
- expr.OnRenderEnd(wsExpr, parent, pattern, ref mode);
- if (expr is Token)
- parentToken = token.Parent;
+ expr.OnRenderEnd(wsExpr, parent, pattern, ref mode, tokenStack);
}
}
+ var tokensByCaptureId = tokens
+ .SelectMany(token => token.CaptureIds
+ .Select(captureId => new { Id = captureId, Token = token }))
+ .ToDictionary(idToken => idToken.Id, idToken => idToken.Token);
+ tokensByCaptureId.Add(ParseTree.KeyRoot, rootToken);
+
return new Pattern
{
Expr = rootExpr,
ExprRender = pattern.ToString(),
- Tokens = tokens,
+ Tokens = tokensByCaptureId,
Root = rootToken
};
}