[javadoc] IDEA-285556 Support language injection into snippet

Add an enclosing class for snippets in order not to make users define a class in a snippet code to eliminate syntax errors when the code consists of a set of instructions

GitOrigin-RevId: c6f52f94d51fdc6393c8a9fdc0ddb615e8d37b17
This commit is contained in:
Nikita Eshkeev
2022-01-15 02:15:22 +03:00
committed by intellij-monorepo-bot
parent f628190d6d
commit 34ec0bb7c9
5 changed files with 29 additions and 5 deletions

View File

@@ -30,8 +30,13 @@ public class JavadocInjector implements MultiHostInjector {
final PsiSnippetDocTagImpl snippet = (PsiSnippetDocTagImpl)context;
registrar.startInjecting(getLanguage(snippet))
.addPlace(null, null, snippet, innerRangeStrippingQuotes(snippet))
final Language language = getLanguage(snippet);
final String prefix = language == JavaLanguage.INSTANCE ? "class ___JavadocSnippetPlaceholder { " : null;
final String suffix = language == JavaLanguage.INSTANCE ? " }" : null;
registrar.startInjecting(language)
.addPlace(prefix, suffix, snippet, innerRangeStrippingQuotes(snippet))
.doneInjecting();
}

View File

@@ -1,5 +1,5 @@
/** {<warning descr="'@snippet' tag is not available at this language level">@snippet</warning> :
* <error descr="'class' or 'interface' expected">Body</error>
* Body<EOLError descr="Identifier expected"></EOLError>
* }
*/
class A {

View File

@@ -0,0 +1,11 @@
/** {<warning descr="'@snippet' tag is not available at this language level">@snippet</warning> :
* {
* Optional<Integer> v = null;
* if (v.isPresent()) {
* System.out.println("v: " + v.get());
* }
* }
* }
*/
class A {
}

View File

@@ -0,0 +1,6 @@
/** {<warning descr="'@snippet' tag is not available at this language level">@snippet</warning> :
* void f() {}
* }
*/
class A {
}

View File

@@ -127,6 +127,8 @@ public class JavadocHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testThrowsInheritDoc() { doTest(); }
public void testSnippetInlineTag() { doTest(); }
public void testSnippet() { doTest(); }
public void testSnippetMethod() { doTest(); }
public void testSnippetInstructions() { doTest(); }
public void testIssueLinksInJavaDoc() {
IssueNavigationConfiguration navigationConfiguration = IssueNavigationConfiguration.getInstance(getProject());
@@ -143,7 +145,7 @@ public class JavadocHighlightingTest extends LightDaemonAnalyzerTestCase {
}
else {
List<WebReference> refs = PlatformTestUtil.collectWebReferences(getFile());
assertTrue(refs.stream().allMatch(PsiReferenceBase::isSoft));
assertTrue(ContainerUtil.and(refs, PsiReferenceBase::isSoft));
assertEquals(expected, ContainerUtil.map(refs, WebReference::getUrl));
}
}
@@ -165,7 +167,7 @@ public class JavadocHighlightingTest extends LightDaemonAnalyzerTestCase {
}
else {
List<WebReference> refs = PlatformTestUtil.collectWebReferences(getFile());
assertTrue(refs.stream().allMatch(PsiReferenceBase::isSoft));
assertTrue(ContainerUtil.and(refs, PsiReferenceBase::isSoft));
assertEquals(expected, refs.stream().map(PsiReferenceBase::getCanonicalText).collect(Collectors.toSet()));
}
}