@@ -4,17 +4,20 @@ use std::{usize, vec};
44use tree_sitter:: { Node , Parser , Point , Tree } ;
55
66use super :: tokens:: {
7- DrupalRoute , DrupalRouteDefaults , DrupalService , PhpClassName , PhpMethod , Token , TokenData ,
7+ DrupalPermission , DrupalRoute , DrupalRouteDefaults , DrupalService , PhpClassName , PhpMethod ,
8+ Token , TokenData ,
89} ;
910
1011pub struct YamlParser {
1112 source : String ,
13+ uri : String ,
1214}
1315
1416impl YamlParser {
15- pub fn new ( source : & str ) -> Self {
17+ pub fn new ( source : & str , uri : & str ) -> Self {
1618 Self {
1719 source : source. to_string ( ) ,
20+ uri : uri. to_string ( ) ,
1821 }
1922 }
2023
@@ -95,8 +98,20 @@ impl YamlParser {
9598 let value_node = node. child_by_field_name ( "value" ) ?;
9699
97100 if let Some ( map) = self . get_block_node_map ( & value_node) {
101+ // Parse Drupal Permission.
102+ if self . uri . ends_with ( ".permissions.yml" ) {
103+ if let Some ( title) = map. get ( "title" ) {
104+ return Some ( Token :: new (
105+ TokenData :: DrupalPermissionDefinition ( DrupalPermission {
106+ name : key. to_string ( ) ,
107+ title : self . get_node_text ( title) . to_string ( ) ,
108+ } ) ,
109+ node. range ( ) ,
110+ ) ) ;
111+ }
112+ }
98113 // Parse Drupal Route.
99- if let ( Some ( path) , Some ( defaults) ) = ( map. get ( "path" ) , map. get ( "defaults" ) ) {
114+ else if let ( Some ( path) , Some ( defaults) ) = ( map. get ( "path" ) , map. get ( "defaults" ) ) {
100115 return Some ( Token :: new (
101116 TokenData :: DrupalRouteDefinition ( DrupalRoute {
102117 name : key. to_string ( ) ,
@@ -132,6 +147,18 @@ impl YamlParser {
132147 TokenData :: PhpClassReference ( PhpClassName :: from ( self . get_node_text ( & value_node) ) ) ,
133148 value_node. range ( ) ,
134149 ) ) ,
150+ "_permission" => Some ( Token :: new (
151+ TokenData :: DrupalPermissionReference (
152+ self . get_node_text ( & value_node) . to_string ( ) . replace ( "'" , "" ) ,
153+ ) ,
154+ value_node. range ( ) ,
155+ ) ) ,
156+ "route_name" => Some ( Token :: new (
157+ TokenData :: DrupalRouteReference (
158+ self . get_node_text ( & value_node) . to_string ( ) . replace ( "'" , "" ) ,
159+ ) ,
160+ value_node. range ( ) ,
161+ ) ) ,
135162 "arguments" => {
136163 let argument = value_node. descendant_for_point_range ( point?, point?) ?;
137164 if argument. kind ( ) != "single_quote_scalar" {
0 commit comments