diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml index ca4f8fa1a..d52d309c2 100644 --- a/resources/META-INF/plugin.xml +++ b/resources/META-INF/plugin.xml @@ -143,6 +143,7 @@ + diff --git a/src/com/magento/idea/magento2plugin/indexes/FixtureIndex.java b/src/com/magento/idea/magento2plugin/indexes/FixtureIndex.java new file mode 100644 index 000000000..28c29ee7f --- /dev/null +++ b/src/com/magento/idea/magento2plugin/indexes/FixtureIndex.java @@ -0,0 +1,52 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.indexes; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.FilenameIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.jetbrains.php.lang.psi.PhpFile; +import com.magento.idea.magento2plugin.magento.files.TestFixture; +import com.magento.idea.magento2plugin.magento.packages.File; +import java.util.ArrayList; +import java.util.List; +import org.jetbrains.annotations.NotNull; + +public final class FixtureIndex { + private final Project project; + + public FixtureIndex(final Project project) { + this.project = project; + } + + /** + * Getter for data fixtures. + */ + public List getDataFixtures(final String fixtureIdentifier) { + final List result = new ArrayList<>(); + + final String[] fixturePathParts = fixtureIdentifier.split(File.separator); + final String fixtureName = fixturePathParts[fixturePathParts.length - 1]; + final String exactFilePath = TestFixture.FIXTURES_LOCATION.concat(fixtureIdentifier); + + @NotNull final PsiFile[] psiFiles = FilenameIndex.getFilesByName( + project, + fixtureName, + GlobalSearchScope.allScope(project) + ); + + for (final PsiFile psiFile: psiFiles) { + @NotNull final String filePath = psiFile.getVirtualFile().getPath(); + if (!filePath.contains(TestFixture.FIXTURES_EXCLUDE_PATH) + && filePath.contains(exactFilePath)) { + result.add((PhpFile) psiFile); + } + } + + return result; + } +} diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLineMarkerProvider.java b/src/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLineMarkerProvider.java new file mode 100644 index 000000000..093446829 --- /dev/null +++ b/src/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLineMarkerProvider.java @@ -0,0 +1,73 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.intellij.codeInsight.daemon.LineMarkerInfo; +import com.intellij.codeInsight.daemon.LineMarkerProvider; +import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.php.PhpIcons; +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag; +import com.jetbrains.php.lang.psi.PhpFile; +import com.magento.idea.magento2plugin.indexes.FixtureIndex; +import com.magento.idea.magento2plugin.magento.files.TestFixture; +import com.magento.idea.magento2plugin.project.Settings; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class TestFixtureLineMarkerProvider implements LineMarkerProvider { + + @Nullable + @Override + public LineMarkerInfo getLineMarkerInfo(final @NotNull PsiElement psiElement) { + return null; + } + + @Override + public void collectSlowLineMarkers( + final @NotNull List elements, + final @NotNull Collection> result + ) { + if (elements.isEmpty() || !Settings.isEnabled(elements.get(0).getProject())) { + return; + } + final FixtureIndex fixtureIndex = new FixtureIndex(elements.get(0).getProject()); + final List results = new ArrayList(); + for (final PsiElement psiElement: elements) { + if (psiElement instanceof PhpDocTag) { + @NotNull final String tagName = ((PhpDocTag) psiElement).getName(); + if (!tagName.equals(TestFixture.PHP_DOC_TAG_NAME) + && !tagName.equals(TestFixture.PHP_DOC_TAG_NAME_API)) { + continue; + } + @NotNull final String tagValue = ((PhpDocTag) psiElement).getTagValue(); + if (tagValue.isEmpty()) { + continue; + } + + final List dataFixtures = fixtureIndex.getDataFixtures(tagValue); + + if (dataFixtures.isEmpty()) { + continue; + } + + results.addAll(dataFixtures); + + final String tooltipText = "Navigate to fixtures"; + final NavigationGutterIconBuilder builder = NavigationGutterIconBuilder + .create(PhpIcons.PHP_FILE) + .setTargets(results) + .setTooltipText(tooltipText); + + result.add(builder.createLineMarkerInfo(PsiTreeUtil.getDeepestFirst(psiElement))); + } + } + } +} diff --git a/src/com/magento/idea/magento2plugin/magento/files/TestFixture.java b/src/com/magento/idea/magento2plugin/magento/files/TestFixture.java new file mode 100644 index 000000000..5b0b24d60 --- /dev/null +++ b/src/com/magento/idea/magento2plugin/magento/files/TestFixture.java @@ -0,0 +1,16 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.magento.files; + +@SuppressWarnings({ + "PMD.ClassNamingConventions" +}) +public class TestFixture { + public static final String PHP_DOC_TAG_NAME = "@magentoDataFixture"; + public static final String PHP_DOC_TAG_NAME_API = "@magentoApiDataFixture"; + public static final String FIXTURES_LOCATION = "dev/tests/integration/testsuite/"; + public static final String FIXTURES_EXCLUDE_PATH = "vendor"; +} diff --git a/testData/linemarker/php/FixtureLinemarkerRegistrar/magentoApiDataFixtureHaveLinemarker/Test.php b/testData/linemarker/php/FixtureLinemarkerRegistrar/magentoApiDataFixtureHaveLinemarker/Test.php new file mode 100644 index 000000000..29506cf10 --- /dev/null +++ b/testData/linemarker/php/FixtureLinemarkerRegistrar/magentoApiDataFixtureHaveLinemarker/Test.php @@ -0,0 +1,18 @@ +