Skip to content

Commit 01a3b89

Browse files
authored
Merge pull request #56 from CodinGame/fix-csharp-metadata
Fix csharp metadata
2 parents a1db8ad + de7c579 commit 01a3b89

File tree

4 files changed

+65
-3
lines changed

4 files changed

+65
-3
lines changed

src/extensions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class InitializeTextDocumentFeature implements StaticFeature {
2929

3030
const languageClient = this.languageClient
3131
async function saveFile (textDocument: vscode.TextDocument) {
32-
if (documentSelector != null && vscode.languages.match(documentSelector, textDocument) > 0) {
32+
if (documentSelector != null && vscode.languages.match(documentSelector, textDocument) > 0 && textDocument.uri.scheme === 'file') {
3333
await updateFile(textDocument.uri.toString(), textDocument.getText(), languageClient)
3434

3535
// Always send notification even if the server doesn't support it (because csharp register the didSave feature too late)

src/extensions/csharp.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { MonacoLanguageClient, ProtocolRequestType } from 'monaco-languageclient'
2+
import { Uri, ExtensionContext, workspace, CancellationToken } from 'vscode'
3+
import { ExtensionFeature } from './tools'
4+
5+
const OmnisharpMetadataRequestType = new ProtocolRequestType<{
6+
Timeout: number
7+
AssemblyName: string
8+
Language: string | null
9+
ProjectName: string
10+
TypeName: string
11+
VersionNumber: string | null
12+
}, {
13+
Source: string
14+
SourceName: string
15+
}, never, void, void>('o#/metadata')
16+
17+
export class CsharpExtensionFeature extends ExtensionFeature {
18+
constructor (private languageClient: MonacoLanguageClient) {
19+
super()
20+
}
21+
22+
activate (context: ExtensionContext): void {
23+
context.subscriptions.push(workspace.registerTextDocumentContentProvider('omnisharp-metadata', {
24+
provideTextDocumentContent: async (uri: Uri, token: CancellationToken): Promise<string> => {
25+
const [, project, assembly, typeName] = /^\/Project\/(.*)\/Assembly\/(.*)\/Symbol\/(.*).cs$/.exec(uri.fsPath)!
26+
const { Source } = await this.languageClient.sendRequest(OmnisharpMetadataRequestType, {
27+
Timeout: 5000,
28+
AssemblyName: assembly!.replace(/\//g, '.'),
29+
Language: null,
30+
ProjectName: project!,
31+
TypeName: typeName!.replace(/\//g, '.'),
32+
VersionNumber: null
33+
}, token)
34+
return Source
35+
}
36+
}))
37+
}
38+
}

src/services/PopupConsoleWindow.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class PopupOutputChannel implements vscode.OutputChannel {
7070
contentEl.style.width = '80%'
7171
contentEl.style.height = '80%'
7272
contentEl.style.background = 'white'
73+
contentEl.style.color = 'black'
7374
container.style.cursor = 'auto'
7475
contentEl.innerText = this.logs
7576
const watcherDisposable = this.onDidChangeLog(() => {

src/staticOptions.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,33 @@ const staticOptions = asLanguageClientOptionsById({
3737
},
3838
csharp: {
3939
documentSelector: [
40-
{ language: 'csharp' }
40+
{ scheme: 'file', language: 'csharp' }
4141
],
4242
mutualizable: true,
43-
vscodeExtensionIds: ['omnisharp']
43+
vscodeExtensionIds: ['omnisharp'],
44+
middleware: {
45+
async provideDefinition (document, position, token, next) {
46+
const definition = await next(document, position, token)
47+
// Transform file:/$metadata$/... uris to omnisharp-metadata:/... so we can register a text document content provider
48+
// See https://github.com/OmniSharp/omnisharp-roslyn/issues/2238
49+
if (definition != null && !Array.isArray(definition)) {
50+
const metadataMatch = /^\/\$metadata\$(.*)$/.exec(definition.uri.fsPath)
51+
if (metadataMatch != null) {
52+
return {
53+
...definition,
54+
uri: vscode.Uri.from({ scheme: 'omnisharp-metadata', path: metadataMatch[1] })
55+
}
56+
}
57+
}
58+
return definition
59+
}
60+
},
61+
async createAdditionalFeatures (client) {
62+
const { CsharpExtensionFeature } = await import('./extensions/csharp')
63+
return [
64+
new CsharpExtensionFeature(client)
65+
]
66+
}
4467
},
4568
cpp: {
4669
documentSelector: [

0 commit comments

Comments
 (0)