Skip to content

Commit 50c7e0e

Browse files
committed
Include Roslyn devkit dependencies in C# extension to avoid versioning issues with devkit
1 parent e5c352d commit 50c7e0e

File tree

6 files changed

+62
-36
lines changed

6 files changed

+62
-36
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ obj
33
node_modules
44
out
55
.roslyn/
6+
.roslynDevkit/
67
.omnisharp/
78
.omnisharp-*/
89
.vs/

.vscodeignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
.logs/**
33
.nyc_output/**
44
!.roslyn/**
5+
!.roslynDevkit/**
56
!.omnisharp/**
67
!.razor/**
78
!.razoromnisharp/**

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
}
3838
},
3939
"defaults": {
40-
"roslyn": "4.9.0-2.23566.1",
40+
"roslyn": "4.9.0-2.23571.2",
4141
"omniSharp": "1.39.10",
4242
"razor": "7.0.0-preview.23528.1",
4343
"razorOmnisharp": "7.0.0-preview.23363.1",

src/lsptoolshost/roslynLanguageServer.ts

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ export class RoslynLanguageServer {
510510
_channel.appendLine('Activating C# + C# Dev Kit...');
511511
}
512512

513-
const csharpDevkitArgs = await this.getCSharpDevkitExportArgs(csharpDevkitExtension);
513+
const csharpDevkitArgs = this.getCSharpDevkitExportArgs();
514514
args = args.concat(csharpDevkitArgs);
515515

516516
await this.setupDevKitEnvironment(env, csharpDevkitExtension);
@@ -756,24 +756,17 @@ export class RoslynLanguageServer {
756756
);
757757
}
758758

759-
private static async getCSharpDevkitExportArgs(
760-
csharpDevkitExtension: vscode.Extension<CSharpDevKitExports>
761-
): Promise<string[]> {
762-
const exports: CSharpDevKitExports = await csharpDevkitExtension.activate();
763-
764-
const extensionPaths = languageServerOptions.extensionsPaths || [
765-
this.getLanguageServicesDevKitComponentPath(exports),
766-
];
767-
759+
private static getCSharpDevkitExportArgs(): string[] {
768760
const args: string[] = [];
769761

770-
args.push('--sharedDependencies');
771-
args.push(exports.components['@microsoft/visualstudio-server-shared']);
772-
773-
for (const extensionPath of extensionPaths) {
774-
args.push('--extension');
775-
args.push(extensionPath);
776-
}
762+
const clientRoot = __dirname;
763+
const devkitDepsPath = path.join(
764+
clientRoot,
765+
'..',
766+
'.roslynDevkit',
767+
'Microsoft.VisualStudio.LanguageServices.DevKit.dll'
768+
);
769+
args.push('--extension', devkitDepsPath);
777770

778771
args.push('--sessionId', getSessionId());
779772
return args;
@@ -805,13 +798,6 @@ export class RoslynLanguageServer {
805798
await exports.setupTelemetryEnvironmentAsync(env);
806799
}
807800

808-
private static getLanguageServicesDevKitComponentPath(csharpDevKitExports: CSharpDevKitExports): string {
809-
return path.join(
810-
csharpDevKitExports.components['@microsoft/visualstudio-languageservices-devkit'],
811-
'Microsoft.VisualStudio.LanguageServices.DevKit.dll'
812-
);
813-
}
814-
815801
private static GetTraceLevel(logLevel: string): Trace {
816802
switch (logLevel) {
817803
case 'Trace':

tasks/offlinePackagingTasks.ts

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
languageServerDirectory,
2424
nugetTempPath,
2525
rootPath,
26+
devkitDependenciesDirectory,
2627
} from '../tasks/projectPaths';
2728
import { getPackageJSON } from '../tasks/packageJson';
2829
import { createPackageAsync } from '../tasks/vsceTasks';
@@ -122,27 +123,46 @@ gulp.task(
122123
for (const p of platformSpecificPackages) {
123124
await acquireRoslyn(packageJSON, p.platformInfo, true);
124125
}
126+
127+
// Also pull in the Roslyn devkit dependencies nuget package.
128+
await acquireRoslynDevkit(packageJSON, true);
125129
}, 'installDependencies')
126130
);
127131

128132
// Install Tasks
129133
async function installRoslyn(packageJSON: any, platformInfo?: PlatformInformation) {
134+
// Install the Roslyn language server bits.
130135
const { packagePath, serverPlatform } = await acquireRoslyn(packageJSON, platformInfo, false);
136+
await installNuGetPackage(
137+
packagePath,
138+
path.join('content', 'LanguageServer', serverPlatform),
139+
languageServerDirectory
140+
);
141+
142+
// Install Roslyn Devkit dependencies.
143+
const roslynDevkitPackagePath = await acquireRoslynDevkit(packageJSON, false);
144+
await installNuGetPackage(roslynDevkitPackagePath, 'content', devkitDependenciesDirectory);
145+
}
131146

132-
// Get the directory containing the server executable for the current platform.
133-
const serverExecutableDirectory = path.join(packagePath, 'content', 'LanguageServer', serverPlatform);
134-
if (!fs.existsSync(serverExecutableDirectory)) {
135-
throw new Error(`Failed to find server executable directory at ${serverExecutableDirectory}`);
147+
async function installNuGetPackage(pathToPackage: string, contentPath: string, outputPath: string) {
148+
// Get the directory containing the content.
149+
const contentDirectory = path.join(pathToPackage, contentPath);
150+
if (!fs.existsSync(contentDirectory)) {
151+
throw new Error(`Failed to find NuGet package content at ${contentDirectory}`);
136152
}
137153

138-
console.log(`Extracting Roslyn executables from ${serverExecutableDirectory}`);
154+
const numFilesToCopy = fs.readdirSync(contentDirectory).length;
155+
156+
console.log(`Extracting content from ${contentDirectory}`);
139157

140158
// Copy the files to the language server directory.
141-
fs.mkdirSync(languageServerDirectory);
142-
fsextra.copySync(serverExecutableDirectory, languageServerDirectory);
143-
const languageServerDll = path.join(languageServerDirectory, 'Microsoft.CodeAnalysis.LanguageServer.dll');
144-
if (!fs.existsSync(languageServerDll)) {
145-
throw new Error(`Failed to copy server executable`);
159+
fs.mkdirSync(outputPath);
160+
fsextra.copySync(contentDirectory, outputPath);
161+
const numCopiedFiles = fs.readdirSync(outputPath).length;
162+
163+
// Not expected to ever happen, just a simple sanity check.
164+
if (numFilesToCopy !== numCopiedFiles) {
165+
throw new Error('Failed to copy all files from NuGet package');
146166
}
147167
}
148168

@@ -173,6 +193,16 @@ async function acquireRoslyn(
173193
return { packagePath, serverPlatform };
174194
}
175195

196+
async function acquireRoslynDevkit(packageJSON: any, interactive: boolean): Promise<string> {
197+
const roslynVersion = packageJSON.defaults.roslyn;
198+
const packagePath = await acquireNugetPackage(
199+
`Microsoft.VisualStudio.LanguageServices.Devkit`,
200+
roslynVersion,
201+
interactive
202+
);
203+
return packagePath;
204+
}
205+
176206
async function installRazor(packageJSON: any, platformInfo: PlatformInformation) {
177207
if (platformInfo === undefined) {
178208
const platformNeutral = new PlatformInformation('neutral', 'neutral');
@@ -297,7 +327,14 @@ async function doPackageOffline(vsixPlatform: VSIXPlatformInfo | undefined) {
297327
}
298328

299329
async function cleanAsync() {
300-
await del(['install.*', '.omnisharp*', '.debugger', '.razor', languageServerDirectory]);
330+
await del([
331+
'install.*',
332+
'.omnisharp*',
333+
'.debugger',
334+
'.razor',
335+
languageServerDirectory,
336+
devkitDependenciesDirectory,
337+
]);
301338
}
302339

303340
async function buildVsix(

tasks/projectPaths.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const jestPath = path.join(nodeModulesPath, 'jest', 'bin', 'jest');
1515
export const packedVsixOutputRoot = commandLineOptions.outputFolder || path.join(rootPath, 'vsix');
1616
export const nugetTempPath = path.join(rootPath, 'out', '.nuget');
1717
export const languageServerDirectory = path.join(rootPath, '.roslyn');
18+
export const devkitDependenciesDirectory = path.join(rootPath, '.roslynDevkit');
1819

1920
export const codeExtensionPath = commandLineOptions.codeExtensionPath || rootPath;
2021

0 commit comments

Comments
 (0)