Skip to content

Commit 17a73c4

Browse files
Merge branch 'master' into release
2 parents 2a0711e + d73abff commit 17a73c4

File tree

13 files changed

+251
-108
lines changed

13 files changed

+251
-108
lines changed

src/features/codeActionProvider.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,25 @@ import AbstractProvider from './abstractProvider';
99
import * as protocol from '../omnisharp/protocol';
1010
import { toRange2 } from '../omnisharp/typeConvertion';
1111
import * as serverUtils from '../omnisharp/utils';
12-
import { Options } from '../omnisharp/options';
1312
import { FileModificationType } from '../omnisharp/protocol';
1413
import { Uri } from 'vscode';
1514
import CompositeDisposable from '../CompositeDisposable';
15+
import OptionProvider from '../observers/OptionProvider';
1616

1717
export default class CodeActionProvider extends AbstractProvider implements vscode.CodeActionProvider {
1818

19-
private _options: Options;
2019
private _commandId: string;
2120

22-
constructor(server: OmniSharpServer) {
21+
constructor(server: OmniSharpServer, private optionProvider: OptionProvider) {
2322
super(server);
24-
2523
this._commandId = 'omnisharp.runCodeAction';
26-
27-
this._resetCachedOptions();
28-
29-
let d1 = vscode.workspace.onDidChangeConfiguration(this._resetCachedOptions, this);
30-
let d2 = vscode.commands.registerCommand(this._commandId, this._runCodeAction, this);
31-
this.addDisposables(new CompositeDisposable(d1, d2));
32-
}
33-
34-
private _resetCachedOptions(): void {
35-
this._options = Options.Read(vscode);
24+
let registerCommandDisposable = vscode.commands.registerCommand(this._commandId, this._runCodeAction, this);
25+
this.addDisposables(new CompositeDisposable(registerCommandDisposable));
3626
}
3727

3828
public async provideCodeActions(document: vscode.TextDocument, range: vscode.Range, context: vscode.CodeActionContext, token: vscode.CancellationToken): Promise<vscode.Command[]> {
39-
if (this._options.disableCodeActions) {
29+
let options = this.optionProvider.GetLatestOptions();
30+
if (options.disableCodeActions) {
4031
return;
4132
}
4233

src/features/codeLensProvider.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@
66
import * as protocol from '../omnisharp/protocol';
77
import * as serverUtils from '../omnisharp/utils';
88
import * as vscode from 'vscode';
9-
109
import { toLocation, toRange } from '../omnisharp/typeConvertion';
11-
1210
import AbstractProvider from './abstractProvider';
1311
import { OmniSharpServer } from '../omnisharp/server';
1412
import { Options } from '../omnisharp/options';
1513
import TestManager from './dotnetTest';
16-
import CompositeDisposable from '../CompositeDisposable';
14+
import OptionProvider from '../observers/OptionProvider';
1715

1816
class OmniSharpCodeLens extends vscode.CodeLens {
1917

@@ -27,19 +25,9 @@ class OmniSharpCodeLens extends vscode.CodeLens {
2725

2826
export default class OmniSharpCodeLensProvider extends AbstractProvider implements vscode.CodeLensProvider {
2927

30-
private _options: Options;
31-
32-
constructor(server: OmniSharpServer, testManager: TestManager) {
28+
constructor(server: OmniSharpServer, testManager: TestManager, private optionProvider: OptionProvider) {
3329
super(server);
3430

35-
this._resetCachedOptions();
36-
37-
let configChangedDisposable = vscode.workspace.onDidChangeConfiguration(this._resetCachedOptions, this);
38-
this.addDisposables(new CompositeDisposable(configChangedDisposable));
39-
}
40-
41-
private _resetCachedOptions(): void {
42-
this._options = Options.Read(vscode);
4331
}
4432

4533
private static filteredSymbolNames: { [name: string]: boolean } = {
@@ -50,37 +38,38 @@ export default class OmniSharpCodeLensProvider extends AbstractProvider implemen
5038
};
5139

5240
async provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken) {
53-
if (!this._options.showReferencesCodeLens && !this._options.showTestsCodeLens) {
41+
let options = this.optionProvider.GetLatestOptions();
42+
if (!options.showReferencesCodeLens && !options.showTestsCodeLens) {
5443
return [];
5544
}
5645

5746
let tree = await serverUtils.currentFileMembersAsTree(this._server, { FileName: document.fileName }, token);
5847
let ret: vscode.CodeLens[] = [];
5948

6049
for (let node of tree.TopLevelTypeDefinitions) {
61-
await this._convertQuickFix(ret, document.fileName, node);
50+
await this._convertQuickFix(ret, document.fileName, node, options);
6251
}
6352

6453
return ret;
6554
}
6655

6756

68-
private async _convertQuickFix(bucket: vscode.CodeLens[], fileName: string, node: protocol.Node): Promise<void> {
57+
private async _convertQuickFix(bucket: vscode.CodeLens[], fileName: string, node: protocol.Node, options: Options): Promise<void> {
6958

7059
if (node.Kind === 'MethodDeclaration' && OmniSharpCodeLensProvider.filteredSymbolNames[node.Location.Text]) {
7160
return;
7261
}
7362

7463
let lens = new OmniSharpCodeLens(fileName, toRange(node.Location));
75-
if (this._options.showReferencesCodeLens) {
64+
if (options.showReferencesCodeLens) {
7665
bucket.push(lens);
7766
}
7867

7968
for (let child of node.ChildNodes) {
80-
this._convertQuickFix(bucket, fileName, child);
69+
this._convertQuickFix(bucket, fileName, child, options);
8170
}
8271

83-
if (this._options.showTestsCodeLens) {
72+
if (options.showTestsCodeLens) {
8473
await this._updateCodeLensForTest(bucket, fileName, node);
8574
}
8675
}

src/features/commands.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ import { CommandShowOutput, CommandDotNetRestoreStart, CommandDotNetRestoreProgr
1818
import { EventStream } from '../EventStream';
1919
import { PlatformInformation } from '../platform';
2020
import CompositeDisposable from '../CompositeDisposable';
21+
import OptionProvider from '../observers/OptionProvider';
2122

22-
export default function registerCommands(server: OmniSharpServer, eventStream: EventStream, platformInfo: PlatformInformation): CompositeDisposable {
23+
export default function registerCommands(server: OmniSharpServer, platformInfo: PlatformInformation, eventStream: EventStream, optionProvider: OptionProvider): CompositeDisposable {
2324
let d1 = vscode.commands.registerCommand('o.restart', () => restartOmniSharp(server));
24-
let d2 = vscode.commands.registerCommand('o.pickProjectAndStart', () => pickProjectAndStart(server));
25+
let d2 = vscode.commands.registerCommand('o.pickProjectAndStart', async () => pickProjectAndStart(server, optionProvider));
2526
let d3 = vscode.commands.registerCommand('o.showOutput', () => eventStream.post(new CommandShowOutput()));
2627
let d4 = vscode.commands.registerCommand('dotnet.restore', fileName => {
2728
if (fileName) {
@@ -63,9 +64,9 @@ function restartOmniSharp(server: OmniSharpServer) {
6364
}
6465
}
6566

66-
function pickProjectAndStart(server: OmniSharpServer) {
67-
68-
return findLaunchTargets().then(targets => {
67+
async function pickProjectAndStart(server: OmniSharpServer, optionProvider: OptionProvider) {
68+
let options = optionProvider.GetLatestOptions();
69+
return findLaunchTargets(options).then(targets => {
6970

7071
let currentPath = server.getSolutionPathOrFolder();
7172
if (currentPath) {

src/main.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ import TelemetryReporter from 'vscode-extension-telemetry';
2828
import { addJSONProviders } from './features/json/jsonContributions';
2929
import { ProjectStatusBarObserver } from './observers/ProjectStatusBarObserver';
3030
import CSharpExtensionExports from './CSharpExtensionExports';
31-
import { Options } from './omnisharp/options';
3231
import { vscodeNetworkSettingsProvider, NetworkSettingsProvider } from './NetworkSettings';
3332
import { ErrorMessageObserver } from './observers/ErrorMessageObserver';
33+
import OptionStream from './observables/OptionStream';
34+
import OptionProvider from './observers/OptionProvider';
3435

3536
export async function activate(context: vscode.ExtensionContext): Promise<CSharpExtensionExports> {
3637

@@ -43,6 +44,8 @@ export async function activate(context: vscode.ExtensionContext): Promise<CSharp
4344
util.setExtensionPath(extension.extensionPath);
4445

4546
const eventStream = new EventStream();
47+
const optionStream = new OptionStream(vscode);
48+
let optionProvider = new OptionProvider(optionStream);
4649

4750
let dotnetChannel = vscode.window.createOutputChannel('.NET');
4851
let dotnetChannelObserver = new DotNetChannelObserver(dotnetChannel);
@@ -62,7 +65,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<CSharp
6265
eventStream.subscribe(omnisharpLogObserver.post);
6366
eventStream.subscribe(omnisharpChannelObserver.post);
6467

65-
let warningMessageObserver = new WarningMessageObserver(vscode, () => Options.Read(vscode).disableMSBuildDiagnosticWarning || false);
68+
let warningMessageObserver = new WarningMessageObserver(vscode, () => optionProvider.GetLatestOptions().disableMSBuildDiagnosticWarning || false);
6669
eventStream.subscribe(warningMessageObserver.post);
6770

6871
let informationMessageObserver = new InformationMessageObserver(vscode);
@@ -98,16 +101,18 @@ export async function activate(context: vscode.ExtensionContext): Promise<CSharp
98101

99102
let networkSettingsProvider = vscodeNetworkSettingsProvider(vscode);
100103
let runtimeDependenciesExist = await ensureRuntimeDependencies(extension, eventStream, platformInfo, networkSettingsProvider);
101-
104+
102105
// activate language services
103-
let omniSharpPromise = OmniSharp.activate(context, eventStream, extension.packageJSON, platformInfo, networkSettingsProvider);
106+
let omniSharpPromise = OmniSharp.activate(context, extension.packageJSON, platformInfo, networkSettingsProvider, eventStream, optionProvider);
104107

105108
// register JSON completion & hover providers for project.json
106109
context.subscriptions.push(addJSONProviders());
107110
context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(() => {
108111
eventStream.post(new ActiveTextEditorChanged());
109112
}));
110113

114+
context.subscriptions.push(optionStream);
115+
111116
let coreClrDebugPromise = Promise.resolve();
112117
if (runtimeDependenciesExist) {
113118
// activate coreclr-debug
@@ -123,7 +128,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<CSharp
123128
};
124129
}
125130

126-
async function ensureRuntimeDependencies(extension: vscode.Extension<CSharpExtensionExports>, eventStream: EventStream, platformInfo: PlatformInformation, networkSettingsProvider : NetworkSettingsProvider): Promise<boolean> {
131+
async function ensureRuntimeDependencies(extension: vscode.Extension<CSharpExtensionExports>, eventStream: EventStream, platformInfo: PlatformInformation, networkSettingsProvider: NetworkSettingsProvider): Promise<boolean> {
127132
return util.installFileExists(util.InstallFileType.Lock)
128133
.then(exists => {
129134
if (!exists) {

src/observables/OptionStream.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { Options } from "../omnisharp/options";
7+
import { vscode } from "../vscodeAdapter";
8+
import 'rxjs/add/operator/take';
9+
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
10+
import Disposable, { IDisposable } from "../Disposable";
11+
import { Subject } from "rxjs/Subject";
12+
13+
export default class OptionStream {
14+
private optionStream: Subject<Options>;
15+
private disposable: IDisposable;
16+
17+
constructor(vscode: vscode) {
18+
this.optionStream = new BehaviorSubject<Options>(Options.Read(vscode));
19+
this.disposable = vscode.workspace.onDidChangeConfiguration(e => {
20+
//if the omnisharp or csharp configuration are affected only then read the options
21+
if (e.affectsConfiguration('omnisharp') || e.affectsConfiguration('csharp')) {
22+
this.optionStream.next(Options.Read(vscode));
23+
}
24+
});
25+
}
26+
27+
public dispose = () => {
28+
this.disposable.dispose();
29+
}
30+
31+
public subscribe(observer: (options: Options) => void): Disposable {
32+
return new Disposable(this.optionStream.subscribe(observer));
33+
}
34+
}

src/observers/OptionProvider.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { Options } from "../omnisharp/options";
7+
import OptionStream from "../observables/OptionStream";
8+
9+
export default class OptionProvider {
10+
private options: Options;
11+
12+
constructor(optionStream: OptionStream) {
13+
optionStream.subscribe(options => this.options = options);
14+
}
15+
16+
public GetLatestOptions(): Options {
17+
if (!this.options) {
18+
throw new Error("Error reading OmniSharp options");
19+
}
20+
return this.options;
21+
}
22+
}

src/omnisharp/extension.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import FormatProvider from '../features/formattingEditProvider';
2020
import HoverProvider from '../features/hoverProvider';
2121
import ImplementationProvider from '../features/implementationProvider';
2222
import { OmniSharpServer } from './server';
23-
import { Options } from './options';
2423
import ReferenceProvider from '../features/referenceProvider';
2524
import RenameProvider from '../features/renameProvider';
2625
import SignatureHelpProvider from '../features/signatureHelpProvider';
@@ -34,21 +33,22 @@ import { EventStream } from '../EventStream';
3433
import { NetworkSettingsProvider } from '../NetworkSettings';
3534
import CompositeDisposable from '../CompositeDisposable';
3635
import Disposable from '../Disposable';
36+
import OptionProvider from '../observers/OptionProvider';
3737

3838
export let omnisharp: OmniSharpServer;
3939

40-
export async function activate(context: vscode.ExtensionContext, eventStream: EventStream, packageJSON: any, platformInfo: PlatformInformation, provider: NetworkSettingsProvider) {
40+
export async function activate(context: vscode.ExtensionContext, packageJSON: any, platformInfo: PlatformInformation, provider: NetworkSettingsProvider, eventStream: EventStream, optionProvider: OptionProvider) {
4141
const documentSelector: vscode.DocumentSelector = {
4242
language: 'csharp',
4343
scheme: 'file' // only files from disk
4444
};
4545

46-
const options = Options.Read(vscode);
47-
const server = new OmniSharpServer(vscode, provider, eventStream, packageJSON, platformInfo);
46+
const options = optionProvider.GetLatestOptions();
47+
const server = new OmniSharpServer(vscode, provider, packageJSON, platformInfo, eventStream, optionProvider);
4848
omnisharp = server;
4949
const advisor = new Advisor(server); // create before server is started
5050
const disposables = new CompositeDisposable();
51-
let localDisposables : CompositeDisposable;
51+
let localDisposables: CompositeDisposable;
5252

5353
disposables.add(server.onServerStart(() => {
5454
// register language feature provider on start
@@ -62,7 +62,7 @@ export async function activate(context: vscode.ExtensionContext, eventStream: Ev
6262
localDisposables.add(vscode.languages.registerImplementationProvider(documentSelector, new ImplementationProvider(server)));
6363
const testManager = new TestManager(server, eventStream);
6464
localDisposables.add(testManager);
65-
localDisposables.add(vscode.languages.registerCodeLensProvider(documentSelector, new CodeLensProvider(server, testManager)));
65+
localDisposables.add(vscode.languages.registerCodeLensProvider(documentSelector, new CodeLensProvider(server, testManager, optionProvider)));
6666
localDisposables.add(vscode.languages.registerDocumentHighlightProvider(documentSelector, new DocumentHighlightProvider(server)));
6767
localDisposables.add(vscode.languages.registerDocumentSymbolProvider(documentSelector, new DocumentSymbolProvider(server)));
6868
localDisposables.add(vscode.languages.registerReferenceProvider(documentSelector, new ReferenceProvider(server)));
@@ -75,7 +75,7 @@ export async function activate(context: vscode.ExtensionContext, eventStream: Ev
7575
localDisposables.add(vscode.languages.registerCompletionItemProvider(documentSelector, new CompletionItemProvider(server), '.', ' '));
7676
localDisposables.add(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server)));
7777
localDisposables.add(vscode.languages.registerSignatureHelpProvider(documentSelector, new SignatureHelpProvider(server), '(', ','));
78-
const codeActionProvider = new CodeActionProvider(server);
78+
const codeActionProvider = new CodeActionProvider(server, optionProvider);
7979
localDisposables.add(codeActionProvider);
8080
localDisposables.add(vscode.languages.registerCodeActionsProvider(documentSelector, codeActionProvider));
8181
localDisposables.add(reportDiagnostics(server, advisor));
@@ -90,7 +90,7 @@ export async function activate(context: vscode.ExtensionContext, eventStream: Ev
9090
localDisposables = null;
9191
}));
9292

93-
disposables.add(registerCommands(server, eventStream,platformInfo));
93+
disposables.add(registerCommands(server, platformInfo, eventStream, optionProvider));
9494

9595
if (!context.workspaceState.get<boolean>('assetPromptDisabled')) {
9696
disposables.add(server.onServerStart(() => {
@@ -164,7 +164,7 @@ export async function activate(context: vscode.ExtensionContext, eventStream: Ev
164164

165165
context.subscriptions.push(disposables);
166166

167-
return new Promise<OmniSharpServer>(resolve =>
168-
server.onServerStart(e =>
169-
resolve(server)));
167+
return new Promise<OmniSharpServer>(resolve =>
168+
server.onServerStart(e =>
169+
resolve(server)));
170170
}

src/omnisharp/launcher.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,11 @@ export interface LaunchTarget {
3636
* (if it doesn't contain a `project.json` file, but `project.json` files exist). In addition, the root folder
3737
* is included if there are any `*.csproj` files present, but a `*.sln* file is not found.
3838
*/
39-
export function findLaunchTargets(): Thenable<LaunchTarget[]> {
39+
export function findLaunchTargets(options: Options): Thenable<LaunchTarget[]> {
4040
if (!vscode.workspace.workspaceFolders) {
4141
return Promise.resolve([]);
4242
}
4343

44-
const options = Options.Read(vscode);
45-
4644
return vscode.workspace.findFiles(
4745
/*include*/ '{**/*.sln,**/*.csproj,**/project.json,**/*.csx,**/*.cake}',
4846
/*exclude*/ '{**/node_modules/**,**/.git/**,**/bower_components/**}',

0 commit comments

Comments
 (0)