Skip to content

Commit 7eece7a

Browse files
authored
Find and Replace Functionality (#1537)
* Added search and replace functions This commit includes 3 versions of a search and replace function; Also removes an unnecessary map; * Refactor search and replace functionality * Add WorkspaceDocument+SearchState and WorkspaceDocument+Index * Add error handling for file operations * Added navigator status and fixed case sensitive searching * Removed "Match Whole Word" from the FindNavigator TextField. Reason: Match Whole Word is already included in the search menu picker * FIX: Search options were not working When using options like: "Starting with" or "Ending With" the search results were not correct. * Display an error message when no occurrences of the search term are found during replace operation * Cleaned up some code and spelling errors Signed-off-by: Tom Ludwig <tommludwig@icloud.com> * Added a progress view while searching Signed-off-by: Tom Ludwig <tommludwig@icloud.com> * Added some tests Signed-off-by: Tom Ludwig <tommludwig@icloud.com> * Added tests for containing, matching word, starting with and ending with * Code refactoring to stick to DRY * Added testSearchWithOptionCaseSensitive() * Tests for Find and Replace * fix swift line warning * Improved a few comments * Timeout for indexing * FIX: Swiftlint warnings --------- Signed-off-by: Tom Ludwig <tommludwig@icloud.com>
1 parent d5d42f9 commit 7eece7a

11 files changed

+1513
-422
lines changed

CodeEdit.xcodeproj/project.pbxproj

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
/* Begin PBXBuildFile section */
1010
041FC6AD2AE437CE00C1F65A /* SourceControlNavigatorNewBranchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041FC6AC2AE437CE00C1F65A /* SourceControlNavigatorNewBranchView.swift */; };
11-
043BCF03281DA18A000AC47C /* WorkspaceDocument+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043BCF02281DA18A000AC47C /* WorkspaceDocument+Search.swift */; };
11+
043BCF03281DA18A000AC47C /* WorkspaceDocument+SearchState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043BCF02281DA18A000AC47C /* WorkspaceDocument+SearchState.swift */; };
1212
043C321427E31FF6006AE443 /* CodeEditDocumentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043C321327E31FF6006AE443 /* CodeEditDocumentController.swift */; };
1313
043C321627E3201F006AE443 /* WorkspaceDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043C321527E3201F006AE443 /* WorkspaceDocument.swift */; };
1414
04540D5E27DD08C300E91B77 /* WorkspaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B658FB3127DA9E0F00EA4DBD /* WorkspaceView.swift */; };
@@ -255,6 +255,7 @@
255255
58FD7608291EA1CB0051D6E4 /* CommandPaletteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FD7605291EA1CB0051D6E4 /* CommandPaletteViewModel.swift */; };
256256
58FD7609291EA1CB0051D6E4 /* CommandPaletteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FD7607291EA1CB0051D6E4 /* CommandPaletteView.swift */; };
257257
5C4BB1E128212B1E00A92FB2 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4BB1E028212B1E00A92FB2 /* World.swift */; };
258+
610C0FDA2B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610C0FD92B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift */; };
258259
611191FA2B08CC9000D4459B /* SearchIndexer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191F92B08CC9000D4459B /* SearchIndexer.swift */; };
259260
611191FC2B08CCB800D4459B /* SearchIndexer+AsyncController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191FB2B08CCB800D4459B /* SearchIndexer+AsyncController.swift */; };
260261
611191FE2B08CCD200D4459B /* SearchIndexer+File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191FD2B08CCD200D4459B /* SearchIndexer+File.swift */; };
@@ -272,6 +273,11 @@
272273
61538B902B111FE800A88846 /* String+AppearancesOfSubstring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61538B8F2B111FE800A88846 /* String+AppearancesOfSubstring.swift */; };
273274
61538B932B11201900A88846 /* String+Character.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61538B922B11201900A88846 /* String+Character.swift */; };
274275
615AA21A2B0CFD480013FCCC /* LazyStringLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615AA2192B0CFD480013FCCC /* LazyStringLoader.swift */; };
276+
6195E30D2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6195E30C2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift */; };
277+
6195E30F2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6195E30E2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift */; };
278+
6195E3112B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6195E3102B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift */; };
279+
61A53A7E2B4449870093BF8A /* WorkspaceDocument+Find.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A53A7D2B4449870093BF8A /* WorkspaceDocument+Find.swift */; };
280+
61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */; };
275281
6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */; };
276282
6C05A8AF284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C05A8AE284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift */; };
277283
6C092EDA2A53A58600489202 /* EditorLayout+StateRestoration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C092ED92A53A58600489202 /* EditorLayout+StateRestoration.swift */; };
@@ -537,7 +543,7 @@
537543

538544
/* Begin PBXFileReference section */
539545
041FC6AC2AE437CE00C1F65A /* SourceControlNavigatorNewBranchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorNewBranchView.swift; sourceTree = "<group>"; };
540-
043BCF02281DA18A000AC47C /* WorkspaceDocument+Search.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Search.swift"; sourceTree = "<group>"; };
546+
043BCF02281DA18A000AC47C /* WorkspaceDocument+SearchState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState.swift"; sourceTree = "<group>"; };
541547
043C321327E31FF6006AE443 /* CodeEditDocumentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeEditDocumentController.swift; sourceTree = "<group>"; };
542548
043C321527E3201F006AE443 /* WorkspaceDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceDocument.swift; sourceTree = "<group>"; };
543549
04660F6027E3A68A00477777 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -788,6 +794,7 @@
788794
58FD7605291EA1CB0051D6E4 /* CommandPaletteViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandPaletteViewModel.swift; sourceTree = "<group>"; };
789795
58FD7607291EA1CB0051D6E4 /* CommandPaletteView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandPaletteView.swift; sourceTree = "<group>"; };
790796
5C4BB1E028212B1E00A92FB2 /* World.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = World.swift; sourceTree = "<group>"; };
797+
610C0FD92B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+FindAndReplace.swift"; sourceTree = "<group>"; };
791798
611191F92B08CC9000D4459B /* SearchIndexer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchIndexer.swift; sourceTree = "<group>"; };
792799
611191FB2B08CCB800D4459B /* SearchIndexer+AsyncController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+AsyncController.swift"; sourceTree = "<group>"; };
793800
611191FD2B08CCD200D4459B /* SearchIndexer+File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+File.swift"; sourceTree = "<group>"; };
@@ -805,6 +812,11 @@
805812
61538B8F2B111FE800A88846 /* String+AppearancesOfSubstring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+AppearancesOfSubstring.swift"; sourceTree = "<group>"; };
806813
61538B922B11201900A88846 /* String+Character.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Character.swift"; sourceTree = "<group>"; };
807814
615AA2192B0CFD480013FCCC /* LazyStringLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyStringLoader.swift; sourceTree = "<group>"; };
815+
6195E30C2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState+FindTests.swift"; sourceTree = "<group>"; };
816+
6195E30E2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState+FindAndReplaceTests.swift"; sourceTree = "<group>"; };
817+
6195E3102B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState+IndexTests.swift"; sourceTree = "<group>"; };
818+
61A53A7D2B4449870093BF8A /* WorkspaceDocument+Find.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Find.swift"; sourceTree = "<group>"; };
819+
61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Index.swift"; sourceTree = "<group>"; };
808820
6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryEventStream.swift; sourceTree = "<group>"; };
809821
6C05A8AE284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Listeners.swift"; sourceTree = "<group>"; };
810822
6C092ED92A53A58600489202 /* EditorLayout+StateRestoration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EditorLayout+StateRestoration.swift"; sourceTree = "<group>"; };
@@ -1050,7 +1062,10 @@
10501062
5831E3CE2933F3DE00D5A6D2 /* Controllers */,
10511063
5831E3CF2933F4E000D5A6D2 /* Views */,
10521064
043C321527E3201F006AE443 /* WorkspaceDocument.swift */,
1053-
043BCF02281DA18A000AC47C /* WorkspaceDocument+Search.swift */,
1065+
043BCF02281DA18A000AC47C /* WorkspaceDocument+SearchState.swift */,
1066+
61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */,
1067+
61A53A7D2B4449870093BF8A /* WorkspaceDocument+Find.swift */,
1068+
610C0FD92B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift */,
10541069
615AA2192B0CFD480013FCCC /* LazyStringLoader.swift */,
10551070
6C05A8AE284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift */,
10561071
6C092EDF2A53BFCF00489202 /* WorkspaceStateKey.swift */,
@@ -1268,6 +1283,9 @@
12681283
children = (
12691284
4EE96ECC296059D200FFBEA8 /* Mocks */,
12701285
4EE96ECA2960565E00FFBEA8 /* DocumentsUnitTests.swift */,
1286+
6195E3102B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift */,
1287+
6195E30C2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift */,
1288+
6195E30E2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift */,
12711289
613053582B23916D00D767E3 /* Indexer */,
12721290
);
12731291
path = Documents;
@@ -3229,6 +3247,7 @@
32293247
587B9E5F29301D8F00AC7927 /* GitLabProjectRouter.swift in Sources */,
32303248
587B9E7329301D8F00AC7927 /* GitRouter.swift in Sources */,
32313249
6C2C156129B4F52F00EA60A5 /* SplitViewModifiers.swift in Sources */,
3250+
61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */,
32323251
201169DD2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift in Sources */,
32333252
587B9E8B29301D8F00AC7927 /* GitHubAccount+deleteReference.swift in Sources */,
32343253
58798237292E30B90085B254 /* FeedbackView.swift in Sources */,
@@ -3391,6 +3410,7 @@
33913410
581BFB682926431000D251EC /* WelcomeView.swift in Sources */,
33923411
6CFF967829BEBCF600182D6F /* MainCommands.swift in Sources */,
33933412
587B9E7129301D8F00AC7927 /* GitURLSession.swift in Sources */,
3413+
610C0FDA2B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift in Sources */,
33943414
5882252C292C280D00E83CDE /* UtilityAreaView.swift in Sources */,
33953415
2847019E27FDDF7600F87B6B /* ProjectNavigatorOutlineView.swift in Sources */,
33963416
B607184C2B17E037009CDAB4 /* SourceControlStashChangesView.swift in Sources */,
@@ -3438,6 +3458,7 @@
34383458
6C6BD70429CD17B600235D17 /* ExtensionsManager.swift in Sources */,
34393459
587B9E6129301D8F00AC7927 /* GitLabOAuthConfiguration.swift in Sources */,
34403460
587B9E6229301D8F00AC7927 /* GitLabConfiguration.swift in Sources */,
3461+
61A53A7E2B4449870093BF8A /* WorkspaceDocument+Find.swift in Sources */,
34413462
6CABB19E29C5591D00340467 /* NSTableViewWrapper.swift in Sources */,
34423463
5879821B292D92370085B254 /* SearchResultMatchModel.swift in Sources */,
34433464
04BA7C1E2AE2D8A000584E1C /* GitClient+Clone.swift in Sources */,
@@ -3503,7 +3524,7 @@
35033524
B6E41C7429DD40010088F9F4 /* View+HideSidebarToggle.swift in Sources */,
35043525
611191FA2B08CC9000D4459B /* SearchIndexer.swift in Sources */,
35053526
58822532292C280D00E83CDE /* UtilityAreaViewModel.swift in Sources */,
3506-
043BCF03281DA18A000AC47C /* WorkspaceDocument+Search.swift in Sources */,
3527+
043BCF03281DA18A000AC47C /* WorkspaceDocument+SearchState.swift in Sources */,
35073528
58822527292C280D00E83CDE /* StatusBarIndentSelector.swift in Sources */,
35083529
587B9E9629301D8F00AC7927 /* BitBucketRepositories.swift in Sources */,
35093530
5878DAA6291AE76700DD95A3 /* QuickOpenPreviewView.swift in Sources */,
@@ -3555,7 +3576,10 @@
35553576
4EE96ECB2960565E00FFBEA8 /* DocumentsUnitTests.swift in Sources */,
35563577
4EE96ECE296059E000FFBEA8 /* NSHapticFeedbackPerformerMock.swift in Sources */,
35573578
6130535C2B23933D00D767E3 /* MemoryIndexingTests.swift in Sources */,
3579+
6195E3112B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift in Sources */,
35583580
6130536B2B24722C00D767E3 /* AsyncIndexingTests.swift in Sources */,
3581+
6195E30D2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift in Sources */,
3582+
6195E30F2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift in Sources */,
35593583
587B612E293419B700D5CD8F /* CodeFileTests.swift in Sources */,
35603584
);
35613585
runOnlyForDeploymentPostprocessing = 0;

0 commit comments

Comments
 (0)