Added possibility not to add FQN in javadocs if class was imported (IDEA-121121 ) [CR-IC-6907]

Now three options is available: use FQN always, never, or when not imported. Last is used by default.
Converted and moved boolean legacy setting from CommonCodeStyle settings into JavaCodeStyleSettings.
This commit is contained in:
Yaroslav Lepenkin
2014-12-01 21:14:31 +02:00
parent 825b2d3ca3
commit 9f82306ea5
15 changed files with 291 additions and 33 deletions

View File

@@ -31,7 +31,6 @@ import java.awt.event.ActionListener;
public class CodeStyleImportsPanel extends JPanel {
private JCheckBox myCbUseFQClassNames;
private JCheckBox myCbUseFQClassNamesInJavaDoc;
private JCheckBox myCbUseSingleClassImports;
private JCheckBox myCbInsertInnerClassImports;
private JTextField myClassCountField;
@@ -49,6 +48,7 @@ public class CodeStyleImportsPanel extends JPanel {
private JPanel myImportsLayoutPanel;
private JPanel myWholePanel;
private ImportLayoutPanel myImportLayoutPanel;
private FullyQualifiedNamesInJdOptionProvider myFqnInJavadocOption;
public CodeStyleImportsPanel(CodeStyleSettings settings) {
mySettings = settings;
@@ -129,9 +129,9 @@ public class CodeStyleImportsPanel extends JPanel {
myCbInsertInnerClassImports = new JCheckBox(ApplicationBundle.message("checkbox.insert.imports.for.inner.classes"));
group.add(myCbInsertInnerClassImports);
myCbUseFQClassNamesInJavaDoc = new JCheckBox(ApplicationBundle.message("checkbox.use.fully.qualified.class.names.in.javadoc"));
group.add(myCbUseFQClassNamesInJavaDoc);
myFqnInJavadocOption = new FullyQualifiedNamesInJdOptionProvider(mySettings);
group.add(myFqnInJavadocOption.getPanel());
myClassCountField = new JTextField(3);
myNamesCountField = new JTextField(3);
final JPanel panel = new JPanel(new GridBagLayout());
@@ -161,7 +161,6 @@ public class CodeStyleImportsPanel extends JPanel {
public void reset(CodeStyleSettings settings) {
myCbUseFQClassNames.setSelected(settings.USE_FQ_CLASS_NAMES);
myCbUseFQClassNamesInJavaDoc.setSelected(settings.USE_FQ_CLASS_NAMES_IN_JAVADOC);
myCbUseSingleClassImports.setSelected(settings.USE_SINGLE_CLASS_IMPORTS);
myCbInsertInnerClassImports.setSelected(settings.INSERT_INNER_CLASS_IMPORTS);
myClassCountField.setText(Integer.toString(settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND));
@@ -169,6 +168,7 @@ public class CodeStyleImportsPanel extends JPanel {
myImportLayoutPanel.getImportLayoutList().copyFrom(settings.IMPORT_LAYOUT_TABLE);
myPackageList.copyFrom(settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND);
myFqnInJavadocOption.reset(settings);
myImportLayoutPanel.getCbLayoutStaticImportsSeparately().setSelected(settings.LAYOUT_STATIC_IMPORTS_SEPARATELY);
@@ -203,7 +203,6 @@ public class CodeStyleImportsPanel extends JPanel {
settings.LAYOUT_STATIC_IMPORTS_SEPARATELY = myImportLayoutPanel.areStaticImportsEnabled();
settings.USE_FQ_CLASS_NAMES = myCbUseFQClassNames.isSelected();
settings.USE_FQ_CLASS_NAMES_IN_JAVADOC = myCbUseFQClassNamesInJavaDoc.isSelected();
settings.USE_SINGLE_CLASS_IMPORTS = myCbUseSingleClassImports.isSelected();
settings.INSERT_INNER_CLASS_IMPORTS = myCbInsertInnerClassImports.isSelected();
try {
@@ -227,6 +226,8 @@ public class CodeStyleImportsPanel extends JPanel {
settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND.copyFrom(myPackageList);
settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST = myJspImportCommaSeparated.isSelected();
myFqnInJavadocOption.apply(settings);
}
public void apply() {
@@ -241,7 +242,7 @@ public class CodeStyleImportsPanel extends JPanel {
public boolean isModified(CodeStyleSettings settings) {
boolean isModified = isModified(myImportLayoutPanel.getCbLayoutStaticImportsSeparately(), settings.LAYOUT_STATIC_IMPORTS_SEPARATELY);
isModified |= isModified(myCbUseFQClassNames, settings.USE_FQ_CLASS_NAMES);
isModified |= isModified(myCbUseFQClassNamesInJavaDoc, settings.USE_FQ_CLASS_NAMES_IN_JAVADOC);
isModified |= myFqnInJavadocOption.isModified(settings);
isModified |= isModified(myCbUseSingleClassImports, settings.USE_SINGLE_CLASS_IMPORTS);
isModified |= isModified(myCbInsertInnerClassImports, settings.INSERT_INNER_CLASS_IMPORTS);
isModified |= isModified(myClassCountField, settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND);

View File

@@ -24,14 +24,19 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.codeStyle.JavaCodeStyleSettings;
import com.intellij.psi.filters.FilterPositionUtil;
import com.intellij.psi.impl.source.codeStyle.ImportHelper;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.javadoc.PsiDocTag;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import static com.intellij.patterns.PsiJavaPatterns.psiElement;
import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.*;
/**
* @author peter
@@ -71,8 +76,7 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
AutoPopupController.getInstance(context.getProject()).autoPopupMemberLookup(context.getEditor(), null);
}
if (PsiTreeUtil.getParentOfType(position, PsiDocComment.class, false) != null &&
CodeStyleSettingsManager.getSettings(project).USE_FQ_CLASS_NAMES_IN_JAVADOC) {
if (PsiTreeUtil.getParentOfType(position, PsiDocComment.class, false) != null && shouldInsertFqnInJavadoc(item, file, project)) {
AllClassesGetter.INSERT_FQN.handleInsert(context, item);
return;
}
@@ -113,6 +117,28 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
}
}
private static boolean shouldInsertFqnInJavadoc(@NotNull JavaPsiClassReferenceElement item,
@NotNull PsiFile file,
@NotNull Project project)
{
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class);
switch (javaSettings.CLASS_NAMES_IN_JAVADOC) {
case FULLY_QUALIFY_NAMES_ALWAYS:
return true;
case SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT:
return false;
case FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED:
if (file instanceof PsiJavaFile) {
PsiJavaFile javaFile = ((PsiJavaFile)file);
return !ImportHelper.isAlreadyImported(javaFile, item.getQualifiedName());
}
default:
return false;
}
}
private static boolean shouldInsertParentheses(PsiElement position) {
final PsiJavaCodeReferenceElement ref = PsiTreeUtil.getParentOfType(position, PsiJavaCodeReferenceElement.class);
if (ref == null) {

View File

@@ -36,5 +36,27 @@ public class JavaCodeStyleSettings extends CustomCodeStyleSettings {
public boolean ALIGN_MULTILINE_ANNOTATION_PARAMETERS = false;
public int BLANK_LINES_AROUND_INITIALIZER = 1;
public static final int FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED = 1;
public static final int FULLY_QUALIFY_NAMES_ALWAYS = 2;
public static final int SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT = 3;
public boolean LEGACY_SETTING_USE_FQ_CLASS_NAMES_IN_JAVADOC_IMPORTED = false;
public int CLASS_NAMES_IN_JAVADOC = FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED;
public boolean useFqNamesInJavadocAlways() {
return CLASS_NAMES_IN_JAVADOC == FULLY_QUALIFY_NAMES_ALWAYS;
}
@Override
public void importLegacySettings() {
if (!LEGACY_SETTING_USE_FQ_CLASS_NAMES_IN_JAVADOC_IMPORTED) {
CodeStyleSettings settings = getContainer();
if (!settings.USE_FQ_CLASS_NAMES_IN_JAVADOC) {
CLASS_NAMES_IN_JAVADOC = SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT;
}
LEGACY_SETTING_USE_FQ_CLASS_NAMES_IN_JAVADOC_IMPORTED = true;
}
}
}

View File

@@ -20,6 +20,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
@@ -41,6 +42,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.ClassUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
@@ -563,6 +565,15 @@ public class ImportHelper{
}
return null;
}
public static boolean isAlreadyImported(@NotNull PsiJavaFile file, @NotNull String fullyQualifiedName) {
String className = ClassUtil.extractClassName(fullyQualifiedName);
Project project = file.getProject();
PsiResolveHelper resolveHelper = PsiResolveHelper.SERVICE.getInstance(project);
PsiClass psiClass = resolveHelper.resolveReferencedClass(className, file);
return psiClass != null && fullyQualifiedName.equals(psiClass.getQualifiedName());
}
public ASTNode getDefaultAnchor(@NotNull PsiImportList list, @NotNull PsiImportStatementBase statement){
PsiJavaCodeReferenceElement ref = statement.getImportReference();

View File

@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.codeStyle.JavaCodeStyleSettings;
import com.intellij.psi.codeStyle.ReferenceAdjuster;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl;
@@ -133,7 +134,8 @@ public class JavaReferenceAdjuster implements ReferenceAdjuster {
@Override
public ASTNode process(@NotNull ASTNode element, boolean addImports, boolean incompleteCode, Project project) {
final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
return process(element, addImports, incompleteCode, settings.USE_FQ_CLASS_NAMES_IN_JAVADOC, settings.USE_FQ_CLASS_NAMES);
JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class);
return process(element, addImports, incompleteCode, javaSettings.useFqNamesInJavadocAlways(), settings.USE_FQ_CLASS_NAMES);
}
private static boolean isAnnotated(ASTNode element) {
@@ -175,7 +177,8 @@ public class JavaReferenceAdjuster implements ReferenceAdjuster {
@Override
public void processRange(@NotNull ASTNode element, int startOffset, int endOffset, Project project) {
final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
processRange(element, startOffset, endOffset, settings.USE_FQ_CLASS_NAMES_IN_JAVADOC, settings.USE_FQ_CLASS_NAMES);
JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class);
processRange(element, startOffset, endOffset, javaSettings.useFqNamesInJavadocAlways(), settings.USE_FQ_CLASS_NAMES);
}
private static void addReferencesInRange(List<ASTNode> array, ASTNode parent, int startOffset, int endOffset) {