@@ -580,10 +580,7 @@ void Lexer::scan_semicolon()
580
580
{
581
581
++cursor;
582
582
token_stream[(int ) index++].kind = ' ;' ;
583
- if (parse_template) {
584
- parse_template = false ;
585
- parse_template_class = false ;
586
- }
583
+ handle_template_scope (' ;' );
587
584
}
588
585
589
586
void Lexer::scan_less ()
@@ -611,12 +608,7 @@ void Lexer::scan_less()
611
608
}
612
609
else
613
610
{
614
- if (parse_template_class) {
615
- token_stream[(int )index++].kind = ' <' ;
616
- token_stream[(int )index++].kind = ' <' ;
617
- } else {
618
- token_stream[(int )index++].kind = Token_shift;
619
- }
611
+ token_stream[(int )index++].kind = Token_shift;
620
612
}
621
613
}
622
614
else
@@ -669,7 +661,7 @@ void Lexer::scan_greater()
669
661
}
670
662
else
671
663
{
672
- if (parse_template_class ) {
664
+ if (in_template_scope () ) {
673
665
token_stream[(int )index++].kind = ' >' ;
674
666
token_stream[(int )index++].kind = ' >' ;
675
667
} else {
@@ -724,10 +716,7 @@ void Lexer::scan_left_brace()
724
716
{
725
717
++cursor;
726
718
token_stream[(int ) index++].kind = ' {' ;
727
- if (parse_template) {
728
- parse_template = false ;
729
- parse_template_class = false ;
730
- }
719
+ handle_template_scope (' {' );
731
720
}
732
721
733
722
void Lexer::scan_or ()
@@ -758,6 +747,7 @@ void Lexer::scan_right_brace()
758
747
{
759
748
++cursor;
760
749
token_stream[(int ) index++].kind = ' }' ;
750
+ handle_template_scope (' }' );
761
751
}
762
752
763
753
void Lexer::scan_tilde ()
@@ -989,6 +979,7 @@ void Lexer::scanKeyword4()
989
979
*(cursor + 3 ) == ' m' )
990
980
{
991
981
token_stream[(int ) index++].kind = Token_enum;
982
+ handle_template_scope (Token_enum);
992
983
return ;
993
984
}
994
985
break ;
@@ -1056,9 +1047,7 @@ void Lexer::scanKeyword5()
1056
1047
*(cursor + 4 ) == ' s' )
1057
1048
{
1058
1049
token_stream[(int ) index++].kind = Token_class;
1059
- if (parse_template) {
1060
- parse_template_class = true ;
1061
- }
1050
+ handle_template_scope (Token_class);
1062
1051
return ;
1063
1052
}
1064
1053
if (*(cursor + 1 ) == ' o' &&
@@ -1154,6 +1143,7 @@ void Lexer::scanKeyword5()
1154
1143
*(cursor + 4 ) == ' g' )
1155
1144
{
1156
1145
token_stream[(int ) index++].kind = Token_using;
1146
+ handle_template_scope (Token_using);
1157
1147
return ;
1158
1148
}
1159
1149
break ;
@@ -1349,9 +1339,7 @@ void Lexer::scanKeyword6()
1349
1339
*(cursor + 5 ) == ' t' )
1350
1340
{
1351
1341
token_stream[(int ) index++].kind = Token_struct;
1352
- if (parse_template) {
1353
- parse_template_class = true ;
1354
- }
1342
+ handle_template_scope (Token_struct);
1355
1343
return ;
1356
1344
}
1357
1345
if (*(cursor + 1 ) == ' w' &&
@@ -1654,7 +1642,7 @@ void Lexer::scanKeyword8()
1654
1642
*(cursor + 7 ) == ' e' )
1655
1643
{
1656
1644
token_stream[(int ) index++].kind = Token_template;
1657
- parse_template = true ;
1645
+ handle_template_scope (Token_template) ;
1658
1646
return ;
1659
1647
}
1660
1648
if (*(cursor + 1 ) == ' y' &&
@@ -1918,4 +1906,39 @@ void Lexer::scanKeyword16()
1918
1906
token_stream[(int ) index++].kind = Token_identifier;
1919
1907
}
1920
1908
1909
+ bool Lexer::in_template_scope () {
1910
+ return parse_template_class;
1911
+ }
1912
+
1913
+ void Lexer::handle_template_scope (int kind) {
1914
+ switch (kind)
1915
+ {
1916
+ case Token_template: {
1917
+ parse_template = true ;
1918
+ } break ;
1919
+ case ' ;' : {
1920
+ if (parse_template) {
1921
+ parse_template = false ;
1922
+ parse_template_class = false ;
1923
+ }
1924
+ } break ;
1925
+ case ' {' : {
1926
+ } break ;
1927
+ case ' }' : {
1928
+ if (parse_template) {
1929
+ parse_template = false ;
1930
+ parse_template_class = false ;
1931
+ }
1932
+ } break ;
1933
+ case Token_class:
1934
+ case Token_struct:
1935
+ case Token_enum:
1936
+ case Token_using: {
1937
+ if (parse_template) {
1938
+ parse_template_class = true ;
1939
+ }
1940
+ } break ;
1941
+ }
1942
+ }
1943
+
1921
1944
// kate: space-indent on; indent-width 2; replace-tabs on;
0 commit comments