下面列出了怎么用com.intellij.psi.LiteralTextEscaper的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void testEncoding() throws Exception {
PsiFile psiFile = myFixture.configureByText(BashFileType.BASH_FILE_TYPE, " 'abc\n'");
BashWordImpl word = PsiTreeUtil.findChildOfType(psiFile, BashWordImpl.class);
Assert.assertNotNull(word);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = word.createLiteralTextEscaper();
Assert.assertTrue(escaper instanceof BashIdentityStringLiteralEscaper<?>);
TextRange range = TextRange.allOf(word.getUnwrappedCharSequence());
Assert.assertEquals(0, escaper.getOffsetInHost(0, range));
Assert.assertEquals(1, escaper.getOffsetInHost(1, range));
Assert.assertEquals(2, escaper.getOffsetInHost(2, range));
Assert.assertEquals(3, escaper.getOffsetInHost(3, range));
Assert.assertEquals(4, escaper.getOffsetInHost(4, range));
}
@Test
public void testEscaped1() throws Exception {
BashWordImpl psiElement = (BashWordImpl) BashPsiElementFactory.createWord(myProject, "$'a\\'a'");
Assert.assertNotNull(psiElement);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> textEscaper = psiElement.createLiteralTextEscaper();
StringBuilder content = new StringBuilder();
TextRange range = psiElement.getTextContentRange();
textEscaper.decode(range, content);
Assert.assertEquals("a'a", content.toString());
//check the offsets
Assert.assertEquals(2, textEscaper.getOffsetInHost(0, range)); // a at 2
Assert.assertEquals(3, textEscaper.getOffsetInHost(1, range)); // ' at 3-4
Assert.assertEquals(5, textEscaper.getOffsetInHost(2, range)); // a at 5
}
@Test
public void testEscaped2() throws Exception {
// unescpaed content: a\\"'a
// java escapes \\ to \\\\
// bash escapes \\\\ to \\\\\\\\
BashWordImpl psiElement = (BashWordImpl) BashPsiElementFactory.createWord(myProject, "$'a\\\\\\\\\"\\'a\\'");
Assert.assertNotNull(psiElement);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> textEscaper = psiElement.createLiteralTextEscaper();
StringBuilder content = new StringBuilder();
TextRange range = psiElement.getTextContentRange();
textEscaper.decode(range, content);
//decoded text is a\\"'a
Assert.assertEquals("a\\\\\"'a", content.toString());
//check the offsets
Assert.assertEquals(2, textEscaper.getOffsetInHost(0, range)); // a at 2
Assert.assertEquals(3, textEscaper.getOffsetInHost(1, range)); // \ at 3-4
Assert.assertEquals(5, textEscaper.getOffsetInHost(2, range)); // \ at 5-6
Assert.assertEquals(7, textEscaper.getOffsetInHost(3, range)); // " at 7
Assert.assertEquals(8, textEscaper.getOffsetInHost(4, range)); // ' at 8-9
Assert.assertEquals(10, textEscaper.getOffsetInHost(5, range)); // a at 10
}
@Nonnull
@Override
@RequiredReadAction
public LiteralTextEscaper<? extends PsiLanguageInjectionHost> createLiteralTextEscaper()
{
IElementType elementType = getLiteralType();
if(elementType == CSharpTokens.STRING_LITERAL)
{
return new CSharpStringLiteralEscaper<>(this);
}
else if(elementType == CSharpTokens.VERBATIM_STRING_LITERAL)
{
return LiteralTextEscaper.createSimple(this);
}
throw new IllegalArgumentException("Unknown " + elementType);
}
@NotNull
@Override
public LiteralTextEscaper<? extends PsiLanguageInjectionHost> createLiteralTextEscaper() {
return new JSStringLiteralEscaper<PsiLanguageInjectionHost>(this) {
@Override
protected boolean isRegExpLiteral() {
return false;
}
};
}
@NotNull
@Override
public LiteralTextEscaper<? extends PsiLanguageInjectionHost> createLiteralTextEscaper() {
return new JSStringLiteralEscaper<PsiLanguageInjectionHost>(this) {
@Override
protected boolean isRegExpLiteral() {
return false;
}
};
}
@Test
public void testUnescpaed() throws Exception {
BashWordImpl psiElement = (BashWordImpl) BashPsiElementFactory.createWord(myProject, "$'a'");
Assert.assertNotNull(psiElement);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> textEscaper = psiElement.createLiteralTextEscaper();
StringBuilder content = new StringBuilder();
TextRange range = psiElement.getTextContentRange();
textEscaper.decode(range, content);
Assert.assertEquals("a", content.toString());
//check the offsets
Assert.assertEquals(2, textEscaper.getOffsetInHost(0, range));
}
@NotNull
private StringBuilder unescapeContent(String source) {
BashWordImpl psiElement = (BashWordImpl) BashPsiElementFactory.createWord(myProject, source);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> textEscaper = psiElement.createLiteralTextEscaper();
StringBuilder content = new StringBuilder();
TextRange range = psiElement.getTextContentRange();
textEscaper.decode(range, content);
return content;
}
@NotNull
@Override
public LiteralTextEscaper<? extends PsiLanguageInjectionHost> createLiteralTextEscaper() {
return new FusionDslTextEscaper(this);
}
@NotNull
@Override
public LiteralTextEscaper<? extends PsiLanguageInjectionHost> createLiteralTextEscaper() {
return new HeredocLiteralEscaper<PsiLanguageInjectionHost>(this);
}
@Nonnull
@Override
public LiteralTextEscaper<? extends PsiLanguageInjectionHost> createLiteralTextEscaper()
{
return LiteralTextEscaper.createSimple(this);
}
@Override
@Nonnull
public LiteralTextEscaper<PsiCommentImpl> createLiteralTextEscaper() {
return new CommentLiteralEscaper(this);
}