Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,6 @@
"command": "dotnet.restore",
"title": "Restore Packages",
"category": "dotnet"
},
{
"command": "csharp.addTasksJson",
"title": "Add tasks.json (if missing)",
"category": "Debugger"
}
],
"keybindings": [
Expand Down
56 changes: 1 addition & 55 deletions src/features/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,8 @@ export default function registerCommands(server: OmnisharpServer, extensionPath:
let d5 = vscode.commands.registerCommand('o.execute-last-command', () => dnxExecuteLastCommand(server));
let d6 = vscode.commands.registerCommand('o.showOutput', () => server.getChannel().show(vscode.ViewColumn.Three));
let d7 = vscode.commands.registerCommand('dotnet.restore', () => dotnetRestore(server));
let d8 = vscode.commands.registerCommand('csharp.addTasksJson', () => addTasksJson(server, extensionPath));

return vscode.Disposable.from(d1, d2, d3, d4, d5, d6, d7, d8);
return vscode.Disposable.from(d1, d2, d3, d4, d5, d6, d7);
}

function pickProjectAndStart(server: OmnisharpServer) {
Expand Down Expand Up @@ -198,57 +197,4 @@ function getFolderPath(fileOrFolderPath: string): Promise<string> {
? path.dirname(fileOrFolderPath)
: fileOrFolderPath;
});
}

function getExpectedVsCodeFolderPath(solutionPathOrFolder: string): Promise<string> {
return getFolderPath(solutionPathOrFolder).then(folder =>
path.join(folder, '.vscode'));
}

export function addTasksJson(server: OmnisharpServer, extensionPath: string) {
return new Promise<string>((resolve, reject) => {
if (!server.isRunning()) {
return reject('OmniSharp is not running.');
}

let solutionPathOrFolder = server.getSolutionPathOrFolder();
if (!solutionPathOrFolder)
{
return reject('No solution or folder open.');
}

return getExpectedVsCodeFolderPath(solutionPathOrFolder).then(vscodeFolder => {
let tasksJsonPath = path.join(vscodeFolder, 'tasks.json');

return fs.existsAsync(tasksJsonPath).then(e => {
if (e) {
return vscode.window.showInformationMessage(`${tasksJsonPath} already exists.`).then(_ => {
return resolve(tasksJsonPath);
});
}
else {
let templatePath = path.join(extensionPath, 'template-tasks.json');

return fs.existsAsync(templatePath).then(e => {
if (!e) {
return reject('Could not find template-tasks.json file in extension.');
}

return fs.ensureDirAsync(vscodeFolder).then(ok => {
if (ok) {
let oldFile = fs.createReadStream(templatePath);
let newFile = fs.createWriteStream(tasksJsonPath);
oldFile.pipe(newFile);

return resolve(tasksJsonPath);
}
else {
return reject(`Could not create ${vscodeFolder} directory.`);
}
});
});
}
});
});
});
}
46 changes: 25 additions & 21 deletions src/omnisharpMain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,45 +22,46 @@ import registerCommands from './features/commands';
import {StdioOmnisharpServer} from './omnisharpServer';
import forwardChanges from './features/changeForwarding';
import reportStatus from './features/omnisharpStatus';
import {Disposable, ExtensionContext, DocumentSelector, languages} from 'vscode';
import {installCoreClrDebug} from './coreclr-debug';
import {promptToAddBuildTaskIfNecessary} from './tasks';
import * as vscode from 'vscode';

export function activate(context: ExtensionContext): any {
export function activate(context: vscode.ExtensionContext): any {

const _selector: DocumentSelector = {
const _selector: vscode.DocumentSelector = {
language: 'csharp',
scheme: 'file' // only files from disk
};

const server = new StdioOmnisharpServer();
const advisor = new Advisor(server); // create before server is started
const disposables: Disposable[] = [];
const localDisposables: Disposable[] = [];
const disposables: vscode.Disposable[] = [];
const localDisposables: vscode.Disposable[] = [];

disposables.push(server.onServerStart(() => {
// register language feature provider on start
localDisposables.push(languages.registerDefinitionProvider(_selector, new DefinitionProvider(server)));
localDisposables.push(languages.registerCodeLensProvider(_selector, new CodeLensProvider(server)));
localDisposables.push(languages.registerDocumentHighlightProvider(_selector, new DocumentHighlightProvider(server)));
localDisposables.push(languages.registerDocumentSymbolProvider(_selector, new DocumentSymbolProvider(server)));
localDisposables.push(languages.registerReferenceProvider(_selector, new ReferenceProvider(server)));
localDisposables.push(languages.registerHoverProvider(_selector, new HoverProvider(server)));
localDisposables.push(languages.registerRenameProvider(_selector, new RenameProvider(server)));
localDisposables.push(languages.registerDocumentRangeFormattingEditProvider(_selector, new FormatProvider(server)));
localDisposables.push(languages.registerOnTypeFormattingEditProvider(_selector, new FormatProvider(server), '}', ';'));
localDisposables.push(languages.registerCompletionItemProvider(_selector, new CompletionItemProvider(server), '.', '<'));
localDisposables.push(languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server)));
localDisposables.push(languages.registerSignatureHelpProvider(_selector, new SignatureHelpProvider(server), '(', ','));
localDisposables.push(vscode.languages.registerDefinitionProvider(_selector, new DefinitionProvider(server)));
localDisposables.push(vscode.languages.registerCodeLensProvider(_selector, new CodeLensProvider(server)));
localDisposables.push(vscode.languages.registerDocumentHighlightProvider(_selector, new DocumentHighlightProvider(server)));
localDisposables.push(vscode.languages.registerDocumentSymbolProvider(_selector, new DocumentSymbolProvider(server)));
localDisposables.push(vscode.languages.registerReferenceProvider(_selector, new ReferenceProvider(server)));
localDisposables.push(vscode.languages.registerHoverProvider(_selector, new HoverProvider(server)));
localDisposables.push(vscode.languages.registerRenameProvider(_selector, new RenameProvider(server)));
localDisposables.push(vscode.languages.registerDocumentRangeFormattingEditProvider(_selector, new FormatProvider(server)));
localDisposables.push(vscode.languages.registerOnTypeFormattingEditProvider(_selector, new FormatProvider(server), '}', ';'));
localDisposables.push(vscode.languages.registerCompletionItemProvider(_selector, new CompletionItemProvider(server), '.', '<'));
localDisposables.push(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server)));
localDisposables.push(vscode.languages.registerSignatureHelpProvider(_selector, new SignatureHelpProvider(server), '(', ','));
const codeActionProvider = new CodeActionProvider(server);
localDisposables.push(codeActionProvider);
localDisposables.push(languages.registerCodeActionsProvider(_selector, codeActionProvider));
localDisposables.push(vscode.languages.registerCodeActionsProvider(_selector, codeActionProvider));
localDisposables.push(reportDiagnostics(server, advisor));
localDisposables.push(forwardChanges(server));
}));

disposables.push(server.onServerStop(() => {
// remove language feature providers on stop
Disposable.from(...localDisposables).dispose();
vscode.Disposable.from(...localDisposables).dispose();
}));

disposables.push(registerCommands(server, context.extensionPath));
Expand All @@ -71,14 +72,17 @@ export function activate(context: ExtensionContext): any {
server.autoStart(context.workspaceState.get<string>('lastSolutionPathOrFolder'));

// stop server on deactivate
disposables.push(new Disposable(() => {
disposables.push(new vscode.Disposable(() => {
advisor.dispose();
server.stop();
}));

// Check to see if there is a tasks.json with a "build" task and prompt the user to add it if missing.
promptToAddBuildTaskIfNecessary();

// install coreclr-debug
installCoreClrDebug(context);

context.subscriptions.push(...disposables);
}

91 changes: 91 additions & 0 deletions src/tasks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

'use strict';

import * as fs from 'fs-extra-promise';
import * as path from 'path';
import * as vscode from 'vscode';
import * as tasks from 'vscode-tasks';

function promptToAddBuildTask(): Promise<boolean> {
return new Promise<boolean>((resolve, reject) => {
const item = { title: 'Yes' }

vscode.window.showInformationMessage('Would you like to add a build task for your project?', item).then(selection => {
return selection
? resolve(true)
: resolve(false);
});
});
}

function createBuildTaskDescription(): tasks.TaskDescription {
return {
taskName: "build",
args: [],
isBuildCommand: true,
problemMatcher: "$msCompile"
};
}

function createTasksConfiguration(): tasks.TaskConfiguration {
return {
version: "0.1.0",
command: "dotnet",
isShellCommand: true,
args: [],
tasks: [ createBuildTaskDescription() ]
};
}

function writeTasksJson(tasksJsonPath: string, tasksConfig: tasks.TaskConfiguration) {
const tasksJsonText = JSON.stringify(tasksConfig, null, ' ');
fs.writeFileSync(tasksJsonPath, tasksJsonText);
}

export function promptToAddBuildTaskIfNecessary() {
if (!vscode.workspace.rootPath) {
return;
}

// If there is no project.json, we won't bother to prompt the user for tasks.json.
const projectJsonPath = path.join(vscode.workspace.rootPath, 'project.json');
if (!fs.existsSync(projectJsonPath)) {
return;
}

const vscodeFolder = path.join(vscode.workspace.rootPath, '.vscode');
const tasksJsonPath = path.join(vscodeFolder, 'tasks.json');

fs.ensureDirAsync(vscodeFolder).then(() => {
fs.existsAsync(tasksJsonPath).then(exists => {
if (exists) {
fs.readFileAsync(tasksJsonPath).then(text => {
const fileText = text.toString();
let tasksConfig: tasks.TaskConfiguration = JSON.parse(fileText);
let buildTask = tasksConfig.tasks.find(td => td.taskName === 'build');
if (!buildTask) {
promptToAddBuildTask().then(shouldAdd => {
if (shouldAdd) {
buildTask = createBuildTaskDescription();
tasksConfig.tasks.push(buildTask);
writeTasksJson(tasksJsonPath, tasksConfig);
}
});
}
});
}
else {
promptToAddBuildTask().then(shouldAdd => {
if (shouldAdd) {
const tasksConfig = createTasksConfiguration();
writeTasksJson(tasksJsonPath, tasksConfig);
}
});
}
});
});
}
5 changes: 5 additions & 0 deletions src/typings/vscode-extension-telemetry.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

declare module 'vscode-extension-telemetry' {
export default class TelemetryReporter {
constructor(extensionId: string,extensionVersion: string, key: string);
Expand Down
Loading