mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-20 22:51:17 -05:00
Use relative module specifiers in error messages if possible (#27441)
* Use relative module specifiers in error messages if possible * Dont share number
This commit is contained in:
@@ -1935,7 +1935,7 @@ namespace ts {
|
||||
combineValueAndTypeSymbols(symbolFromVariable, symbolFromModule) :
|
||||
symbolFromModule || symbolFromVariable;
|
||||
if (!symbol) {
|
||||
const moduleName = getFullyQualifiedName(moduleSymbol);
|
||||
const moduleName = getFullyQualifiedName(moduleSymbol, node);
|
||||
const declarationName = declarationNameToString(name);
|
||||
const suggestion = getSuggestedSymbolForNonexistentModule(name, targetSymbol);
|
||||
if (suggestion !== undefined) {
|
||||
@@ -2101,8 +2101,8 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
function getFullyQualifiedName(symbol: Symbol): string {
|
||||
return symbol.parent ? getFullyQualifiedName(symbol.parent) + "." + symbolToString(symbol) : symbolToString(symbol);
|
||||
function getFullyQualifiedName(symbol: Symbol, containingLocation?: Node): string {
|
||||
return symbol.parent ? getFullyQualifiedName(symbol.parent, containingLocation) + "." + symbolToString(symbol) : symbolToString(symbol, containingLocation, /*meaning*/ undefined, SymbolFormatFlags.DoNotIncludeSymbolChain | SymbolFormatFlags.AllowAnyNodeKind);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3078,6 +3078,9 @@ namespace ts {
|
||||
if (flags & SymbolFormatFlags.UseAliasDefinedOutsideCurrentScope) {
|
||||
nodeFlags |= NodeBuilderFlags.UseAliasDefinedOutsideCurrentScope;
|
||||
}
|
||||
if (flags & SymbolFormatFlags.DoNotIncludeSymbolChain) {
|
||||
nodeFlags |= NodeBuilderFlags.DoNotIncludeSymbolChain;
|
||||
}
|
||||
const builder = flags & SymbolFormatFlags.AllowAnyNodeKind ? nodeBuilder.symbolToExpression : nodeBuilder.symbolToEntityName;
|
||||
return writer ? symbolToStringWorker(writer).getText() : usingSingleLineStringWriter(symbolToStringWorker);
|
||||
|
||||
@@ -3155,7 +3158,12 @@ namespace ts {
|
||||
const context: NodeBuilderContext = {
|
||||
enclosingDeclaration,
|
||||
flags: flags || NodeBuilderFlags.None,
|
||||
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop },
|
||||
// If no full tracker is provided, fake up a dummy one with a basic limited-functionality moduleResolverHost
|
||||
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop, moduleResolverHost: flags! & NodeBuilderFlags.DoNotIncludeSymbolChain ? {
|
||||
getCommonSourceDirectory: (host as Program).getCommonSourceDirectory ? () => (host as Program).getCommonSourceDirectory() : () => "",
|
||||
getSourceFiles: () => host.getSourceFiles(),
|
||||
getCurrentDirectory: host.getCurrentDirectory && (() => host.getCurrentDirectory!())
|
||||
} : undefined },
|
||||
encounteredError: false,
|
||||
visitedSymbols: undefined,
|
||||
inferTypeParameters: undefined,
|
||||
@@ -3885,7 +3893,7 @@ namespace ts {
|
||||
// Try to get qualified name if the symbol is not a type parameter and there is an enclosing declaration.
|
||||
let chain: Symbol[];
|
||||
const isTypeParameter = symbol.flags & SymbolFlags.TypeParameter;
|
||||
if (!isTypeParameter && (context.enclosingDeclaration || context.flags & NodeBuilderFlags.UseFullyQualifiedType)) {
|
||||
if (!isTypeParameter && (context.enclosingDeclaration || context.flags & NodeBuilderFlags.UseFullyQualifiedType) && !(context.flags & NodeBuilderFlags.DoNotIncludeSymbolChain)) {
|
||||
chain = Debug.assertDefined(getSymbolChain(symbol, meaning, /*endOfChain*/ true));
|
||||
Debug.assert(chain && chain.length > 0);
|
||||
}
|
||||
@@ -4140,6 +4148,9 @@ namespace ts {
|
||||
function createExpressionFromSymbolChain(chain: Symbol[], index: number): Expression {
|
||||
const typeParameterNodes = lookupTypeParameterNodes(chain, index, context);
|
||||
const symbol = chain[index];
|
||||
if (some(symbol.declarations, hasNonGlobalAugmentationExternalModuleSymbol)) {
|
||||
return createLiteral(getSpecifierForModuleSymbol(symbol, context));
|
||||
}
|
||||
|
||||
if (index === 0) {
|
||||
context.flags |= NodeBuilderFlags.InInitialEntityName;
|
||||
|
||||
@@ -260,6 +260,9 @@ namespace ts.moduleSpecifiers {
|
||||
}
|
||||
|
||||
function tryGetModuleNameAsNodeModule(moduleFileName: string, { getCanonicalFileName, sourceDirectory }: Info, host: ModuleSpecifierResolutionHost, options: CompilerOptions): string | undefined {
|
||||
if (!host.fileExists || !host.readFile) {
|
||||
return undefined;
|
||||
}
|
||||
const parts: NodeModulePathParts = getNodeModulePathParts(moduleFileName)!;
|
||||
if (!parts) {
|
||||
return undefined;
|
||||
@@ -267,8 +270,8 @@ namespace ts.moduleSpecifiers {
|
||||
|
||||
const packageRootPath = moduleFileName.substring(0, parts.packageRootIndex);
|
||||
const packageJsonPath = combinePaths(packageRootPath, "package.json");
|
||||
const packageJsonContent = host.fileExists!(packageJsonPath)
|
||||
? JSON.parse(host.readFile!(packageJsonPath)!)
|
||||
const packageJsonContent = host.fileExists(packageJsonPath)
|
||||
? JSON.parse(host.readFile(packageJsonPath)!)
|
||||
: undefined;
|
||||
const versionPaths = packageJsonContent && packageJsonContent.typesVersions
|
||||
? getPackageJsonTypesVersionsPaths(packageJsonContent.typesVersions)
|
||||
@@ -325,11 +328,12 @@ namespace ts.moduleSpecifiers {
|
||||
}
|
||||
|
||||
function tryGetAnyFileFromPath(host: ModuleSpecifierResolutionHost, path: string) {
|
||||
if (!host.fileExists) return;
|
||||
// We check all js, `node` and `json` extensions in addition to TS, since node module resolution would also choose those over the directory
|
||||
const extensions = getSupportedExtensions({ allowJs: true }, [{ extension: "node", isMixedContent: false }, { extension: "json", isMixedContent: false, scriptKind: ScriptKind.JSON }]);
|
||||
for (const e of extensions) {
|
||||
const fullPath = path + e;
|
||||
if (host.fileExists!(fullPath)) { // TODO: GH#18217
|
||||
if (host.fileExists(fullPath)) {
|
||||
return fullPath;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2908,7 +2908,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export interface TypeCheckerHost {
|
||||
export interface TypeCheckerHost extends ModuleSpecifierResolutionHost {
|
||||
getCompilerOptions(): CompilerOptions;
|
||||
|
||||
getSourceFiles(): ReadonlyArray<SourceFile>;
|
||||
@@ -3183,6 +3183,8 @@ namespace ts {
|
||||
InTypeAlias = 1 << 23, // Writing type in type alias declaration
|
||||
InInitialEntityName = 1 << 24, // Set when writing the LHS of an entity name or entity name expression
|
||||
InReverseMappedType = 1 << 25,
|
||||
|
||||
/* @internal */ DoNotIncludeSymbolChain = 1 << 26, // Skip looking up and printing an accessible symbol chain
|
||||
}
|
||||
|
||||
// Ensure the shared flags between this and `NodeBuilderFlags` stay in alignment
|
||||
@@ -3245,6 +3247,9 @@ namespace ts {
|
||||
|
||||
// Prefer aliases which are not directly visible
|
||||
UseAliasDefinedOutsideCurrentScope = 0x00000008,
|
||||
|
||||
// Skip building an accessible symbol chain
|
||||
/* @internal */ DoNotIncludeSymbolChain = 0x00000010,
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
@@ -5379,7 +5384,7 @@ namespace ts {
|
||||
reportInaccessibleThisError?(): void;
|
||||
reportPrivateInBaseOfClassExpression?(propertyName: string): void;
|
||||
reportInaccessibleUniqueSymbolError?(): void;
|
||||
moduleResolverHost?: EmitHost;
|
||||
moduleResolverHost?: ModuleSpecifierResolutionHost & { getSourceFiles(): ReadonlyArray<SourceFile>, getCommonSourceDirectory(): string };
|
||||
trackReferencedAmbientModule?(decl: ModuleDeclaration, symbol: Symbol): void;
|
||||
trackExternalModuleSymbolOfImportTypeNode?(symbol: Symbol): void;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user