()
| 3137 | } |
| 3138 | |
| 3139 | func (p *Parser) parseMappedType() *ast.Node { |
| 3140 | pos := p.nodePos() |
| 3141 | p.parseExpected(ast.KindOpenBraceToken) |
| 3142 | var readonlyToken *ast.Node // ReadonlyKeyword | PlusToken | MinusToken |
| 3143 | if p.token == ast.KindReadonlyKeyword || p.token == ast.KindPlusToken || p.token == ast.KindMinusToken { |
| 3144 | readonlyToken = p.parseTokenNode() |
| 3145 | if readonlyToken.Kind != ast.KindReadonlyKeyword { |
| 3146 | p.parseExpected(ast.KindReadonlyKeyword) |
| 3147 | } |
| 3148 | } |
| 3149 | p.parseExpected(ast.KindOpenBracketToken) |
| 3150 | typeParameter := p.parseMappedTypeParameter() |
| 3151 | var nameType *ast.TypeNode |
| 3152 | if p.parseOptional(ast.KindAsKeyword) { |
| 3153 | nameType = p.parseType() |
| 3154 | } |
| 3155 | p.parseExpected(ast.KindCloseBracketToken) |
| 3156 | var questionToken *ast.Node // QuestionToken | PlusToken | MinusToken |
| 3157 | if p.token == ast.KindQuestionToken || p.token == ast.KindPlusToken || p.token == ast.KindMinusToken { |
| 3158 | questionToken = p.parseTokenNode() |
| 3159 | if questionToken.Kind != ast.KindQuestionToken { |
| 3160 | p.parseExpected(ast.KindQuestionToken) |
| 3161 | } |
| 3162 | } |
| 3163 | typeNode := p.parseTypeAnnotation() |
| 3164 | p.parseSemicolon() |
| 3165 | members := p.parseList(PCTypeMembers, (*Parser).parseTypeMember) |
| 3166 | p.parseExpected(ast.KindCloseBraceToken) |
| 3167 | return p.finishNode(p.factory.NewMappedTypeNode(readonlyToken, typeParameter, nameType, questionToken, typeNode, members), pos) |
| 3168 | } |
| 3169 | |
| 3170 | func (p *Parser) parseMappedTypeParameter() *ast.Node { |
| 3171 | pos := p.nodePos() |
no test coverage detected