diff options
author | Miguel Costa <miguel.costa@qt.io> | 2021-04-13 14:09:03 +0200 |
---|---|---|
committer | Miguel Costa <miguel.costa@qt.io> | 2021-04-19 09:09:56 +0000 |
commit | a68a9483f60268a3b8813a1b64134cb0e09c3f12 (patch) | |
tree | 0ebf8b4f71feda6dc5e3b7e8fa429a54e50e5302 /src | |
parent | 0f17827a8d232ab869d191e2ed912d5787ee4cf8 (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.cs | 36 |
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 }; } |