Skip to content

Commit

Permalink
Remove public exports. Update integration with DotRush
Browse files Browse the repository at this point in the history
  • Loading branch information
NikitaRomanov authored and NikitaRomanov committed Jan 8, 2025
1 parent e790f8a commit e12d4dd
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 160 deletions.
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"NuGetVersionRoslyn=4.5.0",
"TargetFramework=net6.0"
],
"dotrush.roslyn.projectFiles": [
"dotrush.roslyn.projectOrSolutionFiles": [
"src/DotNet.Meteor.Debug/DotNet.Meteor.Debug.csproj",
"src/DotNet.Meteor.Tests/DotNet.Meteor.Tests.csproj",
"src/DotNet.Meteor.HotReload.Plugin/DotNet.Meteor.HotReload.Plugin.csproj",
Expand Down
4 changes: 4 additions & 0 deletions src/VSCode/controllers/configurationController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export class ConfigurationController {
public static project: Project | undefined;
public static device: Device | undefined;
public static configuration: string | undefined;
public static framework: string | undefined;

public static onWindows: boolean = process.platform === 'win32';
public static onLinux: boolean = process.platform === 'linux';
Expand Down Expand Up @@ -89,6 +90,9 @@ export class ConfigurationController {
return ConfigurationController.getSetting<boolean>(res.configIdUninstallApplicationBeforeInstalling, true);
}
public static getTargetFramework(): string | undefined {
if (ConfigurationController.framework !== undefined)
return ConfigurationController.framework;

const framework = ConfigurationController.project?.frameworks.find(it => it.includes(ConfigurationController.device?.platform ?? 'undefined'));
if (framework === undefined && (ConfigurationController.isWindows() || ConfigurationController.isMacCatalyst()))
return ConfigurationController.project?.frameworks.find(it => !it.includes('-'));
Expand Down
39 changes: 26 additions & 13 deletions src/VSCode/controllers/stateController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { ConfigurationController } from './configurationController';
import { StatusBarController } from './statusbarController';
import { ExtensionContext } from 'vscode';
import { Device } from '../models/device';
import { Project } from '../models/project';

export class StateController {
private static context: ExtensionContext | undefined;
Expand All @@ -13,18 +14,6 @@ export class StateController {
StateController.context = undefined;
}

public static load() {
if (StateController.context === undefined)
return;

const project = StateController.context.workspaceState.get<string>('project');
const device = StateController.context.workspaceState.get<string>('device');
const target = StateController.context.workspaceState.get<string>('target');

ConfigurationController.project = StatusBarController.projects.find(it => it.path === project);
ConfigurationController.device = StatusBarController.devices.find(it => StateController.getDeviceId(it) === device);
ConfigurationController.configuration = ConfigurationController.project?.configurations.find(it => it === target);
}
public static saveProject() {
if (StateController.context !== undefined)
StateController.context.workspaceState.update('project', ConfigurationController.project?.path);
Expand All @@ -33,11 +22,35 @@ export class StateController {
if (StateController.context !== undefined)
StateController.context.workspaceState.update('device', StateController.getDeviceId(ConfigurationController.device));
}
public static saveTarget() {
public static saveConfiguration() {
if (StateController.context !== undefined)
StateController.context.workspaceState.update('target', ConfigurationController.configuration);
}

public static getProject() : Project | undefined {
if (StateController.context === undefined)
return undefined;

const project = StateController.context.workspaceState.get<string>('project');
return StatusBarController.projects.find(it => it.path === project);
}
public static getConfiguration() : string | undefined {
if (StateController.context === undefined)
return undefined;

const target = StateController.context.workspaceState.get<string>('target');
const project = StateController.getProject();
return project?.configurations.find(it => it === target);
}
public static getDevice() : Device | undefined {
if (StateController.context === undefined)
return undefined;

const device = StateController.context.workspaceState.get<string>('device');
return StatusBarController.devices.find(it => StateController.getDeviceId(it) === device);
}


public static getGlobal<TValue>(key: string): TValue | undefined {
return StateController.context?.globalState.get<TValue>(key);
}
Expand Down
171 changes: 84 additions & 87 deletions src/VSCode/controllers/statusbarController.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { ConfigurationController } from './configurationController';
import { Interop } from "../interop/interop";
import { StateController } from './stateController';
import { PublicExports } from '../publicExports';
import { Project } from '../models/project';
import { ProjectItem } from '../models/projectItem';
import { Device } from '../models/device';
Expand All @@ -10,85 +9,117 @@ import { SeparatorItem } from '../models/separatorItem';
import { Icons } from '../resources/icons';
import * as res from '../resources/constants';
import * as vscode from 'vscode';
import * as path from 'path';

export class StatusBarController {
private static projectStatusItem: vscode.StatusBarItem;
private static targetStatusItem: vscode.StatusBarItem;
private static deviceStatusItem: vscode.StatusBarItem;
private static projectDecorationProvider: StartupProjectDecorationProvider;
private static projectStatusItem: vscode.StatusBarItem | undefined;
private static targetStatusItem: vscode.StatusBarItem | undefined;
private static deviceStatusItem: vscode.StatusBarItem | undefined;

public static projects: Project[];
public static devices: Device[];

public static activate(context: vscode.ExtensionContext) {
StatusBarController.projectStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
StatusBarController.targetStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 90);
StatusBarController.deviceStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 80);
StatusBarController.projectDecorationProvider = new StartupProjectDecorationProvider();
public static async activate(context: vscode.ExtensionContext): Promise<void> {
if (vscode.extensions.getExtension(res.dotrushExtensionId) !== undefined)
return StatusBarController.activateWithDotRush(context);

StatusBarController.createProjectStatusBarItem(context);
StatusBarController.createConfigurationStatusBarItem(context);
StatusBarController.createDeviceStatusBarItem(context);

StatusBarController.targetStatusItem.command = res.commandIdSelectActiveConfiguration;
StatusBarController.projectStatusItem.command = res.commandIdSelectActiveProject;
StatusBarController.deviceStatusItem.command = res.commandIdSelectActiveDevice;
context.subscriptions.push(vscode.workspace.onDidChangeWorkspaceFolders(_ => {
StatusBarController.updateProjectStatusBarItem();
}));
context.subscriptions.push(vscode.workspace.onDidSaveTextDocument(ev => {
if (ev.fileName.endsWith('proj') || ev.fileName.endsWith('.props'))
StatusBarController.updateProjectStatusBarItem();
}));

context.subscriptions.push(StatusBarController.projectStatusItem);
context.subscriptions.push(StatusBarController.targetStatusItem);
context.subscriptions.push(StatusBarController.deviceStatusItem);
StatusBarController.updateProjectStatusBarItem();
StatusBarController.updateDeviceStatusBarItem();
}
public static async activateWithDotRush(context: vscode.ExtensionContext): Promise<void> {
const exports = await vscode.extensions.getExtension(res.dotrushExtensionId)?.activate();
exports?.onActiveProjectChanged?.add((p: Project) => ConfigurationController.project = p);
exports?.onActiveConfigurationChanged?.add((c: string) => ConfigurationController.configuration = c);
exports?.onActiveFrameworkChanged?.add((f: string) => ConfigurationController.framework = f);

StatusBarController.createDeviceStatusBarItem(context);
StatusBarController.updateDeviceStatusBarItem();
}

private static createProjectStatusBarItem(context: vscode.ExtensionContext) {
StatusBarController.projectStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
StatusBarController.projectStatusItem.command = res.commandIdSelectActiveProject;
context.subscriptions.push(StatusBarController.projectStatusItem);
context.subscriptions.push(vscode.commands.registerCommand(res.commandIdSelectActiveProject, StatusBarController.showQuickPickProject));
}
private static createConfigurationStatusBarItem(context: vscode.ExtensionContext) {
StatusBarController.targetStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 90);
StatusBarController.targetStatusItem.command = res.commandIdSelectActiveConfiguration;
context.subscriptions.push(StatusBarController.targetStatusItem);
context.subscriptions.push(vscode.commands.registerCommand(res.commandIdSelectActiveConfiguration, StatusBarController.showQuickPickConfiguration));
}
private static createDeviceStatusBarItem(context: vscode.ExtensionContext) {
StatusBarController.deviceStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 80);
StatusBarController.deviceStatusItem.command = res.commandIdSelectActiveDevice;
context.subscriptions.push(StatusBarController.deviceStatusItem);
context.subscriptions.push(vscode.commands.registerCommand(res.commandIdSelectActiveDevice, StatusBarController.showQuickPickDevice));
context.subscriptions.push(vscode.window.registerFileDecorationProvider(StatusBarController.projectDecorationProvider));

context.subscriptions.push(vscode.workspace.onDidChangeWorkspaceFolders(StatusBarController.update));
context.subscriptions.push(vscode.workspace.onDidSaveTextDocument(ev => {
if (ev.fileName.endsWith('proj') || ev.fileName.endsWith('.props'))
StatusBarController.update();
}));
}
public static async update() : Promise<void> {

private static async updateProjectStatusBarItem(): Promise<void> {
if (StatusBarController.projectStatusItem === undefined)
return;

const folders = vscode.workspace.workspaceFolders!.map(it => it.uri.fsPath);
StatusBarController.projects = await Interop.getProjects(folders);
StatusBarController.devices = await Interop.getDevices();
if (StatusBarController.projects.length === 0)
return StatusBarController.projectStatusItem.hide();

StatusBarController.performSelectProject(StateController.getProject());
StatusBarController.projects.length === 1
? StatusBarController.projectStatusItem.hide()
: StatusBarController.projectStatusItem.show();

if (StatusBarController.projects.length === 0 || StatusBarController.devices.length === 0) {
StatusBarController.projectStatusItem.hide();
StatusBarController.targetStatusItem.hide();
StatusBarController.deviceStatusItem.hide();
PublicExports.instance.invokeAll();
StatusBarController.updateConfigurationStatusBarItem();
}
private static async updateConfigurationStatusBarItem(): Promise<void> {
if (StatusBarController.targetStatusItem === undefined)
return;
}

StateController.load();
StatusBarController.performSelectProject(ConfigurationController.project);
StatusBarController.performSelectConfiguration(ConfigurationController.configuration);
StatusBarController.performSelectDevice(ConfigurationController.device);

if (StatusBarController.projects.length === 0)
return StatusBarController.targetStatusItem.hide();

StatusBarController.performSelectConfiguration(StateController.getConfiguration());
StatusBarController.targetStatusItem.show();
}
private static async updateDeviceStatusBarItem(): Promise<void> {
if (StatusBarController.deviceStatusItem === undefined)
return;

StatusBarController.devices = await Interop.getDevices();
if (StatusBarController.devices.length === 0)
return StatusBarController.deviceStatusItem.hide();

StatusBarController.performSelectDevice(StateController.getDevice());
StatusBarController.deviceStatusItem.show();
StatusBarController.projects.length === 1
? StatusBarController.projectStatusItem.hide()
: StatusBarController.projectStatusItem.show();
}

public static performSelectProject(item: Project | undefined = undefined) {
ConfigurationController.project = item ?? StatusBarController.projects[0];
StatusBarController.projectStatusItem.text = `${Icons.project} ${ConfigurationController.project?.name}`;
PublicExports.instance.onActiveProjectChanged.invoke(ConfigurationController.project);
StatusBarController.projectDecorationProvider.update(item);
if (StatusBarController.projectStatusItem !== undefined)
StatusBarController.projectStatusItem.text = `${Icons.project} ${ConfigurationController.project?.name}`;
StateController.saveProject();
}
public static performSelectConfiguration(item: string | undefined = undefined) {
ConfigurationController.configuration = item ?? 'Debug';
StatusBarController.targetStatusItem.text = `${Icons.target} ${ConfigurationController.configuration} | Any CPU`;
PublicExports.instance.onActiveConfigurationChanged.invoke(ConfigurationController.configuration);
StateController.saveTarget();
if (StatusBarController.targetStatusItem !== undefined)
StatusBarController.targetStatusItem.text = `${Icons.target} ${ConfigurationController.configuration} | Any CPU`;
StateController.saveConfiguration();
}
public static performSelectDevice(item: Device | undefined = undefined) {
ConfigurationController.device = item ?? StatusBarController.devices[0];
StatusBarController.deviceStatusItem.text = `${Icons.deviceKind(ConfigurationController.device)} ${ConfigurationController.device?.name}`;
PublicExports.instance.onActiveDeviceChanged.invoke(ConfigurationController.device);
PublicExports.instance.onActiveFrameworkChanged.invoke(ConfigurationController.getTargetFramework());
if (StatusBarController.deviceStatusItem !== undefined)
StatusBarController.deviceStatusItem.text = `${Icons.deviceKind(ConfigurationController.device)} ${ConfigurationController.device?.name}`;
StateController.saveDevice();
}

Expand All @@ -106,7 +137,7 @@ export class StatusBarController {
const items = ConfigurationController.project?.configurations ?? [];
const options = { placeHolder: res.commandTitleSelectActiveConfiguration };
const selectedItem = await vscode.window.showQuickPick(items, options);

if (selectedItem !== undefined)
StatusBarController.performSelectConfiguration(selectedItem);
}
Expand All @@ -128,48 +159,14 @@ export class StatusBarController {

const items: vscode.QuickPickItem[] = [];
for (let i of StatusBarController.devices.keys()) {
if (i == 0 || StatusBarController.devices[i].detail !== StatusBarController.devices[i-1].detail)
if (i == 0 || StatusBarController.devices[i].detail !== StatusBarController.devices[i - 1].detail)
items.push(new SeparatorItem(StatusBarController.devices[i].detail));

items.push(new DeviceItem(StatusBarController.devices[i]));
items.push(new DeviceItem(StatusBarController.devices[i]));
}

picker.items = items;
picker.placeholder = res.commandTitleSelectActiveDevice;
picker.busy = false;
}
}

class StartupProjectDecorationProvider implements vscode.FileDecorationProvider {
private _onDidChangeFileDecorations: vscode.EventEmitter<vscode.Uri | vscode.Uri[] | undefined> = new vscode.EventEmitter<vscode.Uri | vscode.Uri[] | undefined>();
private startupProjectUri: vscode.Uri | undefined;
private startupProjectDirectoryUri: vscode.Uri | undefined;

public onDidChangeFileDecorations?: vscode.Event<vscode.Uri | vscode.Uri[] | undefined> | undefined = this._onDidChangeFileDecorations.event;
public provideFileDecoration(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<vscode.FileDecoration> {
if (this.startupProjectUri === undefined || this.startupProjectDirectoryUri === undefined)
return undefined;

if (uri.fsPath !== this.startupProjectUri.fsPath && uri.fsPath !== this.startupProjectDirectoryUri.fsPath)
return undefined;

return {
badge: '●',
color: new vscode.ThemeColor('pickerGroup.foreground'),
tooltip: res.messageStartupProject
};
}

public update(project: Project | undefined) {
if (project === undefined) {
this.startupProjectUri = undefined;
this.startupProjectDirectoryUri = undefined;
this._onDidChangeFileDecorations.fire(undefined);
return;
}

this.startupProjectUri = vscode.Uri.file(project.path);
this.startupProjectDirectoryUri = vscode.Uri.file(path.dirname(project.path));
this._onDidChangeFileDecorations.fire(undefined);
}
}
6 changes: 1 addition & 5 deletions src/VSCode/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { ConfigurationController } from './controllers/configurationController';
import { StatusBarController } from './controllers/statusbarController';
import { Interop } from './interop/interop';
import { StateController } from './controllers/stateController';
import { PublicExports } from './publicExports';
import { ModulesView } from './features/modulesView';
import { MauiEssentials } from './features/mauiEssentials';
import { ExternalTypeResolver } from './features/externalTypeResolver';
Expand All @@ -13,18 +12,15 @@ import * as res from './resources/constants';
import * as vscode from 'vscode';


export function activate(context: vscode.ExtensionContext): PublicExports | undefined {
export function activate(context: vscode.ExtensionContext) {
Interop.initialize(context.extensionPath);

if (vscode.workspace.workspaceFolders === undefined)
return undefined;

const exports = new PublicExports();

ConfigurationController.activate(context);
StateController.activate(context);
StatusBarController.activate(context);
StatusBarController.update();

ModulesView.feature.activate(context);
MauiEssentials.feature.activate(context);
Expand Down
2 changes: 1 addition & 1 deletion src/VSCode/interop/interop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class Interop {
.append("--android-sdk-path"));
}
public static getPropertyValue(propertyName: string, project: Project, configuration: string, device: Device) : string | undefined {
const targetFramework = project.frameworks.find(it => it.includes(device.platform ?? 'undefined'));
const targetFramework = ConfigurationController.getTargetFramework();
const runtimeIdentifier = device?.runtime_id;

return ProcessRunner.runSync(new ProcessArgumentBuilder("dotnet")
Expand Down
Loading

0 comments on commit e12d4dd

Please sign in to comment.