From 34e1186c59d089b597710f6bebbfad5daa7f4891 Mon Sep 17 00:00:00 2001 From: Peter Csajtai Date: Mon, 27 May 2024 17:05:55 +0200 Subject: [PATCH] Don't restrict the alias pattern match groups' order --- .../Scan/AliasCollector.cs | 18 ++++++++++++------ test/ConfigCat.Cli.Tests/ScanTests.cs | 11 +++++++++++ test/ConfigCat.Cli.Tests/custom.txt | 6 +++++- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/ConfigCat.Cli.Services/Scan/AliasCollector.cs b/src/ConfigCat.Cli.Services/Scan/AliasCollector.cs index 58695e4..a612976 100644 --- a/src/ConfigCat.Cli.Services/Scan/AliasCollector.cs +++ b/src/ConfigCat.Cli.Services/Scan/AliasCollector.cs @@ -87,18 +87,24 @@ public async Task CollectAsync(FlagModel[] flags, FileInfo file if (!matchPattern.Contains("CC_KEY")) continue; - var regMatch = Regex.Match(line, matchPattern.Replace("CC_KEY", $"[`'\"]?({keys})[`'\"]?"), RegexOptions.Compiled); + var regMatch = Regex.Match(line, matchPattern.Replace("CC_KEY", $"[`'\"]?(?{keys})[`'\"]?"), RegexOptions.Compiled); while (regMatch.Success && !cancellation.IsCancellationRequested) { - var key = regMatch.Groups[2].Value; - var found = regMatch.Groups[1].Value; - var flag = flags.FirstOrDefault(f => f.Key == key); + var keyGroup = regMatch.Groups["keys"]; + var found = regMatch.Groups.Values.Skip(1).Except([keyGroup]).FirstOrDefault(); + if (found is null) + { + regMatch = regMatch.NextMatch(); + continue; + } + + var flag = flags.FirstOrDefault(f => f.Key == keyGroup.Value); if (flag != null) result.FoundFlags.Add(flag); - if (flag != null && !found.IsEmpty()) - result.FlagAliases.AddOrUpdate(flag, [found], (k, v) => { v.Add(found); return v; }); + if (flag != null && !found.Value.IsEmpty()) + result.FlagAliases.AddOrUpdate(flag, [found.Value], (k, v) => { v.Add(found.Value); return v; }); regMatch = regMatch.NextMatch(); } diff --git a/test/ConfigCat.Cli.Tests/ScanTests.cs b/test/ConfigCat.Cli.Tests/ScanTests.cs index 262365a..1eef1f6 100644 --- a/test/ConfigCat.Cli.Tests/ScanTests.cs +++ b/test/ConfigCat.Cli.Tests/ScanTests.cs @@ -268,6 +268,17 @@ public async Task Custom_Other() Assert.Contains("CUS2_TEST_FLAG = client_wrapper.get_flag(:test_flag)", referenceLines); Assert.Contains("Reference to CUS2_TEST_FLAG", referenceLines); + + result = await aliasCollector.CollectAsync(new[] { flag }, file, [@"client_wrapper\.get_flag\(:CC_KEY, (\w+) =>"], CancellationToken.None); + flag.Aliases = result.FlagAliases[flag].ToList(); + + Assert.Contains("cust_flag_val", flag.Aliases); + + references = await scanner.CollectAsync(new[] { flag }, file, 0, CancellationToken.None); + referenceLines = references.References.Select(r => r.ReferenceLine.LineText); + + Assert.Contains("client_wrapper.get_flag(:test_flag, cust_flag_val => {", referenceLines); + Assert.Contains("Reference to cust_flag_val", referenceLines); } [Fact] diff --git a/test/ConfigCat.Cli.Tests/custom.txt b/test/ConfigCat.Cli.Tests/custom.txt index 54b26f2..0f1f8b2 100644 --- a/test/ConfigCat.Cli.Tests/custom.txt +++ b/test/ConfigCat.Cli.Tests/custom.txt @@ -6,10 +6,14 @@ Somewhere else refer to CUS_TEST_FLAG CUS2_TEST_FLAG = client_wrapper.get_flag(:test_flag) +client_wrapper.get_flag(:test_flag, cust_flag_val => { + Somewhere else refer to CUS_TEST_FLAG let is_test_flag_on := FLAGS('test_flag') Reference to is_test_flag_on -Reference to CUS2_TEST_FLAG \ No newline at end of file +Reference to CUS2_TEST_FLAG + +Reference to cust_flag_val \ No newline at end of file