-
Notifications
You must be signed in to change notification settings - Fork 514
add .Save() to FileContext API #1139
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
Changes from 4 commits
47ccd39
0198d8f
2fdb3e8
a65f946
cc04b7d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,7 @@ | |
* Copyright (C) Microsoft Corporation. All rights reserved. | ||
*--------------------------------------------------------*/ | ||
|
||
import os = require('os'); | ||
import path = require('path'); | ||
import vscode = require('vscode'); | ||
import { IFeature } from '../feature'; | ||
|
@@ -140,6 +141,12 @@ export namespace CloseFileRequest { | |
'editor/closeFile'); | ||
} | ||
|
||
export namespace SaveFileRequest { | ||
export const type = | ||
new RequestType<string, EditorOperationResponse, void, void>( | ||
'editor/saveFile'); | ||
} | ||
|
||
export namespace ShowErrorMessageRequest { | ||
export const type = | ||
new RequestType<string, EditorOperationResponse, void, void>( | ||
|
@@ -239,14 +246,18 @@ export class ExtensionCommandsFeature implements IFeature { | |
NewFileRequest.type, | ||
filePath => this.newFile()); | ||
|
||
this.languageClient.onRequest( | ||
this.languageClient.onRequest( | ||
OpenFileRequest.type, | ||
filePath => this.openFile(filePath)); | ||
|
||
this.languageClient.onRequest( | ||
CloseFileRequest.type, | ||
filePath => this.closeFile(filePath)); | ||
|
||
this.languageClient.onRequest( | ||
SaveFileRequest.type, | ||
filePath => this.saveFile(filePath)); | ||
|
||
this.languageClient.onRequest( | ||
ShowInformationMessageRequest.type, | ||
message => this.showInformationMessage(message)); | ||
|
@@ -361,13 +372,7 @@ export class ExtensionCommandsFeature implements IFeature { | |
|
||
private openFile(filePath: string): Thenable<EditorOperationResponse> { | ||
|
||
// Make sure the file path is absolute | ||
if (!path.win32.isAbsolute(filePath)) | ||
{ | ||
filePath = path.win32.resolve( | ||
vscode.workspace.rootPath, | ||
filePath); | ||
} | ||
filePath = this.normalizeFilePath(filePath); | ||
|
||
var promise = | ||
vscode.workspace.openTextDocument(filePath) | ||
|
@@ -380,24 +385,34 @@ export class ExtensionCommandsFeature implements IFeature { | |
private closeFile(filePath: string): Thenable<EditorOperationResponse> { | ||
|
||
var promise: Thenable<EditorOperationResponse>; | ||
|
||
// Make sure the file path is absolute | ||
if (!path.win32.isAbsolute(filePath)) | ||
if (this.findTextDocument(this.normalizeFilePath(filePath))) | ||
{ | ||
filePath = path.win32.resolve( | ||
vscode.workspace.rootPath, | ||
filePath); | ||
promise = | ||
vscode.workspace.openTextDocument(filePath) | ||
.then(doc => vscode.window.showTextDocument(doc)) | ||
.then(editor => vscode.commands.executeCommand("workbench.action.closeActiveEditor")) | ||
.then(_ => EditorOperationResponse.Completed); | ||
} | ||
else | ||
{ | ||
promise = Promise.resolve(EditorOperationResponse.Completed); | ||
} | ||
|
||
// Normalize file path case for comparison | ||
var normalizedFilePath = filePath.toLowerCase(); | ||
return promise; | ||
} | ||
|
||
private saveFile(filePath: string): Thenable<EditorOperationResponse> { | ||
|
||
if (vscode.workspace.textDocuments.find(doc => doc.fileName.toLowerCase() == normalizedFilePath)) | ||
var promise: Thenable<EditorOperationResponse>; | ||
if (this.findTextDocument(this.normalizeFilePath(filePath))) | ||
{ | ||
promise = | ||
vscode.workspace.openTextDocument(filePath) | ||
.then(doc => vscode.window.showTextDocument(doc)) | ||
.then(editor => vscode.commands.executeCommand("workbench.action.closeActiveEditor")) | ||
.then(doc => { | ||
if (doc.isDirty) { | ||
doc.save(); | ||
} | ||
}) | ||
.then(_ => EditorOperationResponse.Completed); | ||
} | ||
else | ||
|
@@ -408,6 +423,53 @@ export class ExtensionCommandsFeature implements IFeature { | |
return promise; | ||
} | ||
|
||
private normalizeFilePath(filePath: string): string { | ||
var platform = os.platform(); | ||
if (platform == "win32") { | ||
// Make sure the file path is absolute | ||
if (!path.win32.isAbsolute(filePath)) | ||
{ | ||
filePath = path.win32.resolve( | ||
vscode.workspace.rootPath, | ||
filePath); | ||
} | ||
|
||
// Normalize file path case for comparison for Windows | ||
return filePath.toLowerCase(); | ||
} else { | ||
// Make sure the file path is absolute | ||
if (!path.isAbsolute(filePath)) | ||
{ | ||
filePath = path.resolve( | ||
vscode.workspace.rootPath, | ||
filePath); | ||
} | ||
|
||
//macOS is case-insensitive | ||
if (platform == "darwin") { | ||
filePath = filePath.toLowerCase(); | ||
} | ||
|
||
return filePath; | ||
} | ||
} | ||
|
||
private findTextDocument(filePath: string): boolean { | ||
// since Windows and macOS are case-insensitive, we need to normalize them differently | ||
var canFind = vscode.workspace.textDocuments.find(doc => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. tslint will complain if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed! |
||
var docPath, platform = os.platform(); | ||
if (platform == "win32" || platform == "darwin") { | ||
// for Windows and macOS paths, they are normalized to be lowercase | ||
docPath = doc.fileName.toLowerCase(); | ||
} else { | ||
docPath = doc.fileName; | ||
} | ||
return docPath == filePath; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Probably want to use a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed! |
||
}); | ||
|
||
return canFind != null; | ||
} | ||
|
||
private setSelection(details: SetSelectionRequestArguments): EditorOperationResponse { | ||
vscode.window.activeTextEditor.selections = [ | ||
new vscode.Selection( | ||
|
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another linter thing and something @daviwil espoused as well - favor the use of
let
overvar
.let
is properly blocked scoped in JavaScript. I'm commenting on this one line about it but there are quite a fewvar
usages in this PR that should belet
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed all occurrences in the file :)