From fbc6243931818725555c6239a221475196301581 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Thu, 21 May 2015 11:56:44 +0300 Subject: [PATCH] IDEA-140025 support pre-Java8 javadoc logic if corresponding JDK is used --- .../javadoc/JavaDocInfoGenerator.java | 44 ++++++++++++++++--- .../javadoc/JavadocConfiguration.java | 14 ++++-- .../javadocIG/legacySpacesInLiteral.html | 2 + .../javadocIG/legacySpacesInLiteral.java | 2 + .../codeInsight/javadocIG/literal.html | 2 +- .../codeInsight/javadocIG/unicodeEscapes.html | 2 +- .../javadoc/JavaDocInfoGeneratorTest.java | 26 +++++++++++ 7 files changed, 79 insertions(+), 13 deletions(-) rename java/{java-psi-impl => java-impl}/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java (98%) create mode 100644 java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html create mode 100644 java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.java diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java similarity index 98% rename from java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java rename to java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index 4ee7c99513af..71676121a439 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -21,10 +21,14 @@ import com.intellij.codeInsight.ExternalAnnotationsManager; import com.intellij.codeInsight.InferredAnnotationsManager; import com.intellij.codeInsight.documentation.DocumentationManagerProtocol; import com.intellij.codeInsight.documentation.DocumentationManagerUtil; +import com.intellij.javadoc.JavadocConfiguration; import com.intellij.lang.ASTNode; import com.intellij.lang.LangBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.Pair; @@ -35,10 +39,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.JavaConstantExpressionEvaluator; import com.intellij.psi.impl.source.tree.JavaDocElementType; -import com.intellij.psi.javadoc.PsiDocComment; -import com.intellij.psi.javadoc.PsiDocTag; -import com.intellij.psi.javadoc.PsiDocTagValue; -import com.intellij.psi.javadoc.PsiInlineDocTag; +import com.intellij.psi.javadoc.*; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiFormatUtilBase; import com.intellij.psi.util.PsiTreeUtil; @@ -85,6 +86,7 @@ public class JavaDocInfoGenerator { private final Project myProject; private final PsiElement myElement; + private final JavaSdkVersion mySdkVersion; interface InheritDocProvider { Pair> getInheritDoc(); @@ -201,6 +203,9 @@ public class JavaDocInfoGenerator { public JavaDocInfoGenerator(Project project, PsiElement element) { myProject = project; myElement = element; + + Sdk jdk = JavadocConfiguration.getSdk(myProject); + mySdkVersion = jdk == null ? null : JavaSdk.getInstance().getVersion(jdk); } @Nullable @@ -1345,16 +1350,41 @@ public class JavaDocInfoGenerator { } @SuppressWarnings({"HardCodedStringLiteral"}) - private static void generateCodeValue(PsiInlineDocTag tag, StringBuilder buffer) { + private void generateCodeValue(PsiInlineDocTag tag, StringBuilder buffer) { buffer.append(""); generateLiteralValue(buffer, tag); buffer.append(""); } - private static void generateLiteralValue(StringBuilder buffer, PsiDocTag tag) { + private void generateLiteralValue(StringBuilder buffer, PsiDocTag tag) { + StringBuilder tmpBuffer = new StringBuilder(); for (PsiElement element : tag.getDataElements()) { - appendPlainText(element.getText(), buffer); + appendPlainText(element.getText(), tmpBuffer); } + if ((mySdkVersion == null || mySdkVersion.isAtLeast(JavaSdkVersion.JDK_1_8)) && isInPre(tag)) { + buffer.append(tmpBuffer); + } + else { + buffer.append(StringUtil.trimLeading(tmpBuffer)); + } + } + + private static boolean isInPre(PsiDocTag tag) { + PsiElement sibling = tag.getPrevSibling(); + while (sibling != null) { + if (sibling instanceof PsiDocToken) { + String text = sibling.getText().toLowerCase(); + int pos = text.lastIndexOf("pre>"); + if (pos > 0) { + switch (text.charAt(pos - 1)) { + case '<' : return true; + case '/' : return false; + } + } + } + sibling = sibling.getPrevSibling(); + } + return false; } private static void appendPlainText(@NonNls String text, final StringBuilder buffer) { diff --git a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java index fbd46ac8a138..85293105383e 100644 --- a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java +++ b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,6 @@ import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; @@ -56,7 +55,10 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; -import java.util.*; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; /** * @author Eugene Zhuravlev @@ -127,6 +129,10 @@ public class JavadocConfiguration implements ModuleRunProfile, JDOMExternalizabl DefaultJDOMExternalizer.writeExternal(this, element); } + public static Sdk getSdk(@NotNull Project project) { + return PathUtilEx.getAnyJdk(project); + } + private class MyJavaCommandLineState extends CommandLineState { private final AnalysisScope myGenerationOptions; private final Project myProject; @@ -142,7 +148,7 @@ public class JavadocConfiguration implements ModuleRunProfile, JDOMExternalizabl protected GeneralCommandLine createCommandLine() throws ExecutionException { final GeneralCommandLine cmdLine = new GeneralCommandLine(); - final Sdk jdk = PathUtilEx.getAnyJdk(myProject); + final Sdk jdk = getSdk(myProject); setupExeParams(jdk, cmdLine); setupProgramParameters(jdk, cmdLine); return cmdLine; diff --git a/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html b/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html new file mode 100644 index 000000000000..abfa7443c44f --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html @@ -0,0 +1,2 @@ +
class Test
+extends Object
abc
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.java b/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.java new file mode 100644 index 000000000000..1352ff695b3e --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.java @@ -0,0 +1,2 @@ +/**
a{@literal  b}c
*/ +class Test {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/literal.html b/java/java-tests/testData/codeInsight/javadocIG/literal.html index cc4d27b2ac7e..7daf32f7dfba 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/literal.html +++ b/java/java-tests/testData/codeInsight/javadocIG/literal.html @@ -1,2 +1,2 @@ Foo
int foo
- foo <> \ No newline at end of file + foo<> \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html index d254aebab020..6c5422a41405 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html +++ b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html @@ -1,3 +1,3 @@
class Test
 extends Object
- a@b c@d \ No newline at end of file + a@b c@d \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java index 09153c8449d3..7c4ea9215b34 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java @@ -18,11 +18,13 @@ package com.intellij.codeInsight.javadoc; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.CodeInsightTestCase; import com.intellij.lang.java.JavaDocumentationProvider; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.PsiTestUtil; import java.io.File; @@ -32,6 +34,8 @@ import java.io.IOException; * @author yole */ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase { + private boolean myUseJava8Sdk; + public void testSimpleField() throws Exception { doTestField(); } @@ -127,6 +131,7 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase { } public void testCode() throws Exception { + useJava8(); doTestField(); } @@ -260,6 +265,12 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase { } public void testMultipleSpacesInLiteral() throws Exception { + useJava8(); + verifyJavaDoc(getTestClass()); + } + + public void testLegacySpacesInLiteral() throws Exception { + useJava7(); verifyJavaDoc(getTestClass()); } @@ -267,7 +278,22 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase { protected String getTestDataPath() { return JavaTestUtil.getJavaTestDataPath(); } + + @Override + protected Sdk getTestProjectJdk() { + return myUseJava8Sdk ? IdeaTestUtil.getMockJdk18() : IdeaTestUtil.getMockJdk17(); + } + private void useJava8() { + myUseJava8Sdk = true; + setUpJdk(); + } + + private void useJava7() { + myUseJava8Sdk = false; + setUpJdk(); + } + private static String replaceEnvironmentDependentContent(String html) { return StringUtil.convertLineSeparators(html.trim()).replaceAll("", ""); }