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
1 change: 1 addition & 0 deletions META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,7 @@
<TwigNamespaceExtension implementation="fr.adrienbrault.idea.symfony2plugin.templating.path.ContainerTwigNamespaceExtension"/>
<TwigNamespaceExtension implementation="fr.adrienbrault.idea.symfony2plugin.templating.path.GlobalAppTwigNamespaceExtension"/>
<TwigNamespaceExtension implementation="fr.adrienbrault.idea.symfony2plugin.templating.path.BundleTwigNamespaceExtension"/>
<TwigNamespaceExtension implementation="fr.adrienbrault.idea.symfony2plugin.templating.path.BundleOverwriteNamespaceExtensions"/>

<ServiceCollector implementation="fr.adrienbrault.idea.symfony2plugin.dic.DefaultServiceCollector"/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,14 +124,6 @@ public Collection<File> getContainerFiles() {
return validFiles;
}

private String getPath(Project project, String path) {
if (!FileUtil.isAbsolute(path)) { // Project relative path
path = project.getBasePath() + "/" + path;
}

return path;
}

private void checkProject() {
if(!this.isEnabled()
&& !Settings.getInstance(project).dismissEnableNotification
Expand Down
36 changes: 5 additions & 31 deletions src/fr/adrienbrault/idea/symfony2plugin/TwigHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import fr.adrienbrault.idea.symfony2plugin.templating.path.TwigPathIndex;
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigTypeResolveUtil;
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
import fr.adrienbrault.idea.symfony2plugin.util.FilesystemUtil;
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
import fr.adrienbrault.idea.symfony2plugin.util.SymfonyBundleUtil;
import fr.adrienbrault.idea.symfony2plugin.util.dict.SymfonyBundle;
Expand Down Expand Up @@ -151,35 +152,6 @@ private static Map<String, Set<VirtualFile>> getTemplateMapProxy(@NotNull Projec
return Collections.emptyMap();
}

// app/Resources/ParentBundle/Resources/views
Map<String, SymfonyBundle> parentBundles = new SymfonyBundleUtil(project).getParentBundles();
if(parentBundles.size() > 0) {
for (Map.Entry<String, SymfonyBundle> entry : parentBundles.entrySet()) {
VirtualFile views = entry.getValue().getRelative("Resources/views");
if(views != null) {
twigPaths.add(new TwigPath(views.getPath(), entry.getKey(), TwigPathIndex.NamespaceType.BUNDLE));
}
}
}

// app/Resources/FooBundle/views
VirtualFile relativeFile = VfsUtil.findRelativeFile(project.getBaseDir(), "app", "Resources");
if(relativeFile != null) {
for (VirtualFile virtualFile : relativeFile.getChildren()) {

if(!virtualFile.isDirectory() || !virtualFile.getName().endsWith("Bundle")) {
continue;
}

VirtualFile views = virtualFile.findChild("views");
if(views == null) {
continue;
}

twigPaths.add(new TwigPath(views.getPath(), virtualFile.getName(), TwigPathIndex.NamespaceType.BUNDLE));
}
}

Map<String, Set<VirtualFile>> templateNames = new HashMap<>();

for (TwigPath twigPath : twigPaths) {
Expand Down Expand Up @@ -2547,8 +2519,9 @@ public static Collection<Pair<String, String>> getTwigPathFromYamlConfigResolved
String second = pair.getSecond();

if(second.startsWith("%kernel.root_dir%")) {
VirtualFile appDir = VfsUtil.findRelativeFile(baseDir, "app");
if(appDir != null) {
// %kernel.root_dir%/../app
// %kernel.root_dir%/foo
for (VirtualFile appDir : FilesystemUtil.getAppDirectories(yamlFile.getProject())) {
String path = StringUtils.stripStart(second.substring("%kernel.root_dir%".length()), "/");

VirtualFile relativeFile = VfsUtil.findRelativeFile(appDir, path.split("/"));
Expand All @@ -2560,6 +2533,7 @@ public static Collection<Pair<String, String>> getTwigPathFromYamlConfigResolved
}
}
} else if(second.startsWith("%kernel.project_dir%")) {
// '%kernel.root_dir%/test'
String path = StringUtils.stripStart(second.substring("%kernel.project_dir%".length()), "/");

VirtualFile relativeFile = VfsUtil.findRelativeFile(yamlFile.getProject().getBaseDir(), path.split("/"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.jetbrains.php.lang.psi.elements.Method;
import com.jetbrains.php.lang.psi.elements.MethodReference;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import fr.adrienbrault.idea.symfony2plugin.util.FilesystemUtil;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -151,7 +152,7 @@ public TreeVisitor(@NotNull PhpClass phpClass, @NotNull PsiElement psiElement, @
public static Collection<VirtualFile> getConfigurations(@NotNull Project project, @NotNull String packageName) {
Collection<String[]> paths = Arrays.asList(
new String[] {"config", "packages", packageName +".yml"},
new String[] {"config", "packages", packageName + "config.yaml"}
new String[] {"config", "packages", packageName, "config.yaml"}
);

Collection<VirtualFile> virtualFiles = new HashSet<>();
Expand All @@ -163,12 +164,15 @@ public static Collection<VirtualFile> getConfigurations(@NotNull Project project
}
}

VirtualFile configDir = VfsUtil.findRelativeFile(project.getBaseDir(), "app", "config");
if(configDir != null) {
for (VirtualFile configFile : configDir.getChildren()) {
// app/config/config*yml
if(configFile.getFileType() == YAMLFileType.YML && configFile.getName().startsWith("config")) {
virtualFiles.add(configFile);
// note
for (VirtualFile virtualFile : FilesystemUtil.getAppDirectories(project)) {
VirtualFile configDir = VfsUtil.findRelativeFile(virtualFile, "config");
if(configDir != null) {
for (VirtualFile configFile : configDir.getChildren()) {
// app/config/config*yml
if(configFile.getFileType() == YAMLFileType.YML && configFile.getName().startsWith("config")) {
virtualFiles.add(configFile);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package fr.adrienbrault.idea.symfony2plugin.templating.path;

import com.intellij.openapi.vfs.VirtualFile;
import fr.adrienbrault.idea.symfony2plugin.extension.TwigNamespaceExtension;
import fr.adrienbrault.idea.symfony2plugin.extension.TwigNamespaceExtensionParameter;
import fr.adrienbrault.idea.symfony2plugin.util.SymfonyBundleUtil;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Collection;

/**
* "app/Resources/ParentBundle/Resources/views"
*
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class BundleOverwriteNamespaceExtensions implements TwigNamespaceExtension {
@NotNull
@Override
public Collection<TwigPath> getNamespaces(@NotNull TwigNamespaceExtensionParameter parameter) {
Collection<TwigPath> twigPaths = new ArrayList<>();

new SymfonyBundleUtil(parameter.getProject()).getParentBundles().forEach((key, virtualFile) -> {
VirtualFile views = virtualFile.getRelative("Resources/views");
if (views != null) {
twigPaths.add(new TwigPath(views.getPath(), key, TwigPathIndex.NamespaceType.BUNDLE));
}
});

return twigPaths;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import fr.adrienbrault.idea.symfony2plugin.Settings;
import fr.adrienbrault.idea.symfony2plugin.extension.TwigNamespaceExtension;
import fr.adrienbrault.idea.symfony2plugin.extension.TwigNamespaceExtensionParameter;
import fr.adrienbrault.idea.symfony2plugin.util.FilesystemUtil;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* app/Resources/views/foo.html.twig => :foo.html.twig
Expand All @@ -27,25 +27,24 @@ public class GlobalAppTwigNamespaceExtension implements TwigNamespaceExtension {
public Collection<TwigPath> getNamespaces(@NotNull TwigNamespaceExtensionParameter parameter) {
VirtualFile baseDir = parameter.getProject().getBaseDir();

Collection<TwigPath> paths = new ArrayList<>();

List<String[]> templatePaths = Arrays.asList(
new String[]{Settings.getInstance(parameter.getProject()).directoryToApp, "Resources", "views"},
new String[]{"templates"}
);

for (String[] strings1 : templatePaths) {
VirtualFile globalDirectory = VfsUtil.findRelativeFile(baseDir, strings1);
// "app" folder
Collection<VirtualFile> directories = FilesystemUtil.getAppDirectories(parameter.getProject()).stream()
.map(path -> VfsUtil.findRelativeFile(path, "Resources", "views"))
.filter(Objects::nonNull)
.collect(Collectors.toSet());

if(globalDirectory == null) {
continue;
}
// flex "templates" in root
VirtualFile templates = VfsUtil.findRelativeFile(baseDir, "templates");
if(templates != null) {
directories.add(templates);
}

String path = globalDirectory.getPath();
Collection<TwigPath> paths = new ArrayList<>();

directories.stream().map(VirtualFile::getPath).forEach(path -> {
paths.add(new TwigPath(path, TwigPathIndex.MAIN, TwigPathIndex.NamespaceType.BUNDLE));
paths.add(new TwigPath(path, TwigPathIndex.MAIN, TwigPathIndex.NamespaceType.ADD_PATH));
}
});

return paths;
}
Expand Down
46 changes: 46 additions & 0 deletions src/fr/adrienbrault/idea/symfony2plugin/util/FilesystemUtil.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package fr.adrienbrault.idea.symfony2plugin.util;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import fr.adrienbrault.idea.symfony2plugin.Settings;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.util.Collection;
import java.util.HashSet;

/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
Expand All @@ -26,4 +35,41 @@ public static PsiDirectory findParentBundleFolder(@NotNull PsiDirectory director
return null;
}

/**
* Try to find an "app" directory on configuration or on project directory in root
* We also support absolute path in configuration
*/
@NotNull
public static Collection<VirtualFile> getAppDirectories(@NotNull Project project) {
Collection<VirtualFile> virtualFiles = new HashSet<>();

// find "app" folder on user settings
String directoryToApp = Settings.getInstance(project).directoryToApp;

if(FileUtil.isAbsolute(directoryToApp)) {
// absolute dir given
VirtualFile fileByIoFile = VfsUtil.findFileByIoFile(new File(directoryToApp), true);
if(fileByIoFile != null) {
virtualFiles.add(fileByIoFile);
}
} else {
// relative path resolve
VirtualFile globalDirectory = VfsUtil.findRelativeFile(
project.getBaseDir(),
directoryToApp.replace("\\", "/").split("/")
);

if(globalDirectory != null) {
virtualFiles.add(globalDirectory);
}
}

// global "app" in root
VirtualFile templates = VfsUtil.findRelativeFile(project.getBaseDir(), "app");
if(templates != null) {
virtualFiles.add(templates);
}

return virtualFiles;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void visitElement(PsiElement element) {


@NotNull
private static PsiFile createDummyFile(Project p, String fileText) {
public static PsiFile createDummyFile(Project p, String fileText) {
return PsiFileFactory.getInstance(p).createFileFromText("DUMMY__." + YAMLFileType.YML.getDefaultExtension(), YAMLFileType.YML, fileText, System.currentTimeMillis(), false);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package fr.adrienbrault.idea.symfony2plugin.tests;

import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import fr.adrienbrault.idea.symfony2plugin.Settings;
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
import fr.adrienbrault.idea.symfony2plugin.templating.path.TwigNamespaceSetting;
import fr.adrienbrault.idea.symfony2plugin.templating.path.TwigPathIndex;
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlPsiElementFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.yaml.psi.YAMLFile;

import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -139,6 +142,35 @@ public void testGetTemplateTargetOnOffset() {
assertTrue(TwigHelper.getTemplateTargetOnOffset(getProject(), "foo.html.twig", 40).size() == 0);
}

/**
* @see fr.adrienbrault.idea.symfony2plugin.TwigHelper#getTwigPathFromYamlConfigResolved
*/
public void testGetTwigPathFromYamlConfigResolved() {
createFile("app/test/foo.yaml");

PsiFile dummyFile = YamlPsiElementFactory.createDummyFile(getProject(), "" +
"twig:\n" +
" paths:\n" +
" '%kernel.root_dir%/test': foo\n" +
" '%kernel.project_dir%/app/test': project\n" +
" '%kernel.root_dir%/../app': app\n"
);

Collection<Pair<String, String>> paths = TwigHelper.getTwigPathFromYamlConfigResolved((YAMLFile) dummyFile);

assertNotNull(
paths.stream().filter(pair -> "foo".equals(pair.getFirst()) && "app/test".equals(pair.getSecond())).findFirst()
);

assertNotNull(
paths.stream().filter(pair -> "project".equals(pair.getFirst()) && "app/test".equals(pair.getSecond())).findFirst()
);

assertNotNull(
paths.stream().filter(pair -> "app".equals(pair.getFirst()) && "app".equals(pair.getSecond())).findFirst()
);
}

private void assertIsDirectoryAtOffset(@NotNull String templateName, int offset, @NotNull String directory) {
assertTrue(TwigHelper.getTemplateTargetOnOffset(getProject(), templateName, offset).stream().filter(psiElement -> psiElement instanceof PsiDirectory && directory.equals(((PsiDirectory) psiElement).getName())).count() > 0);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package fr.adrienbrault.idea.symfony2plugin.tests.config.utils;

import fr.adrienbrault.idea.symfony2plugin.config.utils.ConfigUtil;
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyTempCodeInsightFixtureTestCase;

/**
* @author Daniel Espendiller <daniel@espendiller.net>
* @see fr.adrienbrault.idea.symfony2plugin.config.utils.ConfigUtil
*/
public class ConfigUtilTempTest extends SymfonyTempCodeInsightFixtureTestCase {
/**
* @see ConfigUtil#getConfigurations
*/
public void testGetConfigurations() {
createFile("config/packages/twig.yml");
createFile("config/packages/twig/config.yaml");
createFile("app/config/config_dev.yml");

assertEquals(3, ConfigUtil.getConfigurations(getProject(), "twig").size());
}
}
Loading