( node: SyntaxNode, lastPattern: Pattern, patterns: Pattern[] )
| 189 | type NodePattern = [SyntaxNode, Pattern] | null; |
| 190 | |
| 191 | function searchNodeAscending( |
| 192 | node: SyntaxNode, |
| 193 | lastPattern: Pattern, |
| 194 | patterns: Pattern[] |
| 195 | ): NodePattern { |
| 196 | let resultNode = node; |
| 197 | let resultPattern = lastPattern; |
| 198 | let important: NodePattern = lastPattern.isImportant |
| 199 | ? [node, lastPattern] |
| 200 | : null; |
| 201 | for (let i = patterns.length - 2; i > -1; --i) { |
| 202 | const pattern = patterns[i]; |
| 203 | if (resultNode.parent == null || !pattern.typeEquals(resultNode.parent)) { |
| 204 | if (pattern.isOptional) { |
| 205 | continue; |
| 206 | } |
| 207 | return null; |
| 208 | } |
| 209 | resultNode = resultNode.parent; |
| 210 | resultPattern = pattern; |
| 211 | if (pattern.isImportant) { |
| 212 | important = [resultNode, pattern]; |
| 213 | } |
| 214 | } |
| 215 | return important != null ? important : [resultNode, resultPattern]; |
| 216 | } |
| 217 | |
| 218 | function searchNodeDescending( |
| 219 | node: SyntaxNode, |
no test coverage detected