Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/auto-bump-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Auto bump version
on:
push:
branches:
- release
- master

jobs:
version:
Expand Down
8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@
{
"command": "magento-toolbox.generateWebapiXmlFile",
"title": "Magento Toolbox: Generate Webapi XML"
},
{
"command": "magento-toolbox.generatePreference",
"title": "Magento Toolbox: Generate Preference"
}
],
"menus": {
Expand Down Expand Up @@ -135,6 +139,10 @@
{
"command": "magento-toolbox.generateContextPlugin",
"when": "magento-toolbox.canGeneratePlugin"
},
{
"command": "magento-toolbox.generatePreference",
"when": "magento-toolbox.canGeneratePreference"
}
],
"magento-toolbox.explorer-submenu": [
Expand Down
2 changes: 1 addition & 1 deletion src/command/GenerateContextPluginCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export default class GenerateContextPluginCommand extends Command {
await manager.generate(workspaceFolder.uri);
await manager.writeFiles();
await manager.refreshIndex(workspaceFolder);
manager.openFirstFile();
manager.openAllFiles();
}

private resolvePluginMethod(pluginSubjectInfo: PluginSubjectInfo): PhpMethod | undefined {
Expand Down
2 changes: 1 addition & 1 deletion src/command/GenerateObserverCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,6 @@ export default class GenerateObserverCommand extends Command {
await manager.generate(workspaceFolder.uri);
await manager.writeFiles();
await manager.refreshIndex(workspaceFolder);
manager.openFirstFile();
manager.openAllFiles();
}
}
79 changes: 79 additions & 0 deletions src/command/GeneratePreferenceCommand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { Command } from 'command/Command';
import WizzardClosedError from 'webview/error/WizzardClosedError';
import FileGeneratorManager from 'generator/FileGeneratorManager';
import Common from 'util/Common';
import { TextDocument, Uri, window } from 'vscode';
import IndexManager from 'indexer/IndexManager';
import ModuleIndexer from 'indexer/module/ModuleIndexer';
import PreferenceWizard, { PreferenceWizardData } from 'wizard/PreferenceWizard';
import PreferenceClassGenerator from 'generator/preference/PreferenceClassGenerator';
import PhpDocumentParser from 'common/php/PhpDocumentParser';
import { ClasslikeInfo } from 'common/php/ClasslikeInfo';
import PreferenceDiGenerator from 'generator/preference/PreferenceDiGenerator';

export default class GeneratePreferenceCommand extends Command {
constructor() {
super('magento-toolbox.generatePreference');
}

public async execute(uri?: Uri): Promise<void> {
const moduleIndex = IndexManager.getIndexData(ModuleIndexer.KEY);
let contextModule: string | undefined;

const contextUri = uri || window.activeTextEditor?.document.uri;

if (moduleIndex && contextUri) {
const module = moduleIndex.getModuleByUri(contextUri);

if (module) {
contextModule = module.name;
}
}

const parentClassName = await this.getParentClassName(window.activeTextEditor?.document);

const preferenceWizard = new PreferenceWizard();

let data: PreferenceWizardData;

try {
data = await preferenceWizard.show(parentClassName, contextModule);
} catch (error) {
if (error instanceof WizzardClosedError) {
return;
}

throw error;
}

const manager = new FileGeneratorManager([
new PreferenceClassGenerator(data),
new PreferenceDiGenerator(data),
]);

const workspaceFolder = Common.getActiveWorkspaceFolder();

if (!workspaceFolder) {
window.showErrorMessage('No active workspace folder');
return;
}

await manager.generate(workspaceFolder.uri);
await manager.writeFiles();
await manager.refreshIndex(workspaceFolder);
manager.openAllFiles();
}

private async getParentClassName(
document: TextDocument | undefined
): Promise<string | undefined> {
if (!document) {
return undefined;
}

const phpFile = await PhpDocumentParser.parse(document);
const info = new ClasslikeInfo(phpFile);

return info.getNamespace();
}
}
12 changes: 12 additions & 0 deletions src/common/Context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import CopyMagentoPathCommand from 'command/CopyMagentoPathCommand';

export interface EditorContext {
canGeneratePlugin: boolean;
canGeneratePreference: boolean;
supportedMagentoPathExtensions: string[];
}

Expand All @@ -25,6 +26,7 @@ class Context {
await this.setContext({
...this.editorContext,
canGeneratePlugin: await this.canGeneratePlugin(editor),
canGeneratePreference: await this.canGeneratePreference(editor),
});
}

Expand All @@ -43,6 +45,7 @@ class Context {
public getDefaultContext(): EditorContext {
return {
canGeneratePlugin: false,
canGeneratePreference: false,
supportedMagentoPathExtensions: [
...CopyMagentoPathCommand.TEMPLATE_EXTENSIONS,
...CopyMagentoPathCommand.WEB_EXTENSIONS,
Expand Down Expand Up @@ -83,6 +86,15 @@ class Context {

return false;
}

private async canGeneratePreference(editor: TextEditor): Promise<boolean> {
if (editor.document.languageId !== 'php') {
return false;
}

const phpFile = await PhpDocumentParser.parse(editor.document);
return phpFile.classes.length > 0 || phpFile.interfaces.length > 0;
}
}

export default new Context();
17 changes: 11 additions & 6 deletions src/common/PhpNamespace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,17 @@ export default class PhpNamespace {
return this.parts.join(PhpNamespace.NS_SEPARATOR);
}

public append(part: string | PhpNamespace): PhpNamespace {
if (typeof part === 'string') {
return new PhpNamespace([...this.parts, part]);
}

return new PhpNamespace([...this.parts, ...part.getParts()]);
public append(...parts: (string | PhpNamespace)[]): PhpNamespace {
return new PhpNamespace([
...this.parts,
...parts.flatMap(part => {
if (typeof part === 'string') {
return [part];
}

return part.getParts();
}),
]);
}

public prepend(part: string | PhpNamespace): PhpNamespace {
Expand Down
2 changes: 2 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import GenerateGraphqlSchemaFileCommand from 'command/GenerateGraphqlSchemaFile'
import GenerateRoutesXmlFileCommand from 'command/GenerateRoutesXmlFileCommand';
import GenerateAclXmlFileCommand from 'command/GenerateAclXmlFileCommand';
import GenerateDiXmlFileCommand from 'command/GenerateDiXmlFileCommand';
import GeneratePreferenceCommand from 'command/GeneratePreferenceCommand';

// This method is called when your extension is activated
// Your extension is activated the very first time the command is executed
Expand All @@ -42,6 +43,7 @@ export async function activate(context: vscode.ExtensionContext) {
GenerateRoutesXmlFileCommand,
GenerateAclXmlFileCommand,
GenerateDiXmlFileCommand,
GeneratePreferenceCommand,
];

ExtensionState.init(context);
Expand Down
16 changes: 0 additions & 16 deletions src/generator/ModuleFileGenerator.ts

This file was deleted.

4 changes: 2 additions & 2 deletions src/generator/TemplateGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { Uri } from 'vscode';
import ModuleFileGenerator from './ModuleFileGenerator';
import FileGenerator from './FileGenerator';
import GeneratedFile from './GeneratedFile';
import GenerateFromTemplate from './util/GenerateFromTemplate';

export default class TemplateGenerator extends ModuleFileGenerator {
export default class TemplateGenerator extends FileGenerator {
public constructor(
protected fileName: string,
protected templateName: string,
Expand Down
12 changes: 4 additions & 8 deletions src/generator/block/BlockClassGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import FileHeader from 'common/php/FileHeader';
import FileGenerator from 'generator/FileGenerator';
import GeneratedFile from 'generator/GeneratedFile';
import ModuleFileGenerator from 'generator/ModuleFileGenerator';
import { PhpFile, PsrPrinter } from 'node-php-generator';
import Magento from 'util/Magento';
import { Uri } from 'vscode';
import { BlockWizardData } from 'wizard/BlockWizard';

/**
* This is file was generated by the Magento Toolbox extension.
* %module% is the name of the module.
*/

export default class BlockClassGenerator extends ModuleFileGenerator {
export default class BlockClassGenerator extends FileGenerator {
private static readonly BLOCK_CLASS_PARENT = 'Magento\\Framework\\View\\Element\\Template';

public constructor(protected data: BlockWizardData) {
Expand All @@ -20,7 +16,7 @@ export default class BlockClassGenerator extends ModuleFileGenerator {
public async generate(workspaceUri: Uri): Promise<GeneratedFile> {
const [vendor, module] = this.data.module.split('_');
const namespaceParts = [vendor, module, this.data.path];
const moduleDirectory = this.getModuleDirectory(vendor, module, workspaceUri);
const moduleDirectory = Magento.getModuleDirectory(vendor, module, workspaceUri);

const header = FileHeader.getHeader(this.data.module);

Expand Down
11 changes: 7 additions & 4 deletions src/generator/module/ModuleComposerGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import FileGenerator from 'generator/FileGenerator';
import GeneratedFile from 'generator/GeneratedFile';
import ModuleFileGenerator from 'generator/ModuleFileGenerator';
import Magento from 'util/Magento';
import { Uri } from 'vscode';
import { ModuleWizardComposerData } from 'wizard/ModuleWizard';

export default class ModuleComposerGenerator extends ModuleFileGenerator {
export default class ModuleComposerGenerator extends FileGenerator {
public constructor(protected data: ModuleWizardComposerData) {
super();
}

public async generate(workspaceUri: Uri): Promise<GeneratedFile> {
const content = this.getComposerContent();
const moduleDirectory = this.getModuleDirectory(
const moduleDirectory = Magento.getModuleDirectory(
this.data.vendor,
this.data.module,
workspaceUri
Expand All @@ -20,6 +21,8 @@ export default class ModuleComposerGenerator extends ModuleFileGenerator {
}

public getComposerContent(): string {
const namespace = Magento.getModuleNamespace(this.data.vendor, this.data.module);

const object: any = {
name: this.data.composerName,
description: this.data.composerDescription,
Expand All @@ -30,7 +33,7 @@ export default class ModuleComposerGenerator extends ModuleFileGenerator {
autoload: {
files: ['registration.php'],
psr4: {
[`${this.data.vendor}\\${this.data.module}\\`]: '',
[namespace.toString() + '\\']: 'src/',
},
},
};
Expand Down
3 changes: 2 additions & 1 deletion src/generator/module/ModuleLicenseGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import GeneratedFile from 'generator/GeneratedFile';
import TemplateGenerator from 'generator/TemplateGenerator';
import Magento from 'util/Magento';
import { Uri } from 'vscode';
import { ModuleWizardComposerData, ModuleWizardData } from 'wizard/ModuleWizard';

Expand All @@ -9,7 +10,7 @@ export default class ModuleLicenseGenerator extends TemplateGenerator {
}

public async generate(workspaceUri: Uri): Promise<GeneratedFile> {
const moduleDirectory = this.getModuleDirectory(
const moduleDirectory = Magento.getModuleDirectory(
this.data.vendor,
this.data.module,
workspaceUri
Expand Down
15 changes: 8 additions & 7 deletions src/generator/module/ModuleRegistrationGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import ModuleFileGenerator from 'generator/ModuleFileGenerator';
import { ModuleWizardComposerData, ModuleWizardData } from 'wizard/ModuleWizard';
import { Literal, PhpFile, PsrPrinter } from 'node-php-generator';
import { PhpFile, PsrPrinter } from 'node-php-generator';
import { Uri } from 'vscode';
import GeneratedFile from 'generator/GeneratedFile';
import Magento from 'util/Magento';
import FileGenerator from 'generator/FileGenerator';

export default class ModuleRegistrationGenerator extends ModuleFileGenerator {
export default class ModuleRegistrationGenerator extends FileGenerator {
public constructor(protected data: ModuleWizardData | ModuleWizardComposerData) {
super();
}

public async generate(workspaceUri: Uri): Promise<GeneratedFile> {
const registrationContent = this.getRegistrationContent();
const moduleDirectory = this.getModuleDirectory(
const registrationFileUri = Magento.getModuleDirectory(
this.data.vendor,
this.data.module,
workspaceUri
workspaceUri,
'registration.php'
);
const registrationFileUri = Uri.joinPath(moduleDirectory, 'registration.php');
return new GeneratedFile(registrationFileUri, registrationContent);
}

Expand All @@ -26,7 +27,7 @@ export default class ModuleRegistrationGenerator extends ModuleFileGenerator {
file.setStrictTypes(true);
file.addUse('Magento\\Framework\\Component\\ComponentRegistrar');

const moduleName = this.getModuleName(this.data.vendor, this.data.module);
const moduleName = Magento.getModuleName(this.data.vendor, this.data.module);

let content = printer.printFile(file);

Expand Down
14 changes: 7 additions & 7 deletions src/generator/module/ModuleXmlGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
import GeneratedFile from 'generator/GeneratedFile';
import ModuleFileGenerator from 'generator/ModuleFileGenerator';
import XmlGenerator from 'generator/XmlGenerator';
import { Uri } from 'vscode';
import { ModuleWizardComposerData, ModuleWizardData } from 'wizard/ModuleWizard';
import FileGenerator from '../FileGenerator';
import Magento from 'util/Magento';

export default class ModuleXmlGenerator extends ModuleFileGenerator {
export default class ModuleXmlGenerator extends FileGenerator {
public constructor(protected data: ModuleWizardData | ModuleWizardComposerData) {
super();
}

public async generate(workspaceUri: Uri): Promise<GeneratedFile> {
const xmlContent = this.getXmlContent();

const moduleDirectory = this.getModuleDirectory(
const moduleFile = Magento.getModuleDirectory(
this.data.vendor,
this.data.module,
workspaceUri
workspaceUri,
'etc/module.xml'
);

const moduleFile = Uri.joinPath(moduleDirectory, 'etc', 'module.xml');

return new GeneratedFile(moduleFile, xmlContent);
}

protected getXmlContent(): string {
const moduleName = this.data.vendor + '_' + this.data.module;
const moduleName = Magento.getModuleName(this.data.vendor, this.data.module);
const xml = {
'?xml': {
'@_version': '1.0',
Expand Down
Loading