3
3
using System . Windows . Media ;
4
4
using ICSharpCode . AvalonEdit . Document ;
5
5
using ICSharpCode . AvalonEdit . Rendering ;
6
+ using SPCode . Utils ;
6
7
7
8
namespace SPCode . UI . Components
8
9
{
@@ -95,6 +96,8 @@ public class SPBracketSearcher : IBracketSearcher
95
96
private bool isCommentLine ;
96
97
private bool isString ;
97
98
private bool isChar ;
99
+ public BracketHighlightHelpers bracketHelper = new BracketHighlightHelpers ( ) ;
100
+
98
101
#endregion
99
102
100
103
public BracketSearchResult SearchBracket ( IDocument document , int offset )
@@ -238,7 +241,6 @@ private int SearchBracketForward(IDocument document, int offset, char openBracke
238
241
var inString = false ;
239
242
var inChar = false ;
240
243
var verbatim = false ;
241
-
242
244
var lineComment = false ;
243
245
var blockComment = false ;
244
246
@@ -250,11 +252,11 @@ private int SearchBracketForward(IDocument document, int offset, char openBracke
250
252
// After searching for quick result, we check for
251
253
// comment blocks, comment lines, string and chars
252
254
253
- var quickResult = QuickSearchBracketForward ( document , offset , openBracket , closingBracket ) ;
254
- isCommentBlockForward = CheckForCommentBlockForward ( document , offset ) ;
255
- isCommentLine = CheckForCommentLine ( document , offset ) ;
256
- isString = CheckForString ( document , offset ) ;
257
- isChar = CheckForChar ( document , offset ) ;
255
+ var quickResult = bracketHelper . QuickSearchBracketForward ( document , offset , openBracket , closingBracket ) ;
256
+ isCommentBlockForward = bracketHelper . CheckForCommentBlockForward ( document , offset ) ;
257
+ isCommentLine = bracketHelper . CheckForCommentLine ( document , offset ) ;
258
+ isString = bracketHelper . CheckForString ( document , offset ) ;
259
+ isChar = bracketHelper . CheckForChar ( document , offset ) ;
258
260
259
261
// If the Quick Search result is valid, only return it if we determined the bracket
260
262
// is valid (is not inside a comment block, comment line, string or char)
@@ -382,11 +384,11 @@ private int SearchBracketBackward(IDocument document, int offset, char openBrack
382
384
// After searching for quick result, we check for
383
385
// comment blocks, comment lines, string and chars
384
386
385
- var quickResult = QuickSearchBracketBackward ( document , offset , openBracket , closingBracket ) ;
386
- isCommentBlockBackward = CheckForCommentBackward ( document , offset , openBracket , closingBracket ) ;
387
- isCommentLine = CheckForCommentLine ( document , offset ) ;
388
- isString = CheckForString ( document , offset ) ;
389
- isChar = CheckForChar ( document , offset ) ;
387
+ var quickResult = bracketHelper . QuickSearchBracketBackward ( document , offset , openBracket , closingBracket ) ;
388
+ isCommentBlockBackward = bracketHelper . CheckForCommentBlockBackward ( document , offset ) ;
389
+ isCommentLine = bracketHelper . CheckForCommentLine ( document , offset ) ;
390
+ isString = bracketHelper . CheckForString ( document , offset ) ;
391
+ isChar = bracketHelper . CheckForChar ( document , offset ) ;
390
392
391
393
// If the Quick Search result is valid, only return it if we determined the bracket
392
394
// is valid (is not inside a comment block, comment line, string or char)
@@ -515,262 +517,6 @@ private int SearchBracketBackward(IDocument document, int offset, char openBrack
515
517
}
516
518
#endregion
517
519
518
- #region Quick Search Helpers
519
- private int QuickSearchBracketBackward ( IDocument document , int offset , char openBracket , char closingBracket )
520
- {
521
- var brackets = - 1 ;
522
- for ( var i = offset ; i >= 0 ; -- i )
523
- {
524
- var ch = document . GetCharAt ( i ) ;
525
- if ( ch == openBracket )
526
- {
527
- ++ brackets ;
528
- if ( brackets == 0 )
529
- {
530
- return i ;
531
- }
532
- }
533
- else if ( ch == closingBracket )
534
- {
535
- -- brackets ;
536
- }
537
- else if ( ch == '"' )
538
- {
539
- break ;
540
- }
541
- else if ( ch == '\' ' )
542
- {
543
- break ;
544
- }
545
- else if ( ch == '/' && i > 0 )
546
- {
547
- if ( document . GetCharAt ( i - 1 ) == '/' )
548
- {
549
- break ;
550
- }
551
-
552
- if ( document . GetCharAt ( i - 1 ) == '*' )
553
- {
554
- break ;
555
- }
556
- }
557
- }
558
- return - 1 ;
559
- }
560
-
561
- private int QuickSearchBracketForward ( IDocument document , int offset , char openBracket , char closingBracket )
562
- {
563
- var brackets = 1 ;
564
- // try "quick find" - find the matching bracket if there is no string/comment in the way
565
- for ( var i = offset ; i < document . TextLength ; ++ i )
566
- {
567
- var ch = document . GetCharAt ( i ) ;
568
- if ( ch == openBracket )
569
- {
570
- ++ brackets ;
571
- }
572
- else if ( ch == closingBracket )
573
- {
574
- -- brackets ;
575
- if ( brackets == 0 )
576
- {
577
- return i ;
578
- }
579
- }
580
- else if ( ch == '"' )
581
- {
582
- break ;
583
- }
584
- else if ( ch == '\' ' )
585
- {
586
- break ;
587
- }
588
- else if ( ch == '/' && i > 0 )
589
- {
590
- if ( document . GetCharAt ( i - 1 ) == '/' )
591
- {
592
- break ;
593
- }
594
- }
595
- else if ( ch == '*' && i > 0 )
596
- {
597
- if ( document . GetCharAt ( i - 1 ) == '/' )
598
- {
599
- break ;
600
- }
601
- }
602
- }
603
- return - 1 ;
604
- }
605
-
606
- private bool CheckForCommentBlockForward ( IDocument document , int offset )
607
- {
608
- for ( var i = offset ; i < document . TextLength ; ++ i )
609
- {
610
- var ch = document . GetCharAt ( i ) ;
611
-
612
- // If we find the characters ' */ ' together scanning forward,
613
- // it means a comment block is finishing
614
- // therefore, we've been inside a code block this whole time:
615
- // this bracket should be ignored by the highlighter
616
-
617
- if ( ch == '*' && document . GetCharAt ( i + 1 ) == '/' )
618
- {
619
- return true ;
620
- }
621
-
622
- // If we find, however, ' /* ', a code block is starting:
623
- // not possible that we've been in a comment block
624
- // that's a nested comment compiling error
625
-
626
- if ( ch == '/' && document . GetCharAt ( i + 1 ) == '*' )
627
- {
628
- return false ;
629
- }
630
-
631
- }
632
- return false ;
633
- }
634
-
635
- private bool CheckForCommentBackward ( IDocument document , int offset , char openBracket , char closingBracket )
636
- {
637
- for ( var i = offset ; i >= 0 ; -- i )
638
- {
639
- var ch = document . GetCharAt ( i ) ;
640
-
641
- // If we find the characters ' /* ' together while scanning backwards,
642
- // it means a comment block is starting
643
- // therefore, we've been inside a code block this whole time:
644
- // this bracket should be ignored by the highlighter
645
-
646
- if ( ch == '*' && document . GetCharAt ( i - 1 ) == '/' )
647
- {
648
- return true ;
649
- }
650
-
651
- // If we find, however, ' /* ', a code block is finishing:
652
- // not possible that we've been in a comment block
653
- // that's a nested comment compiling error
654
-
655
- if ( ch == '/' && i > 0 && document . GetCharAt ( i - 1 ) == '*' )
656
- {
657
- return false ;
658
- }
659
-
660
- }
661
- return false ;
662
- }
663
-
664
- private bool CheckForCommentLine ( IDocument document , int offset )
665
- {
666
- for ( var i = offset ; i >= 0 ; -- i )
667
- {
668
- var ch = document . GetCharAt ( i ) ;
669
-
670
- // If we find two ' // ' together as we scan backwards
671
- // we find we are in a comment line, and should ignore the bracket
672
-
673
- if ( ch == '/' && document . GetCharAt ( i - 1 ) == '/' )
674
- {
675
- return true ;
676
- }
677
-
678
- // If the next scanned character is a newline, cut the function off
679
-
680
- if ( ch == '\n ' )
681
- {
682
- break ;
683
- }
684
- }
685
- return false ;
686
- }
687
-
688
- private bool CheckForString ( IDocument document , int offset )
689
- {
690
- var quoteFound = false ;
691
- for ( var i = offset ; i >= 0 ; -- i )
692
- {
693
- var ch = document . GetCharAt ( i ) ;
694
-
695
- // If we find a quote in the same line, set a flag.
696
-
697
- if ( ch == '"' )
698
- {
699
- quoteFound = true ;
700
- }
701
-
702
- // Otherwise, keep looking for a line jump and a '\'
703
- // to cover the case of its usage to escape the newline
704
-
705
- if ( ch == '\n ' && i > 0 )
706
- {
707
- if ( document . GetCharAt ( i - 1 ) == '\r ' && document . GetCharAt ( i - 2 ) == '\\ ' )
708
- {
709
- continue ;
710
- }
711
- else
712
- {
713
- break ;
714
- }
715
- }
716
- }
717
-
718
- // If there was an opening quote, look forward for the closing quote
719
- // skipping the combination of a backslash and a newline
720
-
721
- if ( quoteFound )
722
- {
723
- for ( var i = offset ; i < document . TextLength ; ++ i )
724
- {
725
- var ch = document . GetCharAt ( i ) ;
726
- if ( ch == '"' )
727
- {
728
- return true ;
729
- }
730
-
731
- if ( ch == '\\ ' && document . GetCharAt ( i + 1 ) == '\r ' )
732
- {
733
- continue ;
734
- }
735
- }
736
- }
737
- return false ;
738
- }
739
-
740
- private bool CheckForChar ( IDocument document , int offset )
741
- {
742
- var apFound = false ;
743
- for ( var i = offset ; i >= 0 ; -- i )
744
- {
745
- var ch = document . GetCharAt ( i ) ;
746
-
747
- // Scanning backwards, if we find the apostrophe, set the flag
748
-
749
- if ( ch == '\' ' )
750
- {
751
- apFound = true ;
752
- }
753
- }
754
- if ( apFound )
755
- {
756
- for ( var i = offset ; i < document . TextLength ; ++ i )
757
- {
758
- var ch = document . GetCharAt ( i ) ;
759
-
760
- // If the flag is true, scan for the other one
761
-
762
- if ( ch == '\' ' )
763
- {
764
- return true ;
765
- }
766
- if ( ch == '\n ' )
767
- {
768
- break ;
769
- }
770
- }
771
- }
772
- return false ;
773
- }
774
- #endregion
520
+
775
521
}
776
522
}
0 commit comments