(isTagged: boolean)
| 2011 | // Parse template expression. |
| 2012 | |
| 2013 | parseTemplateElement(isTagged: boolean): N.TemplateElement { |
| 2014 | const { start, startLoc, end, value } = this.state; |
| 2015 | const elemStart = start + 1; |
| 2016 | const elem = this.startNodeAt<N.TemplateElement>( |
| 2017 | createPositionWithColumnOffset(startLoc, 1), |
| 2018 | ); |
| 2019 | if (value === null) { |
| 2020 | if (!isTagged) { |
| 2021 | this.raise( |
| 2022 | Errors.InvalidEscapeSequenceTemplate, |
| 2023 | // FIXME: Adding 1 is probably wrong. |
| 2024 | createPositionWithColumnOffset( |
| 2025 | this.state.firstInvalidTemplateEscapePos!, |
| 2026 | 1, |
| 2027 | ), |
| 2028 | ); |
| 2029 | } |
| 2030 | } |
| 2031 | |
| 2032 | const isTail = this.match(tt.templateTail); |
| 2033 | const endOffset = isTail ? -1 : -2; |
| 2034 | const elemEnd = end + endOffset; |
| 2035 | elem.value = { |
| 2036 | raw: this.input.slice(elemStart, elemEnd).replace(/\r\n?/g, "\n"), |
| 2037 | cooked: value === null ? null : value.slice(1, endOffset), |
| 2038 | }; |
| 2039 | elem.tail = isTail; |
| 2040 | this.next(); |
| 2041 | const finishedNode = this.finishNode(elem, "TemplateElement"); |
| 2042 | this.resetEndLocation( |
| 2043 | finishedNode, |
| 2044 | createPositionWithColumnOffset(this.state.lastTokEndLoc!, endOffset), |
| 2045 | ); |
| 2046 | return finishedNode; |
| 2047 | } |
| 2048 | |
| 2049 | // https://tc39.es/ecma262/#prod-TemplateLiteral |
| 2050 | parseTemplate(this: Parser, isTagged: boolean): N.TemplateLiteral { |
nothing calls this directly
no test coverage detected