From 59f12948bbdd8d7c5dc27b32fd4d0c831d85b623 Mon Sep 17 00:00:00 2001 From: Daniel Espendiller Date: Wed, 24 Jul 2019 17:58:33 +0200 Subject: [PATCH] support more dotenv files --- .../config/xml/XmlCompletionContributor.java | 4 +- .../yaml/YamlCompletionContributor.java | 3 +- .../dic/container/util/DotEnvUtil.java | 38 ++++++++++++++----- .../dic/container/util/DotEnvUtilTest.java | 6 +++ 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlCompletionContributor.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlCompletionContributor.java index e7856e766..b88166440 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlCompletionContributor.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlCompletionContributor.java @@ -99,8 +99,7 @@ protected void addCompletions(@NotNull CompletionParameters completionParameters private static class ArgumentParameterCompletionProvider extends CompletionProvider { @Override - protected void addCompletions(@NotNull CompletionParameters completionParameters, ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) { - + protected void addCompletions(@NotNull CompletionParameters completionParameters, @NotNull ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) { PsiElement psiElement = completionParameters.getOriginalPosition(); if(psiElement == null || !Symfony2ProjectComponent.isEnabled(psiElement)) { return; @@ -116,6 +115,7 @@ protected void addCompletions(@NotNull CompletionParameters completionParameters // %env('foobar')% for (String s : DotEnvUtil.getEnvironmentVariables(project)) { completionResultSet.addElement(new ParameterLookupPercentElement(new ContainerParameter("env(" + s +")", false))); + completionResultSet.addElement(new ParameterLookupPercentElement(new ContainerParameter("env(resolve:" + s +")", false))); } } } diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlCompletionContributor.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlCompletionContributor.java index a38a801e2..832b0ff0d 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlCompletionContributor.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlCompletionContributor.java @@ -132,7 +132,7 @@ public YamlCompletionContributor() { CompletionType.BASIC, YamlElementPatternHelper.getServiceParameterDefinition(), new CompletionProvider() { public void addCompletions(@NotNull CompletionParameters parameters, - ProcessingContext context, + @NotNull ProcessingContext context, @NotNull CompletionResultSet resultSet) { if(!Symfony2ProjectComponent.isEnabled(parameters.getPosition())) { @@ -151,6 +151,7 @@ public void addCompletions(@NotNull CompletionParameters parameters, for (String s : DotEnvUtil.getEnvironmentVariables(element.getProject())) { resultSet.addElement(new ParameterLookupElement(new ContainerParameter("env(" + s +")", false), ParameterPercentWrapInsertHandler.getInstance(), element.getText())); + resultSet.addElement(new ParameterLookupElement(new ContainerParameter("env(resolve:" + s +")", false), ParameterPercentWrapInsertHandler.getInstance(), element.getText())); } } } diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/container/util/DotEnvUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/container/util/DotEnvUtil.java index 87104dcee..9ecf443ee 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/container/util/DotEnvUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/container/util/DotEnvUtil.java @@ -3,6 +3,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -53,8 +54,8 @@ public static Collection getEnvironmentVariableTargetsForParameter(@ // https://github.com/symfony/symfony/pull/23901 => RegisterEnvVarProcessorsPass // '%env(int:DATABASE_PORT)%' - // '%env(resolve:DB)%' - Matcher matcher = Pattern.compile("^[\\w]+:(.*)$", Pattern.MULTILINE).matcher(parameterName); + // '%env(resolve:int:foo:DB)%' + Matcher matcher = Pattern.compile("^[\\w-_^:]+:(.*)$", Pattern.MULTILINE).matcher(parameterName); if(matcher.find()){ parameterName = matcher.group(1); } @@ -96,23 +97,42 @@ public static Collection getEnvironmentVariableTargets(@NotNull Proj } private static void visitEnvironment(@NotNull Project project, @NotNull Consumer> consumer) { - for (VirtualFile virtualFile : FilenameIndex.getAllFilesByExt(project, "env", GlobalSearchScope.allScope(project))) { - Properties variables = new Properties(); - try { - variables.load(virtualFile.getInputStream()); - } catch (IOException e) { - continue; + Set files = new HashSet<>( + FilenameIndex.getAllFilesByExt(project, "env", GlobalSearchScope.allScope(project)) + ); + + // try to find some env's ;) + for (String file : new String[]{".env", ".env.dist", ".env.test", ".env.local"}) { + files.addAll(FilenameIndex.getVirtualFilesByName(project, file, GlobalSearchScope.allScope(project))); + } + + // search root directory for all ".env*" files + VirtualFile projectDir = VfsUtil.findRelativeFile(project.getBaseDir()); + if (projectDir != null) { + for (VirtualFile child : projectDir.getChildren()) { + if (child.getName().startsWith(".env")) { + files.add(child); + } } + } + for (VirtualFile virtualFile : files) { PsiFile file = PsiManager.getInstance(project).findFile(virtualFile); if(file == null) { continue; } + Properties variables = new Properties(); + try { + variables.load(virtualFile.getInputStream()); + } catch (IOException e) { + continue; + } + for (Map.Entry variable : variables.entrySet()) { Object key = variable.getKey(); if(key instanceof String) { - consumer.accept(Pair.create(key.toString(), file)); + consumer.accept(Pair.create((String) key, file)); } } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/container/util/DotEnvUtilTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/container/util/DotEnvUtilTest.java index a86d9594e..8682351ef 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/container/util/DotEnvUtilTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/container/util/DotEnvUtilTest.java @@ -44,5 +44,11 @@ public void testGetEnvironmentVariableTargetsForParameter() { .filter(psiElement -> psiElement instanceof PsiFile && "env.env".equals(((PsiFile) psiElement).getName())) .count() ); + + assertEquals(1, DotEnvUtil.getEnvironmentVariableTargetsForParameter(getProject(), "%env(int:json:foo_foo:foo-foo:foobar)%") + .stream() + .filter(psiElement -> psiElement instanceof PsiFile && "env.env".equals(((PsiFile) psiElement).getName())) + .count() + ); } }