GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing github.com — Create type aliases for unresolved type symbols by ahejlsberg · Pull Request #45976 · microsoft/TypeScript Conversation
Member
With this PR we create type aliases for unresolved symbols such that quick info and error messages list back the unresolved name instead of just In this example where function foo(items: ItemData[]) { let item = items[0]; } hovering over Fixes #45893.
Sorry, something went wrong. Uh oh!
There was an error while loading. Please reload this page. All reactions
Daniel Rosenwasser (DanielRosenwasser)
requested changes
|
| const typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.IgnoreErrors | (noTruncation ? NodeBuilderFlags.NoTruncation : 0), writer); | ||
| if (typeNode === undefined) return Debug.fail("should always get typenode"); | ||
| const options = { removeComments: true }; | ||
| const options = { removeComments: type !== unresolvedType }; |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Would be helpful to leave a comment on this one (pun intended).
| const options = { removeComments: type !== unresolvedType }; | |
| // The unresolved type gets a synthesized comment on `any` | |
| // to hint to users that it's not a plain `any`. | |
| // Otherwise, we always strip comments out. | |
| const options = { removeComments: type !== unresolvedType }; |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Sure, I'll add a comment.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| } | ||
|
|
||
| function isErrorType(type: Type) { | ||
| return type === errorType || !!(type.flags & TypeFlags.Any && type.aliasSymbol); |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Why not just this? Seems like it'd be cheaper too.
| return type === errorType || !!(type.flags & TypeFlags.Any && type.aliasSymbol); | |
| return type === errorType || type === unresolvedType; |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
No, that wouldn't work. I'll add a clarifying comment, but basically we want to identify the special TypeFlags.Any types produced by getTypeForTypeAliasReference for an unresolved symbol. The sole purpose of unresolvedType is to act as the declared type for the special type alias symbols we create for unresolved names. The type is never actually returned by anything because getTypeForTypeAliasReference maps it into a special TypeFlags.Any type with an aliasSymbol.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| // Legal to use 'await' in a type context. | ||
| var v: await; | ||
| >v : any | ||
| >v : await |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Is there some way to make the type writer a little smarter here so that the team can differentiate between an unresolved and a concrete type?
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
We certainly have the ability to tell the difference, but what did you have in mind in terms of output? Remember that we're often dealing with composed types, e.g. for var v: Promise<await[]> we can't easily attach a comment to the await identifier in the output.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
A parenthesized type might work like (/*unresolved*/ await)
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I'm not really sure we want to do that. We're already generate an error at every reference to an unresolved symbol, I don't think we also want the extra noise in the type baselines.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
I guess this doesn't technically fix #38836 because this only applies to types, right? |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Right, this doesn't fix #38836. One complication there would be what scope to introduce the unknown value symbols into. Should they be locals of the innermost enclosing function, or just globals like we do for the type symbols? The latter typically makes sense for types, but less clear for unresolved value symbols. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
I think just a global scope makes enough sense; if you do have a bunch of unresolved variables spread throughout your codebase, it's convenient to find-all-references, and likely to be a global anyhow; if it's mostly local (e.g. a user forgot to locally declare it), it doesn't really matter where you put it. But I'd understand if we wanted to take it one step at a time. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Looks like there's a few conflicts that need to be resolved. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
# Conflicts: # src/compiler/checker.ts # tests/cases/fourslash/findReferencesJSXTagName.ts # tests/cases/fourslash/tsxFindAllReferences10.ts
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
Improve display experience for unresolved symbols
There was an error while loading. Please reload this page.