Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Limited regular expressions #2504

Merged
merged 150 commits into from
Mar 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
19afa9d
updates
gregli-msft Jun 25, 2024
0016eb8
Updates
gregli-msft Jul 1, 2024
601de22
Updates
gregli-msft Jul 2, 2024
c36e21f
Updates
gregli-msft Jul 3, 2024
6347e59
Updates
gregli-msft Jul 3, 2024
a2ab49f
Update Microsoft.PowerFx.Core.Tests.Shared.projitems
gregli-msft Jul 3, 2024
20d2fd3
Update Microsoft.PowerFx.Core.Tests.Shared.projitems
gregli-msft Jul 3, 2024
765b291
Updates
gregli-msft Jul 3, 2024
b514426
Merge branch 'gregli/regex-min' of https://github.com/microsoft/power…
gregli-msft Jul 3, 2024
9b33931
Updates
gregli-msft Jul 3, 2024
b17c233
Merge branch 'main' into gregli/regex-min
gregli-msft Jul 3, 2024
d5463c8
Updates
gregli-msft Jul 3, 2024
2316665
Updates
gregli-msft Jul 3, 2024
ba1e124
Merge branch 'main' into gregli/regex-min
gregli-msft Jul 4, 2024
e2e58ff
Updates
gregli-msft Jul 4, 2024
6349dd9
Updates
gregli-msft Jul 4, 2024
ed49656
Merge branch 'main' into gregli/regex-min
gregli-msft Jul 5, 2024
5105468
Updates
gregli-msft Jul 10, 2024
bbe578d
Updates
gregli-msft Jul 10, 2024
939bf18
Merge branch 'main' into gregli/regex-min
gregli-msft Jul 10, 2024
1c72620
update
gregli-msft Jul 10, 2024
a88f286
Merge branch 'gregli/regex-min' of https://github.com/microsoft/Power…
gregli-msft Jul 10, 2024
428164d
Updates
gregli-msft Jul 10, 2024
d724b82
Merge branch 'main' into gregli/regex-min
gregli-msft Jul 10, 2024
3693147
Updates
gregli-msft Jul 10, 2024
d628f1a
Merge branch 'gregli/regex-min' of https://github.com/microsoft/Power…
gregli-msft Jul 10, 2024
db1405d
Merge branch 'main' into gregli/regex-min
gregli-msft Jul 30, 2024
b79704d
Updates
gregli-msft Aug 3, 2024
15541fc
Updates
gregli-msft Aug 12, 2024
0d0c88c
Updates
gregli-msft Aug 13, 2024
e18f2fe
Updates
gregli-msft Aug 13, 2024
a06654e
Updates
gregli-msft Aug 14, 2024
08d89e0
Updates
gregli-msft Aug 14, 2024
442bf73
updates
gregli-msft Aug 15, 2024
dfa1e15
Updates 2
gregli-msft Aug 15, 2024
9d7ba42
Updates 3
gregli-msft Aug 15, 2024
d51e047
Updates
gregli-msft Aug 16, 2024
e309223
Updates
gregli-msft Aug 22, 2024
ef24bec
Merge branch 'main' into gregli/regex-min
gregli-msft Aug 22, 2024
98ad8e4
Updates
gregli-msft Aug 22, 2024
c55a842
Updates
gregli-msft Aug 30, 2024
c5dfdb0
Merge branch 'main' into gregli/regex-min
gregli-msft Aug 30, 2024
e646a6f
Merge branch 'main' into gregli/regex-min
gregli-msft Aug 30, 2024
856bdfe
Updates
gregli-msft Aug 31, 2024
14d7fe5
Updates
gregli-msft Aug 31, 2024
78d1197
updates
gregli-msft Aug 31, 2024
59bed91
Merge branch 'main' into gregli/regex-min
gregli-msft Aug 31, 2024
3c6f50b
Updates
gregli-msft Aug 31, 2024
9a7e568
Updates
gregli-msft Aug 31, 2024
7bf1438
Updates
gregli-msft Aug 31, 2024
54aea5f
Updates
gregli-msft Sep 1, 2024
df24948
Updates
gregli-msft Sep 1, 2024
d506d23
Updates
gregli-msft Sep 3, 2024
47086b6
Updates
gregli-msft Sep 4, 2024
3904484
Updates
gregli-msft Sep 4, 2024
d7542de
Updates
gregli-msft Sep 4, 2024
273e37e
Updates
gregli-msft Sep 4, 2024
e674cf6
Updates
gregli-msft Sep 6, 2024
280beb2
updates
gregli-msft Sep 6, 2024
01d7098
Updates
gregli-msft Sep 8, 2024
3090dfe
Merge branch 'main' into gregli/regex-min
gregli-msft Sep 8, 2024
a6bb1ad
Updates
gregli-msft Sep 9, 2024
65cadd9
Merge branch 'main' into gregli/regex-min
gregli-msft Sep 20, 2024
d8774a1
Updates
gregli-msft Sep 20, 2024
14afc3b
Updates
gregli-msft Sep 20, 2024
fc1796b
Merge branch 'main' into gregli/regex-min
gregli-msft Sep 27, 2024
709dc9b
Merge branch 'main' into gregli/regex-min
gregli-msft Oct 18, 2024
5615760
updates
gregli-msft Oct 22, 2024
6b4499b
Updates
gregli-msft Oct 24, 2024
fa7edbe
updats
gregli-msft Oct 25, 2024
13ea69a
Updates
gregli-msft Oct 25, 2024
4a254e4
Updates
gregli-msft Oct 25, 2024
18dd7ef
Merge branch 'main' into gregli/regex-min
gregli-msft Oct 29, 2024
a7a9e43
Merge branch 'main' into gregli/regex-min
gregli-msft Nov 6, 2024
46f8221
Updates
gregli-msft Nov 6, 2024
c06bb98
Updates
gregli-msft Nov 7, 2024
4162e1f
update
gregli-msft Nov 7, 2024
03f5190
Updates
gregli-msft Nov 10, 2024
eae88e8
Updates
gregli-msft Nov 13, 2024
f9f9faa
Update
gregli-msft Nov 14, 2024
147ddc5
Update
gregli-msft Nov 15, 2024
fa2e0d1
Merge branch 'main' into gregli/regex-min
gregli-msft Jan 14, 2025
15e6b06
more
gregli-msft Jan 20, 2025
9f360ab
Merge branch 'main' into gregli/regex-min
gregli-msft Jan 23, 2025
def11ec
Updates
gregli-msft Jan 24, 2025
c8389c0
Updates
gregli-msft Feb 4, 2025
bc48d2a
Merge branch 'main' into gregli/regex-min
gregli-msft Feb 4, 2025
a840b50
Updates
gregli-msft Feb 4, 2025
a9c5f05
more
gregli-msft Feb 4, 2025
9651c13
Merge branch 'main' into gregli/regex-min
gregli-msft Feb 4, 2025
5c67964
Update
gregli-msft Feb 5, 2025
afa9abf
Merge branch 'main' into gregli/regex-min
gregli-msft Feb 5, 2025
ce85f12
Merge branch 'gregli/regex-min' of https://github.com/microsoft/power…
gregli-msft Feb 5, 2025
d3ca6f6
Updates
gregli-msft Feb 6, 2025
609cc35
Merge branch 'main' into gregli/regex-min
gregli-msft Feb 6, 2025
4bd05c3
Updates
gregli-msft Feb 6, 2025
276620d
Merge branch 'gregli/regex-min' of https://github.com/microsoft/power…
gregli-msft Feb 6, 2025
4792094
Update
gregli-msft Feb 6, 2025
8e0100b
Updates
gregli-msft Feb 6, 2025
7e16cca
Merge branch 'main' into gregli/regex-min
gregli-msft Feb 20, 2025
14eac2d
Gregli/regex star2 (#2861)
gregli-msft Mar 6, 2025
587eff3
Merge branch 'main' into gregli/regex-min
gregli-msft Mar 6, 2025
22d2f7f
Updates
gregli-msft Mar 6, 2025
78887be
Updates
gregli-msft Mar 6, 2025
4f54c71
Updates
gregli-msft Mar 6, 2025
d287205
Updates
gregli-msft Mar 6, 2025
ea86e02
Updates
gregli-msft Mar 6, 2025
1abd009
Updates
gregli-msft Mar 7, 2025
2b74c5a
Updates
gregli-msft Mar 7, 2025
3fc069c
Updates
gregli-msft Mar 7, 2025
592c57f
Updates
gregli-msft Mar 7, 2025
98e67e0
Updates
gregli-msft Mar 7, 2025
22e0733
Updates
gregli-msft Mar 7, 2025
ce00d9a
Updates
gregli-msft Mar 7, 2025
22a21bb
Updates
gregli-msft Mar 8, 2025
4644f91
Updates, changed IsMatch to be contains vs complete
gregli-msft Mar 9, 2025
9ab43b1
Updates
gregli-msft Mar 9, 2025
b79897e
Merge branch 'main' into gregli/regex-min
gregli-msft Mar 9, 2025
0af723a
Updates
gregli-msft Mar 10, 2025
2774ac2
Merge branch 'gregli/regex-min' of https://github.com/microsoft/power…
gregli-msft Mar 10, 2025
294acb3
Updates
gregli-msft Mar 11, 2025
defcb5a
Updates
gregli-msft Mar 11, 2025
846797b
Merge branch 'main' into gregli/regex-min
gregli-msft Mar 11, 2025
8bcd80c
Updates
gregli-msft Mar 11, 2025
db1574d
Merge branch 'gregli/regex-min' of https://github.com/microsoft/power…
gregli-msft Mar 11, 2025
e33ccd5
Updates
gregli-msft Mar 12, 2025
3074f6f
updates
gregli-msft Mar 12, 2025
7cd0445
Updates
gregli-msft Mar 12, 2025
c455e63
Merge branch 'main' into gregli/regex-min
gregli-msft Mar 12, 2025
f4f79bc
Updates
gregli-msft Mar 12, 2025
39d189d
Merge branch 'gregli/regex-min' of https://github.com/microsoft/power…
gregli-msft Mar 12, 2025
ede5775
Updates
gregli-msft Mar 13, 2025
ab40d71
Updates
gregli-msft Mar 13, 2025
de47cc5
Merge branch 'main' into gregli/regex-min
gregli-msft Mar 13, 2025
be595af
Updates
gregli-msft Mar 13, 2025
7f15963
Updates
gregli-msft Mar 13, 2025
6d1b7ec
Updates
gregli-msft Mar 13, 2025
4a7b6de
Updates
gregli-msft Mar 18, 2025
eab879a
Updates
gregli-msft Mar 18, 2025
5f104e9
Reformat Match.cs file.
gregli-msft Mar 18, 2025
c906063
Revert "Reformat Match.cs file."
gregli-msft Mar 18, 2025
38e1905
Updates
gregli-msft Mar 18, 2025
126b747
Updates
gregli-msft Mar 18, 2025
c2a1a08
Updates
gregli-msft Mar 18, 2025
f7926f5
Updates
gregli-msft Mar 18, 2025
013614a
Updates
gregli-msft Mar 18, 2025
6841402
Updates
gregli-msft Mar 18, 2025
52e0040
updates
gregli-msft Mar 18, 2025
245e8c6
Updates
gregli-msft Mar 18, 2025
7ad8992
Merge branch 'main' into gregli/regex-min
gregli-msft Mar 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
302 changes: 302 additions & 0 deletions docs/regular-expressions.md

Large diffs are not rendered by default.

68 changes: 64 additions & 4 deletions src/libraries/Microsoft.PowerFx.Core/Binding/BinderUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
// Licensed under the MIT license.

using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.PowerFx.Core.App.Controls;
using Microsoft.PowerFx.Core.App.ErrorContainers;
Expand All @@ -14,6 +15,7 @@
using Microsoft.PowerFx.Core.Localization;
using Microsoft.PowerFx.Core.Logging.Trackers;
using Microsoft.PowerFx.Core.Texl;
using Microsoft.PowerFx.Core.Texl.Builtins;
using Microsoft.PowerFx.Core.Types;
using Microsoft.PowerFx.Core.Types.Enums;
using Microsoft.PowerFx.Core.Utils;
Expand Down Expand Up @@ -1502,10 +1504,32 @@ public static bool TryGetConstantValue(CheckTypesContext context, TexlNode node,
Contracts.AssertValue(node);
nodeValue = null;
switch (node.Kind)
{
{
case NodeKind.StrLit:
nodeValue = node.AsStrLit().Value;
return true;
return true;
case NodeKind.StrInterp:
var strInterpNode = node.AsStrInterp();
var segments = new List<string>();
foreach (var segmentNode in strInterpNode.Children)
{
if (TryGetConstantValue(context, segmentNode, out var segmentValue))
{
segments.Append(segmentValue);
}
else
{
break;
}
}

if (segments.Count == strInterpNode.Children.Count)
{
nodeValue = string.Join(string.Empty, segments);
return true;
}

break;
case NodeKind.BinaryOp:
var binaryOpNode = node.AsBinaryOp();
if (binaryOpNode.Op == BinaryOp.Concat)
Expand Down Expand Up @@ -1540,7 +1564,43 @@ public static bool TryGetConstantValue(CheckTypesContext context, TexlNode node,
nodeValue = string.Join(string.Empty, parameters);
return true;
}
}
}
else if ((callNode.Head.Name.Value == BuiltinFunctionsCore.Char.Name || callNode.Head.Name.Value == BuiltinFunctionsCore.UniChar.Name) && callNode.Args.Children.Count == 1)
{
int val = -1;

if (callNode.Args.Children[0].Kind == NodeKind.DecLit)
{
val = (int)((DecLitNode)callNode.Args.Children[0]).ActualDecValue;
}
else if (callNode.Args.Children[0].Kind == NodeKind.NumLit)
{
val = (int)((NumLitNode)callNode.Args.Children[0]).ActualNumValue;
}
else if (callNode.Args.Children[0].Kind == NodeKind.Call)
{
var hexCallNode = callNode.Args.Children[0].AsCall();
if (hexCallNode.Head.Name.Value == BuiltinFunctionsCore.Hex2Dec.Name && hexCallNode.Args.Children[0].Kind == NodeKind.StrLit)
{
var hexStr = hexCallNode.Args.Children[0].AsStrLit().Value;

// check for 10 hex digits is the same as in LibraryMath.cs/Hex2Dec, Excel functions works on a 40 bit number
// may result in a negative val, but that will be checked below
if (hexStr.Length > 10 || !int.TryParse(hexStr, System.Globalization.NumberStyles.HexNumber, null, out val))
{
return false;
}
}
}

if (val < 1 || (val > 255 && callNode.Head.Name.Value == BuiltinFunctionsCore.Char.Name) || val > 0x10FFFF || (val >= 0xD800 && val <= 0xDFFF))
{
return false;
}

nodeValue = char.ConvertFromUtf32(val);
return true;
}

break;
case NodeKind.FirstName:
Expand Down
58 changes: 55 additions & 3 deletions src/libraries/Microsoft.PowerFx.Core/Localization/Strings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -743,10 +743,62 @@ internal static class TexlStrings
public static ErrorResourceKey ErrDecimalRequiresPowerFxV1 = new ErrorResourceKey("ErrDecimalNeedsPowerFxV1");

public static ErrorResourceKey ErrInvalidRegEx = new ErrorResourceKey("ErrInvalidRegEx");
public static ErrorResourceKey ErrInvalidRegExWithContext = new ErrorResourceKey("ErrInvalidRegExWithContext");
public static ErrorResourceKey ErrInvalidRegExBadInlineOptions = new ErrorResourceKey("ErrInvalidRegExBadInlineOptions");
public static ErrorResourceKey ErrInvalidRegExInlineOptionNotAtStart = new ErrorResourceKey("ErrInvalidRegExInlineOptionNotAtStart");
public static ErrorResourceKey ErrInvalidRegExBadOctal = new ErrorResourceKey("ErrInvalidRegExBadOctal");
public static ErrorResourceKey ErrInvalidRegExBadCurly = new ErrorResourceKey("ErrInvalidRegExBadCurly");
public static ErrorResourceKey ErrInvalidRegExBadSquare = new ErrorResourceKey("ErrInvalidRegExBadSquare");
public static ErrorResourceKey ErrInvalidRegExUnterminatedSquare = new ErrorResourceKey("ErrInvalidRegExUnterminatedSquare");
public static ErrorResourceKey ErrInvalidRegExBadParen = new ErrorResourceKey("ErrInvalidRegExBadParen");
public static ErrorResourceKey ErrInvalidRegExBadEscapeInsideCharacterClass = new ErrorResourceKey("ErrInvalidRegExBadEscapeInsideCharacterClass");
public static ErrorResourceKey ErrInvalidRegExBadEscapeInsideNegativeCharacterClass = new ErrorResourceKey("ErrInvalidRegExBadEscapeInsideNegativeCharacterClass");
public static ErrorResourceKey ErrInvalidRegExBadEscapeOutsideCharacterClass = new ErrorResourceKey("ErrInvalidRegExBadEscapeOutsideCharacterClass");
public static ErrorResourceKey ErrInvalidRegExRepeatInCharClass = new ErrorResourceKey("ErrInvalidRegExRepeatInCharClass");
public static ErrorResourceKey ErrInvalidRegExRepeatedInlineOption = new ErrorResourceKey("ErrInvalidRegExRepeatedInlineOption");
public static ErrorResourceKey ErrInvalidRegExInlineOptionConflictsWithNumberedSubMatches = new ErrorResourceKey("ErrInvalidRegExInlineOptionConflictsWithNumberedSubMatches");
public static ErrorResourceKey ErrInvalidRegExBadQuantifier = new ErrorResourceKey("ErrInvalidRegExBadQuantifier");
public static ErrorResourceKey ErrInvalidRegExBadExactQuantifier = new ErrorResourceKey("ErrInvalidRegExBadExactQuantifier");
public static ErrorResourceKey ErrInvalidRegExBadBackRefSelfReferencing = new ErrorResourceKey("ErrInvalidRegExBadBackRefSelfReferencing");
public static ErrorResourceKey ErrInvalidRegExBadBackRefNotDefined = new ErrorResourceKey("ErrInvalidRegExBadBackRefNotDefined");
public static ErrorResourceKey ErrInvalidRegExBadBalancing = new ErrorResourceKey("ErrInvalidRegExBadBalancing");
public static ErrorResourceKey ErrInvalidRegExBadSingleQuoteNamedCapture = new ErrorResourceKey("ErrInvalidRegExBadSingleQuoteNamedCapture");
public static ErrorResourceKey ErrInvalidRegExBadEscape = new ErrorResourceKey("ErrInvalidRegExBadEscape");
public static ErrorResourceKey ErrInvalidRegExBadConditional = new ErrorResourceKey("ErrInvalidRegExBadConditional");
public static ErrorResourceKey ErrInvalidRegExBadNamedCaptureAlreadyExists = new ErrorResourceKey("ErrInvalidRegExBadNamedCaptureAlreadyExists");
public static ErrorResourceKey ErrInvalidRegExBadNamedCaptureName = new ErrorResourceKey("ErrInvalidRegExBadNamedCaptureName");
public static ErrorResourceKey ErrInvalidRegExUnclosedCaptureGroups = new ErrorResourceKey("ErrInvalidRegExUnclosedCaptureGroups");
public static ErrorResourceKey ErrInvalidRegExUnclosedInlineComment = new ErrorResourceKey("ErrInvalidRegExUnclosedInlineComment");
public static ErrorResourceKey ErrInvalidRegExUnclosedInlineCommentWithContext = new ErrorResourceKey("ErrInvalidRegExUnclosedInlineCommentWithContext");
public static ErrorResourceKey ErrInvalidRegExUnopenedCaptureGroups = new ErrorResourceKey("ErrInvalidRegExUnopenedCaptureGroups");
public static ErrorResourceKey ErrInvalidRegExMixingNamedAndNumberedSubMatches = new ErrorResourceKey("ErrInvalidRegExMixingNamedAndNumberedSubMatches");
public static ErrorResourceKey ErrInvalidRegExNumberedSubMatchesDisabled = new ErrorResourceKey("ErrInvalidRegExNumberedSubMatchesDisabled");
public static ErrorResourceKey ErrInvalidRegExLiteralHyphenInCharacterClass = new ErrorResourceKey("ErrInvalidRegExLiteralHyphenInCharacterClass");
public static ErrorResourceKey ErrInvalidRegExUnescapedCharInCharacterClass = new ErrorResourceKey("ErrInvalidRegExUnescapedCharInCharacterClass");
public static ErrorResourceKey ErrInvalidRegExBadUnicodeCategory = new ErrorResourceKey("ErrInvalidRegExBadUnicodeCategory");
public static ErrorResourceKey ErrInvalidRegExEmptyCharacterClass = new ErrorResourceKey("ErrInvalidRegExEmptyCharacterClass");
public static ErrorResourceKey ErrInvalidRegExQuantifiedCapture = new ErrorResourceKey("ErrInvalidRegExQuantifiedCapture");
public static ErrorResourceKey ErrInvalidRegExCaptureInLookAround = new ErrorResourceKey("ErrInvalidRegExCaptureInLookAround");
public static ErrorResourceKey ErrInvalidRegExNestedLookAround = new ErrorResourceKey("ErrInvalidRegExNestedLookAround");
public static ErrorResourceKey ErrInvalidRegExUnlimitedQuantifierInLookAround = new ErrorResourceKey("ErrInvalidRegExUnlimitedQuantifierInLookAround");
public static ErrorResourceKey ErrInvalidRegExBackRefToZeroCapture = new ErrorResourceKey("ErrInvalidRegExBackRefToZeroCapture");
public static ErrorResourceKey ErrInvalidRegExGroupTrackerOverflow = new ErrorResourceKey("ErrInvalidRegExGroupTrackerOverflow");
public static ErrorResourceKey ErrInvalidRegExQuantifierOursideLookAround = new ErrorResourceKey("ErrInvalidRegExQuantifierOursideLookAround");
public static ErrorResourceKey ErrInvalidRegExNamedCaptureNameTooLong = new ErrorResourceKey("ErrInvalidRegExNamedCaptureNameTooLong");
public static ErrorResourceKey ErrInvalidRegExLowHighQuantifierFlip = new ErrorResourceKey("ErrInvalidRegExLowHighQuantifierFlip");
public static ErrorResourceKey ErrInvalidRegExLookbehindTooManyChars = new ErrorResourceKey("ErrInvalidRegExLookbehindTooManyChars");
public static ErrorResourceKey ErrInvalidRegExNumberOverflow = new ErrorResourceKey("ErrInvalidRegExNumberOverflow");
public static ErrorResourceKey ErrInvalidRegExV1Options = new ErrorResourceKey("ErrInvalidRegExV1Options");
public static ErrorResourceKey ErrInvalidRegExCharacterClassCategoryUse = new ErrorResourceKey("ErrInvalidRegExCharacterClassCategoryUse");
public static ErrorResourceKey ErrInvalidRegExCharacterClassRangeReverse = new ErrorResourceKey("ErrInvalidRegExCharacterClassRangeReverse");
public static ErrorResourceKey ErrInvalidRegExEndsWithBackslash = new ErrorResourceKey("ErrInvalidRegExEndsWithBackslash");
public static ErrorResourceKey ErrInvalidRegExQuantifierOnNothing = new ErrorResourceKey("ErrInvalidRegExQuantifierOnNothing");
public static ErrorResourceKey ErrInvalidRegExBackRefToCaptureInLookaround = new ErrorResourceKey("ErrInvalidRegExBackRefToCaptureInLookaround");

public static ErrorResourceKey ErrVariableRegEx = new ErrorResourceKey("ErrVariableRegEx");
public static ErrorResourceKey InfoRegExCaptureNameHidesPredefinedFullMatchField = new ErrorResourceKey("InfoRegExCaptureNameHidesPredefinedFullMatchField");
public static ErrorResourceKey InfoRegExCaptureNameHidesPredefinedSubMatchesField = new ErrorResourceKey("InfoRegExCaptureNameHidesPredefinedSubMatchesField");
public static ErrorResourceKey InfoRegExCaptureNameHidesPredefinedStartMatchField = new ErrorResourceKey("InfoRegExCaptureNameHidesPredefinedStartMatchField");
public static ErrorResourceKey ErrVariableRegExOptions = new ErrorResourceKey("ErrVariableRegExOptions");
public static ErrorResourceKey InfoRegExCaptureNameHidesPredefinedSingular = new ErrorResourceKey("InfoRegExCaptureNameHidesPredefinedSingular");
public static ErrorResourceKey InfoRegExCaptureNameHidesPredefinedPlural = new ErrorResourceKey("InfoRegExCaptureNameHidesPredefinedPlural");

public static ErrorResourceKey ErrErrorIrrelevantField = new ErrorResourceKey("ErrErrorIrrelevantField");
public static ErrorResourceKey ErrAsNotInContext = new ErrorResourceKey("ErrAsNotInContext");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

using System;
using System.Collections.Concurrent;
using Microsoft.PowerFx.Core.Errors;
using Microsoft.PowerFx.Core.Localization;
using Microsoft.PowerFx.Core.Texl.Builtins;
using Microsoft.PowerFx.Core.Types;

namespace Microsoft.PowerFx
Expand All @@ -13,9 +16,10 @@ namespace Microsoft.PowerFx
/// </summary>
internal class RegexTypeCache
{
// Key is ("tbl_" or "rec_" + regex expression)
// Key is ("tbl_" or "rec_" + schema altering options + regex expression)
// DType can be null if we have validated the regular expression, but didn't need the type for IsMatch
// See Match.cs code for details
internal ConcurrentDictionary<string, Tuple<DType, bool, bool, bool>> Cache { get; }
internal ConcurrentDictionary<string, RegexTypeCacheEntry> Cache { get; }

internal int CacheSize { get; }

Expand All @@ -27,7 +31,46 @@ public RegexTypeCache(int regexCacheSize)
}

CacheSize = regexCacheSize;
Cache = regexCacheSize == -1 ? null : new ConcurrentDictionary<string, Tuple<DType, bool, bool, bool>>();
Cache = regexCacheSize == -1 ? null : new ConcurrentDictionary<string, RegexTypeCacheEntry>();
}

public void Add(string key, RegexTypeCacheEntry entry)
{
if (Cache == null)
{
// nothing to do, we drop the entry
return;
}

if (Cache.Count >= CacheSize)
{
// To preserve memory during authoring, we clear the cache if it gets
// too large. This should only happen in a minority of cases and
// should have no impact on deployed apps.
Cache.Clear();
}

Cache[key] = entry;
}

public bool TryLookup(string key, out RegexTypeCacheEntry entry)
{
if (Cache != null && Cache.ContainsKey(key))
{
entry = Cache[key];
return true;
}

entry = null;
return false;
}
}

internal class RegexTypeCacheEntry
{
public DType ReturnType;
public ErrorResourceKey? Error;
public DocumentErrorSeverity ErrorSeverity;
public string ErrorParam;
}
}
61 changes: 0 additions & 61 deletions src/libraries/Microsoft.PowerFx.Core/Texl/Builtins/IsMatch.cs

This file was deleted.

Loading