Skip to content

Commit 5c1262f

Browse files
committed
new replace rule with new find rule, replace sub rules
1 parent e9304f6 commit 5c1262f

File tree

10 files changed

+69
-37
lines changed

10 files changed

+69
-37
lines changed

src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/FullConfig.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
ReplaceTemplate: |-
2828
$var$ = $value1$ ?? $value2$;
2929
ReplaceRules:
30+
- $sign$ In ("!=", "is not") then $var2$ => $var1$, $var1$ => $var2$
3031
3132
# TernaryOperator
3233

src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/ShortConfig.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
- $sign$ In ("Is", "==", "!=", "is not")
2626
ReplaceTemplate: |-
2727
$var$ = $value1$ ?? $value2$;
28-
28+
ReplaceRules:
29+
- $sign$ In ("!=", "is not") then $var2$ => $var1$, $var1$ => $var2$
2930
# TernaryOperator
3031

3132
- FindTemplate: |-

src/SimpleStateMachine.StructuralSearch.Tests/Mock/Configuration.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ public static Configuration GetConfigurationFromFiles(string name)
1313
var fileRule = FileOrNull("FindRule", fileName) ;
1414
var replaceTemplate = FileOrNull("ReplaceTemplate", fileName);
1515
var replaceRule = FileOrNull("ReplaceRule", fileName);
16-
17-
var fileRules = fileRule is null ? null : new List<string>{ fileRule };
18-
var replaceRules = replaceRule is null ? null : new List<string>{ replaceRule };
16+
var fileRules = fileRule is null ? null : new List<string>(fileRule.Split(Constant.LineFeed.ToString()));
17+
var replaceRules = replaceRule is null ? null : new List<string>(replaceRule.Split(Constant.LineFeed.ToString()));
1918
var config = new Configuration
2019
{
2120
FindTemplate = findTemplate,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
$sign$ Is ("Is", "==", "!=", "is not")
1+
$sign$ In ("!=", "is not") then $var2$ => $var1$, $var1$ => $var2$

src/SimpleStateMachine.StructuralSearch.Tests/ReplaceRuleParserTests.cs

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,13 @@ namespace SimpleStateMachine.StructuralSearch.Tests
77
public class ReplaceRuleParserTests
88
{
99
[Theory]
10-
[InlineData("$var$", "equals $var$", "$var$")]
11-
[InlineData("$var$", "equals \"\\$\"", "\"\\$\"")]
12-
[InlineData("$var$", "Not equals $var$.Lenght", "$var$.Lenght")]
13-
[InlineData("$var$", "Not equals $var$.offset.Start", "$var$.offset.Start")]
14-
[InlineData("$var$", "equals $var$.Lenght and Not StartsWith \"123\"", "$var$.offset.Start.Trim")]
15-
[InlineData("$var$", "equals $var$.Lenght and Not StartsWith \"\\\"Test\"", "$var$.offset.Start.ToUpper")]
16-
public void ReplaceRulePartsParsingShouldBeSuccess(string placeholder, string findRule, string replaceRule)
17-
{
18-
var replaceRuleStr = $"{placeholder} {findRule} => {replaceRule}";
19-
var rule = StructuralSearch.ParseReplaceRule(replaceRuleStr);
20-
var ruleStr = rule.ToString().ToLower();
21-
Assert.NotNull(rule);
22-
Assert.Equal(ruleStr, replaceRuleStr.ToLower());
23-
}
24-
25-
[Theory]
26-
[InlineData("$var1$ equals $var$ => $var2$")]
27-
[InlineData("$var1$ equals \"\\$\" => \"\\$\"")]
28-
[InlineData("$var1$ Not equals $var$.Lenght => $var$.Lenght")]
29-
[InlineData("$var1$ Not equals $var$.offset.Start => $var$.offset.Start")]
30-
[InlineData("$var1$ equals $var$.Lenght and Not StartsWith \"123\" => $var$.offset.Start.Trim")]
31-
[InlineData("$var1$ equals $var$.Lenght and Not StartsWith \"\\\"Test\" => $var$.offset.Start.ToUpper")]
10+
[InlineData("$var1$ equals $var2$ then $var1$ => $var3$")]
11+
[InlineData("$var1$ equals \"\\$\" then $var1$ => \"\\$\",$var2$ => \"132\"")]
12+
[InlineData("Not $var1$ equals $var$.Lenght then $var1$ => $var$.Lenght")]
13+
[InlineData("Not $var1$ equals $var$.offset.Start then $var1$ => $var$.offset.Start")]
14+
[InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"123\" then $var1$ => $var$.offset.Start.Trim")]
15+
[InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"123\" then $var1$ => $var$.offset.Start.Trim,$var2$ => $var$.offset.Start.Trim")]
16+
[InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"\\\"Test\" then $var1$ => $var$.offset.Start.ToUpper")]
3217
public void ReplaceRuleParsingShouldBeSuccess(string replaceRule)
3318
{
3419
var rule = StructuralSearch.ParseReplaceRule(replaceRule);

src/SimpleStateMachine.StructuralSearch/Constant.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ public static partial class Constant
1212
/// </summary>
1313
public static readonly string Not ="Not";
1414

15+
/// <summary>
16+
/// String: "Then"
17+
/// </summary>
18+
public static readonly string Then ="Then";
19+
1520
/// <summary>
1621
/// Parenthesis char: '('
1722
/// </summary>
@@ -97,6 +102,11 @@ public static partial class Constant
97102
/// </summary>
98103
public static readonly char More = '>';
99104

105+
/// <summary>
106+
/// Char: ':'
107+
/// </summary>
108+
public static readonly char Colon = ':';
109+
100110
/// <summary>
101111
/// String: "=>"
102112
/// </summary>
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using Pidgin;
1+
using System.Collections.Generic;
2+
using System.Reflection.Metadata;
3+
using Pidgin;
24
using SimpleStateMachine.StructuralSearch.Extensions;
35
using SimpleStateMachine.StructuralSearch.Rules;
46

@@ -7,19 +9,18 @@ namespace SimpleStateMachine.StructuralSearch
79
public class ReplaceRule
810
{
911
public IRule FindRule { get; }
10-
public PlaceholderParameter Placeholder { get; }
11-
public IRuleParameter Parameter { get; }
1212

13-
public ReplaceRule(IRule findRule, PlaceholderParameter placeholder, IRuleParameter parameter)
13+
public IEnumerable<ReplaceSubRule> Rules { get; }
14+
15+
public ReplaceRule(IRule findRule, IEnumerable<ReplaceSubRule> rules)
1416
{
1517
FindRule = findRule;
16-
Placeholder = placeholder;
17-
Parameter = parameter;
18+
Rules = rules;
1819
}
1920

2021
public override string ToString()
2122
{
22-
return $"{FindRule}{Constant.Space}{Constant.Should}{Constant.Space}{Parameter}";
23+
return $"{FindRule}{Constant.Space}{Constant.Then}{Constant.Space}{string.Join(Constant.Comma, Rules)}";
2324
}
2425
}
2526
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using SimpleStateMachine.StructuralSearch.Rules;
2+
3+
namespace SimpleStateMachine.StructuralSearch;
4+
5+
public class ReplaceSubRule
6+
{
7+
public PlaceholderParameter Placeholder { get; }
8+
public IRuleParameter Parameter { get; }
9+
10+
public ReplaceSubRule(PlaceholderParameter placeholder, IRuleParameter parameter)
11+
{
12+
Placeholder = placeholder;
13+
Parameter = parameter;
14+
}
15+
16+
public override string ToString()
17+
{
18+
return $"{Placeholder}{Constant.Space}{Constant.Should}{Constant.Space}{Parameter}";
19+
}
20+
}

src/SimpleStateMachine.StructuralSearch/StructuralSearch/CommonParser.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ internal static readonly Parser<char, string> Identifier
3434
internal static readonly Parser<char, char> Comma
3535
= Char(Constant.Comma);
3636

37+
internal static readonly Parser<char, char> Colon
38+
= Char(Constant.Colon);
39+
3740
internal static readonly Parser<char, char> DoubleQuotes
3841
= Char(Constant.DoubleQuotes);
3942

src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceRuleParser.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,26 @@ public static class ReplaceRuleParser
1313
.As<char, ChangeParameter, IRuleParameter>()
1414
.Try()
1515
.TrimStart();
16+
17+
internal static readonly Parser<char, string> Then =
18+
Parser.CIString(Constant.Then)
19+
.Try()
20+
.TrimStart();
1621

17-
internal static readonly Parser<char, ReplaceRule> ReplaceRule =
18-
Parser.Map((rule, parameter) => new ReplaceRule(rule, parameter),
19-
FindRuleParser.Expr.Before(CommonTemplateParser.Should.TrimStart()),
22+
internal static readonly Parser<char, ReplaceSubRule> ReplaceSubRule =
23+
Parser.Map((placeholder, parameter) => new ReplaceSubRule(placeholder, parameter),
24+
ParametersParser.PlaceholderParameter.Before(CommonTemplateParser.Should.TrimStart()),
2025
Parser.OneOf(ChangeParameter.Try(), ParametersParser.Parameter.Try()))
2126
.Try()
2227
.TrimStart();
2328

29+
internal static readonly Parser<char, ReplaceRule> ReplaceRule =
30+
Parser.Map((rule, subRules) => new ReplaceRule(rule, subRules),
31+
FindRuleParser.Expr,
32+
Then.Then(ReplaceSubRule.SeparatedAtLeastOnce(CommonParser.Comma)))
33+
.Try()
34+
.TrimStart();
35+
2436
internal static ReplaceRule ParseTemplate(string str)
2537
{
2638
return ReplaceRule.ParseOrThrow(str);

0 commit comments

Comments
 (0)