Merge pull request #412 from Adeptius/feature/html-reference-completition

feat: html reference and completition support
This commit is contained in:
Marcel Haßlinger 2024-11-23 22:26:17 +01:00 committed by GitHub
commit 5fa8c19ecb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 97 additions and 0 deletions

View File

@ -0,0 +1,17 @@
package de.marhali.easyi18n.assistance.completion;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.impl.source.xml.XmlAttributeValueImpl;
/**
* Xml specific completion contributor.
* @author adeptius
*/
public class XmlCompletionContributor extends CompletionContributor {
public XmlCompletionContributor() {
extend(CompletionType.BASIC, PlatformPatterns.psiElement().inside(XmlAttributeValueImpl.class),
new KeyCompletionProvider());
}
}

View File

@ -0,0 +1,27 @@
package de.marhali.easyi18n.assistance.intention;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.xml.XmlAttributeValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Xml specific translation key intention.
* @author adeptius
*/
public class XmlTranslationIntention extends AbstractTranslationIntention {
@Override
protected @Nullable String extractText(@NotNull PsiElement element) {
if(!(element.getParent() instanceof XmlAttributeValue)) {
return null;
}
return ((XmlAttributeValue) element.getParent()).getValue();
}
@Override
@NotNull TextRange convertRange(@NotNull TextRange input) {
return new TextRange(input.getStartOffset() + 1, input.getEndOffset() - 1);
}
}

View File

@ -0,0 +1,38 @@
package de.marhali.easyi18n.assistance.reference;
import com.intellij.openapi.project.Project;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.psi.PsiReferenceRegistrar;
import com.intellij.psi.impl.source.xml.XmlAttributeValueImpl;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
/**
* Xml specific key reference binding
* @author adeptius
*/
public class XmlKeyReferenceContributor extends AbstractKeyReferenceContributor {
@Override
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
registrar.registerReferenceProvider(
PlatformPatterns.psiElement(XmlAttributeValueImpl.class),
getProvider());
}
private PsiReferenceProvider getProvider() {
return new PsiReferenceProvider() {
@Override
public PsiReference @NotNull [] getReferencesByElement(
@NotNull PsiElement element, @NotNull ProcessingContext context) {
Project project = element.getProject();
XmlAttributeValueImpl literalExpression = (XmlAttributeValueImpl) element;
String value = literalExpression.getValue();
return getReferences(project, element, value);
}
};
}
}

View File

@ -1,5 +1,11 @@
<idea-plugin> <idea-plugin>
<extensions defaultExtensionNs="com.intellij"> <extensions defaultExtensionNs="com.intellij">
<psi.referenceContributor
language="HTML"
implementation="de.marhali.easyi18n.assistance.reference.XmlKeyReferenceContributor"
/>
<lang.foldingBuilder <lang.foldingBuilder
language="HTML" language="HTML"
implementationClass="de.marhali.easyi18n.assistance.folding.XmlFoldingBuilder" implementationClass="de.marhali.easyi18n.assistance.folding.XmlFoldingBuilder"
@ -9,5 +15,14 @@
language="HTML" language="HTML"
implementationClass="de.marhali.easyi18n.assistance.documentation.CommonDocumentationProvider" implementationClass="de.marhali.easyi18n.assistance.documentation.CommonDocumentationProvider"
/> />
<completion.contributor
language="HTML"
implementationClass="de.marhali.easyi18n.assistance.completion.XmlCompletionContributor"
/>
<intentionAction>
<className>de.marhali.easyi18n.assistance.intention.XmlTranslationIntention</className>
</intentionAction>
</extensions> </extensions>
</idea-plugin> </idea-plugin>