support sync editing in injection

This commit is contained in:
Dennis Ushakov
2015-01-23 15:13:22 +02:00
parent 942fd02842
commit 0e0c696c88
2 changed files with 42 additions and 2 deletions
@@ -43,6 +43,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.util.SmartList;
import com.intellij.xml.util.XmlUtil;
import org.jetbrains.annotations.NotNull;
@@ -279,11 +280,12 @@ public class XmlTagNameSynchronizer extends CommandAdapter implements Applicatio
}
private static RangeMarker findSupport(RangeMarker leader, PsiFile file, Document document) {
final PsiElement element = file.findElementAt(leader.getStartOffset());
final PsiElement element = InjectedLanguageUtil.findElementAtNoCommit(file, leader.getStartOffset());
PsiElement support = RenameTagBeginOrEndIntentionAction.findOtherSide(element, false);
support = support == null || element == support ? RenameTagBeginOrEndIntentionAction.findOtherSide(element, true) : support;
int diff = leader.getStartOffset() - element.getTextRange().getStartOffset();
final TextRange range = support != null ? support.getTextRange() : null;
return range != null ? document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), true) : null;
return range != null ? document.createRangeMarker(range.getStartOffset() + diff, range.getEndOffset() + diff, true) : null;
}
}
}
@@ -17,10 +17,22 @@ package com.intellij.codeInsight.completion;
import com.intellij.application.options.editor.WebEditorOptions;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.lang.injection.MultiHostInjector;
import com.intellij.lang.injection.MultiHostRegistrar;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.actionSystem.DocCommandGroupId;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
/**
* @author Dennis.Ushakov
@@ -87,10 +99,36 @@ public class XmlSyncTagTest extends LightPlatformCodeInsightFixtureTestCase {
"<html><body></body><bertran></bertran><bertran></bertran><html>");
}
public void testInjection() {
final MultiHostInjector injector = new MultiHostInjector() {
@Override
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
if (context instanceof XmlAttributeValue) {
registrar.startInjecting(XMLLanguage.INSTANCE)
.addPlace(null, null, (PsiLanguageInjectionHost)context, new TextRange(1, context.getTextLength() - 1))
.doneInjecting();
}
}
@NotNull
@Override
public List<? extends Class<? extends PsiElement>> elementsToInjectIn() {
return Collections.singletonList(XmlAttributeValue.class);
}
};
InjectedLanguageManager.getInstance(getProject()).registerMultiHostInjector(injector);
try {
doTest("<div injected='<div<caret>></div>'></div>", "v", "<div injected='<divv></divv>'></div>");
} finally {
InjectedLanguageManager.getInstance(getProject()).unregisterMultiHostInjector(injector);
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
WebEditorOptions.getInstance().setSyncTagEditing(true);
myFixture.setCaresAboutInjection(false);
}
@Override