[parsing/mfm] Improve aggregateText & aggregateTextInline performance

This commit is contained in:
Laura Hausmann 2024-11-27 05:46:25 +01:00
parent bd56788542
commit 5a3d4b9bb4
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 20 additions and 14 deletions

View file

@ -374,8 +374,9 @@
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002EMemberReordering_002EMigrations_002ECSharpFileLayoutPatternRemoveIsAttributeUpgrade/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002EMemberReordering_002EMigrations_002ECSharpFileLayoutPatternRemoveIsAttributeUpgrade/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=Testing_0020Platform/@EntryIndexedValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EUnitTestFramework_002EMigrations_002EEnableDisabledProvidersMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=VsTest/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=82C6671DFF72A14F823A7B0C48905556/@KeyIndexDefined">True</s:Boolean> <s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=82C6671DFF72A14F823A7B0C48905556/@KeyIndexDefined">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=82C6671DFF72A14F823A7B0C48905556/Applicability/=Live/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=82C6671DFF72A14F823A7B0C48905556/Applicability/=Live/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=82C6671DFF72A14F823A7B0C48905556/Description/@EntryValue">ProducesResultsAndErrors</s:String> <s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=82C6671DFF72A14F823A7B0C48905556/Description/@EntryValue">ProducesResultsAndErrors</s:String>

View file

@ -150,22 +150,22 @@ module private MfmParser =
let isAsciiLetterOrNumber c = Char.IsAsciiLetter c || Char.IsDigit c let isAsciiLetterOrNumber c = Char.IsAsciiLetter c || Char.IsDigit c
let isLetterOrNumber c = Char.IsLetterOrDigit c let isLetterOrNumber c = Char.IsLetterOrDigit c
let isNewline c = '\n'.Equals(c) let isNewline c = '\n' = c
let isNotNewline c = not (isNewline c) let isNotNewline c = '\n' <> c
let followedByChar c = nextCharSatisfies <| fun ch -> c = ch let followedByChar c = nextCharSatisfies <| fun ch -> c = ch
let (|CharNode|MfmNode|) (x: MfmNode) =
if x :? MfmCharNode then
CharNode(x :?> MfmCharNode)
else
MfmNode x
let folder (current, result) node = let folder (current, result) node =
match (node: MfmNode), (current: char list) with match (node: MfmNode), (current: char list) with
| CharNode node, _ -> node.Char :: current, result | :? MfmCharNode as ch, _ -> ch.Char :: current, result
| MfmNode node, [] -> current, node :: result | node, [] -> current, node :: result
| MfmNode node, _ -> [], node :: (MfmTextNode(current |> List.toArray |> String) :: result) | node, _ -> [], node :: (MfmTextNode(current |> List.toArray |> String) :: result)
let inlineFolder (current, result) node =
match (node: MfmInlineNode), (current: char list) with
| :? MfmCharNode as ch, _ -> ch.Char :: current, result
| node, [] -> current, node :: result
| node, _ -> [], node :: (MfmTextNode(current |> List.toArray |> String) :: result)
let aggregateText nodes = let aggregateText nodes =
nodes nodes
@ -176,7 +176,12 @@ module private MfmParser =
| current, result -> MfmTextNode(current |> List.toArray |> String) :: result | current, result -> MfmTextNode(current |> List.toArray |> String) :: result
let aggregateTextInline nodes = let aggregateTextInline nodes =
nodes |> aggregateText |> List.map (fun x -> x :?> MfmInlineNode) nodes
|> List.rev
|> List.fold inlineFolder ([], [])
|> function
| [], result -> result
| current, result -> MfmTextNode(current |> List.toArray |> String) :: result
let domainComponent = let domainComponent =
many1Chars ( many1Chars (