* ```abnf * NamedType = IDENT ["<" Type ">"] * ```
(s: ITokenStream)
| 151 | * ``` |
| 152 | */ |
| 153 | function parseNamedType(s: ITokenStream): Ast.TypeSource { |
| 154 | const startPos = s.getPos(); |
| 155 | |
| 156 | let name: string; |
| 157 | if (s.is(TokenKind.Identifier)) { |
| 158 | name = s.getTokenValue(); |
| 159 | s.next(); |
| 160 | } else { |
| 161 | s.expect(TokenKind.NullKeyword); |
| 162 | s.next(); |
| 163 | name = 'null'; |
| 164 | } |
| 165 | |
| 166 | // inner type |
| 167 | let inner: Ast.TypeSource | undefined; |
| 168 | if (s.is(TokenKind.Lt)) { |
| 169 | s.next(); |
| 170 | inner = parseType(s); |
| 171 | s.expect(TokenKind.Gt); |
| 172 | s.next(); |
| 173 | } |
| 174 | |
| 175 | return NODE('namedTypeSource', { name, inner }, startPos, s.getPos()); |
| 176 | } |
no test coverage detected