Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 26 additions & 31 deletions internal/ast/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -6141,15 +6141,16 @@ type StringLiteral struct {
LiteralLikeBase
}

func (f *NodeFactory) NewStringLiteral(text string) *Node {
func (f *NodeFactory) NewStringLiteral(text string, flags TokenFlags) *Node {
data := f.stringLiteralPool.New()
data.Text = text
data.TokenFlags = flags & TokenFlagsStringLiteralFlags
f.textCount++
return f.newNode(KindStringLiteral, data)
}

func (node *StringLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewStringLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
return cloneNode(f.AsNodeFactory().NewStringLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks)
}

func IsStringLiteral(node *Node) bool {
Expand All @@ -6163,15 +6164,16 @@ type NumericLiteral struct {
LiteralLikeBase
}

func (f *NodeFactory) NewNumericLiteral(text string) *Node {
func (f *NodeFactory) NewNumericLiteral(text string, flags TokenFlags) *Node {
data := f.numericLiteralPool.New()
data.Text = text
data.TokenFlags = flags & TokenFlagsNumericLiteralFlags
f.textCount++
return f.newNode(KindNumericLiteral, data)
}

func (node *NumericLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNumericLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
return cloneNode(f.AsNodeFactory().NewNumericLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks)
}

func IsNumericLiteral(node *Node) bool {
Expand All @@ -6185,15 +6187,16 @@ type BigIntLiteral struct {
LiteralLikeBase
}

func (f *NodeFactory) NewBigIntLiteral(text string) *Node {
func (f *NodeFactory) NewBigIntLiteral(text string, flags TokenFlags) *Node {
data := &BigIntLiteral{}
data.Text = text
data.TokenFlags = flags & TokenFlagsNumericLiteralFlags
f.textCount++
return f.newNode(KindBigIntLiteral, data)
}

func (node *BigIntLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewBigIntLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
return cloneNode(f.AsNodeFactory().NewBigIntLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks)
}

func (node *BigIntLiteral) computeSubtreeFacts() SubtreeFacts {
Expand All @@ -6211,15 +6214,16 @@ type RegularExpressionLiteral struct {
LiteralLikeBase
}

func (f *NodeFactory) NewRegularExpressionLiteral(text string) *Node {
func (f *NodeFactory) NewRegularExpressionLiteral(text string, flags TokenFlags) *Node {
data := &RegularExpressionLiteral{}
data.Text = text
data.TokenFlags = flags & TokenFlagsRegularExpressionLiteralFlags
f.textCount++
return f.newNode(KindRegularExpressionLiteral, data)
}

func (node *RegularExpressionLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewRegularExpressionLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
return cloneNode(f.AsNodeFactory().NewRegularExpressionLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks)
}

func IsRegularExpressionLiteral(node *Node) bool {
Expand All @@ -6233,15 +6237,16 @@ type NoSubstitutionTemplateLiteral struct {
TemplateLiteralLikeBase
}

func (f *NodeFactory) NewNoSubstitutionTemplateLiteral(text string) *Node {
func (f *NodeFactory) NewNoSubstitutionTemplateLiteral(text string, templateFlags TokenFlags) *Node {
data := &NoSubstitutionTemplateLiteral{}
data.Text = text
data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags
f.textCount++
return f.newNode(KindNoSubstitutionTemplateLiteral, data)
}

func (node *NoSubstitutionTemplateLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNoSubstitutionTemplateLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
return cloneNode(f.AsNodeFactory().NewNoSubstitutionTemplateLiteral(node.Text, node.TemplateFlags), node.AsNode(), f.AsNodeFactory().hooks)
}

// BinaryExpression
Expand Down Expand Up @@ -8722,7 +8727,7 @@ func (f *NodeFactory) NewTemplateHead(text string, rawText string, templateFlags
data := &TemplateHead{}
data.Text = text
data.RawText = rawText
data.TemplateFlags = templateFlags
data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags
f.textCount++
return f.newNode(KindTemplateHead, data)
}
Expand All @@ -8746,7 +8751,7 @@ func (f *NodeFactory) NewTemplateMiddle(text string, rawText string, templateFla
data := &TemplateMiddle{}
data.Text = text
data.RawText = rawText
data.TemplateFlags = templateFlags
data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags
f.textCount++
return f.newNode(KindTemplateMiddle, data)
}
Expand All @@ -8770,7 +8775,7 @@ func (f *NodeFactory) NewTemplateTail(text string, rawText string, templateFlags
data := &TemplateTail{}
data.Text = text
data.RawText = rawText
data.TemplateFlags = templateFlags
data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags
f.textCount++
return f.newNode(KindTemplateTail, data)
}
Expand Down Expand Up @@ -10980,33 +10985,23 @@ func createToken(kind Kind, file *SourceFile, pos, end int, flags TokenFlags) *N
text := file.text[pos:end]
switch kind {
case KindNumericLiteral:
literal := file.tokenFactory.NewNumericLiteral(text)
literal.AsNumericLiteral().TokenFlags = flags & TokenFlagsNumericLiteralFlags
return literal
return file.tokenFactory.NewNumericLiteral(text, flags)
case KindBigIntLiteral:
literal := file.tokenFactory.NewBigIntLiteral(text)
literal.AsBigIntLiteral().TokenFlags = flags & TokenFlagsNumericLiteralFlags
return literal
return file.tokenFactory.NewBigIntLiteral(text, flags)
case KindStringLiteral:
literal := file.tokenFactory.NewStringLiteral(text)
literal.AsStringLiteral().TokenFlags = flags & TokenFlagsStringLiteralFlags
return literal
return file.tokenFactory.NewStringLiteral(text, flags)
case KindJsxText, KindJsxTextAllWhiteSpaces:
return file.tokenFactory.NewJsxText(text, kind == KindJsxTextAllWhiteSpaces)
case KindRegularExpressionLiteral:
literal := file.tokenFactory.NewRegularExpressionLiteral(text)
literal.AsRegularExpressionLiteral().TokenFlags = flags & TokenFlagsRegularExpressionLiteralFlags
return literal
return file.tokenFactory.NewRegularExpressionLiteral(text, flags)
case KindNoSubstitutionTemplateLiteral:
literal := file.tokenFactory.NewNoSubstitutionTemplateLiteral(text)
literal.AsNoSubstitutionTemplateLiteral().TokenFlags = flags & TokenFlagsTemplateLiteralLikeFlags
return literal
return file.tokenFactory.NewNoSubstitutionTemplateLiteral(text, flags)
case KindTemplateHead:
return file.tokenFactory.NewTemplateHead(text, "" /*rawText*/, flags&TokenFlagsTemplateLiteralLikeFlags)
return file.tokenFactory.NewTemplateHead(text, "" /*rawText*/, flags)
case KindTemplateMiddle:
return file.tokenFactory.NewTemplateMiddle(text, "" /*rawText*/, flags&TokenFlagsTemplateLiteralLikeFlags)
return file.tokenFactory.NewTemplateMiddle(text, "" /*rawText*/, flags)
case KindTemplateTail:
return file.tokenFactory.NewTemplateTail(text, "" /*rawText*/, flags&TokenFlagsTemplateLiteralLikeFlags)
return file.tokenFactory.NewTemplateTail(text, "" /*rawText*/, flags)
case KindIdentifier:
return file.tokenFactory.NewIdentifier(text)
case KindPrivateIdentifier:
Expand Down
2 changes: 1 addition & 1 deletion internal/checker/checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -17363,7 +17363,7 @@ func (c *Checker) getSyntheticElementAccess(node *ast.Node) *ast.Node {
parentAccess := c.getParentElementAccess(node)
if parentAccess != nil && getFlowNodeOfNode(parentAccess) != nil {
if propName, ok := c.getDestructuringPropertyName(node); ok {
literal := c.factory.NewStringLiteral(propName)
literal := c.factory.NewStringLiteral(propName, ast.TokenFlagsNone)
literal.Loc = node.Loc
lhsExpr := parentAccess
if !ast.IsLeftHandSideExpression(parentAccess) {
Expand Down
8 changes: 4 additions & 4 deletions internal/checker/emitresolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -972,18 +972,18 @@ func (r *EmitResolver) CreateLiteralConstValue(emitContext *printer.EmitContext,
}
switch value := t.AsLiteralType().value.(type) {
case string:
return emitContext.Factory.NewStringLiteral(value)
return emitContext.Factory.NewStringLiteral(value, ast.TokenFlagsNone)
case jsnum.Number:
if value.Abs() != value {
// negative
return emitContext.Factory.NewPrefixUnaryExpression(
ast.KindMinusToken,
emitContext.Factory.NewNumericLiteral(value.String()[1:]),
emitContext.Factory.NewNumericLiteral(value.String()[1:], ast.TokenFlagsNone),
)
}
return emitContext.Factory.NewNumericLiteral(value.String())
return emitContext.Factory.NewNumericLiteral(value.String(), ast.TokenFlagsNone)
case jsnum.PseudoBigInt:
return emitContext.Factory.NewBigIntLiteral(pseudoBigIntToString(value) + "n")
return emitContext.Factory.NewBigIntLiteral(pseudoBigIntToString(value)+"n", ast.TokenFlagsNone)
case bool:
kind := ast.KindFalseKeyword
if value {
Expand Down
35 changes: 17 additions & 18 deletions internal/checker/nodebuilderimpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -757,11 +757,11 @@ func (b *NodeBuilderImpl) createExpressionFromSymbolChain(chain []*ast.Symbol, i

var expression *ast.Expression
if startsWithSingleOrDoubleQuote(symbolName) && symbol.Flags&ast.SymbolFlagsEnumMember == 0 {
expression = b.newStringLiteral(stringutil.UnquoteString(symbolName))
expression = b.newStringLiteralEx(stringutil.UnquoteString(symbolName), symbolName[0] == '\'')
} else if jsnum.FromString(symbolName).String() == symbolName {
// TODO: the follwing in strada would assert if the number is negative, but no such assertion exists here
// Moreover, what's even guaranteeing the name *isn't* -1 here anyway? Needs double-checking.
expression = b.f.NewNumericLiteral(symbolName)
expression = b.f.NewNumericLiteral(symbolName, ast.TokenFlagsNone)
}
if expression == nil {
expression = b.f.NewIdentifier(symbolName)
Expand Down Expand Up @@ -2088,12 +2088,9 @@ func (b *NodeBuilderImpl) createPropertyNameNodeForIdentifierOrLiteral(name stri
return b.f.NewIdentifier(name)
}
if !stringNamed && !isMethodNamedNew && isNumericLiteralName(name) && jsnum.FromString(name) >= 0 {
return b.f.NewNumericLiteral(name)
}
result := b.f.NewStringLiteral(name)
if singleQuote {
result.AsStringLiteral().TokenFlags |= ast.TokenFlagsSingleQuote
return b.f.NewNumericLiteral(name, ast.TokenFlagsNone)
}
result := b.f.NewStringLiteral(name, core.IfElse(singleQuote, ast.TokenFlagsSingleQuote, ast.TokenFlagsNone))
return result
}

Expand Down Expand Up @@ -2157,14 +2154,11 @@ func (b *NodeBuilderImpl) getPropertyNameNodeForSymbolFromNameType(symbol *ast.S
name = nameType.AsLiteralType().value.(string)
}
if !scanner.IsIdentifierText(name, core.LanguageVariantStandard) && (stringNamed || !isNumericLiteralName(name)) {
node := b.f.NewStringLiteral(name)
if singleQuote {
node.AsStringLiteral().TokenFlags |= ast.TokenFlagsSingleQuote
}
node := b.f.NewStringLiteral(name, core.IfElse(singleQuote, ast.TokenFlagsSingleQuote, ast.TokenFlagsNone))
return node
}
if isNumericLiteralName(name) && name[0] == '-' {
return b.f.NewComputedPropertyName(b.f.NewPrefixUnaryExpression(ast.KindMinusToken, b.f.NewNumericLiteral(name[1:])))
return b.f.NewComputedPropertyName(b.f.NewPrefixUnaryExpression(ast.KindMinusToken, b.f.NewNumericLiteral(name[1:], ast.TokenFlagsNone)))
}
return b.createPropertyNameNodeForIdentifierOrLiteral(name, singleQuote, stringNamed, isMethod)
}
Expand Down Expand Up @@ -2896,14 +2890,14 @@ func (b *NodeBuilderImpl) typeToTypeNode(t *Type) *ast.TypeNode {
value := t.AsLiteralType().value.(jsnum.Number)
b.ctx.approximateLength += len(value.String())
if value < 0 {
return b.f.NewLiteralTypeNode(b.f.NewPrefixUnaryExpression(ast.KindMinusToken, b.f.NewNumericLiteral(value.String()[1:])))
return b.f.NewLiteralTypeNode(b.f.NewPrefixUnaryExpression(ast.KindMinusToken, b.f.NewNumericLiteral(value.String()[1:], ast.TokenFlagsNone)))
} else {
return b.f.NewLiteralTypeNode(b.f.NewNumericLiteral(value.String()))
return b.f.NewLiteralTypeNode(b.f.NewNumericLiteral(value.String(), ast.TokenFlagsNone))
}
}
if t.flags&TypeFlagsBigIntLiteral != 0 {
b.ctx.approximateLength += len(pseudoBigIntToString(getBigIntLiteralValue(t))) + 1
return b.f.NewLiteralTypeNode(b.f.NewBigIntLiteral(pseudoBigIntToString(getBigIntLiteralValue(t)) + "n"))
return b.f.NewLiteralTypeNode(b.f.NewBigIntLiteral(pseudoBigIntToString(getBigIntLiteralValue(t))+"n", ast.TokenFlagsNone))
}
if t.flags&TypeFlagsBooleanLiteral != 0 {
if t.AsLiteralType().value.(bool) {
Expand Down Expand Up @@ -3102,10 +3096,15 @@ func (b *NodeBuilderImpl) typeToTypeNode(t *Type) *ast.TypeNode {
}

func (b *NodeBuilderImpl) newStringLiteral(text string) *ast.Node {
node := b.f.NewStringLiteral(text)
if b.ctx.flags&nodebuilder.FlagsUseSingleQuotesForStringLiteralType != 0 {
node.AsStringLiteral().TokenFlags |= ast.TokenFlagsSingleQuote
return b.newStringLiteralEx(text, false /*isSingleQuote*/)
}

func (b *NodeBuilderImpl) newStringLiteralEx(text string, isSingleQuote bool) *ast.Node {
flags := ast.TokenFlagsNone
if isSingleQuote || b.ctx.flags&nodebuilder.FlagsUseSingleQuotesForStringLiteralType != 0 {
flags |= ast.TokenFlagsSingleQuote
}
node := b.f.NewStringLiteral(text, flags)
return node
}

Expand Down
2 changes: 1 addition & 1 deletion internal/compiler/fileloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(t *parseTask) {
func (p *fileLoader) createSyntheticImport(text string, file *ast.SourceFile) *ast.Node {
p.factoryMu.Lock()
defer p.factoryMu.Unlock()
externalHelpersModuleReference := p.factory.NewStringLiteral(text)
externalHelpersModuleReference := p.factory.NewStringLiteral(text, ast.TokenFlagsNone)
importDecl := p.factory.NewImportDeclaration(nil, nil, externalHelpersModuleReference, nil)
// !!! addInternalEmitFlags(importDecl, InternalEmitFlags.NeverApplyImportHelper);
externalHelpersModuleReference.Parent = importDecl
Expand Down
8 changes: 4 additions & 4 deletions internal/ls/autoimportfixes.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,10 +298,10 @@ func (ls *LanguageService) getNewImports(
namespaceLikeImport *Import, // { importKind: ImportKind.CommonJS | ImportKind.Namespace; }
compilerOptions *core.CompilerOptions,
) []*ast.Statement {
moduleSpecifierStringLiteral := ct.NodeFactory.NewStringLiteral(moduleSpecifier)
if quotePreference == quotePreferenceSingle {
moduleSpecifierStringLiteral.AsStringLiteral().TokenFlags |= ast.TokenFlagsSingleQuote
}
moduleSpecifierStringLiteral := ct.NodeFactory.NewStringLiteral(
moduleSpecifier,
core.IfElse(quotePreference == quotePreferenceSingle, ast.TokenFlagsSingleQuote, ast.TokenFlagsNone),
)
var statements []*ast.Statement // []AnyImportSyntax
if defaultImport != nil || len(namedImports) > 0 {
// `verbatimModuleSyntax` should prefer top-level `import type` -
Expand Down
8 changes: 6 additions & 2 deletions internal/ls/autoimports.go
Original file line number Diff line number Diff line change
Expand Up @@ -1564,7 +1564,7 @@ func (l *LanguageService) codeActionForFixWorker(
}

if fix.useRequire {
declarations = getNewRequires(changeTracker, fix.moduleSpecifier, defaultImport, namedImports, namespaceLikeImport, l.GetProgram().Options())
declarations = getNewRequires(changeTracker, fix.moduleSpecifier, getQuotePreference(sourceFile, l.UserPreferences()), defaultImport, namedImports, namespaceLikeImport, l.GetProgram().Options())
} else {
declarations = l.getNewImports(changeTracker, fix.moduleSpecifier, getQuotePreference(sourceFile, l.UserPreferences()), defaultImport, namedImports, namespaceLikeImport, l.GetProgram().Options())
}
Expand Down Expand Up @@ -1598,12 +1598,16 @@ func (l *LanguageService) codeActionForFixWorker(
func getNewRequires(
changeTracker *change.Tracker,
moduleSpecifier string,
quotePreference quotePreference,
defaultImport *Import,
namedImports []*Import,
namespaceLikeImport *Import,
compilerOptions *core.CompilerOptions,
) []*ast.Statement {
quotedModuleSpecifier := changeTracker.NodeFactory.NewStringLiteral(moduleSpecifier)
quotedModuleSpecifier := changeTracker.NodeFactory.NewStringLiteral(
moduleSpecifier,
core.IfElse(quotePreference == quotePreferenceSingle, ast.TokenFlagsSingleQuote, ast.TokenFlagsNone),
)
var statements []*ast.Statement

// const { default: foo, bar, etc } = require('./mod');
Expand Down
2 changes: 1 addition & 1 deletion internal/ls/codeactions_importfixes.go
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ func promoteImportClause(
outputpaths.GetOutputExtension(moduleText, compilerOptions.Jsx),
)
// Replace the module specifier with the new extension
newStringLiteral := changes.NewStringLiteral(changedExtension)
newStringLiteral := changes.NewStringLiteral(changedExtension, moduleSpecifier.AsStringLiteral().TokenFlags)
changes.ReplaceNode(sourceFile, moduleSpecifier, newStringLiteral, nil)
}
}
Expand Down
21 changes: 8 additions & 13 deletions internal/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -3562,7 +3562,7 @@ func (p *Parser) parseTemplateHead(isTaggedTemplate bool) *ast.Node {
p.reScanTemplateToken(false /*isTaggedTemplate*/)
}
pos := p.nodePos()
result := p.factory.NewTemplateHead(p.scanner.TokenValue(), p.getTemplateLiteralRawText(2 /*endLength*/), p.scanner.TokenFlags()&ast.TokenFlagsTemplateLiteralLikeFlags)
result := p.factory.NewTemplateHead(p.scanner.TokenValue(), p.getTemplateLiteralRawText(2 /*endLength*/), p.scanner.TokenFlags())
p.nextToken()
return p.finishNode(result, pos)
}
Expand Down Expand Up @@ -3606,9 +3606,9 @@ func (p *Parser) parseTemplateMiddleOrTail() *ast.Node {
pos := p.nodePos()
var result *ast.Node
if p.token == ast.KindTemplateMiddle {
result = p.factory.NewTemplateMiddle(p.scanner.TokenValue(), p.getTemplateLiteralRawText(2 /*endLength*/), p.scanner.TokenFlags()&ast.TokenFlagsTemplateLiteralLikeFlags)
result = p.factory.NewTemplateMiddle(p.scanner.TokenValue(), p.getTemplateLiteralRawText(2 /*endLength*/), p.scanner.TokenFlags())
} else {
result = p.factory.NewTemplateTail(p.scanner.TokenValue(), p.getTemplateLiteralRawText(1 /*endLength*/), p.scanner.TokenFlags()&ast.TokenFlagsTemplateLiteralLikeFlags)
result = p.factory.NewTemplateTail(p.scanner.TokenValue(), p.getTemplateLiteralRawText(1 /*endLength*/), p.scanner.TokenFlags())
}
p.nextToken()
return p.finishNode(result, pos)
Expand Down Expand Up @@ -5646,20 +5646,15 @@ func (p *Parser) parseLiteralExpression(intern bool) *ast.Node {
var result *ast.Node
switch p.token {
case ast.KindStringLiteral:
result = p.factory.NewStringLiteral(text)
result.AsStringLiteral().TokenFlags |= tokenFlags & ast.TokenFlagsStringLiteralFlags
result = p.factory.NewStringLiteral(text, tokenFlags)
case ast.KindNumericLiteral:
result = p.factory.NewNumericLiteral(text)
result.AsNumericLiteral().TokenFlags |= tokenFlags & ast.TokenFlagsNumericLiteralFlags
result = p.factory.NewNumericLiteral(text, tokenFlags)
case ast.KindBigIntLiteral:
result = p.factory.NewBigIntLiteral(text)
result.AsBigIntLiteral().TokenFlags |= tokenFlags & ast.TokenFlagsNumericLiteralFlags
result = p.factory.NewBigIntLiteral(text, tokenFlags)
case ast.KindRegularExpressionLiteral:
result = p.factory.NewRegularExpressionLiteral(text)
result.AsRegularExpressionLiteral().TokenFlags |= tokenFlags & ast.TokenFlagsRegularExpressionLiteralFlags
result = p.factory.NewRegularExpressionLiteral(text, tokenFlags)
case ast.KindNoSubstitutionTemplateLiteral:
result = p.factory.NewNoSubstitutionTemplateLiteral(text)
result.AsNoSubstitutionTemplateLiteral().TokenFlags |= tokenFlags & ast.TokenFlagsTemplateLiteralLikeFlags
result = p.factory.NewNoSubstitutionTemplateLiteral(text, tokenFlags)
default:
panic("Unhandled case in parseLiteralExpression")
}
Expand Down
Loading