Skip to content

Commit c5ff00a

Browse files
authored
Merge branch 'master' into patch-1
2 parents 85ba58f + 93cb435 commit c5ff00a

23 files changed

+173
-97
lines changed

package-lock.json

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@
9191
"@types/gulp": "4.0.5",
9292
"@types/minimist": "1.2.1",
9393
"@types/mocha": "5.2.5",
94-
"@types/node": "10.12.24",
94+
"@types/node": "16.11.38",
9595
"@types/semver": "5.5.0",
9696
"@types/tmp": "0.0.33",
9797
"@types/unzipper": "^0.9.1",
9898
"@types/vscode": "1.66.0",
99-
"@types/yauzl": "2.9.1",
99+
"@types/yauzl": "2.10.0",
100100
"@vscode/test-electron": "2.1.3",
101101
"archiver": "5.3.0",
102102
"chai": "4.3.4",
@@ -4095,4 +4095,4 @@
40954095
}
40964096
]
40974097
}
4098-
}
4098+
}

src/features/codeActionProvider.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
6262

6363
return {
6464
title: codeAction.Name,
65+
kind: this.mapOmniSharpCodeActionKindToVSCodeCodeActionKind(codeAction.CodeActionKind),
6566
command: {
6667
title: codeAction.Name,
6768
command: this._commandId,
@@ -74,6 +75,21 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
7475
}
7576
}
7677

78+
private mapOmniSharpCodeActionKindToVSCodeCodeActionKind(kind: string): vscode.CodeActionKind {
79+
switch (kind) {
80+
case 'QuickFix':
81+
return vscode.CodeActionKind.QuickFix;
82+
case 'Refactor':
83+
return vscode.CodeActionKind.Refactor;
84+
case 'RefactorExtract':
85+
return vscode.CodeActionKind.RefactorExtract;
86+
case 'RefactorInline':
87+
return vscode.CodeActionKind.RefactorInline;
88+
default:
89+
return vscode.CodeActionKind.Empty;
90+
}
91+
}
92+
7793
private async _runCodeAction(req: protocol.V2.RunCodeActionRequest, token: vscode.CancellationToken): Promise<boolean | string | {}> {
7894
try {
7995
const response = await serverUtils.runCodeAction(this._server, req);

src/features/referenceProvider.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@
66
import AbstractSupport from './abstractProvider';
77
import * as protocol from '../omnisharp/protocol';
88
import * as serverUtils from '../omnisharp/utils';
9-
import {createRequest, toLocation} from '../omnisharp/typeConversion';
9+
import {createRequest, toLocation, toLocationFromUri} from '../omnisharp/typeConversion';
1010
import {ReferenceProvider, Location, TextDocument, CancellationToken, Position} from 'vscode';
11+
import { OmniSharpServer } from '../omnisharp/server';
12+
import { LanguageMiddlewareFeature } from '../omnisharp/LanguageMiddlewareFeature';
13+
import SourceGeneratedDocumentProvider from './sourceGeneratedDocumentProvider';
1114

1215
export default class OmnisharpReferenceProvider extends AbstractSupport implements ReferenceProvider {
1316

17+
public constructor(server: OmniSharpServer, languageMiddlewareFeature: LanguageMiddlewareFeature, private generatedDocumentProvider: SourceGeneratedDocumentProvider) {
18+
super(server, languageMiddlewareFeature);
19+
}
20+
1421
public async provideReferences(document: TextDocument, position: Position, options: { includeDeclaration: boolean;}, token: CancellationToken): Promise<Location[]> {
1522

1623
let req = createRequest<protocol.FindUsagesRequest>(document, position);
@@ -20,8 +27,8 @@ export default class OmnisharpReferenceProvider extends AbstractSupport implemen
2027
try {
2128
let res = await serverUtils.findUsages(this._server, req, token);
2229
if (res && Array.isArray(res.QuickFixes)) {
23-
const references = res.QuickFixes.map(toLocation);
24-
30+
const references = res.QuickFixes.map(l => this.mapToLocationWithGeneratedInfoPopulation(l));
31+
2532
// Allow language middlewares to re-map its edits if necessary.
2633
const result = await this._languageMiddlewareFeature.remap("remapLocations", references, token);
2734
return result;
@@ -31,4 +38,13 @@ export default class OmnisharpReferenceProvider extends AbstractSupport implemen
3138
return [];
3239
}
3340
}
41+
42+
private mapToLocationWithGeneratedInfoPopulation(symbolLocation: protocol.SymbolLocation): Location {
43+
if (symbolLocation.GeneratedFileInfo) {
44+
const uri = this.generatedDocumentProvider.addSourceGeneratedFileWithoutInitialContent(symbolLocation.GeneratedFileInfo, symbolLocation.FileName);
45+
return toLocationFromUri(uri, symbolLocation);
46+
}
47+
48+
return toLocation(symbolLocation);
49+
}
3450
}

src/features/sourceGeneratedDocumentProvider.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as serverUtils from '../omnisharp/utils';
7-
import { Event, EventEmitter, TextDocument, TextDocumentContentProvider, TextEditor, Uri, window, workspace } from 'vscode';
7+
import { CancellationToken, Event, EventEmitter, TextDocument, TextDocumentContentProvider, TextEditor, Uri, window, workspace } from 'vscode';
88
import { IDisposable } from '../Disposable';
99
import { SourceGeneratedFileInfo, SourceGeneratedFileResponse, UpdateType } from '../omnisharp/protocol';
1010
import { OmniSharpServer } from '../omnisharp/server';
@@ -89,6 +89,27 @@ export default class SourceGeneratedDocumentProvider implements TextDocumentCont
8989
return undefined;
9090
}
9191

92+
public addSourceGeneratedFileWithoutInitialContent(fileInfo: SourceGeneratedFileInfo, fileName: string): Uri {
93+
if (this._documents.has(fileInfo)) {
94+
// Raced with something, return the existing one
95+
return this.tryGetExistingSourceGeneratedFile(fileInfo);
96+
}
97+
98+
const uri = this.getUriForName(fileName);
99+
const uriString = uri.toString();
100+
101+
if (this._uriToDocumentInfo.has(uriString)) {
102+
this._documents.delete(fileInfo);
103+
this._uriToDocumentInfo.delete(uriString);
104+
}
105+
106+
// Provide will see the null and retrieve the file when asked.
107+
this._documents.set(fileInfo, null);
108+
this._uriToDocumentInfo.set(uriString, fileInfo);
109+
110+
return uri;
111+
}
112+
92113
public addSourceGeneratedFile(fileInfo: SourceGeneratedFileInfo, response: SourceGeneratedFileResponse): Uri {
93114
if (this._documents.has(fileInfo)) {
94115
// Raced with something, return the existing one
@@ -117,8 +138,17 @@ export default class SourceGeneratedDocumentProvider implements TextDocumentCont
117138
return uri;
118139
}
119140

120-
public provideTextDocumentContent(uri: Uri): string {
121-
return this._documents.get(this._uriToDocumentInfo.get(uri.toString())).Source;
141+
public async provideTextDocumentContent(uri: Uri, token: CancellationToken): Promise<string> {
142+
const fileInfo = this._uriToDocumentInfo.get(uri.toString());
143+
let response = this._documents.get(fileInfo);
144+
145+
if (response === null) {
146+
// No content yet, get it
147+
response = await serverUtils.getSourceGeneratedFile(this.server, fileInfo, token);
148+
this._documents.set(fileInfo, response);
149+
}
150+
151+
return response.Source;
122152
}
123153

124154
private getUriForName(sourceName: string): Uri {

src/features/workspaceSymbolProvider.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,18 @@ import OptionProvider from '../observers/OptionProvider';
99
import * as protocol from '../omnisharp/protocol';
1010
import * as serverUtils from '../omnisharp/utils';
1111
import { toRange } from '../omnisharp/typeConversion';
12-
import { CancellationToken, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind } from 'vscode';
12+
import { CancellationToken, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind, Location } from 'vscode';
1313
import { LanguageMiddlewareFeature } from '../omnisharp/LanguageMiddlewareFeature';
14+
import SourceGeneratedDocumentProvider from './sourceGeneratedDocumentProvider';
1415

1516

1617
export default class OmnisharpWorkspaceSymbolProvider extends AbstractSupport implements WorkspaceSymbolProvider {
1718

18-
constructor(server: OmniSharpServer, private optionProvider: OptionProvider, languageMiddlewareFeature: LanguageMiddlewareFeature) {
19+
constructor(
20+
server: OmniSharpServer,
21+
private optionProvider: OptionProvider,
22+
languageMiddlewareFeature: LanguageMiddlewareFeature,
23+
private sourceGeneratedDocumentProvider: SourceGeneratedDocumentProvider) {
1924
super(server, languageMiddlewareFeature);
2025
}
2126

@@ -32,19 +37,30 @@ export default class OmnisharpWorkspaceSymbolProvider extends AbstractSupport im
3237
try {
3338
let res = await serverUtils.findSymbols(this._server, { Filter: search, MaxItemsToReturn: maxItemsToReturn, FileName: '' }, token);
3439
if (res && Array.isArray(res.QuickFixes)) {
35-
return res.QuickFixes.map(OmnisharpWorkspaceSymbolProvider._asSymbolInformation);
40+
return res.QuickFixes.map(symbol => this._asSymbolInformation(symbol));
3641
}
3742
}
3843
catch (error) {
3944
return [];
4045
}
4146
}
4247

43-
private static _asSymbolInformation(symbolInfo: protocol.SymbolLocation): SymbolInformation {
48+
private _asSymbolInformation(symbolInfo: protocol.SymbolLocation): SymbolInformation {
49+
let uri: Uri;
50+
if (symbolInfo.GeneratedFileInfo) {
51+
uri = this.sourceGeneratedDocumentProvider.addSourceGeneratedFileWithoutInitialContent(symbolInfo.GeneratedFileInfo, symbolInfo.FileName);
52+
}
53+
else {
54+
uri = Uri.file(symbolInfo.FileName);
55+
}
56+
57+
const location = new Location(uri, toRange(symbolInfo));
4458

45-
return new SymbolInformation(symbolInfo.Text, OmnisharpWorkspaceSymbolProvider._toKind(symbolInfo),
46-
toRange(symbolInfo),
47-
Uri.file(symbolInfo.FileName));
59+
return new SymbolInformation(
60+
symbolInfo.Text,
61+
OmnisharpWorkspaceSymbolProvider._toKind(symbolInfo),
62+
symbolInfo.ContainingSymbolName ?? "",
63+
location);
4864
}
4965

5066
private static _toKind(symbolInfo: protocol.SymbolLocation): SymbolKind {

src/observers/BackgroundWorkStatusBarObserver.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ export class BackgroundWorkStatusBarObserver extends BaseStatusBarItemObserver {
1515

1616
if (asProjectEvent.message.Status === DiagnosticStatus.Processing) {
1717
let projectFile = asProjectEvent.message.ProjectFilePath.replace(/^.*[\\\/]/, '');
18-
this.SetAndShowStatusBar(`$(sync~spin) Analyzing ${projectFile}`, 'o.showOutput', null, `Analyzing ${projectFile}`);
18+
this.SetAndShowStatusBar(`$(sync~spin) Analyzing ${projectFile}`, 'o.showOutput', undefined, `Analyzing ${projectFile}`);
1919
}
2020
else {
2121
this.ResetAndHideStatusBar();
2222
}
2323
}
2424
}
2525
}
26-

src/observers/BaseStatusBarItemObserver.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ export abstract class BaseStatusBarItemObserver {
2020
}
2121

2222
public ResetAndHideStatusBar() {
23-
this.statusBarItem.text = undefined;
23+
this.statusBarItem.text = '';
2424
this.statusBarItem.command = undefined;
2525
this.statusBarItem.color = undefined;
2626
this.statusBarItem.tooltip = undefined;
2727
this.statusBarItem.hide();
2828
}
2929

3030
abstract post: (event: BaseEvent) => void;
31-
}
31+
}

src/observers/CsharpLoggerObserver.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { PackageError } from "../packageManager/PackageError";
99
import { EventType } from "../omnisharp/EventType";
1010

1111
export class CsharpLoggerObserver extends BaseLoggerObserver {
12-
private dots: number;
12+
private dots: number = 0;
1313

1414
public post = (event: Event.BaseEvent) => {
1515
switch (event.type) {
@@ -146,4 +146,4 @@ export class CsharpLoggerObserver extends BaseLoggerObserver {
146146
private handleDocumentSynchronizationFailure(event: Event.DocumentSynchronizationFailure) {
147147
this.logger.appendLine(`Failed to synchronize document '${event.documentPath}': ${event.errorMessage}`);
148148
}
149-
}
149+
}

src/observers/OmnisharpLoggerObserver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export class OmnisharpLoggerObserver extends BaseLoggerObserver {
8383
this.logger.append(`OmniSharp server started`);
8484
if (event.hostVersion) {
8585
this.logger.append(` with ${event.hostIsMono ? 'Mono' : '.NET'} ${event.hostVersion}`);
86-
if (event.hostPath?.length > 0) {
86+
if (event.hostPath && event.hostPath.length > 0) {
8787
this.logger.append(` (${event.hostPath})`);
8888
}
8989
}

0 commit comments

Comments
 (0)