diff --git a/plugins/env-files-support/.gitignore b/plugins/env-files-support/.gitignore index 5167f1512788..fa1eb150d679 100644 --- a/plugins/env-files-support/.gitignore +++ b/plugins/env-files-support/.gitignore @@ -8,4 +8,5 @@ /.gradle/ /*.iml /*.ipr -/*.iws \ No newline at end of file +/*.iws +/.intellijPlatform diff --git a/plugins/env-files-support/build.gradle.kts b/plugins/env-files-support/build.gradle.kts index f29ed73ce7c3..036c45eb2e33 100644 --- a/plugins/env-files-support/build.gradle.kts +++ b/plugins/env-files-support/build.gradle.kts @@ -1,17 +1,21 @@ +import org.jetbrains.intellij.platform.gradle.TestFrameworkType + plugins { - id("org.jetbrains.intellij") version "1.14.0" + id("org.jetbrains.intellij.platform") version "2.0.1" } group = "ru.adelf" -version = "2023.2" +version = "2024.2.1" repositories { mavenCentral() + intellijPlatform { + defaultRepositories() + } } apply { plugin("idea") - plugin("org.jetbrains.intellij") plugin("java") } @@ -31,38 +35,54 @@ sourceSets { } } -intellij { - version.set("IU-223.8617.56") - plugins.set( - listOf( - "com.jetbrains.php:223.8617.59", - "yaml", - "org.jetbrains.plugins.go:223.8617.56", - "Docker", - "pythonid:223.8617.56", - "org.jetbrains.plugins.ruby:223.8617.56", - "Kotlin", - "java-i18n", - "properties", - "java" - ) - ) - pluginName.set(".env files support") +dependencies { + intellijPlatform { + create("IU", "2023.2.4", useInstaller = true) + + plugin("com.jetbrains.php", "232.8660.153") + plugin("org.jetbrains.plugins.go", "232.8660.48") + plugin("org.jetbrains.plugins.ruby", "232.8660.142") + plugin("PythonCore", "232.8660.142") + + bundledPlugin("org.jetbrains.kotlin") + bundledPlugin("com.intellij.java") + bundledPlugin("Docker") + bundledPlugin("org.jetbrains.plugins.yaml") + + pluginVerifier() + instrumentationTools() + testFramework(TestFrameworkType.Platform) + } + + testImplementation("junit:junit:4.13.2") + testImplementation("org.opentest4j:opentest4j:1.3.0") + + testRuntimeOnly("com.fasterxml.jackson.core:jackson-databind:2.14.1") +} + +intellijPlatform { + pluginConfiguration { + name = ".env files support" + + ideaVersion { + sinceBuild = "232" + untilBuild = "242.*" + } + } + + pluginVerification { + ides { + ide("IU", "2023.2.4") + } + + freeArgs = listOf("-mute", "TemplateWordInPluginName") + } } tasks { - patchPluginXml { - sinceBuild.set("223") - untilBuild.set("232.*") - } - buildSearchableOptions { enabled = false } - - runPluginVerifier { - ideVersions.set(listOf("IU-223.4884.69")) - } } tasks.withType { diff --git a/plugins/env-files-support/gradle/wrapper/gradle-wrapper.properties b/plugins/env-files-support/gradle/wrapper/gradle-wrapper.properties index 070cb702f09e..a59520664252 100644 --- a/plugins/env-files-support/gradle/wrapper/gradle-wrapper.properties +++ b/plugins/env-files-support/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvKey.java b/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvKey.java index f706441fc2ab..46e9c60bb05a 100644 --- a/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvKey.java +++ b/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvKey.java @@ -1,10 +1,8 @@ // This is a generated file. Not intended for manual editing. package ru.adelf.idea.dotenv.psi; -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.psi.PsiElement; +import com.intellij.model.psi.PsiExternalReferenceHost; -public interface DotEnvKey extends PsiElement { +public interface DotEnvKey extends PsiExternalReferenceHost { } diff --git a/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvVisitor.java b/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvVisitor.java index 08dad8aa74c0..fe7a7e22332a 100644 --- a/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvVisitor.java +++ b/plugins/env-files-support/src/main/gen/ru/adelf/idea/dotenv/psi/DotEnvVisitor.java @@ -1,14 +1,15 @@ // This is a generated file. Not intended for manual editing. package ru.adelf.idea.dotenv.psi; -import org.jetbrains.annotations.*; -import com.intellij.psi.PsiElementVisitor; +import com.intellij.model.psi.PsiExternalReferenceHost; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import org.jetbrains.annotations.NotNull; public class DotEnvVisitor extends PsiElementVisitor { public void visitKey(@NotNull DotEnvKey o) { - visitPsiElement(o); + visitPsiExternalReferenceHost(o); } public void visitProperty(@NotNull DotEnvProperty o) { @@ -19,6 +20,10 @@ public class DotEnvVisitor extends PsiElementVisitor { visitPsiElement(o); } + public void visitPsiExternalReferenceHost(@NotNull PsiExternalReferenceHost o) { + visitElement(o); + } + public void visitNamedElement(@NotNull DotEnvNamedElement o) { visitPsiElement(o); } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/DotEnvIcons.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/DotEnvIcons.java new file mode 100644 index 000000000000..b56e35c36fec --- /dev/null +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/DotEnvIcons.java @@ -0,0 +1,9 @@ +package ru.adelf.idea.dotenv; + +import com.intellij.openapi.util.IconLoader; + +import javax.swing.*; + +public class DotEnvIcons { + public static final Icon icon = IconLoader.getIcon("/icons/env.png", DotEnvIcons.class); +} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java index 6abdda611c93..f38414a6e02c 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java @@ -87,7 +87,7 @@ public class EnvironmentVariablesApi { return true; } - for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) { + for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) { FileAcceptResult fileAcceptResult = provider.acceptFile(virtualFile); if (!fileAcceptResult.isAccepted()) { continue; @@ -99,7 +99,7 @@ public class EnvironmentVariablesApi { return true; }, GlobalSearchScope.allScope(project)); - return (targets.size() > 0 ? targets : secondaryTargets).toArray(PsiElement.EMPTY_ARRAY); + return (!targets.isEmpty() ? targets : secondaryTargets).toArray(PsiElement.EMPTY_ARRAY); } /** @@ -114,7 +114,7 @@ public class EnvironmentVariablesApi { PsiSearchHelper searchHelper = PsiSearchHelper.getInstance(project); Processor psiFileProcessor = psiFile -> { - for (EnvironmentVariablesUsagesProvider provider : EnvironmentVariablesProviderUtil.USAGES_PROVIDERS) { + for (EnvironmentVariablesUsagesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesUsagesProviders()) { targets.addAll(EnvironmentVariablesUtil.getUsagesElementsByKey(key, provider.getUsages(psiFile))); } @@ -129,7 +129,7 @@ public class EnvironmentVariablesApi { } private static FileAcceptResult getFileAcceptResult(VirtualFile virtualFile) { - for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) { + for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) { FileAcceptResult fileAcceptResult = provider.acceptFile(virtualFile); if (!fileAcceptResult.isAccepted()) { continue; diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/common/BaseEnvCompletionProvider.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/common/BaseEnvCompletionProvider.java index 5e293736abfc..56dd736e03c1 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/common/BaseEnvCompletionProvider.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/common/BaseEnvCompletionProvider.java @@ -6,7 +6,6 @@ import com.intellij.codeInsight.completion.PrioritizedLookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler; import com.intellij.openapi.project.Project; -import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi; @@ -19,7 +18,7 @@ abstract public class BaseEnvCompletionProvider extends CompletionContributor im LookupElementBuilder lockup = LookupElementBuilder.create(entry.getKey()) .withCaseSensitivity(false); - if (StringUtils.isNotEmpty(entry.getValue())) { + if (!entry.getValue().isEmpty()) { lockup = lockup.withTailText(" = " + entry.getValue(), true); } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerComposeYamlPsiElementsVisitor.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerComposeYamlPsiElementsVisitor.java index 09e46d8b777c..54afdcf28cb7 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerComposeYamlPsiElementsVisitor.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerComposeYamlPsiElementsVisitor.java @@ -2,7 +2,6 @@ package ru.adelf.idea.dotenv.docker; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiRecursiveElementVisitor; -import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.psi.*; import ru.adelf.idea.dotenv.models.EnvironmentKeyValue; @@ -36,7 +35,7 @@ class DockerComposeYamlPsiElementsVisitor extends PsiRecursiveElementVisitor { if (el instanceof YAMLScalar) { EnvironmentKeyValue keyValue = EnvironmentVariablesUtil.getKeyValueFromString(((YAMLScalar) el).getTextValue()); - if (StringUtils.isNotBlank(keyValue.getKey())) { + if (!keyValue.getKey().isBlank()) { collectedItems.add(new KeyValuePsiElement(keyValue.getKey(), keyValue.getValue(), el)); } } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerfilePsiElementsVisitor.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerfilePsiElementsVisitor.java index 3b569670856b..d9aa7a4a69e6 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerfilePsiElementsVisitor.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/docker/DockerfilePsiElementsVisitor.java @@ -3,7 +3,6 @@ package ru.adelf.idea.dotenv.docker; import com.intellij.docker.dockerFile.parser.psi.DockerFileEnvRegularDeclaration; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiRecursiveElementVisitor; -import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import ru.adelf.idea.dotenv.models.KeyValuePsiElement; @@ -23,11 +22,11 @@ class DockerfilePsiElementsVisitor extends PsiRecursiveElementVisitor { } private void visitProperty(DockerFileEnvRegularDeclaration envRegularDeclaration) { - if (StringUtils.isNotBlank(envRegularDeclaration.getDeclaredName().getText()) && envRegularDeclaration.getRegularValue() != null) { - collectedItems.add(new KeyValuePsiElement( - envRegularDeclaration.getDeclaredName().getText(), - envRegularDeclaration.getRegularValue().getText(), - envRegularDeclaration)); + var key = envRegularDeclaration.getDeclaredName().getText(); + var valueElement = envRegularDeclaration.getRegularValue(); + + if (key != null && !key.isBlank() && valueElement != null) { + collectedItems.add(new KeyValuePsiElement(key, valueElement.getText(), envRegularDeclaration)); } } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvKeyGotoHandler.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvKeyGotoHandler.java deleted file mode 100644 index 7e6a0156321b..000000000000 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvKeyGotoHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.adelf.idea.dotenv.extension; - -import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.editor.Editor; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi; -import ru.adelf.idea.dotenv.psi.DotEnvKey; - -public class DotEnvKeyGotoHandler implements GotoDeclarationHandler { - - @Nullable - @Override - public PsiElement[] getGotoDeclarationTargets(@Nullable PsiElement psiElement, int i, Editor editor) { - if(psiElement == null || psiElement.getParent() == null) { - return PsiElement.EMPTY_ARRAY; - } - - psiElement = psiElement.getParent(); - - if(!(psiElement instanceof DotEnvKey)) { - return PsiElement.EMPTY_ARRAY; - } - - return EnvironmentVariablesApi.getKeyUsages(psiElement.getProject(), psiElement.getText()); - } - - @Nullable - @Override - public String getActionText(@NotNull DataContext dataContext) { - return null; - } -} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvValuesHiding.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvValuesHiding.java index 82b159f6c838..0aa43f95e81e 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvValuesHiding.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/DotEnvValuesHiding.java @@ -14,9 +14,7 @@ import ru.adelf.idea.dotenv.psi.DotEnvValue; public class DotEnvValuesHiding extends FoldingBuilderEx implements DumbAware { @Override - public FoldingDescriptor @NotNull [] buildFoldRegions(@NotNull PsiElement root, - @NotNull Document document, - boolean quick) { + public FoldingDescriptor [] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { if (!DotEnvSettings.getInstance().hideValuesInTheFile) return emptyResult; return PsiTreeUtil.collectElementsOfType(root, DotEnvValue.class).stream().map( diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvKeyUsageReference.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvKeyUsageReference.java new file mode 100644 index 000000000000..846a9ddc7b1b --- /dev/null +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvKeyUsageReference.java @@ -0,0 +1,38 @@ +package ru.adelf.idea.dotenv.extension.symbols; + +import com.intellij.model.Symbol; +import com.intellij.model.psi.PsiSymbolReference; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi; +import ru.adelf.idea.dotenv.psi.DotEnvKey; + +import java.util.Arrays; +import java.util.Collection; + +@SuppressWarnings("UnstableApiUsage") +class DotEnvKeyUsageReference implements PsiSymbolReference { + private final DotEnvKey keyElement; + + DotEnvKeyUsageReference(DotEnvKey keyElement) { + this.keyElement = keyElement; + } + + @Override + public @NotNull PsiElement getElement() { + return keyElement; + } + + @Override + public @NotNull TextRange getRangeInElement() { + return new TextRange(0, keyElement.getTextLength()); + } + + @Override + public @NotNull Collection resolveReference() { + return Arrays.stream(EnvironmentVariablesApi.getKeyUsages(keyElement.getProject(), keyElement.getText())) + .map(DotEnvKeyUsageSymbol::new) + .toList(); + } +} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvKeyUsageSymbol.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvKeyUsageSymbol.java new file mode 100644 index 000000000000..1edb129d9bfe --- /dev/null +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvKeyUsageSymbol.java @@ -0,0 +1,104 @@ +package ru.adelf.idea.dotenv.extension.symbols; + +import com.intellij.model.Pointer; +import com.intellij.navigation.NavigatableSymbol; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Iconable; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.platform.backend.navigation.NavigationRequest; +import com.intellij.platform.backend.navigation.NavigationTarget; +import com.intellij.platform.backend.presentation.TargetPresentation; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import ru.adelf.idea.dotenv.DotEnvIcons; + +import java.util.Collection; +import java.util.List; + +@SuppressWarnings("UnstableApiUsage") +class DotEnvKeyUsageSymbol implements Pointer, NavigatableSymbol, NavigationTarget { + private final PsiElement psiElement; + + DotEnvKeyUsageSymbol(PsiElement psiElement) { + this.psiElement = psiElement; + } + + @Override + public @Nullable DotEnvKeyUsageSymbol dereference() { + return this; + } + + @Override + public @NotNull Collection getNavigationTargets(@NotNull Project project) { + return List.of(); + } + + @Override + public @NotNull Pointer createPointer() { + return this; + } + + @Override + public @NotNull TargetPresentation computePresentation() { + PsiFile psiFile = psiElement.getContainingFile(); + + if (psiFile == null) { + return TargetPresentation.builder(psiElement.getText()) + .presentation(); + } + + int lineNumber = getLineNumber(psiElement, psiFile); + + String filePath = getFilePath(psiFile); + + if (filePath == null) { + filePath = psiFile.getName(); + } + + String locationString; + if (lineNumber == -1) { + locationString = filePath; + } else { + locationString = filePath + ":" + lineNumber; + } + + return TargetPresentation.builder(psiElement.getText()) + .locationText(locationString, psiFile.getIcon(Iconable.ICON_FLAG_VISIBILITY)) + .icon(DotEnvIcons.icon) + .presentation(); + } + + @Override + public @Nullable NavigationRequest navigationRequest() { + return NavigationRequest.sourceNavigationRequest(psiElement.getContainingFile(), psiElement.getTextRange()); + } + + private int getLineNumber(@NotNull PsiElement psiElement, @NotNull PsiFile psiFile) { + Document document = psiFile.getViewProvider().getDocument(); + + if (document == null) return -1; + + return document.getLineNumber(psiElement.getTextOffset()) + 1; + } + + private @Nullable String getFilePath(@NotNull PsiFile psiFile) { + String basePath = psiFile.getProject().getBasePath(); + + if (basePath == null) return null; + + VirtualFile virtualFile = psiFile.getVirtualFile(); + + if (virtualFile == null) return null; + + String filePath = virtualFile.getPath(); + + if (filePath.startsWith(basePath)) { + return filePath.substring(basePath.length()); + } else { + return null; + } + } +} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvSymbolReferenceProvider.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvSymbolReferenceProvider.java new file mode 100644 index 000000000000..c29552cffa20 --- /dev/null +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/extension/symbols/DotEnvSymbolReferenceProvider.java @@ -0,0 +1,30 @@ +package ru.adelf.idea.dotenv.extension.symbols; + +import com.intellij.model.Symbol; +import com.intellij.model.psi.PsiExternalReferenceHost; +import com.intellij.model.psi.PsiSymbolReference; +import com.intellij.model.psi.PsiSymbolReferenceHints; +import com.intellij.model.psi.PsiSymbolReferenceProvider; +import com.intellij.model.search.SearchRequest; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import ru.adelf.idea.dotenv.psi.DotEnvKey; + +import java.util.Collection; +import java.util.List; + +@SuppressWarnings("UnstableApiUsage") +public class DotEnvSymbolReferenceProvider implements PsiSymbolReferenceProvider { + @Override + public @NotNull Collection getReferences(@NotNull PsiExternalReferenceHost keyElement, + @NotNull PsiSymbolReferenceHints psiSymbolReferenceHints) { + if (!(keyElement instanceof DotEnvKey)) return List.of(); + + return List.of(new DotEnvKeyUsageReference((DotEnvKey) keyElement)); + } + + @Override + public @NotNull Collection getSearchRequests(@NotNull Project project, @NotNull Symbol symbol) { + return List.of(); + } +} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/grammars/DovEnvGrammar.bnf b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/grammars/DovEnvGrammar.bnf index 12da26e600b4..fa8cb208cfad 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/grammars/DovEnvGrammar.bnf +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/grammars/DovEnvGrammar.bnf @@ -19,9 +19,9 @@ dotEnvFile ::= item_* private item_ ::= (EXPORT? property|COMMENT|CRLF) -key ::= KEY_CHARS +key ::= KEY_CHARS {implements="com.intellij.model.psi.PsiExternalReferenceHost"} value ::= VALUE_CHARS+ | QUOTE VALUE_CHARS* QUOTE? property ::= (key SEPARATOR value? COMMENT?) | key COMMENT? {mixin="ru.adelf.idea.dotenv.psi.DotEnvNamedElementImpl" - implements="ru.adelf.idea.dotenv.psi.DotEnvNamedElement" methods=[getKeyText getValueText getName setName getNameIdentifier]} \ No newline at end of file + implements="ru.adelf.idea.dotenv.psi.DotEnvNamedElement" methods=[getKeyText getValueText getName setName getNameIdentifier]} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java index 700000148351..66fbdb897108 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java @@ -31,7 +31,7 @@ public class DotEnvKeyValuesIndex extends FileBasedIndexExtension { - for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) { + for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) { if (provider.acceptFile(file).isAccepted()) return true; } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/php/PhpEnvironmentCallsVisitor.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/php/PhpEnvironmentCallsVisitor.java index 368fce767976..3bb59637f40f 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/php/PhpEnvironmentCallsVisitor.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/php/PhpEnvironmentCallsVisitor.java @@ -1,3 +1,4 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package ru.adelf.idea.dotenv.php; import com.intellij.psi.PsiElement; @@ -39,7 +40,7 @@ class PhpEnvironmentCallsVisitor extends PsiRecursiveElementVisitor { String key = ((StringLiteralExpression)parameters[0]).getContents(); - collectedItems.add(new KeyUsagePsiElement(key, parameters[0])); + collectedItems.add(new KeyUsagePsiElement(key, expression)); } private void visitArrayAccess(ArrayAccessExpression expression) { diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/util/EnvironmentVariablesProviderUtil.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/util/EnvironmentVariablesProviderUtil.java index 16360f21c282..504ffc7a0fd0 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/util/EnvironmentVariablesProviderUtil.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/util/EnvironmentVariablesProviderUtil.java @@ -1,26 +1,21 @@ package ru.adelf.idea.dotenv.util; import com.intellij.openapi.extensions.ExtensionPointName; -import org.jetbrains.annotations.NotNull; import ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider; import ru.adelf.idea.dotenv.api.EnvironmentVariablesUsagesProvider; public class EnvironmentVariablesProviderUtil { - public static final EnvironmentVariablesProvider[] PROVIDERS = getEnvVariablesProviders(); + private static final ExtensionPointName providersEP + = new ExtensionPointName<>("ru.adelf.idea.dotenv.environmentVariablesProvider"); - public static final EnvironmentVariablesUsagesProvider[] USAGES_PROVIDERS = getEnvVariablesUsagesProviders(); + private static final ExtensionPointName usageProvidersEP + = new ExtensionPointName<>("ru.adelf.idea.dotenv.environmentVariablesUsagesProvider"); - private static EnvironmentVariablesProvider[] getEnvVariablesProviders() { - return getExtensions("ru.adelf.idea.dotenv.environmentVariablesProvider"); + public static EnvironmentVariablesProvider[] getEnvVariablesProviders() { + return providersEP.getExtensions(); } - private static EnvironmentVariablesUsagesProvider[] getEnvVariablesUsagesProviders() { - return getExtensions("ru.adelf.idea.dotenv.environmentVariablesUsagesProvider"); - } - - private static T[] getExtensions(@NotNull String name) { - ExtensionPointName pointName = new ExtensionPointName<>(name); - - return pointName.getExtensions(); + public static EnvironmentVariablesUsagesProvider[] getEnvVariablesUsagesProviders() { + return usageProvidersEP.getExtensions(); } } diff --git a/plugins/env-files-support/src/main/resources/META-INF/plugin.xml b/plugins/env-files-support/src/main/resources/META-INF/plugin.xml index 0a95050d071a..eac827197df1 100644 --- a/plugins/env-files-support/src/main/resources/META-INF/plugin.xml +++ b/plugins/env-files-support/src/main/resources/META-INF/plugin.xml @@ -26,9 +26,11 @@ + name="environmentVariablesProvider" + dynamic="true"/> + name="environmentVariablesUsagesProvider" + dynamic="true"/> com.intellij.modules.platform @@ -46,7 +48,6 @@ - @@ -57,6 +58,11 @@ + + - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/plugins/env-files-support/src/main/resources/icons/env.png b/plugins/env-files-support/src/main/resources/icons/env.png new file mode 100644 index 000000000000..b5754ee6c33d Binary files /dev/null and b/plugins/env-files-support/src/main/resources/icons/env.png differ diff --git a/plugins/env-files-support/src/main/resources/icons/env@2x.png b/plugins/env-files-support/src/main/resources/icons/env@2x.png new file mode 100644 index 000000000000..b186fa9dcaee Binary files /dev/null and b/plugins/env-files-support/src/main/resources/icons/env@2x.png differ