@@ -336,9 +336,8 @@ static AST_HTML_ATTRIBUTE_NAME_NODE_T* parser_parse_html_attribute_name(parser_T
336336 TOKEN_EOF
337337 )) {
338338 if (token_is (parser , TOKEN_ERB_START )) {
339- const char * tag = parser -> current_token -> value .data ;
340- size_t tag_length = parser -> current_token -> value .length ;
341- bool is_output_tag = (tag_length >= 3 && tag [2 ] == '=' );
339+ hb_string_T tag = parser -> current_token -> value ;
340+ bool is_output_tag = (tag .length >= 3 && tag .data [2 ] == '=' );
342341
343342 if (!is_output_tag ) {
344343 bool is_control_flow = parser_lookahead_erb_is_control_flow (parser );
@@ -921,14 +920,14 @@ static bool parser_lookahead_erb_is_attribute(lexer_T* lexer) {
921920 } while (true);
922921}
923922
924- static bool starts_with_keyword (const char * pointer , size_t remaining , const char * keyword ) {
925- size_t length = strlen (keyword );
926- if (remaining < length ) { return false; }
927- if (strncmp (pointer , keyword , length ) != 0 ) { return false; }
923+ static bool starts_with_keyword (hb_string_T string , const char * keyword ) {
924+ hb_string_T prefix = hb_string (keyword );
925+ if (string . length < prefix . length ) { return false; }
926+ if (strncmp (string . data , prefix . data , prefix . length ) != 0 ) { return false; }
928927
929- if (remaining == length ) { return true; }
928+ if (string . length == prefix . length ) { return true; }
930929
931- return is_whitespace (pointer [ length ]);
930+ return is_whitespace (string . data [ prefix . length ]);
932931}
933932
934933// TODO: ideally we could avoid basing this off of strings, and use the step in analyze.c
@@ -942,18 +941,12 @@ static bool parser_lookahead_erb_is_control_flow(parser_T* parser) {
942941 return false;
943942 }
944943
945- const char * data = content -> value .data ;
946- size_t remaining = content -> value .length ;
944+ hb_string_T trimmed = hb_string_trim_start (content -> value );
947945
948- while (remaining > 0 && is_whitespace (* data )) {
949- data ++ ;
950- remaining -- ;
951- }
952-
953- bool is_control_flow = starts_with_keyword (data , remaining , "end" ) || starts_with_keyword (data , remaining , "else" )
954- || starts_with_keyword (data , remaining , "elsif" ) || starts_with_keyword (data , remaining , "in" )
955- || starts_with_keyword (data , remaining , "when" ) || starts_with_keyword (data , remaining , "rescue" )
956- || starts_with_keyword (data , remaining , "ensure" );
946+ bool is_control_flow = starts_with_keyword (trimmed , "end" ) || starts_with_keyword (trimmed , "else" )
947+ || starts_with_keyword (trimmed , "elsif" ) || starts_with_keyword (trimmed , "in" )
948+ || starts_with_keyword (trimmed , "when" ) || starts_with_keyword (trimmed , "rescue" )
949+ || starts_with_keyword (trimmed , "ensure" );
957950
958951 token_free (content , parser -> allocator );
959952
0 commit comments