Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add quickfix and refactoring to install @types packages #19130

Merged
12 commits merged into from
Oct 17, 2017
Merged

Conversation

ghost
Copy link

@ghost ghost commented Oct 12, 2017

Needs testing against VSCode before merging. And probably a lot of code review.

@ghost ghost force-pushed the install_types_fix_2 branch 3 times, most recently from fa83247 to 9418845 Compare October 12, 2017 17:13
@ghost ghost force-pushed the install_types_fix_2 branch from 9418845 to 76b7be8 Compare October 12, 2017 17:51
@ghost ghost requested a review from sheetalkamat October 12, 2017 17:52
@@ -1829,7 +1829,9 @@ namespace ts {
return i < 0 ? path : path.substring(i + 1);
}

export function combinePaths(path1: string, path2: string) {
export function combinePaths(path1: Path, path2: string): Path;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not correct.. Path handle case sensitivity.. since path2 doesnt have Path as type you would never be sure if combined paths would be Path or just string (that needs to handle case sensitivity)

@@ -1153,4 +1158,68 @@ namespace ts {
function toSearchResult<T>(value: T | undefined): SearchResult<T> {
return value !== undefined ? { value } : undefined;
}

/* @internal */
export const enum PackageNameValidationResult {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These types shouldnt be in compiler .. They should be in Language service since they arent needed by compiler.

* Validates package name using rules defined at https://docs.npmjs.com/files/package.json
*/
/* @internal */
export function validatePackageName(packageName: string): PackageNameValidationResult {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These functions too..

@@ -1541,6 +1561,7 @@ namespace ts.server.protocol {
description: string;
/** Text changes to apply to each file as part of the code action */
changes: FileCodeEdits[];
commands?: {}[];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should add a note that this is an opaque object to be passed as the input to the apply command request.

return this.typesRegistryCache;
}

this.send({ kind: "typesRegistry" });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can be in a state wherte we send the registry multiple times. we should add a check to make sure we only send it once.

@@ -6837,7 +6882,7 @@ declare namespace ts.server {
logError(err: Error, cmd: string): void;
send(msg: protocol.Message): void;
event<T>(info: T, eventName: string): void;
output(info: any, cmdName: string, reqSeq?: number, errorMsg?: string): void;
output(info: {} | undefined, cmdName: string, reqSeq: number, success: boolean, message?: string): void;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should not be breaking this public API

fileName = toPath(fileName, currentDirectory, getCanonicalFileName);
switch (action.type) {
case "install package":
return host.installPackage({ fileName, packageName: action.packageName });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

host.installPackage is optional, we should check it before calling it

@@ -199,6 +202,9 @@ namespace ts {
* Gets a set of custom transformers to use during emit.
*/
getCustomTransformers?(): CustomTransformers | undefined;

tryGetTypesRegistry?(): Map<void> | undefined;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

consider changing the API to be isKownTypesPackageName(name: string). the server still gets the registry internally and uses it to answer these requests. but the LS API does not really need to know about this detail.

@@ -540,6 +540,16 @@ namespace ts.server {
return response.body.map(entry => this.convertCodeActions(entry, file));
}

applyCodeActionCommand(file: string, command: CodeActionCommand): PromiseLike<ApplyCodeActionCommandResult> {
const args: protocol.ApplyCodeActionCommandRequestArgs = { file, command };
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

leave that as not impmeneted for now.

@ghost ghost force-pushed the install_types_fix_2 branch from f7a2288 to 50b47bb Compare October 13, 2017 21:07
@ghost ghost force-pushed the install_types_fix_2 branch from 50b47bb to 7c22ad6 Compare October 13, 2017 21:42
// We want to avoid looking this up in the registry as that is expensive. So first check that it's actually an NPM package.
const validationResult = JsTyping.validatePackageName(name);
if (validationResult !== JsTyping.PackageNameValidationResult.Ok) {
return undefined;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return false?

/**
* Cheap PromiseLike implementation.
*/
export class PromiseImpl<T> implements PromiseLike<T> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need a custom Promise implementation?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

node v4.0 seems like a reasonable minimum supported platform for the services..

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@anstarovoyt does your engine have Promise support?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't use it

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am sorry, do not use what?

I am asking about your runtime, is it node v4 or compatible?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, we expect that our users use node >= v4 for running the service

/*@internal*/
protected getProjectRootPath(): Path | undefined {
return this.projectRootPath as Path;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thiws method isnt needed... There is always projectRootPath set as currentDirectory field on project

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, do you know why currentDirectory is not a Path?

/* @internal */
protected getProjectRootPath(): Path | undefined {
return this.canonicalConfigFilePath as string as Path;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This too not needed

/* @internal */
protected getProjectRootPath(): Path | undefined {
return this.projectFilePath as Path;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and this too..

@ghost
Copy link
Author

ghost commented Oct 17, 2017

@sheetalkamat Good to go?

@ghost ghost merged commit d05443b into master Oct 17, 2017
@ghost ghost deleted the install_types_fix_2 branch October 17, 2017 22:04
@ghost
Copy link
Author

ghost commented Oct 18, 2017

@mhegazy Since we're using a real Promise maybe it would be a good idea to update type definitions from PromiseLike to Promise?

@mhegazy
Copy link
Contributor

mhegazy commented Oct 18, 2017

yes. Promise is now in lib.d.ts, so should be a non-breaking change.

@ghost ghost mentioned this pull request Oct 18, 2017
@billti
Copy link
Member

billti commented Oct 19, 2017

Anything needed on VS side for this to work?

@ghost
Copy link
Author

ghost commented Oct 19, 2017

We would need to implement functionality to call back into the language server after a code action is accepted, if it contains commands. microsoft/vscode#34787 should still be an accurate description. This hasn't yet been implemented in vscode.

mhegazy added a commit that referenced this pull request Oct 19, 2017
* Adding test case where opened file included in project is not added to ref count of configured project

* Fix the way configured project's reference is managed so that the open file

* Do not watch root folders for failed lookup locations and effective type roots
Fixes #19170

* LEGO: check in for master to temporary branch.

* LEGO: check in for master to temporary branch.

* Mark fresh spread objects w/ContainsObjectLiteral

* Test excess property checks of spreads of unions.

* Add exported members of all project files in the global completion list (#19069)

* checker.ts: Remove null check on symbols

* tsserverProjectSystem.ts: add two tests

* client.ts, completions.ts, types.ts: Add codeActions member to CompletionEntryDetails

* protocol.ts, session.ts: Add codeActions member to CompletionEntryDetails protocol

* protocol.ts, session.ts, types.ts: add hasAction to CompletionEntry

* session.ts, services.ts, types.ts: Add formattingOptions parameter to getCompletionEntryDetails

* completions.ts: define SymbolOriginInfo type

* completions.ts, services.ts: Add allSourceFiles parameter to getCompletionsAtPosition

* completions.ts, services.ts: Plumb allSourceFiles into new function getSymbolsFromOtherSourceFileExports inside getCompletionData

* completions.ts: add symbolToOriginInfoMap parameter to getCompletionEntriesFromSymbols and to return value of getCompletionData

* utilities.ts: Add getOtherModuleSymbols, getUniqueSymbolIdAsString, getUniqueSymbolId

* completions.ts: Set CompletionEntry.hasAction when symbol is found in symbolToOriginInfoMap (meaning there's an import action)

* completions.ts: Populate list with possible exports (implement getSymbolsFromOtherSourceFileExports)

* completions.ts, services.ts: Plumb host and rulesProvider into getCompletionEntryDetails

* completions.ts: Add TODO comment

* importFixes.ts: Add types ImportDeclarationMap and ImportCodeFixContext

* Move getImportDeclarations into getCodeActionForImport, immediately after the implementation

* importFixes.ts: Move createChangeTracker into getCodeActionForImport, immediately after getImportDeclarations

* importFixes.ts: Add convertToImportCodeFixContext function and reference it from the getCodeActions lambda

* importFixes.ts: Add context: ImportCodeFixContext parameter to getCodeActionForImport, update call sites, destructure it, use compilerOptions in getModuleSpecifierForNewImport

* importFixes.ts: Remove moduleSymbol parameter from getImportDeclarations and use the ambient one

* importFixes.ts: Use cachedImportDeclarations from context in getCodeActionForImport

* importFixes.ts: Move createCodeAction out, immediately above convertToImportCodeFixContext

* Move the declaration for lastImportDeclaration out of the getCodeActions lambda into getCodeActionForImport

* importFixes.ts: Use symbolToken in getCodeActionForImport

* importFixes.ts: Remove useCaseSensitiveFileNames altogether from getCodeActions lambda

* importFixes.ts: Remove local getUniqueSymbolId function and add checker parameter to calls to it

* importFixes.ts: Move getCodeActionForImport out into an export, immediately below convertToImportCodeFixContext

* completions.ts: In getCompletionEntryDetails, if there's symbolOriginInfo, call getCodeActionForImport

* importFixes.ts: Create and use importFixContext within getCodeActions lambda

* importFixes.ts: Use local newLineCharacter instead of context.newLineCharacter in getCodeActionForImport

* importFixes.ts: Use local host instead of context.host in getCodeActionForImport

* importFixes.ts: Remove dummy getCanonicalFileName line

* Filter symbols after gathering exports instead of before

* Lint

* Test, fix bugs, refactor

* Suggestions from code review

* Update api baseline

* Fix bug if previousToken is not an Identifier

* Replace `startsWith` with `stringContainsCharactersInOrder`

* Dont try to run unit tests with rwc tests again (#19240)

* In tsserver, indent logged JSON (#19080)

* noUnusedLocals: Warn for recursive call to private method (#18920)

* Added test for windows style paths watched directories

* Handle when directory watcher is invoked on file change
Fixes #19206

* Add quickfix and refactoring to install @types packages (#19130)

* Add quickfix and refactoring to install @types packages

* Move `validatePackageName` to `jsTyping.ts`

* Remove combinePaths overloads

* Respond to code review

* Update api baselines

* Use native PromiseConstructor

* Return false instead of undefined

* Remove getProjectRootPath

* Update api

* This wasnt required before... (#19262)

* Collapse jsdoc annotation refactors to one

Previously there were two, and two always fired.

* Update baselines

* Fix #19257: Ensure a generated signature has a return type (#19264)

* Fix #19257: Ensure a generated signature has a return type

* Ensure generated properties have types

* Use the same context for multiple inferences to the same property access

* Respect newLine compiler option in language service output (#19279)

* LEGO: check in for master to temporary branch.

* LEGO: check in for master to temporary branch.

* LEGO: check in for master to temporary branch.

* Disambiguate same-named refactors using description (#19267)

Disambiguate same-named refactors using actionName

* Set the scriptKind from the host configuration if present

* Update API baselines

* Remove erroneous error for JSDoc object literals

appears with checkJS.

* Update annotateWithTypeFromJSDoc tests

1. Object literals are single-line now.
2. Index signatures transform to TS index signatures.
3. The refactoring is only available when it could add types.

* Add a better test for jsdoc index signatures.

The test case shows that the errorenous error no longer appears.

* Fix bugs in jsdoc annotation refactor

1. Transform index signatures to TS index signatures.
2. Print object literals on a single line.
3. Only offer the refactor when it could add types. (There must not be a
type annotation already, and there must be a JSDoc that applies.)

* Move isJSDocIndexSignature to utilities

* Add failing testcase where when d.ts file is in program, the files get emitted multiple times with --out setting

* Modify api to emit affected files using callback instead of generating in memory output
Also marking few apis introduced during watch improvements changes that are suppose to be internal for now

* Use get files affected by internally and hence use file paths as input

* Simplify emit changed files further
Also use source file version as the signature of declaration file instead of computing it from text

* Do not cache the semantic diagnostics when compiler options has --out since we would anyways get all fresh diagnostics

* make getCurrentDirectory required (#19303)

* LEGO: check in for master to temporary branch.

* Actually use cached semantic diagnostics

* Fix tsc-instrumented

1. Make recursiveCreateDirectory correctly handle relative paths.
2. Remove dependency on Harness
3. Correctly increment iocapture0, iocapture1, ... iocaptureN.
4. Stop double-nesting baseline files.

* Fix lint

* Fix #19270: ensure output name is a valid locale name (#19308)

* Fix #19270: ensure output name is a valid locale name

* Use const instead of var

* Add comment

* Fix typo

* Split the concat logic for generatedLCGFile

* findAllRefs: Support anonymous default export (#19302)

* Fix undefined error using `getEffectiveTypeRoots` (#19300)

* Remove extra blank line in logs (#19307)

* Use Promise instead of PromiseLike (#19305)

* Workaround for nonnull operator on indexed accesses (#19275)

* Quick and dirty workaround

* Add third case to show current behavior

* Rename variable, replace elaboration from comment with links

* Remove some unnecessary `undefined` checks in extractSymbol (#19256)

* Fix "noStringLiteral" lint errors (#19310)

* LEGO: check in for master to temporary branch.

* Rename locale outputs

* Update LKG
@microsoft microsoft locked and limited conversation to collaborators Jun 14, 2018
This pull request was closed.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants