[parsing/mfm] Improve aggregateText & aggregateTextInline performance
This commit is contained in:
parent
bd56788542
commit
5a3d4b9bb4
2 changed files with 20 additions and 14 deletions
|
@ -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>
|
||||||
|
|
|
@ -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 (
|
||||||
|
|
Loading…
Add table
Reference in a new issue