introduce basic code folding support for translation keys

Resolves #62
This commit is contained in:
Marcel Haßlinger 2021-12-08 12:53:05 +01:00
parent bf1338ffa0
commit e0c68bd63f
6 changed files with 108 additions and 4 deletions

View File

@ -4,6 +4,7 @@
## [Unreleased]
### Added
- Partial support for translation key folding against actual translation
- Support for json based arb files (flutter)
### Changed

View File

@ -12,12 +12,12 @@ pluginSinceBuild = 203
pluginUntilBuild = 213.*
# IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties
platformType = IC
platformType = IU
platformVersion = 2021.3
# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22
platformPlugins = org.jetbrains.kotlin
platformPlugins = org.jetbrains.kotlin, JavaScriptLanguage
# Java language level used to compile sources and to generate the files for - Java 11 is required since 2020.3
javaVersion = 11

View File

@ -0,0 +1,83 @@
package de.marhali.easyi18n.editor.generic;
import com.intellij.lang.ASTNode;
import com.intellij.lang.folding.FoldingBuilderEx;
import com.intellij.lang.folding.FoldingDescriptor;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLiteralValue;
import com.intellij.psi.util.PsiTreeUtil;
import de.marhali.easyi18n.DataStore;
import de.marhali.easyi18n.InstanceManager;
import de.marhali.easyi18n.model.Translation;
import de.marhali.easyi18n.service.SettingsService;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Translation key folding with actual value based on i18n instance.
* @author marhali
*/
public class GenericFoldingBuilder extends FoldingBuilderEx {
@Override
public FoldingDescriptor @NotNull [] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) {
Collection<PsiLiteralValue> literalValues = PsiTreeUtil.findChildrenOfType(root, PsiLiteralValue.class);
List<FoldingDescriptor> descriptors = new ArrayList<>();
if(!SettingsService.getInstance(root.getProject()).getState().isCodeAssistance()) {
return FoldingDescriptor.EMPTY;
}
DataStore store = InstanceManager.get(root.getProject()).store();
for(final PsiLiteralValue literalValue : literalValues) {
String value = literalValue.getValue() instanceof String ? (String) literalValue.getValue() : null;
// Undefined string literal or not a translation
if(value == null || store.getData().getTranslation(value) == null) {
continue;
}
descriptors.add(new FoldingDescriptor(literalValue.getNode(),
new TextRange(literalValue.getTextRange().getStartOffset() + 1,
literalValue.getTextRange().getEndOffset() - 1)));
}
return descriptors.toArray(new FoldingDescriptor[0]);
}
@Nullable
@Override
public String getPlaceholderText(@NotNull ASTNode node) {
PsiLiteralValue literalValue = node.getPsi(PsiLiteralValue.class);
String value = literalValue.getValue() instanceof String ? (String) literalValue.getValue() : null;
if(value == null) {
return null;
}
DataStore store = InstanceManager.get(literalValue.getProject()).store();
Translation translation = store.getData().getTranslation(value);
if(translation == null) {
return null;
}
String previewLocale = SettingsService.getInstance(literalValue.getProject()).getState().getPreviewLocale();
return translation.get(previewLocale);
}
@Override
public boolean isCollapsedByDefault(@NotNull ASTNode node) {
return true;
}
}

View File

@ -0,0 +1,5 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<lang.foldingBuilder language="JAVA" implementationClass="de.marhali.easyi18n.editor.generic.GenericFoldingBuilder" />
</extensions>
</idea-plugin>

View File

@ -0,0 +1,6 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<lang.foldingBuilder language="JavaScript" implementationClass="de.marhali.easyi18n.editor.generic.GenericFoldingBuilder" />
<lang.foldingBuilder language="TypeScript" implementationClass="de.marhali.easyi18n.editor.generic.GenericFoldingBuilder" />
</extensions>
</idea-plugin>

View File

@ -8,17 +8,26 @@
<!-- https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<depends>com.intellij.modules.lang</depends>
<depends optional="true" config-file="de.marhali.easyi18n-kotlin.xml">org.jetbrains.kotlin</depends>
<depends optional="true" config-file="de.marhali.easyi18n-javascript.xml">JavaScript</depends>
<depends optional="true" config-file="de.marhali.easyi18n-java.xml">com.intellij.java</depends>
<extensions defaultExtensionNs="com.intellij">
<toolWindow id="Easy I18n" anchor="bottom" factoryClass="de.marhali.easyi18n.service.TranslatorToolWindowFactory" />
<projectService serviceImplementation="de.marhali.easyi18n.service.SettingsService" />
<completion.contributor language="any"
implementationClass="de.marhali.easyi18n.editor.generic.GenericKeyCompletionContributor" />
<annotator language="" implementationClass="de.marhali.easyi18n.editor.generic.GenericKeyAnnotator" />
<annotator language=""
implementationClass="de.marhali.easyi18n.editor.generic.GenericKeyAnnotator" />
<psi.referenceContributor implementation="de.marhali.easyi18n.editor.generic.GenericKeyReferenceContributor" />
<psi.referenceContributor
implementation="de.marhali.easyi18n.editor.generic.GenericKeyReferenceContributor" />
<lang.foldingBuilder language="HtmlCompatible"
implementationClass="de.marhali.easyi18n.editor.generic.GenericFoldingBuilder" />
</extensions>
</idea-plugin>