( node: SyntaxNode, firstPattern: Pattern, patterns: Pattern[] )
| 216 | } |
| 217 | |
| 218 | function searchNodeDescending( |
| 219 | node: SyntaxNode, |
| 220 | firstPattern: Pattern, |
| 221 | patterns: Pattern[] |
| 222 | ): NodePattern { |
| 223 | let tmpNode = node; |
| 224 | // Even if descending search we return the "top" node by default. |
| 225 | let important: NodePattern = [node, firstPattern]; |
| 226 | for (let i = 1; i < patterns.length; ++i) { |
| 227 | const pattern = patterns[i]; |
| 228 | const children = tmpNode.namedChildren.filter((node) => |
| 229 | pattern.typeEquals(node) |
| 230 | ); |
| 231 | if (children.length !== 1) { |
| 232 | if (pattern.isOptional) { |
| 233 | continue; |
| 234 | } |
| 235 | return null; |
| 236 | } |
| 237 | tmpNode = children[0]; |
| 238 | if (pattern.isImportant) { |
| 239 | important = [tmpNode, pattern]; |
| 240 | } |
| 241 | } |
| 242 | return important; |
| 243 | } |
| 244 | |
| 245 | class Pattern { |
| 246 | type: string; |
no test coverage detected