Compare commits

..

2 commits

Author SHA1 Message Date
Gabriela Araujo Britto 64e0bd4263 fixes 2021-11-16 16:41:22 -08:00
Gabriela Araujo Britto 3e59096506 call formatter in completions 2021-11-16 16:41:21 -08:00
72 changed files with 254 additions and 1269 deletions

12
package-lock.json generated
View file

@ -676,9 +676,9 @@
"dev": true
},
"@types/node": {
"version": "16.11.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz",
"integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==",
"version": "16.11.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
"integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==",
"dev": true
},
"@types/node-fetch": {
@ -6997,9 +6997,9 @@
}
},
"source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"version": "0.5.20",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz",
"integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",

View file

@ -5657,8 +5657,8 @@ namespace ts {
const expandedParams = getExpandedParameters(signature, /*skipUnionExpanding*/ true)[0];
// If the expanded parameter list had a variadic in a non-trailing position, don't expand it
const parameters = (some(expandedParams, p => p !== expandedParams[expandedParams.length - 1] && !!(getCheckFlags(p) & CheckFlags.RestParameter)) ? signature.parameters : expandedParams).map(parameter => symbolToParameterDeclaration(parameter, context, kind === SyntaxKind.Constructor, options?.privateSymbolVisitor, options?.bundledImports));
const thisParameter = tryGetThisParameterDeclaration(signature, context);
if (thisParameter) {
if (signature.thisParameter) {
const thisParameter = symbolToParameterDeclaration(signature.thisParameter, context);
parameters.unshift(thisParameter);
}
@ -5713,25 +5713,6 @@ namespace ts {
return node;
}
function tryGetThisParameterDeclaration(signature: Signature, context: NodeBuilderContext) {
if (signature.thisParameter) {
return symbolToParameterDeclaration(signature.thisParameter, context);
}
if (signature.declaration) {
const thisTag = getJSDocThisTag(signature.declaration);
if (thisTag && thisTag.typeExpression) {
return factory.createParameterDeclaration(
/* decorators */ undefined,
/* modifiers */ undefined,
/* dotDotDotToken */ undefined,
"this",
/* questionToken */ undefined,
typeToTypeNodeHelper(getTypeFromTypeNode(thisTag.typeExpression), context)
);
}
}
}
function typeParameterToDeclarationWithConstraint(type: TypeParameter, context: NodeBuilderContext, constraintNode: TypeNode | undefined): TypeParameterDeclaration {
const savedContextFlags = context.flags;
context.flags &= ~NodeBuilderFlags.WriteTypeParametersInQualifiedName; // Avoids potential infinite loop when building for a claimspace with a generic
@ -6223,8 +6204,12 @@ namespace ts {
firstChar = symbolName.charCodeAt(0);
}
let expression: Expression | undefined;
if (isSingleOrDoubleQuote(firstChar) && !(symbol.flags & SymbolFlags.EnumMember)) {
expression = factory.createStringLiteral(stripQuotes(symbolName).replace(/\\./g, s => s.substring(1)), firstChar === CharacterCodes.singleQuote);
if (isSingleOrDoubleQuote(firstChar)) {
expression = factory.createStringLiteral(
symbolName
.substring(1, symbolName.length - 1)
.replace(/\\./g, s => s.substring(1)),
firstChar === CharacterCodes.singleQuote);
}
else if (("" + +symbolName) === symbolName) {
expression = factory.createNumericLiteral(+symbolName);
@ -40422,8 +40407,9 @@ namespace ts {
const enclosingFile = getSourceFileOfNode(node);
const links = getNodeLinks(enclosingFile);
if (!(links.flags & NodeCheckFlags.TypeChecked)) {
links.deferredNodes ||= new Set();
links.deferredNodes.add(node);
links.deferredNodes = links.deferredNodes || new Map();
const id = getNodeId(node);
links.deferredNodes.set(id, node);
}
}

View file

@ -23,6 +23,34 @@ namespace ts {
export const emptyMap: ReadonlyESMap<never, never> = new Map<never, never>();
export const emptySet: ReadonlySet<never> = new Set<never>();
/**
* Create a new map.
* @deprecated Use `new Map()` instead.
*/
export function createMap<K, V>(): ESMap<K, V>;
export function createMap<T>(): ESMap<string, T>;
export function createMap<K, V>(): ESMap<K, V> {
return new Map<K, V>();
}
/**
* Create a new map from a template object is provided, the map will copy entries from it.
* @deprecated Use `new Map(getEntries(template))` instead.
*/
export function createMapFromTemplate<T>(template: MapLike<T>): ESMap<string, T> {
const map: ESMap<string, T> = new Map<string, T>();
// Copies keys/values from template. Note that for..in will not throw if
// template is undefined, and instead will just exit the loop.
for (const key in template) {
if (hasOwnProperty.call(template, key)) {
map.set(key, template[key]);
}
}
return map;
}
export function length(array: readonly any[] | undefined): number {
return array ? array.length : 0;
}

View file

@ -171,6 +171,12 @@ namespace ts {
return value;
}
/**
* @deprecated Use `checkDefined` to check whether a value is defined inline. Use `assertIsDefined` to check whether
* a value is defined at the statement level.
*/
export const assertDefined = checkDefined;
export function assertEachIsDefined<T extends Node>(value: NodeArray<T>, message?: string, stackCrawlMark?: AnyFunction): asserts value is NodeArray<T>;
export function assertEachIsDefined<T>(value: readonly T[], message?: string, stackCrawlMark?: AnyFunction): asserts value is readonly NonNullable<T>[];
export function assertEachIsDefined<T>(value: readonly T[], message?: string, stackCrawlMark?: AnyFunction) {
@ -184,6 +190,12 @@ namespace ts {
return value;
}
/**
* @deprecated Use `checkEachDefined` to check whether the elements of an array are defined inline. Use `assertEachIsDefined` to check whether
* the elements of an array are defined at the statement level.
*/
export const assertEachDefined = checkEachDefined;
export function assertNever(member: never, message = "Illegal value:", stackCrawlMark?: AnyFunction): never {
const detail = typeof member === "object" && hasProperty(member, "kind") && hasProperty(member, "pos") && formatSyntaxKind ? "SyntaxKind: " + formatSyntaxKind((member as Node).kind) : JSON.stringify(member);
return fail(`${message} ${detail}`, stackCrawlMark || assertNever);

View file

@ -1940,7 +1940,7 @@ namespace ts {
emitPlaceholder(hint, node, snippet);
break;
case SnippetKind.TabStop:
emitTabStop(snippet);
emitTabStop(hint, node, snippet);
break;
}
}
@ -1952,7 +1952,12 @@ namespace ts {
// `${2:...}`
}
function emitTabStop(snippet: TabStop) {
function emitTabStop(hint: EmitHint, node: Node, snippet: TabStop) {
// A tab stop should only be attached to an empty node, i.e. a node that doesn't emit any text.
Debug.assert(node.kind === SyntaxKind.EmptyStatement,
`A tab stop cannot be attached to a node of kind ${Debug.formatSyntaxKind(node.kind)}.`);
Debug.assert(hint !== EmitHint.EmbeddedStatement,
`A tab stop cannot be attached to an embedded statement.`);
nonEscapingWrite(`\$${snippet.order}`);
}
@ -4109,9 +4114,13 @@ namespace ts {
}
function emitModifiers(node: Node, modifiers: NodeArray<Modifier> | undefined) {
if (modifiers && modifiers.length) {
emitList(node, modifiers, ListFormat.Modifiers);
writeSpace();
if (modifiers) {
onBeforeEmitNodeArray?.(modifiers);
if (modifiers.length) {
emitList(node, modifiers, ListFormat.Modifiers);
writeSpace();
}
onAfterEmitNodeArray?.(modifiers);
}
}

View file

@ -6387,7 +6387,7 @@ namespace ts {
sourceMapText = mapTextOrStripInternal as string;
}
const node = oldFileOfCurrentEmit ?
parseOldFileOfCurrentEmit(Debug.checkDefined(bundleFileInfo)) :
parseOldFileOfCurrentEmit(Debug.assertDefined(bundleFileInfo)) :
parseUnparsedSourceFile(bundleFileInfo, stripInternal, length);
node.fileName = fileName;
node.sourceMapPath = sourceMapPath;
@ -6587,13 +6587,13 @@ namespace ts {
};
node.javascriptPath = declarationTextOrJavascriptPath;
node.javascriptMapPath = javascriptMapPath;
node.declarationPath = Debug.checkDefined(javascriptMapTextOrDeclarationPath);
node.declarationPath = Debug.assertDefined(javascriptMapTextOrDeclarationPath);
node.declarationMapPath = declarationMapPath;
node.buildInfoPath = declarationMapTextOrBuildInfoPath;
Object.defineProperties(node, {
javascriptText: { get() { return definedTextGetter(declarationTextOrJavascriptPath); } },
javascriptMapText: { get() { return textGetter(javascriptMapPath); } }, // TODO:: if there is inline sourceMap in jsFile, use that
declarationText: { get() { return definedTextGetter(Debug.checkDefined(javascriptMapTextOrDeclarationPath)); } },
declarationText: { get() { return definedTextGetter(Debug.assertDefined(javascriptMapTextOrDeclarationPath)); } },
declarationMapText: { get() { return textGetter(declarationMapPath); } }, // TODO:: if there is inline sourceMap in dtsFile, use that
buildInfo: { get() { return getAndCacheBuildInfo(() => textGetter(declarationMapTextOrBuildInfoPath)); } }
});

View file

@ -818,25 +818,6 @@ namespace ts {
}
}
/** @internal */
export const plainJSErrors: Set<number> = new Set([
Diagnostics.Cannot_redeclare_block_scoped_variable_0.code,
Diagnostics.A_module_cannot_have_multiple_default_exports.code,
Diagnostics.Another_export_default_is_here.code,
Diagnostics.The_first_export_default_is_here.code,
Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module.code,
Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode.code,
Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here.code,
Diagnostics.constructor_is_a_reserved_word.code,
Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode.code,
Diagnostics.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode.code,
Diagnostics.Invalid_use_of_0_Modules_are_automatically_in_strict_mode.code,
Diagnostics.Invalid_use_of_0_in_strict_mode.code,
Diagnostics.A_label_is_not_allowed_here.code,
Diagnostics.Octal_literals_are_not_allowed_in_strict_mode.code,
Diagnostics.with_statements_are_not_allowed_in_strict_mode.code,
]);
/**
* Determine if source file needs to be re-created even if its text hasn't changed
*/
@ -1596,7 +1577,6 @@ namespace ts {
newSourceFile.originalFileName = oldSourceFile.originalFileName;
newSourceFile.resolvedPath = oldSourceFile.resolvedPath;
newSourceFile.fileName = oldSourceFile.fileName;
newSourceFile.impliedNodeFormat = oldSourceFile.impliedNodeFormat;
const packageName = oldProgram.sourceFileToPackageName.get(oldSourceFile.path);
if (packageName !== undefined) {
@ -2024,24 +2004,15 @@ namespace ts {
Debug.assert(!!sourceFile.bindDiagnostics);
const isJs = sourceFile.scriptKind === ScriptKind.JS || sourceFile.scriptKind === ScriptKind.JSX;
const isCheckJs = isJs && isCheckJsEnabledForFile(sourceFile, options);
const isPlainJs = isJs && !sourceFile.checkJsDirective && options.checkJs === undefined;
const isCheckJs = isCheckJsEnabledForFile(sourceFile, options);
const isTsNoCheck = !!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false;
// By default, only type-check .ts, .tsx, Deferred, plain JS, checked JS and External
// - plain JS: .js files with no // ts-check and checkJs: undefined
// - check JS: .js files with either // ts-check or checkJs: true
// - external: files that are added by plugins
// By default, only type-check .ts, .tsx, 'Deferred' and 'External' files (external files are added by plugins)
const includeBindAndCheckDiagnostics = !isTsNoCheck && (sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX
|| sourceFile.scriptKind === ScriptKind.External || isPlainJs || isCheckJs || sourceFile.scriptKind === ScriptKind.Deferred);
let bindDiagnostics: readonly Diagnostic[] = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray;
const checkDiagnostics = includeBindAndCheckDiagnostics && !isPlainJs ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray;
if (isPlainJs) {
bindDiagnostics = filter(bindDiagnostics, d => plainJSErrors.has(d.code));
}
// skip ts-expect-error errors in plain JS files, and skip JSDoc errors except in checked JS
return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics && !isPlainJs, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : undefined);
|| sourceFile.scriptKind === ScriptKind.External || isCheckJs || sourceFile.scriptKind === ScriptKind.Deferred);
const bindDiagnostics: readonly Diagnostic[] = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray;
const checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray;
return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : undefined);
});
}

View file

@ -619,7 +619,7 @@ namespace ts {
) {
if (resolution.refCount) {
resolution.refCount++;
Debug.assertIsDefined(resolution.files);
Debug.assertDefined(resolution.files);
}
else {
resolution.refCount = 1;
@ -696,7 +696,7 @@ namespace ts {
filePath: Path,
getResolutionWithResolvedFileName: GetResolutionWithResolvedFileName<T, R>,
) {
unorderedRemoveItem(Debug.checkDefined(resolution.files), filePath);
unorderedRemoveItem(Debug.assertDefined(resolution.files), filePath);
resolution.refCount!--;
if (resolution.refCount) {
return;
@ -798,7 +798,7 @@ namespace ts {
for (const resolution of resolutions) {
if (resolution.isInvalidated || !canInvalidate(resolution)) continue;
resolution.isInvalidated = invalidated = true;
for (const containingFilePath of Debug.checkDefined(resolution.files)) {
for (const containingFilePath of Debug.assertDefined(resolution.files)) {
(filesWithInvalidatedResolutions || (filesWithInvalidatedResolutions = new Set())).add(containingFilePath);
// When its a file with inferred types resolution, invalidate type reference directive resolution
hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames || endsWith(containingFilePath, inferredTypesContainingFile);

View file

@ -282,7 +282,7 @@ namespace ts {
function visitYieldExpression(node: YieldExpression) {
if (enclosingFunctionFlags & FunctionFlags.Async && enclosingFunctionFlags & FunctionFlags.Generator) {
if (node.asteriskToken) {
const expression = visitNode(Debug.checkDefined(node.expression), visitor, isExpression);
const expression = visitNode(Debug.assertDefined(node.expression), visitor, isExpression);
return setOriginalNode(
setTextRange(

View file

@ -48,11 +48,11 @@ namespace ts {
return existing.name;
}
if (!currentFileState.utilizedImplicitRuntimeImports) {
currentFileState.utilizedImplicitRuntimeImports = new Map();
currentFileState.utilizedImplicitRuntimeImports = createMap();
}
let specifierSourceImports = currentFileState.utilizedImplicitRuntimeImports.get(importSource);
if (!specifierSourceImports) {
specifierSourceImports = new Map();
specifierSourceImports = createMap();
currentFileState.utilizedImplicitRuntimeImports.set(importSource, specifierSourceImports);
}
const generatedName = factory.createUniqueName(`_${name}`, GeneratedIdentifierFlags.Optimistic | GeneratedIdentifierFlags.FileLevel | GeneratedIdentifierFlags.AllowNameSubstitution);

View file

@ -1609,7 +1609,7 @@ namespace ts {
export interface TypePredicateNode extends TypeNode {
readonly kind: SyntaxKind.TypePredicate;
readonly parent: SignatureDeclaration | JSDocTypeExpression;
readonly assertsModifier?: AssertsKeyword;
readonly assertsModifier?: AssertsToken;
readonly parameterName: Identifier | ThisTypeNode;
readonly type?: TypeNode;
}
@ -1702,7 +1702,7 @@ namespace ts {
export interface MappedTypeNode extends TypeNode, Declaration {
readonly kind: SyntaxKind.MappedType;
readonly readonlyToken?: ReadonlyKeyword | PlusToken | MinusToken;
readonly readonlyToken?: ReadonlyToken | PlusToken | MinusToken;
readonly typeParameter: TypeParameterDeclaration;
readonly nameType?: TypeNode;
readonly questionToken?: QuestionToken | PlusToken | MinusToken;
@ -2756,7 +2756,7 @@ namespace ts {
export interface ForOfStatement extends IterationStatement {
readonly kind: SyntaxKind.ForOfStatement;
readonly awaitModifier?: AwaitKeyword;
readonly awaitModifier?: AwaitKeywordToken;
readonly initializer: ForInitializer;
readonly expression: Expression;
}
@ -5107,7 +5107,7 @@ namespace ts {
jsxNamespace?: Symbol | false; // Resolved jsx namespace symbol for this node
jsxImplicitImportContainer?: Symbol | false; // Resolved module symbol the implicit jsx import of this file should refer to
contextFreeType?: Type; // Cached context-free type used by the first pass of inference; used when a function's return is partially contextually sensitive
deferredNodes?: Set<Node>; // Set of nodes whose checking has been deferred
deferredNodes?: ESMap<NodeId, Node>; // Set of nodes whose checking has been deferred
capturedBlockScopeBindings?: Symbol[]; // Block-scoped bindings captured beneath this part of an IterationStatement
outerTypeParameters?: TypeParameter[]; // Outer type parameters of anonymous object type
isExhaustive?: boolean; // Is node an exhaustive switch statement

View file

@ -20,6 +20,21 @@ namespace ts {
return undefined;
}
/**
* Create a new escaped identifier map.
* @deprecated Use `new Map<__String, T>()` instead.
*/
export function createUnderscoreEscapedMap<T>(): UnderscoreEscapedMap<T> {
return new Map<__String, T>();
}
/**
* @deprecated Use `!!map?.size` instead
*/
export function hasEntries(map: ReadonlyCollection<any> | undefined): map is ReadonlyCollection<any> {
return !!map && !!map.size;
}
export function createSymbolTable(symbols?: readonly Symbol[]): SymbolTable {
const result = new Map<__String, Symbol>();
if (symbols) {
@ -6979,6 +6994,18 @@ namespace ts {
return { min, max };
}
/** @deprecated Use `ReadonlySet<TNode>` instead. */
export type ReadonlyNodeSet<TNode extends Node> = ReadonlySet<TNode>;
/** @deprecated Use `Set<TNode>` instead. */
export type NodeSet<TNode extends Node> = Set<TNode>;
/** @deprecated Use `ReadonlyMap<TNode, TValue>` instead. */
export type ReadonlyNodeMap<TNode extends Node, TValue> = ReadonlyESMap<TNode, TValue>;
/** @deprecated Use `Map<TNode, TValue>` instead. */
export type NodeMap<TNode extends Node, TValue> = ESMap<TNode, TValue>;
export function rangeOfNode(node: Node): TextRange {
return { pos: getTokenPosOfNode(node), end: node.end };
}

View file

@ -637,8 +637,7 @@ namespace FourSlash {
ts.forEachKey(this.inputFiles, fileName => {
if (!ts.isAnySupportedFileExtension(fileName)
|| Harness.getConfigNameFromFileName(fileName)
// Can't get a Program in Server tests
|| this.testType !== FourSlashTestType.Server && !ts.getAllowJSCompilerOption(this.getProgram().getCompilerOptions()) && !ts.resolutionExtensionIsTSOrJson(ts.extensionFromPath(fileName))
|| !ts.getAllowJSCompilerOption(this.getProgram().getCompilerOptions()) && !ts.resolutionExtensionIsTSOrJson(ts.extensionFromPath(fileName))
|| ts.getBaseFileName(fileName) === "package.json") return;
const errors = this.getDiagnostics(fileName).filter(e => e.category !== ts.DiagnosticCategory.Suggestion);
if (errors.length) {

View file

@ -472,8 +472,8 @@ namespace Harness.LanguageService {
const responseFormat = format || ts.SemanticClassificationFormat.Original;
return unwrapJSONCallResult(this.shim.getEncodedSemanticClassifications(fileName, span.start, span.length, responseFormat));
}
getCompletionsAtPosition(fileName: string, position: number, preferences: ts.UserPreferences | undefined): ts.CompletionInfo {
return unwrapJSONCallResult(this.shim.getCompletionsAtPosition(fileName, position, preferences));
getCompletionsAtPosition(fileName: string, position: number, preferences: ts.UserPreferences | undefined, formattingSettings: ts.FormatCodeSettings | undefined): ts.CompletionInfo {
return unwrapJSONCallResult(this.shim.getCompletionsAtPosition(fileName, position, preferences, formattingSettings));
}
getCompletionEntryDetails(fileName: string, position: number, entryName: string, formatOptions: ts.FormatCodeOptions | undefined, source: string | undefined, preferences: ts.UserPreferences | undefined, data: ts.CompletionEntryData | undefined): ts.CompletionEntryDetails {
return unwrapJSONCallResult(this.shim.getCompletionEntryDetails(fileName, position, entryName, JSON.stringify(formatOptions), source, preferences, data));

View file

@ -1842,13 +1842,18 @@ namespace ts.server {
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file)!;
const position = this.getPosition(args, scriptInfo);
const completions = project.getLanguageService().getCompletionsAtPosition(file, position, {
...convertUserPreferences(this.getPreferences(file)),
triggerCharacter: args.triggerCharacter,
triggerKind: args.triggerKind as CompletionTriggerKind | undefined,
includeExternalModuleExports: args.includeExternalModuleExports,
includeInsertTextCompletions: args.includeInsertTextCompletions
});
const completions = project.getLanguageService().getCompletionsAtPosition(
file,
position,
{
...convertUserPreferences(this.getPreferences(file)),
triggerCharacter: args.triggerCharacter,
triggerKind: args.triggerKind as CompletionTriggerKind | undefined,
includeExternalModuleExports: args.includeExternalModuleExports,
includeInsertTextCompletions: args.includeInsertTextCompletions,
},
project.projectService.getFormatCodeOptions(file),
);
if (completions === undefined) return undefined;
if (kind === protocol.CommandTypes.CompletionsFull) return completions;
@ -2112,7 +2117,7 @@ namespace ts.server {
private getFullNavigateToItems(args: protocol.NavtoRequestArgs): CombineOutputResult<NavigateToItem> {
const { currentFileOnly, searchValue, maxResultCount, projectFileName } = args;
if (currentFileOnly) {
Debug.assertIsDefined(args.file);
Debug.assertDefined(args.file);
const { file, project } = this.getFileAndProject(args as protocol.FileRequestArgs);
return [{ project, result: project.getLanguageService().getNavigateToItems(searchValue, maxResultCount, file) }];
}

View file

@ -26,9 +26,9 @@ namespace ts.codefix {
if (!isFunctionDeclaration(fn) && !isFunctionExpression(fn)) return undefined;
if (!isSourceFile(getThisContainer(fn, /*includeArrowFunctions*/ false))) { // 'this' is defined outside, convert to arrow function
const fnKeyword = Debug.checkDefined(findChildOfKind(fn, SyntaxKind.FunctionKeyword, sourceFile));
const fnKeyword = Debug.assertDefined(findChildOfKind(fn, SyntaxKind.FunctionKeyword, sourceFile));
const { name } = fn;
const body = Debug.checkDefined(fn.body); // Should be defined because the function contained a 'this' expression
const body = Debug.assertDefined(fn.body); // Should be defined because the function contained a 'this' expression
if (isFunctionExpression(fn)) {
if (name && FindAllReferences.Core.isSymbolReferencedInFile(name, checker, sourceFile, body)) {
// Function expression references itself. To fix we would have to extract it to a const.

View file

@ -229,6 +229,7 @@ namespace ts.Completions {
triggerCharacter: CompletionsTriggerCharacter | undefined,
completionKind: CompletionTriggerKind | undefined,
cancellationToken: CancellationToken,
formatContext?: formatting.FormatContext,
): CompletionInfo | undefined {
const { previousToken } = getRelevantTokens(position, sourceFile);
if (triggerCharacter && !isInString(sourceFile, position, previousToken) && !isValidTrigger(sourceFile, triggerCharacter, previousToken, position)) {
@ -275,7 +276,7 @@ namespace ts.Completions {
switch (completionData.kind) {
case CompletionDataKind.Data:
const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences);
const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext);
if (response?.isIncomplete) {
incompleteCompletionsCache?.set(response);
}
@ -412,6 +413,7 @@ namespace ts.Completions {
log: Log,
completionData: CompletionData,
preferences: UserPreferences,
formatContext: formatting.FormatContext | undefined,
): CompletionInfo | undefined {
const {
symbols,
@ -459,6 +461,7 @@ namespace ts.Completions {
completionKind,
preferences,
compilerOptions,
formatContext,
isTypeOnlyLocation,
propertyAccessToConvert,
isJsxIdentifierExpected,
@ -489,6 +492,7 @@ namespace ts.Completions {
completionKind,
preferences,
compilerOptions,
formatContext,
isTypeOnlyLocation,
propertyAccessToConvert,
isJsxIdentifierExpected,
@ -638,6 +642,7 @@ namespace ts.Completions {
options: CompilerOptions,
preferences: UserPreferences,
completionKind: CompletionKind,
formatContext: formatting.FormatContext | undefined,
): CompletionEntry | undefined {
let insertText: string | undefined;
let replacementSpan = getReplacementSpanForContextToken(replacementToken);
@ -706,7 +711,7 @@ namespace ts.Completions {
completionKind === CompletionKind.MemberLike &&
isClassLikeMemberCompletion(symbol, location)) {
let importAdder;
({ insertText, isSnippet, importAdder } = getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, contextToken));
({ insertText, isSnippet, importAdder } = getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, contextToken, formatContext));
if (importAdder?.hasFixes()) {
hasAction = true;
source = CompletionSource.ClassMemberSnippet;
@ -832,6 +837,7 @@ namespace ts.Completions {
symbol: Symbol,
location: Node,
contextToken: Node | undefined,
formatContext: formatting.FormatContext | undefined,
): { insertText: string, isSnippet?: true, importAdder?: codefix.ImportAdder } {
const classLikeDeclaration = findAncestor(location, isClassLike);
if (!classLikeDeclaration) {
@ -852,15 +858,16 @@ namespace ts.Completions {
});
const importAdder = codefix.createImportAdder(sourceFile, program, preferences, host);
// Create empty body for possible method implementation.
let body;
if (preferences.includeCompletionsWithSnippetText) {
isSnippet = true;
// We are adding a tabstop (i.e. `$0`) in the body of the suggested member,
// if it has one, so that the cursor ends up in the body once the completion is inserted.
// Note: this assumes we won't have more than one body in the completion nodes, which should be the case.
const emptyStatement = factory.createExpressionStatement(factory.createIdentifier(""));
setSnippetElement(emptyStatement, { kind: SnippetKind.TabStop, order: 0 });
body = factory.createBlock([emptyStatement], /* multiline */ true);
const emptyStmt = factory.createEmptyStatement();
body = factory.createBlock([emptyStmt], /* multiline */ true);
setSnippetElement(emptyStmt, { kind: SnippetKind.TabStop, order: 0 });
}
else {
body = factory.createBlock([], /* multiline */ true);
@ -911,7 +918,6 @@ namespace ts.Completions {
modifiers = node.modifierFlagsCache | requiredModifiers | presentModifiers;
}
node = factory.updateModifiers(node, modifiers & (~presentModifiers));
completionNodes.push(node);
},
body,
@ -919,10 +925,38 @@ namespace ts.Completions {
isAbstract);
if (completionNodes.length) {
insertText = printer.printSnippetList(
ListFormat.MultiLine | ListFormat.NoTrailingNewLine,
factory.createNodeArray(completionNodes),
sourceFile);
// If we have access to formatting settings, we print the nodes using the emitter,
// and then format the printed text.
if (formatContext) {
const syntheticFile = {
text: printer.printSnippetList(
ListFormat.MultiLine | ListFormat.NoTrailingNewLine,
factory.createNodeArray(completionNodes),
sourceFile),
getLineAndCharacterOfPosition(pos: number) {
return getLineAndCharacterOfPosition(this, pos);
},
};
const formatOptions = getFormatCodeSettingsForWriting(formatContext, sourceFile);
const changes = flatMap(completionNodes, node => {
const nodeWithPos = textChanges.assignPositionsToNode(node);
return formatting.formatNodeGivenIndentation(
nodeWithPos,
syntheticFile,
sourceFile.languageVariant,
/* indentation */ 0,
/* delta */ 0,
{ ...formatContext, options: formatOptions });
});
insertText = textChanges.applyChanges(syntheticFile.text, changes);
}
else { // Otherwise, just use emitter to print the new nodes.
insertText = printer.printSnippetList(
ListFormat.MultiLine | ListFormat.NoTrailingNewLine,
factory.createNodeArray(completionNodes),
sourceFile);
}
}
return { insertText, isSnippet, importAdder };
@ -972,8 +1006,8 @@ namespace ts.Completions {
function createSnippetPrinter(
printerOptions: PrinterOptions,
) {
const printer = createPrinter(printerOptions);
const baseWriter = createTextWriter(getNewLineCharacter(printerOptions));
const baseWriter = textChanges.createWriter(getNewLineCharacter(printerOptions));
const printer = createPrinter(printerOptions, baseWriter);
const writer: EmitTextWriter = {
...baseWriter,
write: s => baseWriter.write(escapeSnippetText(s)),
@ -1117,6 +1151,7 @@ namespace ts.Completions {
kind: CompletionKind,
preferences: UserPreferences,
compilerOptions: CompilerOptions,
formatContext: formatting.FormatContext | undefined,
isTypeOnlyLocation?: boolean,
propertyAccessToConvert?: PropertyAccessExpression,
jsxIdentifierExpected?: boolean,
@ -1166,6 +1201,7 @@ namespace ts.Completions {
compilerOptions,
preferences,
kind,
formatContext,
);
if (!entry) {
continue;
@ -1444,7 +1480,8 @@ namespace ts.Completions {
name,
symbol,
location,
contextToken);
contextToken,
formatContext);
if (importAdder) {
const changes = textChanges.ChangeTracker.with(
{ host, formatContext, preferences },

View file

@ -198,17 +198,14 @@ namespace ts.GoToDefinition {
return undefined;
}
const symbol = getSymbol(node, typeChecker);
const symbol = typeChecker.getSymbolAtLocation(node);
if (!symbol) return undefined;
const typeAtLocation = typeChecker.getTypeOfSymbolAtLocation(symbol, node);
const returnType = tryGetReturnTypeOfFunction(symbol, typeAtLocation, typeChecker);
const fromReturnType = returnType && definitionFromType(returnType, typeChecker, node);
// If a function returns 'void' or some other type with no definition, just return the function definition.
const typeDefinitions = fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node);
return typeDefinitions.length ? typeDefinitions
: !(symbol.flags & SymbolFlags.Value) && symbol.flags & SymbolFlags.Type ? getDefinitionFromSymbol(typeChecker, skipAlias(symbol, typeChecker), node)
: undefined;
return fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node);
}
function definitionFromType(type: Type, checker: TypeChecker, node: Node): readonly DefinitionInfo[] {

View file

@ -1593,7 +1593,7 @@ namespace ts {
return [...program.getOptionsDiagnostics(cancellationToken), ...program.getGlobalDiagnostics(cancellationToken)];
}
function getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions = emptyOptions): CompletionInfo | undefined {
function getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions = emptyOptions, formattingSettings?: FormatCodeSettings): CompletionInfo | undefined {
// Convert from deprecated options names to new names
const fullPreferences: UserPreferences = {
...identity<UserPreferences>(options), // avoid excess property check
@ -1610,7 +1610,8 @@ namespace ts {
fullPreferences,
options.triggerCharacter,
options.triggerKind,
cancellationToken);
cancellationToken,
formattingSettings && formatting.getFormatContext(formattingSettings, host));
}
function getCompletionEntryDetails(fileName: string, position: number, name: string, formattingOptions: FormatCodeSettings | undefined, source: string | undefined, preferences: UserPreferences = emptyOptions, data?: CompletionEntryData): CompletionEntryDetails | undefined {

View file

@ -151,7 +151,7 @@ namespace ts {
getEncodedSyntacticClassifications(fileName: string, start: number, length: number): string;
getEncodedSemanticClassifications(fileName: string, start: number, length: number, format?: SemanticClassificationFormat): string;
getCompletionsAtPosition(fileName: string, position: number, preferences: UserPreferences | undefined): string;
getCompletionsAtPosition(fileName: string, position: number, preferences: UserPreferences | undefined, formattingSettings: FormatCodeSettings | undefined): string;
getCompletionEntryDetails(fileName: string, position: number, entryName: string, formatOptions: string/*Services.FormatCodeOptions*/ | undefined, source: string | undefined, preferences: UserPreferences | undefined, data: CompletionEntryData | undefined): string;
getQuickInfoAtPosition(fileName: string, position: number): string;
@ -956,10 +956,10 @@ namespace ts {
* to provide at the given source position and providing a member completion
* list if requested.
*/
public getCompletionsAtPosition(fileName: string, position: number, preferences: GetCompletionsAtPositionOptions | undefined) {
public getCompletionsAtPosition(fileName: string, position: number, preferences: GetCompletionsAtPositionOptions | undefined, formattingSettings: FormatCodeSettings | undefined) {
return this.forwardJSONCall(
`getCompletionsAtPosition('${fileName}', ${position}, ${preferences})`,
() => this.languageService.getCompletionsAtPosition(fileName, position, preferences)
`getCompletionsAtPosition('${fileName}', ${position}, ${preferences}, ${formattingSettings})`,
() => this.languageService.getCompletionsAtPosition(fileName, position, preferences, formattingSettings)
);
}

View file

@ -54,6 +54,7 @@ namespace ts.Completions.StringCompletions {
CompletionKind.String,
preferences,
options,
/*formatContext*/ undefined,
); // Target will not be used, so arbitrary
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, optionalReplacementSpan, entries };
}

View file

@ -1052,15 +1052,6 @@ namespace ts.textChanges {
? "" : options.suffix);
}
function getFormatCodeSettingsForWriting({ options }: formatting.FormatContext, sourceFile: SourceFile): FormatCodeSettings {
const shouldAutoDetectSemicolonPreference = !options.semicolons || options.semicolons === SemicolonPreference.Ignore;
const shouldRemoveSemicolons = options.semicolons === SemicolonPreference.Remove || shouldAutoDetectSemicolonPreference && !probablyUsesSemicolons(sourceFile);
return {
...options,
semicolons: shouldRemoveSemicolons ? SemicolonPreference.Remove : SemicolonPreference.Ignore,
};
}
/** Note: this may mutate `nodeIn`. */
function getFormattedTextOfNode(nodeIn: Node, sourceFile: SourceFile, pos: number, { indentation, prefix, delta }: InsertNodeOptions, newLineCharacter: string, formatContext: formatting.FormatContext, validate: ValidateNonFormattedText | undefined): string {
const { node, text } = getNonformattedText(nodeIn, sourceFile, newLineCharacter);
@ -1110,7 +1101,7 @@ namespace ts.textChanges {
return skipTrivia(s, 0) === s.length;
}
function assignPositionsToNode(node: Node): Node {
export function assignPositionsToNode(node: Node): Node {
const visited = visitEachChild(node, assignPositionsToNode, nullTransformationContext, assignPositionsToNodeArray, assignPositionsToNode);
// create proxy node for non synthesized nodes
const newNode = nodeIsSynthesized(visited) ? visited : Object.create(visited) as Node;
@ -1131,7 +1122,7 @@ namespace ts.textChanges {
interface TextChangesWriter extends EmitTextWriter, PrintHandlers {}
function createWriter(newLine: string): TextChangesWriter {
export function createWriter(newLine: string): TextChangesWriter {
let lastNonTriviaPosition = 0;
const writer = createTextWriter(newLine);

View file

@ -414,8 +414,9 @@ namespace ts {
* @param position A zero-based index of the character where you want the entries
* @param options An object describing how the request was triggered and what kinds
* of code actions can be returned with the completions.
* @param formattingSettings settings needed for calling formatting functions.
*/
getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions | undefined): WithMetadata<CompletionInfo> | undefined;
getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions | undefined, formattingSettings?: FormatCodeSettings): WithMetadata<CompletionInfo> | undefined;
/**
* Gets the extended details for a completion entry retrieved from `getCompletionsAtPosition`.

View file

@ -3290,5 +3290,17 @@ namespace ts {
: getLocaleSpecificMessage(diag);
}
/**
* Get format code settings for a code writing context (e.g. when formatting text changes or completions code).
*/
export function getFormatCodeSettingsForWriting({ options }: formatting.FormatContext, sourceFile: SourceFile): FormatCodeSettings {
const shouldAutoDetectSemicolonPreference = !options.semicolons || options.semicolons === SemicolonPreference.Ignore;
const shouldRemoveSemicolons = options.semicolons === SemicolonPreference.Remove || shouldAutoDetectSemicolonPreference && !probablyUsesSemicolons(sourceFile);
return {
...options,
semicolons: shouldRemoveSemicolons ? SemicolonPreference.Remove : SemicolonPreference.Ignore,
};
}
// #endregion
}

View file

@ -326,7 +326,7 @@ namespace ts.projectSystem {
};
function updateFile(path: string, newText: string) {
Debug.assertIsDefined(files.find(f => f.path === path));
Debug.assertDefined(files.find(f => f.path === path));
session.executeCommandSeq<protocol.ApplyChangedToOpenFilesRequest>({
command: protocol.CommandTypes.ApplyChangedToOpenFiles,
arguments: {
@ -339,7 +339,7 @@ namespace ts.projectSystem {
}
function findAllReferences(file: string, line: number, offset: number) {
Debug.assertIsDefined(files.find(f => f.path === file));
Debug.assertDefined(files.find(f => f.path === file));
session.executeCommandSeq<protocol.ReferencesRequest>({
command: protocol.CommandTypes.References,
arguments: {

View file

@ -897,7 +897,7 @@ declare namespace ts {
export interface TypePredicateNode extends TypeNode {
readonly kind: SyntaxKind.TypePredicate;
readonly parent: SignatureDeclaration | JSDocTypeExpression;
readonly assertsModifier?: AssertsKeyword;
readonly assertsModifier?: AssertsToken;
readonly parameterName: Identifier | ThisTypeNode;
readonly type?: TypeNode;
}
@ -968,7 +968,7 @@ declare namespace ts {
}
export interface MappedTypeNode extends TypeNode, Declaration {
readonly kind: SyntaxKind.MappedType;
readonly readonlyToken?: ReadonlyKeyword | PlusToken | MinusToken;
readonly readonlyToken?: ReadonlyToken | PlusToken | MinusToken;
readonly typeParameter: TypeParameterDeclaration;
readonly nameType?: TypeNode;
readonly questionToken?: QuestionToken | PlusToken | MinusToken;
@ -1465,7 +1465,7 @@ declare namespace ts {
}
export interface ForOfStatement extends IterationStatement {
readonly kind: SyntaxKind.ForOfStatement;
readonly awaitModifier?: AwaitKeyword;
readonly awaitModifier?: AwaitKeywordToken;
readonly initializer: ForInitializer;
readonly expression: Expression;
}

View file

@ -897,7 +897,7 @@ declare namespace ts {
export interface TypePredicateNode extends TypeNode {
readonly kind: SyntaxKind.TypePredicate;
readonly parent: SignatureDeclaration | JSDocTypeExpression;
readonly assertsModifier?: AssertsKeyword;
readonly assertsModifier?: AssertsToken;
readonly parameterName: Identifier | ThisTypeNode;
readonly type?: TypeNode;
}
@ -968,7 +968,7 @@ declare namespace ts {
}
export interface MappedTypeNode extends TypeNode, Declaration {
readonly kind: SyntaxKind.MappedType;
readonly readonlyToken?: ReadonlyKeyword | PlusToken | MinusToken;
readonly readonlyToken?: ReadonlyToken | PlusToken | MinusToken;
readonly typeParameter: TypeParameterDeclaration;
readonly nameType?: TypeNode;
readonly questionToken?: QuestionToken | PlusToken | MinusToken;
@ -1465,7 +1465,7 @@ declare namespace ts {
}
export interface ForOfStatement extends IterationStatement {
readonly kind: SyntaxKind.ForOfStatement;
readonly awaitModifier?: AwaitKeyword;
readonly awaitModifier?: AwaitKeywordToken;
readonly initializer: ForInitializer;
readonly expression: Expression;
}

View file

@ -1,46 +0,0 @@
/a.js(18,9): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
==== /a.js (1 errors) ====
class A {
/**
* Constructor
*
* @param {object} [foo={}]
*/
constructor(foo = {}) {
const key = "bar";
/**
* @type object
*/
this.foo = foo;
/**
* @type object
*/
const arguments = this.arguments;
~~~~~~~~~
!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
/**
* @type object
*/
this.bar = arguments.bar;
/**
* @type object
*/
this.baz = arguments[key];
/**
* @type object
*/
this.options = arguments;
}
get arguments() {
return { bar: {} };
}
}

View file

@ -1,44 +0,0 @@
/a.js(16,9): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
==== /a.js (1 errors) ====
class A {
/**
* @param {object} [foo={}]
*/
m(foo = {}) {
const key = "bar";
/**
* @type object
*/
this.foo = foo;
/**
* @type object
*/
const arguments = this.arguments;
~~~~~~~~~
!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
/**
* @type object
*/
this.bar = arguments.bar;
/**
* @type object
*/
this.baz = arguments[key];
/**
* @type object
*/
this.options = arguments;
}
get arguments() {
return { bar: {} };
}
}

View file

@ -3,6 +3,6 @@ enum E {
>E : Symbol(E, Decl(enumWithUnicodeEscape1.ts, 0, 0))
'gold \u2730'
>'gold \u2730' : Symbol(E['gold \u2730'], Decl(enumWithUnicodeEscape1.ts, 0, 8))
>'gold \u2730' : Symbol(E['gold u2730'], Decl(enumWithUnicodeEscape1.ts, 0, 8))
}

View file

@ -1,18 +1,12 @@
tests/cases/compiler/export.js(1,13): error TS2451: Cannot redeclare block-scoped variable 'foo'.
tests/cases/compiler/export.js(1,13): error TS8008: Type aliases can only be used in TypeScript files.
tests/cases/compiler/export.js(6,14): error TS2451: Cannot redeclare block-scoped variable 'foo'.
==== tests/cases/compiler/export.js (3 errors) ====
==== tests/cases/compiler/export.js (1 errors) ====
export type foo = 5;
~~~
!!! error TS2451: Cannot redeclare block-scoped variable 'foo'.
~~~
!!! error TS8008: Type aliases can only be used in TypeScript files.
/**
* @typedef {{
* }}
*/
export const foo = 5;
~~~
!!! error TS2451: Cannot redeclare block-scoped variable 'foo'.
export const foo = 5;

View file

@ -1,97 +0,0 @@
tests/cases/conformance/salsa/plainJSBinderErrors.js(1,1): error TS2528: A module cannot have multiple default exports.
tests/cases/conformance/salsa/plainJSBinderErrors.js(2,1): error TS2528: A module cannot have multiple default exports.
tests/cases/conformance/salsa/plainJSBinderErrors.js(3,7): error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module.
tests/cases/conformance/salsa/plainJSBinderErrors.js(4,7): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(6,11): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here.
tests/cases/conformance/salsa/plainJSBinderErrors.js(9,11): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(12,5): error TS18012: '#constructor' is a reserved word.
tests/cases/conformance/salsa/plainJSBinderErrors.js(15,20): error TS1102: 'delete' cannot be called on an identifier in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(18,16): error TS1102: 'delete' cannot be called on an identifier in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(19,16): error TS1102: 'delete' cannot be called on an identifier in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(22,15): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'eval'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(23,15): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(26,27): error TS1121: Octal literals are not allowed in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(27,9): error TS1101: 'with' statements are not allowed in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(33,13): error TS1344: 'A label is not allowed here.
tests/cases/conformance/salsa/plainJSBinderErrors.js(39,7): error TS1215: Invalid use of 'eval'. Modules are automatically in strict mode.
tests/cases/conformance/salsa/plainJSBinderErrors.js(40,7): error TS1215: Invalid use of 'arguments'. Modules are automatically in strict mode.
==== tests/cases/conformance/salsa/plainJSBinderErrors.js (17 errors) ====
export default 12
~~~~~~~~~~~~~~~~~
!!! error TS2528: A module cannot have multiple default exports.
!!! related TS2753 tests/cases/conformance/salsa/plainJSBinderErrors.js:2:1: Another export default is here.
export default 13
~~~~~~~~~~~~~~~~~
!!! error TS2528: A module cannot have multiple default exports.
!!! related TS2752 tests/cases/conformance/salsa/plainJSBinderErrors.js:1:1: The first export default is here.
const await = 1
~~~~~
!!! error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module.
const yield = 2
~~~~~
!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
async function f() {
const await = 3
~~~~~
!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here.
}
function* g() {
const yield = 4
~~~~~
!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
}
class C {
#constructor = 5
~~~~~~~~~~~~
!!! error TS18012: '#constructor' is a reserved word.
deleted() {
function container(f) {
delete f
~
!!! error TS1102: 'delete' cannot be called on an identifier in strict mode.
}
var g = 6
delete g
~
!!! error TS1102: 'delete' cannot be called on an identifier in strict mode.
delete container
~~~~~~~~~
!!! error TS1102: 'delete' cannot be called on an identifier in strict mode.
}
evalArguments() {
const eval = 7
~~~~
!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'eval'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
const arguments = 8
~~~~~~~~~
!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
}
withOctal() {
const redundant = 010
~~~
!!! error TS1121: Octal literals are not allowed in strict mode.
with (redundant) {
~~~~
!!! error TS1101: 'with' statements are not allowed in strict mode.
return toFixed()
}
}
label() {
for(;;) {
label: var x = 1
~~~~~
!!! error TS1344: 'A label is not allowed here.
break label
}
return x
}
}
const eval = 9
~~~~
!!! error TS1215: Invalid use of 'eval'. Modules are automatically in strict mode.
const arguments = 10
~~~~~~~~~
!!! error TS1215: Invalid use of 'arguments'. Modules are automatically in strict mode.

View file

@ -1,84 +0,0 @@
//// [plainJSBinderErrors.js]
export default 12
export default 13
const await = 1
const yield = 2
async function f() {
const await = 3
}
function* g() {
const yield = 4
}
class C {
#constructor = 5
deleted() {
function container(f) {
delete f
}
var g = 6
delete g
delete container
}
evalArguments() {
const eval = 7
const arguments = 8
}
withOctal() {
const redundant = 010
with (redundant) {
return toFixed()
}
}
label() {
for(;;) {
label: var x = 1
break label
}
return x
}
}
const eval = 9
const arguments = 10
//// [plainJSBinderErrors.js]
export default 12;
export default 13;
const await = 1;
const yield = 2;
async function f() {
const await = 3;
}
function* g() {
const yield = 4;
}
class C {
#constructor = 5;
deleted() {
function container(f) {
delete f;
}
var g = 6;
delete g;
delete container;
}
evalArguments() {
const eval = 7;
const arguments = 8;
}
withOctal() {
const redundant = 010;
with (redundant) {
return toFixed();
}
}
label() {
for (;;) {
label: var x = 1;
break label;
}
return x;
}
}
const eval = 9;
const arguments = 10;

View file

@ -1,86 +0,0 @@
=== tests/cases/conformance/salsa/plainJSBinderErrors.js ===
export default 12
export default 13
const await = 1
>await : Symbol(await, Decl(plainJSBinderErrors.js, 2, 5))
const yield = 2
>yield : Symbol(yield, Decl(plainJSBinderErrors.js, 3, 5))
async function f() {
>f : Symbol(f, Decl(plainJSBinderErrors.js, 3, 15))
const await = 3
>await : Symbol(await, Decl(plainJSBinderErrors.js, 5, 9))
}
function* g() {
>g : Symbol(g, Decl(plainJSBinderErrors.js, 6, 1))
const yield = 4
>yield : Symbol(yield, Decl(plainJSBinderErrors.js, 8, 9))
}
class C {
>C : Symbol(C, Decl(plainJSBinderErrors.js, 9, 1))
#constructor = 5
>#constructor : Symbol(C.#constructor, Decl(plainJSBinderErrors.js, 10, 9))
deleted() {
>deleted : Symbol(C.deleted, Decl(plainJSBinderErrors.js, 11, 20))
function container(f) {
>container : Symbol(container, Decl(plainJSBinderErrors.js, 12, 15))
>f : Symbol(f, Decl(plainJSBinderErrors.js, 13, 27))
delete f
>f : Symbol(f, Decl(plainJSBinderErrors.js, 13, 27))
}
var g = 6
>g : Symbol(g, Decl(plainJSBinderErrors.js, 16, 11))
delete g
>g : Symbol(g, Decl(plainJSBinderErrors.js, 16, 11))
delete container
>container : Symbol(container, Decl(plainJSBinderErrors.js, 12, 15))
}
evalArguments() {
>evalArguments : Symbol(C.evalArguments, Decl(plainJSBinderErrors.js, 19, 5))
const eval = 7
>eval : Symbol(eval, Decl(plainJSBinderErrors.js, 21, 13))
const arguments = 8
>arguments : Symbol(arguments, Decl(plainJSBinderErrors.js, 22, 13))
}
withOctal() {
>withOctal : Symbol(C.withOctal, Decl(plainJSBinderErrors.js, 23, 5))
const redundant = 010
>redundant : Symbol(redundant, Decl(plainJSBinderErrors.js, 25, 13))
with (redundant) {
>redundant : Symbol(redundant, Decl(plainJSBinderErrors.js, 25, 13))
return toFixed()
}
}
label() {
>label : Symbol(C.label, Decl(plainJSBinderErrors.js, 29, 5))
for(;;) {
label: var x = 1
>x : Symbol(x, Decl(plainJSBinderErrors.js, 32, 22))
break label
}
return x
>x : Symbol(x, Decl(plainJSBinderErrors.js, 32, 22))
}
}
const eval = 9
>eval : Symbol(eval, Decl(plainJSBinderErrors.js, 38, 5))
const arguments = 10
>arguments : Symbol(arguments, Decl(plainJSBinderErrors.js, 39, 5))

View file

@ -1,105 +0,0 @@
=== tests/cases/conformance/salsa/plainJSBinderErrors.js ===
export default 12
export default 13
const await = 1
>await : 1
>1 : 1
const yield = 2
>yield : 2
>2 : 2
async function f() {
>f : () => Promise<void>
const await = 3
>await : 3
>3 : 3
}
function* g() {
>g : () => Generator<never, void, unknown>
const yield = 4
>yield : 4
>4 : 4
}
class C {
>C : C
#constructor = 5
>#constructor : number
>5 : 5
deleted() {
>deleted : () => void
function container(f) {
>container : (f: any) => void
>f : any
delete f
>delete f : boolean
>f : any
}
var g = 6
>g : number
>6 : 6
delete g
>delete g : boolean
>g : number
delete container
>delete container : boolean
>container : (f: any) => void
}
evalArguments() {
>evalArguments : () => void
const eval = 7
>eval : 7
>7 : 7
const arguments = 8
>arguments : 8
>8 : 8
}
withOctal() {
>withOctal : () => any
const redundant = 010
>redundant : 10
>010 : 10
with (redundant) {
>redundant : 10
return toFixed()
>toFixed() : any
>toFixed : any
}
}
label() {
>label : () => number
for(;;) {
label: var x = 1
>label : any
>x : number
>1 : 1
break label
>label : any
}
return x
>x : number
}
}
const eval = 9
>eval : 9
>9 : 9
const arguments = 10
>arguments : 10
>10 : 10

View file

@ -1,37 +0,0 @@
tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(1,1): error TS2528: A module cannot have multiple default exports.
tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(2,1): error TS2528: A module cannot have multiple default exports.
tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(3,7): error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module.
tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(4,7): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(6,11): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here.
tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(9,11): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
==== tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js (6 errors) ====
export default 12
~~~~~~~~~~~~~~~~~
!!! error TS2528: A module cannot have multiple default exports.
!!! related TS2753 tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js:2:1: Another export default is here.
export default 13
~~~~~~~~~~~~~~~~~
!!! error TS2528: A module cannot have multiple default exports.
!!! related TS2752 tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js:1:1: The first export default is here.
const await = 1
~~~~~
!!! error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module.
const yield = 2
~~~~~
!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
async function f() {
const await = 3
~~~~~
!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here.
}
function* g() {
const yield = 4
~~~~~
!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode.
}
class C {
#constructor = 1
}

View file

@ -1,30 +0,0 @@
//// [plainJSMultipleDefaultExport.js]
export default 12
export default 13
const await = 1
const yield = 2
async function f() {
const await = 3
}
function* g() {
const yield = 4
}
class C {
#constructor = 1
}
//// [plainJSMultipleDefaultExport.js]
export default 12;
export default 13;
const await = 1;
const yield = 2;
async function f() {
const await = 3;
}
function* g() {
const yield = 4;
}
class C {
#constructor = 1;
}

View file

@ -1,28 +0,0 @@
=== tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js ===
export default 12
export default 13
const await = 1
>await : Symbol(await, Decl(plainJSMultipleDefaultExport.js, 2, 5))
const yield = 2
>yield : Symbol(yield, Decl(plainJSMultipleDefaultExport.js, 3, 5))
async function f() {
>f : Symbol(f, Decl(plainJSMultipleDefaultExport.js, 3, 15))
const await = 3
>await : Symbol(await, Decl(plainJSMultipleDefaultExport.js, 5, 9))
}
function* g() {
>g : Symbol(g, Decl(plainJSMultipleDefaultExport.js, 6, 1))
const yield = 4
>yield : Symbol(yield, Decl(plainJSMultipleDefaultExport.js, 8, 9))
}
class C {
>C : Symbol(C, Decl(plainJSMultipleDefaultExport.js, 9, 1))
#constructor = 1
>#constructor : Symbol(C.#constructor, Decl(plainJSMultipleDefaultExport.js, 10, 9))
}

View file

@ -1,33 +0,0 @@
=== tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js ===
export default 12
export default 13
const await = 1
>await : 1
>1 : 1
const yield = 2
>yield : 2
>2 : 2
async function f() {
>f : () => Promise<void>
const await = 3
>await : 3
>3 : 3
}
function* g() {
>g : () => Generator<never, void, unknown>
const yield = 4
>yield : 4
>4 : 4
}
class C {
>C : C
#constructor = 1
>#constructor : number
>1 : 1
}

View file

@ -1,13 +0,0 @@
tests/cases/conformance/salsa/plainJSRedeclare.js(1,7): error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
tests/cases/conformance/salsa/plainJSRedeclare.js(2,5): error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
==== tests/cases/conformance/salsa/plainJSRedeclare.js (2 errors) ====
const orbitol = 1
~~~~~~~
!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
var orbitol = 1 + false
~~~~~~~
!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
orbitol.toExponential()

View file

@ -1,10 +0,0 @@
//// [plainJSRedeclare.js]
const orbitol = 1
var orbitol = 1 + false
orbitol.toExponential()
//// [plainJSRedeclare.js]
var orbitol = 1;
var orbitol = 1 + false;
orbitol.toExponential();

View file

@ -1,12 +0,0 @@
=== tests/cases/conformance/salsa/plainJSRedeclare.js ===
const orbitol = 1
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5))
var orbitol = 1 + false
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 1, 3))
orbitol.toExponential()
>orbitol.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5))
>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))

View file

@ -1,17 +0,0 @@
=== tests/cases/conformance/salsa/plainJSRedeclare.js ===
const orbitol = 1
>orbitol : 1
>1 : 1
var orbitol = 1 + false
>orbitol : any
>1 + false : any
>1 : 1
>false : false
orbitol.toExponential()
>orbitol.toExponential() : string
>orbitol.toExponential : (fractionDigits?: number) => string
>orbitol : 1
>toExponential : (fractionDigits?: number) => string

View file

@ -1,16 +0,0 @@
tests/cases/conformance/salsa/plainJSRedeclare.js(1,7): error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
tests/cases/conformance/salsa/plainJSRedeclare.js(2,5): error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
tests/cases/conformance/salsa/plainJSRedeclare.js(2,15): error TS2365: Operator '+' cannot be applied to types 'number' and 'boolean'.
==== tests/cases/conformance/salsa/plainJSRedeclare.js (3 errors) ====
const orbitol = 1
~~~~~~~
!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
var orbitol = 1 + false
~~~~~~~
!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'.
~~~~~~~~~
!!! error TS2365: Operator '+' cannot be applied to types 'number' and 'boolean'.
orbitol.toExponential()

View file

@ -1,10 +0,0 @@
//// [plainJSRedeclare.js]
const orbitol = 1
var orbitol = 1 + false
orbitol.toExponential()
//// [plainJSRedeclare.js]
var orbitol = 1;
var orbitol = 1 + false;
orbitol.toExponential();

View file

@ -1,12 +0,0 @@
=== tests/cases/conformance/salsa/plainJSRedeclare.js ===
const orbitol = 1
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5))
var orbitol = 1 + false
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 1, 3))
orbitol.toExponential()
>orbitol.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5))
>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))

View file

@ -1,17 +0,0 @@
=== tests/cases/conformance/salsa/plainJSRedeclare.js ===
const orbitol = 1
>orbitol : 1
>1 : 1
var orbitol = 1 + false
>orbitol : any
>1 + false : any
>1 : 1
>false : false
orbitol.toExponential()
>orbitol.toExponential() : string
>orbitol.toExponential : (fractionDigits?: number) => string
>orbitol : 1
>toExponential : (fractionDigits?: number) => string

View file

@ -1,10 +0,0 @@
//// [plainJSRedeclare.js]
const orbitol = 1
var orbitol = 1 + false
orbitol.toExponential()
//// [plainJSRedeclare.js]
var orbitol = 1;
var orbitol = 1 + false;
orbitol.toExponential();

View file

@ -1,12 +0,0 @@
=== tests/cases/conformance/salsa/plainJSRedeclare.js ===
const orbitol = 1
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5))
var orbitol = 1 + false
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 1, 3))
orbitol.toExponential()
>orbitol.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))
>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5))
>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))

View file

@ -1,17 +0,0 @@
=== tests/cases/conformance/salsa/plainJSRedeclare.js ===
const orbitol = 1
>orbitol : 1
>1 : 1
var orbitol = 1 + false
>orbitol : any
>1 + false : any
>1 : 1
>false : false
orbitol.toExponential()
>orbitol.toExponential() : string
>orbitol.toExponential : (fractionDigits?: number) => string
>orbitol : 1
>toExponential : (fractionDigits?: number) => string

View file

@ -1,13 +0,0 @@
tests/cases/conformance/salsa/plainJSReservedStrict.js(2,7): error TS1100: Invalid use of 'eval' in strict mode.
tests/cases/conformance/salsa/plainJSReservedStrict.js(3,7): error TS1100: Invalid use of 'arguments' in strict mode.
==== tests/cases/conformance/salsa/plainJSReservedStrict.js (2 errors) ====
"use strict"
const eval = 1
~~~~
!!! error TS1100: Invalid use of 'eval' in strict mode.
const arguments = 2
~~~~~~~~~
!!! error TS1100: Invalid use of 'arguments' in strict mode.

View file

@ -1,10 +0,0 @@
//// [plainJSReservedStrict.js]
"use strict"
const eval = 1
const arguments = 2
//// [plainJSReservedStrict.js]
"use strict";
const eval = 1;
const arguments = 2;

View file

@ -1,8 +0,0 @@
=== tests/cases/conformance/salsa/plainJSReservedStrict.js ===
"use strict"
const eval = 1
>eval : Symbol(eval, Decl(plainJSReservedStrict.js, 1, 5))
const arguments = 2
>arguments : Symbol(arguments, Decl(plainJSReservedStrict.js, 2, 5))

View file

@ -1,12 +0,0 @@
=== tests/cases/conformance/salsa/plainJSReservedStrict.js ===
"use strict"
>"use strict" : "use strict"
const eval = 1
>eval : 1
>1 : 1
const arguments = 2
>arguments : 2
>2 : 2

View file

@ -69,7 +69,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -135,7 +135,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -201,7 +201,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -411,7 +411,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -549,7 +549,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -687,7 +687,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -791,7 +791,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -857,7 +857,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -923,7 +923,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -1149,7 +1149,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -1295,7 +1295,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -1441,7 +1441,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",

View file

@ -69,7 +69,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -135,7 +135,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -201,7 +201,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -411,7 +411,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -549,7 +549,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -687,7 +687,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -791,7 +791,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -857,7 +857,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -923,7 +923,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -1149,7 +1149,7 @@
},
{
"text": "\"e1\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -1295,7 +1295,7 @@
},
{
"text": "'e2'",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",
@ -1441,7 +1441,7 @@
},
{
"text": "\"e3\"",
"kind": "enumMemberName"
"kind": "stringLiteral"
},
{
"text": "]",

View file

@ -1,134 +0,0 @@
[
{
"marker": {
"fileName": "/tests/cases/fourslash/quickInfoDisplayPartsEnum4.ts",
"position": 51,
"name": "1"
},
"quickInfo": {
"kind": "enum member",
"kindModifiers": "",
"textSpan": {
"start": 51,
"length": 4
},
"displayParts": [
{
"text": "(",
"kind": "punctuation"
},
{
"text": "enum member",
"kind": "text"
},
{
"text": ")",
"kind": "punctuation"
},
{
"text": " ",
"kind": "space"
},
{
"text": "Foo",
"kind": "enumName"
},
{
"text": "[",
"kind": "punctuation"
},
{
"text": "\"\\t\"",
"kind": "enumMemberName"
},
{
"text": "]",
"kind": "punctuation"
},
{
"text": " ",
"kind": "space"
},
{
"text": "=",
"kind": "operator"
},
{
"text": " ",
"kind": "space"
},
{
"text": "9",
"kind": "numericLiteral"
}
],
"documentation": []
}
},
{
"marker": {
"fileName": "/tests/cases/fourslash/quickInfoDisplayPartsEnum4.ts",
"position": 61,
"name": "2"
},
"quickInfo": {
"kind": "enum member",
"kindModifiers": "",
"textSpan": {
"start": 61,
"length": 8
},
"displayParts": [
{
"text": "(",
"kind": "punctuation"
},
{
"text": "enum member",
"kind": "text"
},
{
"text": ")",
"kind": "punctuation"
},
{
"text": " ",
"kind": "space"
},
{
"text": "Foo",
"kind": "enumName"
},
{
"text": "[",
"kind": "punctuation"
},
{
"text": "\"\\u007f\"",
"kind": "enumMemberName"
},
{
"text": "]",
"kind": "punctuation"
},
{
"text": " ",
"kind": "space"
},
{
"text": "=",
"kind": "operator"
},
{
"text": " ",
"kind": "space"
},
{
"text": "127",
"kind": "numericLiteral"
}
],
"documentation": []
}
}
]

View file

@ -4,7 +4,7 @@
* @return {number}
*/
function f(s) {
>f : (this: { n: number; }, s: string) => number
>f : (s: string) => number
>s : string
return this.n + s.length
@ -18,11 +18,11 @@ function f(s) {
}
const o = {
>o : { f: (this: { n: number; }, s: string) => number; n: number; }
>{ f, n: 1} : { f: (this: { n: number; }, s: string) => number; n: number; }
>o : { f: (s: string) => number; n: number; }
>{ f, n: 1} : { f: (s: string) => number; n: number; }
f,
>f : (this: { n: number; }, s: string) => number
>f : (s: string) => number
n: 1
>n : number
@ -30,8 +30,8 @@ const o = {
}
o.f('hi')
>o.f('hi') : number
>o.f : (this: { n: number; }, s: string) => number
>o : { f: (this: { n: number; }, s: string) => number; n: number; }
>f : (this: { n: number; }, s: string) => number
>o.f : (s: string) => number
>o : { f: (s: string) => number; n: number; }
>f : (s: string) => number
>'hi' : "hi"

View file

@ -1,15 +0,0 @@
//// [a.js]
/** @this {string} */
export function f1() {}
/** @this */
export function f2() {}
//// [a.d.ts]
/** @this {string} */
export function f1(this: string): void;
/** @this */
export function f2(this: any): void;

View file

@ -1,9 +0,0 @@
=== tests/cases/conformance/jsdoc/a.js ===
/** @this {string} */
export function f1() {}
>f1 : Symbol(f1, Decl(a.js, 0, 0))
/** @this */
export function f2() {}
>f2 : Symbol(f2, Decl(a.js, 1, 23))

View file

@ -1,9 +0,0 @@
=== tests/cases/conformance/jsdoc/a.js ===
/** @this {string} */
export function f1() {}
>f1 : (this: string) => void
/** @this */
export function f2() {}
>f2 : (this: any) => void

View file

@ -1,11 +0,0 @@
// @target: esnext
// @allowJs: true
// @declaration: true
// @emitDeclarationOnly: true
// @filename: a.js
/** @this {string} */
export function f1() {}
/** @this */
export function f2() {}

View file

@ -1,44 +0,0 @@
// @outdir: out/
// @target: esnext
// @allowJS: true
// @filename: plainJSBinderErrors.js
export default 12
export default 13
const await = 1
const yield = 2
async function f() {
const await = 3
}
function* g() {
const yield = 4
}
class C {
#constructor = 5
deleted() {
function container(f) {
delete f
}
var g = 6
delete g
delete container
}
evalArguments() {
const eval = 7
const arguments = 8
}
withOctal() {
const redundant = 010
with (redundant) {
return toFixed()
}
}
label() {
for(;;) {
label: var x = 1
break label
}
return x
}
}
const eval = 9
const arguments = 10

View file

@ -1,6 +0,0 @@
// @outdir: out/
// @allowJS: true
// @filename: plainJSRedeclare.js
const orbitol = 1
var orbitol = 1 + false
orbitol.toExponential()

View file

@ -1,7 +0,0 @@
// @outdir: out/
// @allowJS: true
// @checkJS: true
// @filename: plainJSRedeclare.js
const orbitol = 1
var orbitol = 1 + false
orbitol.toExponential()

View file

@ -1,7 +0,0 @@
// @outdir: out/
// @allowJS: true
// @checkJS: false
// @filename: plainJSRedeclare.js
const orbitol = 1
var orbitol = 1 + false
orbitol.toExponential()

View file

@ -1,7 +0,0 @@
// @outdir: out/
// @target: esnext
// @allowJS: true
// @filename: plainJSReservedStrict.js
"use strict"
const eval = 1
const arguments = 2

View file

@ -1,6 +0,0 @@
/// <reference path='fourslash.ts' />
////type /*definition*/T = string;
////const x: /*reference*/T;
verify.goToType("reference", "definition");

View file

@ -1,12 +0,0 @@
/// <reference path='fourslash.ts' />
// @Filename: foo.ts
////export type /*def0*/T = string;
////export const /*def1*/T = "";
// @Filename: bar.ts
////import { T } from "./foo";
////let x: [|/*reference*/T|];
verify.goToType("reference", []);
verify.goToDefinition("reference", ["def0", "def1"]);

View file

@ -1,10 +0,0 @@
/// <reference path='fourslash.ts' />
// @Filename: foo.ts
////let Foo: /*definition*/unresolved;
////type Foo = { x: string };
/////*reference*/Foo;
verify.goToType("reference", []);

View file

@ -1,10 +0,0 @@
/// <reference path='fourslash.ts'/>
////const enum Foo {
//// "\t" = 9,
//// "\u007f" = 127,
////}
////Foo[/*1*/"\t"]
////Foo[/*2*/"\u007f"]
verify.baselineQuickInfo();

View file

@ -1,20 +0,0 @@
/// <reference path="../fourslash.ts" />
// @Filename: /tsconfig.json
//// { "compilerOptions": { "module": "nodenext" } }
// @Filename: /package.json
//// { "name": "foo", "type": "module", "exports": { ".": "./main.js" } }
// @Filename: /main.ts
//// export {};
// @Filename: /index.ts
//// import {} from "foo";
goTo.file("/index.ts");
verify.noErrors();
edit.paste(`\n"${"a".repeat(256)}";`);
verify.noErrors();