From 3dad734686b4ab88fdfac1db9eacea8ac9a8b7b1 Mon Sep 17 00:00:00 2001 From: Korovitskyi Date: Tue, 28 Jun 2022 21:21:38 +0200 Subject: [PATCH 1/5] 406: added sortting plugin list marker --- .../php/PluginLineMarkerProvider.java | 152 ++++++++++++++---- .../linemarker/php/data/PluginMethodData.java | 44 +++++ .../magento/files/ModuleDiXml.java | 1 + .../stubs/indexes/PluginIndex.java | 43 ++--- .../stubs/indexes/data/PluginData.java | 56 +++++++ .../data/PluginSetDataExternalizer.java | 44 +++++ .../GetTargetClassNamesByPluginClassName.java | 11 +- 7 files changed, 301 insertions(+), 50 deletions(-) create mode 100644 src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java create mode 100644 src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java create mode 100644 src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java b/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java index 5d4500d65..a5876a08d 100644 --- a/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java +++ b/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java @@ -15,12 +15,13 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.indexing.FileBasedIndex; -import com.jetbrains.php.PhpIndex; import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.magento.idea.magento2plugin.linemarker.SearchGutterIconNavigationHandler; +import com.magento.idea.magento2plugin.linemarker.php.data.PluginMethodData; import com.magento.idea.magento2plugin.project.Settings; import com.magento.idea.magento2plugin.stubs.indexes.PluginIndex; +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginData; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -94,12 +95,13 @@ public void collectSlowLineMarkers( } } + @SuppressWarnings("checkstyle:LineLength") private static class PluginClassCache { - private final Map> classPluginsMap = new HashMap<>(); + private final Map> classPluginsMap = new HashMap<>(); - public List getPluginsForClass(final @NotNull PhpClass phpClass) { - final List pluginsForClass = getPluginsForClass( + public List getPluginsForClass(final @NotNull PhpClass phpClass) { + final List pluginsForClass = getPluginsForClass( phpClass, phpClass.getPresentableFQN() ); @@ -114,7 +116,7 @@ public List getPluginsForClass(final @NotNull PhpClass phpClass) { return pluginsForClass; } - public List getPluginsForClass( + public List getPluginsForClass( final @NotNull PhpClass phpClass, final @NotNull String classFQN ) { @@ -122,24 +124,24 @@ public List getPluginsForClass( return classPluginsMap.get(classFQN); } - final List> plugins = FileBasedIndex.getInstance() + final List> plugins = FileBasedIndex.getInstance() .getValues( PluginIndex.KEY, classFQN, GlobalSearchScope.allScope(phpClass.getProject()) ); - final List results = new ArrayList<>(); + final List results = new ArrayList<>(); if (plugins.isEmpty()) { classPluginsMap.put(classFQN, results); return results; } - final PhpIndex phpIndex = PhpIndex.getInstance(phpClass.getProject()); - for (final Set pluginClassNames : plugins) { - for (final String pluginClassName: pluginClassNames) { - results.addAll(phpIndex.getClassesByFQN(pluginClassName)); + for (final Set pluginDataList : plugins) { + for (final PluginData pluginData: pluginDataList) { + pluginData.setPhpClass(phpClass); + results.add(pluginData); } } classPluginsMap.put(classFQN, results); @@ -147,25 +149,29 @@ public List getPluginsForClass( return results; } - public List getPluginMethods(final List plugins) { - final List methodList = new ArrayList<>(); + public List getPluginMethods(final List pluginDataList) { + List result = new ArrayList<>(); - for (final PhpClass plugin: plugins) { - methodList.addAll(getPluginMethods(plugin)); + for (PluginData pluginData: pluginDataList) { + for (final PhpClass plugin: pluginData.getPhpClassCollection()) { + //@todo add module sequence ID if sortOrder equal zero. It should be negative value. + result.addAll(getPluginMethods(plugin, pluginData.getSortOrder())); + } } - return methodList; + return result; } - public List getPluginMethods(final @NotNull PhpClass pluginClass) { - final List methodList = new ArrayList<>(); + public List getPluginMethods(final @NotNull PhpClass pluginClass, int sortOrder) { + final List methodList = new ArrayList<>(); for (final Method method : pluginClass.getMethods()) { if (method.getAccess().isPublic()) { final String pluginMethodName = method.getName(); if (pluginMethodName.length() > MIN_PLUGIN_METHOD_NAME_LENGTH) { - methodList.add(method); + //@todo module sequence value should be set here instead of zero. + methodList.add(new PluginMethodData(method, sortOrder, 0)); } } } @@ -186,41 +192,133 @@ public ClassPluginCollector( @Override public List collect(final @NotNull PhpClass psiElement) { - return pluginClassCache.getPluginsForClass(psiElement); + List pluginDataList = pluginClassCache.getPluginsForClass(psiElement); + List phpClassList = new ArrayList<>(); + + for (PluginData pluginData: pluginDataList) { + phpClassList.addAll(pluginData.getPhpClassCollection()); + } + + return phpClassList; } } private static class MethodPluginCollector implements Collector { private final PluginLineMarkerProvider.PluginClassCache pluginClassCache; + private final Map pluginMethodsSortOrder; public MethodPluginCollector( final PluginLineMarkerProvider.PluginClassCache pluginClassCache ) { this.pluginClassCache = pluginClassCache; + pluginMethodsSortOrder = new HashMap<>(); + pluginMethodsSortOrder.put("before", 1); + pluginMethodsSortOrder.put("around", 2); + pluginMethodsSortOrder.put("after", 3); } + @SuppressWarnings("checkstyle:LineLength") @Override public List collect(final @NotNull Method psiElement) { final List results = new ArrayList<>(); - final PhpClass methodClass = psiElement.getContainingClass(); if (methodClass == null) { return results; } - final List pluginsList = pluginClassCache.getPluginsForClass(methodClass); - final List pluginMethods = pluginClassCache.getPluginMethods(pluginsList); + final List pluginDataList = pluginClassCache.getPluginsForClass(methodClass); + final List pluginMethods = pluginClassCache.getPluginMethods(pluginDataList); final String classMethodName = WordUtils.capitalize(psiElement.getName()); - for (final Method pluginMethod: pluginMethods) { - if (isPluginMethodName(pluginMethod.getName(), classMethodName)) { - results.add(pluginMethod); + pluginMethods.removeIf(pluginMethod -> !isPluginMethodName(pluginMethod.getMethodName(), classMethodName)); + sortMethods(pluginMethods, results); + + return results; + } + + @SuppressWarnings({"checkstyle:Indentation", "checkstyle:OperatorWrap", "checkstyle:LineLength"}) + private void sortMethods(final @NotNull List methodDataList, List results) { + List bufferSortOrderList = new ArrayList<>(); + int biggestSortOrder = 0; + + for (PluginMethodData pluginMethodData: methodDataList) { + String methodName = pluginMethodData.getMethodName(); + + if (methodName.startsWith("around")) { + bufferSortOrderList.add(pluginMethodData.getSortOrder()); + } + + if (pluginMethodData.getSortOrder() > biggestSortOrder) { + biggestSortOrder = pluginMethodData.getSortOrder(); } } - return results; + final int biggestSortOrderValue = biggestSortOrder; + + methodDataList.sort( + (PluginMethodData method1, PluginMethodData method2) -> { + final String firstMethodName = method1.getMethodName(); + final String secondMethodName = method2.getMethodName(); + final int firstIndexEnd = firstMethodName.startsWith("after") ? 5 : 6; + final int secondIndexEnd = secondMethodName.startsWith("after") ? 5 : 6; + String firstMethodPrefix = firstMethodName.substring(0,firstIndexEnd); + String secondMethodPrefix = secondMethodName.substring(0,secondIndexEnd); + + if (!pluginMethodsSortOrder.containsKey(firstMethodPrefix) + || !pluginMethodsSortOrder.containsKey(secondMethodPrefix)) { + return firstMethodName.compareTo(secondMethodName); + } + + final Integer firstNameSortOrder = pluginMethodsSortOrder.get(firstMethodPrefix); + final Integer secondNameSortOrder = pluginMethodsSortOrder.get(secondMethodPrefix); + + if (firstNameSortOrder.compareTo(secondNameSortOrder) != 0) { + return firstNameSortOrder.compareTo(secondNameSortOrder); + } + + Integer firstBuffer = 0; + Integer secondBuffer = 0; + Integer firstModuleSequence = (method1.getModuleSequence() + biggestSortOrderValue) * -1; + Integer secondModuleSequence = (method2.getModuleSequence() + biggestSortOrderValue) * -1; + Integer firstSortOrder = method1.getSortOrder() != 0 ? + method1.getSortOrder() : + firstModuleSequence; + Integer secondSortOrder = method2.getSortOrder() != 0 ? + method2.getSortOrder() : + secondModuleSequence; + + if (!bufferSortOrderList.isEmpty() && firstMethodPrefix.equals("after")) { + for (Integer bufferSortOrder : bufferSortOrderList) { + if (bufferSortOrder < firstSortOrder && firstBuffer < bufferSortOrder + 1) { + firstBuffer = bufferSortOrder + 1; + } + + if (bufferSortOrder < secondSortOrder && secondBuffer < bufferSortOrder + 1) { + secondBuffer = bufferSortOrder + 1; + } + } + } + + firstBuffer = firstBuffer.equals(0) ? firstSortOrder : firstBuffer * -1; + secondBuffer = secondBuffer.equals(0) ? secondSortOrder : secondBuffer * -1; + + if (firstBuffer.compareTo(secondBuffer) == 0 && firstSortOrder.compareTo(secondSortOrder) != 0) { + return firstSortOrder.compareTo(secondSortOrder); + } + + if (firstBuffer.compareTo(secondBuffer) == 0 && firstSortOrder.compareTo(secondSortOrder) == 0) { + return firstModuleSequence.compareTo(secondModuleSequence); + } + + return firstBuffer.compareTo(secondBuffer); + } + ); + + for (PluginMethodData pluginMethodData: methodDataList) { + results.add(pluginMethodData.getMethod()); + } } private boolean isPluginMethodName( diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java b/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java new file mode 100644 index 000000000..c2479f42f --- /dev/null +++ b/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java @@ -0,0 +1,44 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php.data; + +import com.jetbrains.php.lang.psi.elements.Method; + +public class PluginMethodData { + + private final Method method; + private final int sortOrder; + private final int moduleSequence; + + /** + * Plugin method data class. + * + * @param method Plugin method + * @param sortOrder Plugin SortOrder integer value + * @param moduleSequence PHP class placed module sequence integer value + */ + public PluginMethodData(final Method method, final int sortOrder, final int moduleSequence) { + this.method = method; + this.sortOrder = sortOrder; + this.moduleSequence = moduleSequence; + } + + public Method getMethod() { + return method; + } + + public int getSortOrder() { + return sortOrder; + } + + public int getModuleSequence() { + return moduleSequence; + } + + public String getMethodName() { + return method.getName(); + } +} diff --git a/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java b/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java index 7db65c0cd..2d8f55e71 100644 --- a/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java +++ b/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java @@ -46,6 +46,7 @@ public class ModuleDiXml implements ModuleFileInterface { // attributes public static String NAME_ATTR = "name"; + public static String SORT_ORDER_ATTR = "sortOrder"; public static String TYPE_ATTR = "type"; public static String PREFERENCE_ATTR_FOR = "for"; public static String CLI_COMMAND_ATTR_COMMANDS = "commands"; diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java index 145ac6f1a..f190df88b 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java @@ -2,6 +2,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + package com.magento.idea.magento2plugin.stubs.indexes; import com.intellij.ide.highlighter.XmlFileType; @@ -15,34 +16,35 @@ import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; import com.jetbrains.php.lang.PhpLangUtil; -import com.jetbrains.php.lang.psi.stubs.indexes.StringSetDataExternalizer; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; import com.magento.idea.magento2plugin.project.Settings; -import org.jetbrains.annotations.NotNull; - +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginData; +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginSetDataExternalizer; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.jetbrains.annotations.NotNull; -public class PluginIndex extends FileBasedIndexExtension> { - public static final ID> KEY +public class PluginIndex extends FileBasedIndexExtension> { + public static final ID> KEY = ID.create("com.magento.idea.magento2plugin.stubs.indexes.plugin_to_type"); private final KeyDescriptor myKeyDescriptor = new EnumeratorStringDescriptor(); @NotNull @Override - public ID> getName() { + public ID> getName() { return KEY; } @NotNull @Override - public DataIndexer, FileContent> getIndexer() { - return new DataIndexer, FileContent>() { + public DataIndexer, FileContent> getIndexer() { + return new DataIndexer<>() { @NotNull @Override - public Map> map(@NotNull FileContent fileContent) { - Map> map = new HashMap<>(); + public Map> map(@NotNull FileContent fileContent) { + Map> map = new HashMap<>(); PsiFile psiFile = fileContent.getPsiFile(); if (!Settings.isEnabled(psiFile.getProject())) { @@ -67,7 +69,7 @@ public Map> map(@NotNull FileContent fileContent) { for (XmlTag typeNode: xmlTag.findSubTags("type")) { String typeName = typeNode.getAttributeValue("name"); if (typeName != null) { - Set plugins = getPluginsForType(typeNode); + Set plugins = getPluginsForType(typeNode); if (plugins.size() > 0) { map.put(PhpLangUtil.toPresentableFQN(typeName), plugins); } @@ -79,15 +81,20 @@ public Map> map(@NotNull FileContent fileContent) { return map; } - private Set getPluginsForType(XmlTag typeNode) { - Set results = new HashSet(); + private Set getPluginsForType(XmlTag typeNode) { + Set results = new HashSet<>(); + + for (XmlTag pluginTag: typeNode.findSubTags(ModuleDiXml.PLUGIN_TAG_NAME)) { + String pluginType = pluginTag.getAttributeValue(ModuleDiXml.TYPE_ATTR); + String pluginSortOrder = pluginTag.getAttributeValue(ModuleDiXml.SORT_ORDER_ATTR); - for (XmlTag pluginTag: typeNode.findSubTags("plugin")) { - String pluginType = pluginTag.getAttributeValue("type"); if (pluginType != null) { - results.add(PhpLangUtil.toPresentableFQN(pluginType)); + pluginSortOrder = pluginSortOrder == null ? "0" : pluginSortOrder; + PluginData pluginData = new PluginData(pluginType, Integer.parseInt(pluginSortOrder)); + results.add(pluginData); } } + return results; } }; @@ -101,8 +108,8 @@ public KeyDescriptor getKeyDescriptor() { @NotNull @Override - public DataExternalizer> getValueExternalizer() { - return new StringSetDataExternalizer(); + public DataExternalizer> getValueExternalizer() { + return PluginSetDataExternalizer.INSTANCE; } @NotNull diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java new file mode 100644 index 000000000..e5e68b034 --- /dev/null +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java @@ -0,0 +1,56 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.stubs.indexes.data; + +import com.jetbrains.php.PhpIndex; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import java.util.Collection; +import org.jetbrains.annotations.NotNull; + +public class PluginData { + + private final String type; + private final int sortOrder; + private Collection phpClassCollection; + + /** + * Plugin data class. + * + * @param type Type class + * @param sortOrder Sort order value. + */ + public PluginData(final String type, final int sortOrder) { + this.type = type; + this.sortOrder = sortOrder; + } + + public String getType() { + return type; + } + + public int getSortOrder() { + return sortOrder; + } + + public @NotNull Collection getPhpClass() { + return phpClassCollection; + } + + public Collection getPhpClassCollection() { + return phpClassCollection; + } + + /** + * Setting PHP plugin class. + * + * @param phpClass collection PHP plugin class + */ + public void setPhpClass(@NotNull PhpClass phpClass) { + final PhpIndex phpIndex = PhpIndex.getInstance(phpClass.getProject()); + + phpClassCollection = phpIndex.getClassesByFQN(getType()); + } +} diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java new file mode 100644 index 000000000..649ec90a8 --- /dev/null +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java @@ -0,0 +1,44 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.stubs.indexes.data; + +import com.intellij.util.io.DataExternalizer; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import org.jetbrains.annotations.NotNull; + +public class PluginSetDataExternalizer implements DataExternalizer> { + public static final PluginSetDataExternalizer INSTANCE = new PluginSetDataExternalizer(); + + public PluginSetDataExternalizer() { + } + + @Override + public synchronized void save(@NotNull DataOutput out, Set value) throws IOException { + out.writeInt(value.size()); + + for (PluginData plugin : value) { + out.writeUTF(plugin.getType()); + out.writeInt(plugin.getSortOrder()); + } + } + + @Override + public synchronized Set read(@NotNull DataInput in) throws IOException { + int size = in.readInt(); + HashSet result = new HashSet<>(size); + + for (int r = size; r > 0; --r) { + PluginData pluginData = new PluginData(in.readUTF(), in.readInt()); + result.add(pluginData); + } + + return result; + } +} diff --git a/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java b/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java index da70223b7..6dace4423 100644 --- a/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java +++ b/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java @@ -2,13 +2,14 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + package com.magento.idea.magento2plugin.util.magento.plugin; import com.intellij.openapi.project.Project; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.indexing.FileBasedIndex; import com.magento.idea.magento2plugin.stubs.indexes.PluginIndex; - +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginData; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -35,14 +36,14 @@ public ArrayList execute(String currentClassName) { .getAllKeys(PluginIndex.KEY, project); for (String targetClassName : allKeys) { - List> pluginsList = FileBasedIndex.getInstance() + List> pluginsList = FileBasedIndex.getInstance() .getValues(com.magento.idea.magento2plugin.stubs.indexes.PluginIndex.KEY, targetClassName, GlobalSearchScope.allScope(project)); if (pluginsList.isEmpty()) { continue; } - for (Set plugins : pluginsList) { - for (String plugin : plugins) { - if (!plugin.equals(currentClassName)) { + for (Set plugins : pluginsList) { + for (PluginData plugin : plugins) { + if (!plugin.getType().equals(currentClassName)) { continue; } targetClassNames.add(targetClassName); From 4656c8a191a230c854336fcfc0e38ab8b5f4499c Mon Sep 17 00:00:00 2001 From: Korovitskyi Date: Wed, 29 Jun 2022 22:45:18 +0200 Subject: [PATCH 2/5] 406: test fix --- .../PluginGenerateMethodHandlerBase.java | 9 ++- .../inspections/php/PluginInspection.java | 8 +-- .../php/PluginLineMarkerProvider.java | 64 ++++++++++--------- .../php/PluginTargetLineMarkerProvider.java | 4 +- .../stubs/indexes/PluginIndex.java | 56 +++++++++------- .../stubs/indexes/data/PluginData.java | 2 +- .../data/PluginSetDataExternalizer.java | 21 +++--- .../GetTargetClassNamesByPluginClassName.java | 39 ++++++----- 8 files changed, 112 insertions(+), 91 deletions(-) diff --git a/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java b/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java index 5fd1810fa..996f244f1 100644 --- a/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java +++ b/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java @@ -42,7 +42,6 @@ import com.magento.idea.magento2plugin.util.magento.plugin.GetTargetClassNamesByPluginClassName; import com.magento.idea.magento2plugin.util.magento.plugin.IsPluginAllowedForMethodUtil; import gnu.trove.THashSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -88,9 +87,9 @@ public boolean isValidFor(final Editor editor, final PsiFile file) { return false; } final GetTargetClassNamesByPluginClassName targetClassesService - = GetTargetClassNamesByPluginClassName.getInstance(editor.getProject()); + = new GetTargetClassNamesByPluginClassName(editor.getProject()); final String currentClass = phpClass.getFQN().substring(1); - final ArrayList targetClassNames = targetClassesService.execute(currentClass); + final List targetClassNames = targetClassesService.execute(currentClass); return !targetClassNames.isEmpty(); } @@ -241,9 +240,9 @@ protected PhpNamedElementNode[] targetMethods( final TreeMap nodes = new TreeMap(); final GetTargetClassNamesByPluginClassName targetClassesService = - GetTargetClassNamesByPluginClassName.getInstance(phpClass.getProject()); + new GetTargetClassNamesByPluginClassName(phpClass.getProject()); final String currentClass = phpClass.getFQN().substring(1); - final ArrayList targetClassNames = targetClassesService.execute(currentClass); + final List targetClassNames = targetClassesService.execute(currentClass); for (final String targetClassName : targetClassNames) { final PhpClass targetClass = GetPhpClassByFQN.getInstance( phpClass.getProject() diff --git a/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java b/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java index c5e4dd744..cbc06b229 100644 --- a/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java +++ b/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java @@ -27,7 +27,7 @@ import com.magento.idea.magento2plugin.magento.packages.Package; import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; import com.magento.idea.magento2plugin.util.magento.plugin.GetTargetClassNamesByPluginClassName; -import java.util.ArrayList; +import java.util.List; import org.jetbrains.annotations.NotNull; @SuppressWarnings({"PMD.ExcessiveMethodLength", "PMD.NPathComplexity", "PMD.CognitiveComplexity"}) @@ -75,10 +75,8 @@ public void visitPhpMethod(final Method pluginMethod) { ((PhpClass) parentClass).getNameIdentifier(); final String currentClass = ((PhpClass) parentClass).getFQN().substring(1); final GetTargetClassNamesByPluginClassName targetClassesService = - GetTargetClassNamesByPluginClassName.getInstance( - problemsHolder.getProject() - ); - final ArrayList targetClassNames = + new GetTargetClassNamesByPluginClassName(problemsHolder.getProject()); + final List targetClassNames = targetClassesService.execute(currentClass); for (final String targetClassName : targetClassNames) { diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java b/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java index a5876a08d..ff3a7af95 100644 --- a/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java +++ b/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java @@ -150,9 +150,9 @@ public List getPluginsForClass( } public List getPluginMethods(final List pluginDataList) { - List result = new ArrayList<>(); + final List result = new ArrayList<>(); - for (PluginData pluginData: pluginDataList) { + for (final PluginData pluginData: pluginDataList) { for (final PhpClass plugin: pluginData.getPhpClassCollection()) { //@todo add module sequence ID if sortOrder equal zero. It should be negative value. result.addAll(getPluginMethods(plugin, pluginData.getSortOrder())); @@ -162,7 +162,7 @@ public List getPluginMethods(final List pluginData return result; } - public List getPluginMethods(final @NotNull PhpClass pluginClass, int sortOrder) { + public List getPluginMethods(final @NotNull PhpClass pluginClass, final int sortOrder) { final List methodList = new ArrayList<>(); for (final Method method : pluginClass.getMethods()) { @@ -171,13 +171,18 @@ public List getPluginMethods(final @NotNull PhpClass pluginCla if (pluginMethodName.length() > MIN_PLUGIN_METHOD_NAME_LENGTH) { //@todo module sequence value should be set here instead of zero. - methodList.add(new PluginMethodData(method, sortOrder, 0)); + methodList.add(getPluginMethodDataObject(method, sortOrder, 0)); } } } return methodList; } + + @NotNull + private PluginMethodData getPluginMethodDataObject(final Method method, final int sortOrder, final int moduleSequence) { + return new PluginMethodData(method, sortOrder, moduleSequence); + } } private static class ClassPluginCollector implements Collector { @@ -192,10 +197,10 @@ public ClassPluginCollector( @Override public List collect(final @NotNull PhpClass psiElement) { - List pluginDataList = pluginClassCache.getPluginsForClass(psiElement); - List phpClassList = new ArrayList<>(); + final List pluginDataList = pluginClassCache.getPluginsForClass(psiElement); + final List phpClassList = new ArrayList<>(); - for (PluginData pluginData: pluginDataList) { + for (final PluginData pluginData: pluginDataList) { phpClassList.addAll(pluginData.getPhpClassCollection()); } @@ -207,6 +212,7 @@ private static class MethodPluginCollector implements Collector private final PluginLineMarkerProvider.PluginClassCache pluginClassCache; private final Map pluginMethodsSortOrder; + private static final String AFTER_PLUGIN_PREFIX = "after"; public MethodPluginCollector( final PluginLineMarkerProvider.PluginClassCache pluginClassCache @@ -215,7 +221,7 @@ public MethodPluginCollector( pluginMethodsSortOrder = new HashMap<>(); pluginMethodsSortOrder.put("before", 1); pluginMethodsSortOrder.put("around", 2); - pluginMethodsSortOrder.put("after", 3); + pluginMethodsSortOrder.put(AFTER_PLUGIN_PREFIX, 3); } @SuppressWarnings("checkstyle:LineLength") @@ -238,13 +244,13 @@ public List collect(final @NotNull Method psiElement) { return results; } - @SuppressWarnings({"checkstyle:Indentation", "checkstyle:OperatorWrap", "checkstyle:LineLength"}) - private void sortMethods(final @NotNull List methodDataList, List results) { - List bufferSortOrderList = new ArrayList<>(); + @SuppressWarnings({"checkstyle:Indentation", "checkstyle:OperatorWrap", "checkstyle:LineLength", "PMD.NPathComplexity"}) + private void sortMethods(final @NotNull List methodDataList, final List results) { + final List bufferSortOrderList = new ArrayList<>(); int biggestSortOrder = 0; - for (PluginMethodData pluginMethodData: methodDataList) { - String methodName = pluginMethodData.getMethodName(); + for (final PluginMethodData pluginMethodData: methodDataList) { + final String methodName = pluginMethodData.getMethodName(); if (methodName.startsWith("around")) { bufferSortOrderList.add(pluginMethodData.getSortOrder()); @@ -261,10 +267,10 @@ private void sortMethods(final @NotNull List methodDataList, L (PluginMethodData method1, PluginMethodData method2) -> { final String firstMethodName = method1.getMethodName(); final String secondMethodName = method2.getMethodName(); - final int firstIndexEnd = firstMethodName.startsWith("after") ? 5 : 6; - final int secondIndexEnd = secondMethodName.startsWith("after") ? 5 : 6; - String firstMethodPrefix = firstMethodName.substring(0,firstIndexEnd); - String secondMethodPrefix = secondMethodName.substring(0,secondIndexEnd); + final int firstIndexEnd = firstMethodName.startsWith(AFTER_PLUGIN_PREFIX) ? 5 : 6; + final int secondIndexEnd = secondMethodName.startsWith(AFTER_PLUGIN_PREFIX) ? 5 : 6; + final String firstMethodPrefix = firstMethodName.substring(0,firstIndexEnd); + final String secondMethodPrefix = secondMethodName.substring(0,secondIndexEnd); if (!pluginMethodsSortOrder.containsKey(firstMethodPrefix) || !pluginMethodsSortOrder.containsKey(secondMethodPrefix)) { @@ -280,17 +286,17 @@ private void sortMethods(final @NotNull List methodDataList, L Integer firstBuffer = 0; Integer secondBuffer = 0; - Integer firstModuleSequence = (method1.getModuleSequence() + biggestSortOrderValue) * -1; - Integer secondModuleSequence = (method2.getModuleSequence() + biggestSortOrderValue) * -1; - Integer firstSortOrder = method1.getSortOrder() != 0 ? - method1.getSortOrder() : - firstModuleSequence; - Integer secondSortOrder = method2.getSortOrder() != 0 ? - method2.getSortOrder() : - secondModuleSequence; - - if (!bufferSortOrderList.isEmpty() && firstMethodPrefix.equals("after")) { - for (Integer bufferSortOrder : bufferSortOrderList) { + final Integer firstModuleSequence = (method1.getModuleSequence() + biggestSortOrderValue) * -1; + final Integer secondModuleSequence = (method2.getModuleSequence() + biggestSortOrderValue) * -1; + final Integer firstSortOrder = method1.getSortOrder() == 0 ? + firstModuleSequence : + method1.getSortOrder(); + final Integer secondSortOrder = method2.getSortOrder() == 0 ? + secondModuleSequence : + method2.getSortOrder(); + + if (!bufferSortOrderList.isEmpty() && firstMethodPrefix.equals(AFTER_PLUGIN_PREFIX)) { + for (final Integer bufferSortOrder : bufferSortOrderList) { if (bufferSortOrder < firstSortOrder && firstBuffer < bufferSortOrder + 1) { firstBuffer = bufferSortOrder + 1; } @@ -316,7 +322,7 @@ private void sortMethods(final @NotNull List methodDataList, L } ); - for (PluginMethodData pluginMethodData: methodDataList) { + for (final PluginMethodData pluginMethodData: methodDataList) { results.add(pluginMethodData.getMethod()); } } diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java b/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java index 5f63c8620..5e8c06af2 100644 --- a/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java +++ b/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java @@ -97,8 +97,8 @@ private List getTargetClassesForPlugin( } final GetTargetClassNamesByPluginClassName targetClassesService = - GetTargetClassNamesByPluginClassName.getInstance(phpClass.getProject()); - final ArrayList targetClassNames = targetClassesService.execute(classFQN); + new GetTargetClassNamesByPluginClassName(phpClass.getProject()); + final List targetClassNames = targetClassesService.execute(classFQN); final List results = new ArrayList<>(); diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java index f190df88b..425708749 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java @@ -11,7 +11,11 @@ import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.indexing.*; +import com.intellij.util.indexing.DataIndexer; +import com.intellij.util.indexing.FileBasedIndex; +import com.intellij.util.indexing.FileBasedIndexExtension; +import com.intellij.util.indexing.FileContent; +import com.intellij.util.indexing.ID; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; @@ -39,14 +43,16 @@ public ID> getName() { @NotNull @Override + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) public DataIndexer, FileContent> getIndexer() { return new DataIndexer<>() { + @SuppressWarnings("checkstyle:LineLength") @NotNull @Override - public Map> map(@NotNull FileContent fileContent) { - Map> map = new HashMap<>(); + public Map> map(final @NotNull FileContent fileContent) { + final Map> map = new HashMap<>(); - PsiFile psiFile = fileContent.getPsiFile(); + final PsiFile psiFile = fileContent.getPsiFile(); if (!Settings.isEnabled(psiFile.getProject())) { return map; } @@ -54,26 +60,27 @@ public Map> map(@NotNull FileContent fileContent) { if (!(psiFile instanceof XmlFile)) { return map; } - XmlDocument document = ((XmlFile) psiFile).getDocument(); - if(document == null) { + final XmlDocument document = ((XmlFile) psiFile).getDocument(); + if (document == null) { return map; } - XmlTag xmlTags[] = PsiTreeUtil.getChildrenOfType(psiFile.getFirstChild(), XmlTag.class); + final XmlTag[] xmlTags = PsiTreeUtil.getChildrenOfType(psiFile.getFirstChild(), XmlTag.class); if (xmlTags == null) { return map; } - for (XmlTag xmlTag: xmlTags) { + for (final XmlTag xmlTag: xmlTags) { if (xmlTag.getName().equals("config")) { - for (XmlTag typeNode: xmlTag.findSubTags("type")) { - String typeName = typeNode.getAttributeValue("name"); - if (typeName != null) { - Set plugins = getPluginsForType(typeNode); - if (plugins.size() > 0) { - map.put(PhpLangUtil.toPresentableFQN(typeName), plugins); - } + for (final XmlTag typeNode: xmlTag.findSubTags("type")) { + final String typeName = typeNode.getAttributeValue("name"); + final Set plugins = getPluginsForType(typeNode); + + if (typeName == null || plugins.isEmpty()) { + continue; } + + map.put(PhpLangUtil.toPresentableFQN(typeName), plugins); } } } @@ -81,22 +88,27 @@ public Map> map(@NotNull FileContent fileContent) { return map; } - private Set getPluginsForType(XmlTag typeNode) { - Set results = new HashSet<>(); + @SuppressWarnings("checkstyle:LineLength") + private Set getPluginsForType(final XmlTag typeNode) { + final Set results = new HashSet<>(); - for (XmlTag pluginTag: typeNode.findSubTags(ModuleDiXml.PLUGIN_TAG_NAME)) { - String pluginType = pluginTag.getAttributeValue(ModuleDiXml.TYPE_ATTR); + for (final XmlTag pluginTag: typeNode.findSubTags(ModuleDiXml.PLUGIN_TAG_NAME)) { + final String pluginType = pluginTag.getAttributeValue(ModuleDiXml.TYPE_ATTR); String pluginSortOrder = pluginTag.getAttributeValue(ModuleDiXml.SORT_ORDER_ATTR); if (pluginType != null) { pluginSortOrder = pluginSortOrder == null ? "0" : pluginSortOrder; - PluginData pluginData = new PluginData(pluginType, Integer.parseInt(pluginSortOrder)); + final PluginData pluginData = getPluginDataObject(pluginType, Integer.parseInt(pluginSortOrder)); results.add(pluginData); } } return results; } + + private PluginData getPluginDataObject(final String pluginType, final Integer sortOrder) { + return new PluginData(pluginType, sortOrder); + } }; } @@ -114,9 +126,9 @@ public DataExternalizer> getValueExternalizer() { @NotNull @Override + @SuppressWarnings("checkstyle:LineLength") public FileBasedIndex.InputFilter getInputFilter() { - return virtualFile -> (virtualFile.getFileType() == XmlFileType.INSTANCE - && virtualFile.getNameWithoutExtension().equals("di")); + return virtualFile -> virtualFile.getFileType().equals(XmlFileType.INSTANCE) && "di".equals(virtualFile.getNameWithoutExtension()); } @Override diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java index e5e68b034..be32391b3 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java @@ -48,7 +48,7 @@ public Collection getPhpClassCollection() { * * @param phpClass collection PHP plugin class */ - public void setPhpClass(@NotNull PhpClass phpClass) { + public void setPhpClass(final @NotNull PhpClass phpClass) { final PhpIndex phpIndex = PhpIndex.getInstance(phpClass.getProject()); phpClassCollection = phpIndex.getClassesByFQN(getType()); diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java index 649ec90a8..94f67b58a 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java @@ -16,29 +16,30 @@ public class PluginSetDataExternalizer implements DataExternalizer> { public static final PluginSetDataExternalizer INSTANCE = new PluginSetDataExternalizer(); - public PluginSetDataExternalizer() { - } - + @SuppressWarnings("checkstyle:LineLength") @Override - public synchronized void save(@NotNull DataOutput out, Set value) throws IOException { + public void save(final @NotNull DataOutput out, final Set value) throws IOException { out.writeInt(value.size()); - for (PluginData plugin : value) { + for (final PluginData plugin : value) { out.writeUTF(plugin.getType()); out.writeInt(plugin.getSortOrder()); } } @Override - public synchronized Set read(@NotNull DataInput in) throws IOException { - int size = in.readInt(); - HashSet result = new HashSet<>(size); + public Set read(final @NotNull DataInput income) throws IOException { + final int size = income.readInt(); + final HashSet result = new HashSet<>(size); for (int r = size; r > 0; --r) { - PluginData pluginData = new PluginData(in.readUTF(), in.readInt()); - result.add(pluginData); + result.add(getPluginDataObject(income.readUTF(), income.readInt())); } return result; } + + private PluginData getPluginDataObject(final String pluginType, final Integer sortOrder) { + return new PluginData(pluginType, sortOrder); + } } diff --git a/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java b/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java index 6dace4423..599de1607 100644 --- a/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java +++ b/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java @@ -16,33 +16,38 @@ import java.util.Set; /** - * Returns all targets class names for the plugin + * Returns all targets class names for the plugin. */ public class GetTargetClassNamesByPluginClassName { - private static GetTargetClassNamesByPluginClassName INSTANCE = null; - private Project project; + private final Project project; - public static GetTargetClassNamesByPluginClassName getInstance(Project project) { - if (null == INSTANCE) { - INSTANCE = new GetTargetClassNamesByPluginClassName(); - } - INSTANCE.project = project; - return INSTANCE; + public GetTargetClassNamesByPluginClassName(final Project project) { + this.project = project; } - public ArrayList execute(String currentClassName) { - ArrayList targetClassNames = new ArrayList<>(); - Collection allKeys = FileBasedIndex.getInstance() + /** + * Get current class names for the plugin. + * + * @param currentClassName plugin class name. + * @return list of plugin classes + */ + public List execute(final String currentClassName) { + final List targetClassNames = new ArrayList<>(); + final Collection allKeys = FileBasedIndex.getInstance() .getAllKeys(PluginIndex.KEY, project); - for (String targetClassName : allKeys) { - List> pluginsList = FileBasedIndex.getInstance() - .getValues(com.magento.idea.magento2plugin.stubs.indexes.PluginIndex.KEY, targetClassName, GlobalSearchScope.allScope(project)); + for (final String targetClassName : allKeys) { + final List> pluginsList = FileBasedIndex.getInstance() + .getValues( + PluginIndex.KEY, + targetClassName, + GlobalSearchScope.allScope(project) + ); if (pluginsList.isEmpty()) { continue; } - for (Set plugins : pluginsList) { - for (PluginData plugin : plugins) { + for (final Set plugins : pluginsList) { + for (final PluginData plugin : plugins) { if (!plugin.getType().equals(currentClassName)) { continue; } From c935b5fdb3f80748c2eb504c1e9f1a895a0e42a4 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Fri, 1 Jul 2022 17:51:16 +0300 Subject: [PATCH 3/5] 406: Added equality overriddes --- .../stubs/indexes/data/PluginData.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java index be32391b3..c1731361b 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java @@ -53,4 +53,35 @@ public void setPhpClass(final @NotNull PhpClass phpClass) { phpClassCollection = phpIndex.getClassesByFQN(getType()); } + + /** + * Overridden hashCode check. + * + * @return boolean + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + this.sortOrder; + + return prime * result + ((this.getType() == null) ? 0 : this.getType().hashCode()); + } + + /** + * Overridden quality check. + * + * @param object PluginData + * + * @return boolean + */ + @Override + public boolean equals(Object object) { + if (!(object instanceof PluginData)) { + return false; + } + final PluginData compareTo = (PluginData) object; + + return type.equals(compareTo.getType()) && sortOrder == compareTo.getSortOrder(); + } } From 03227025105627440ed97dd30555d04e47f538a8 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Fri, 1 Jul 2022 18:00:55 +0300 Subject: [PATCH 4/5] 406: Code style fix --- .../idea/magento2plugin/stubs/indexes/data/PluginData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java index c1731361b..547db8715 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java @@ -76,7 +76,7 @@ public int hashCode() { * @return boolean */ @Override - public boolean equals(Object object) { + public boolean equals(final Object object) { if (!(object instanceof PluginData)) { return false; } From 9e2cde52a14968c0c88c5251413638136778de52 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Tue, 23 Aug 2022 13:23:45 +0300 Subject: [PATCH 5/5] 406: quick fix --- .../linemarker/php/data/PluginMethodData.java | 2 +- .../idea/magento2plugin/stubs/indexes/PluginIndex.java | 2 +- .../idea/magento2plugin/stubs/indexes/data/PluginData.java | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java b/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java index c2479f42f..33fea91ec 100644 --- a/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java +++ b/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java @@ -1,4 +1,4 @@ -/** +/* * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java index 425708749..8e630b889 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java @@ -1,4 +1,4 @@ -/** +/* * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java index 547db8715..cc10cd897 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java @@ -1,4 +1,4 @@ -/** +/* * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ @@ -35,10 +35,6 @@ public int getSortOrder() { return sortOrder; } - public @NotNull Collection getPhpClass() { - return phpClassCollection; - } - public Collection getPhpClassCollection() { return phpClassCollection; }