Skip to content

409: Added argument injection/replacement action #1027

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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
3 changes: 3 additions & 0 deletions resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@
<action id="MagentoCreateAWebApiInterfaceForService.Menu" class="com.magento.idea.magento2plugin.actions.generation.NewWebApiInterfaceAction">
<add-to-group group-id="EditorPopupMenu"/>
</action>
<action id="MagentoInjectConstructorArgumentAction.Menu" class="com.magento.idea.magento2plugin.actions.generation.InjectConstructorArgumentAction">
<add-to-group group-id="EditorPopupMenu"/>
</action>

<action id="CopyMagentoPath"
class="com.magento.idea.magento2plugin.actions.CopyMagentoPath"
Expand Down
4 changes: 4 additions & 0 deletions resources/magento2/validation.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ validator.alphaAndDashCharacters=The {0} field must contain alphabets and dashes
validator.alreadyDeclared={0} is already declared in the {1} module
validator.startWithNumberOrCapitalLetter=The {0} field must start with a number or a capital letter
validator.onlyNumbers=The {0} field must contain numbers only
validator.onlyIntegerOrFloatNumbers=The {0} field must contain only integer or float numbers
validator.mustNotBeNegative={0} must not be negative
validator.identifier=The {0} field must contain letters, numbers, dashes, and underscores only
validator.identifier.colon=The {0} field must contain letters, numbers, colons, dashes, and underscores only
Expand Down Expand Up @@ -41,3 +42,6 @@ validator.lowerSnakeCase=The {0} field must be of the lower snake case format
validator.menuIdentifierInvalid=The menu identifier is invalid
validator.someFieldsHaveErrors=Please, check the dialog. Some fields have errors
validator.dbSchema.invalidColumnType=Invalid ''{0}'' column type specified
validator.arrayValuesDialog.invalidValueForRowWithName=Invalid value ''{0}'' specified for the row with name ''{1}''
validator.arrayValuesDialog.namesMustBeUnique=Duplicated items names
validator.arrayValuesDialog.nameMustNotBeEmpty=The array name cannot be empty
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

package com.magento.idea.magento2plugin.actions.generation;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.jetbrains.php.lang.psi.elements.Method;
import com.jetbrains.php.lang.psi.elements.Parameter;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import com.magento.idea.magento2plugin.MagentoIcons;
import com.magento.idea.magento2plugin.actions.generation.dialog.NewArgumentInjectionDialog;
import com.magento.idea.magento2plugin.magento.packages.MagentoPhpClass;
import com.magento.idea.magento2plugin.project.Settings;
import com.magento.idea.magento2plugin.util.RegExUtil;
import com.magento.idea.magento2plugin.util.php.PhpPsiElementsUtil;
import org.jetbrains.annotations.NotNull;

public class InjectConstructorArgumentAction extends AnAction {

public static final String ACTION_NAME = "Inject argument";
public static final String ACTION_DESCRIPTION = "Inject argument through the DI";
public static final String GATHER_ARRAY_VALUES_ACTION_DESCRIPTION = "Specify array values";
private PhpClass currentPhpClass;
private Parameter currentParameter;

/**
* Inject constructor argument action constructor.
*/
public InjectConstructorArgumentAction() {
super(ACTION_NAME, ACTION_DESCRIPTION, MagentoIcons.MODULE);
}

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public void update(final @NotNull AnActionEvent event) {
setIsAvailableForEvent(event, false);
final Project project = event.getProject();

if (project == null || !Settings.isEnabled(project)) {
return;
}
final PhpClass phpClass = PhpPsiElementsUtil.getPhpClass(event);

if (phpClass == null) {
return;
}
// Excluding argument injection generators for Test/ and *Test.php files
// in order to not overload the context menu.
final String filename = phpClass.getContainingFile().getName();

if (filename.matches(RegExUtil.Magento.TEST_FILE_NAME)
|| phpClass.getPresentableFQN().matches(RegExUtil.Magento.TEST_CLASS_FQN)) {
return;
}
final Parameter parameter = PhpPsiElementsUtil.getMethodArgument(event);

if (parameter == null) {
return;
}
final Method method = parameter.getParent().getParent() instanceof Method
? (Method) parameter.getParent().getParent() : null;

if (method == null) {
return;
}

if (!method.getAccess().isPublic()
|| !MagentoPhpClass.CONSTRUCT_METHOD_NAME.equals(method.getName())) {
return;
}
currentPhpClass = phpClass;
currentParameter = parameter;
setIsAvailableForEvent(event, true);
}

@Override
public void actionPerformed(final @NotNull AnActionEvent event) {
if (event.getProject() == null
|| currentPhpClass == null
|| currentParameter == null) {
return;
}

NewArgumentInjectionDialog.open(
event.getProject(),
currentPhpClass,
currentParameter
);
}

/**
* Set is action available for event.
*
* @param event AnActionEvent
* @param isAvailable boolean
*/
private void setIsAvailableForEvent(
final @NotNull AnActionEvent event,
final boolean isAvailable
) {
event.getPresentation().setVisible(isAvailable);
event.getPresentation().setEnabled(isAvailable);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

package com.magento.idea.magento2plugin.actions.generation.data.xml;

import com.magento.idea.magento2plugin.magento.packages.Areas;
import com.magento.idea.magento2plugin.magento.packages.DiArgumentType;
import org.jetbrains.annotations.NotNull;

public class DiArgumentData {

private final String moduleName;
private final String clazz;
private final String parameter;
private final Areas area;
private final DiArgumentType valueType;
private final String value;

/**
* DI argument DTO constructor.
*
* @param moduleName String
* @param clazz String
* @param parameter String
* @param area Areas
* @param valueType DiArgumentType
* @param value String
*/
public DiArgumentData(
final @NotNull String moduleName,
final @NotNull String clazz,
final @NotNull String parameter,
final @NotNull Areas area,
final @NotNull DiArgumentType valueType,
final @NotNull String value
) {
this.moduleName = moduleName;
this.clazz = clazz;
this.parameter = parameter;
this.area = area;
this.valueType = valueType;
this.value = value;
}

/**
* Get module name.
*
* @return String
*/
public String getModuleName() {
return moduleName;
}

/**
* Get target class.
*
* @return String
*/
public String getClazz() {
return clazz;
}

/**
* Get target parameter.
*
* @return String
*/
public String getParameter() {
return parameter;
}

/**
* Get target area.
*
* @return Areas
*/
public Areas getArea() {
return area;
}

/**
* Get argument value xsi:type.
*
* @return DiArgumentType
*/
public DiArgumentType getValueType() {
return valueType;
}

/**
* Get argument value.
*
* @return String
*/
public String getValue() {
return value;
}
}
Loading