No need to shorten non-affected references in quickfixes

This commit is contained in:
Valentin Kipyatkov
2015-01-26 22:21:51 +03:00
parent 2fd51c30cf
commit 5d516a5f72
18 changed files with 56 additions and 101 deletions
@@ -92,34 +92,12 @@ public object ShortenReferences {
}
}
fun processAllReferencesInFile(descriptors: List<DeclarationDescriptor>, file: JetFile) {
val renderedDescriptors = descriptors.map { it.asString() }
val referenceToContext = resolveReferencesInFile(file).filter { e ->
val (ref, context) = e
val renderedTargets = ref.getTargets(context).map { it.asString() }
ref is JetSimpleNameExpression && renderedDescriptors.any { it in renderedTargets }
}
shortenReferencesInFile(
file,
referenceToContext.keySet().map { (it as JetSimpleNameExpression).getQualifiedElement() },
referenceToContext,
{ FilterResult.PROCESS }
)
}
private enum class FilterResult {
SKIP
GO_INSIDE
PROCESS
}
private fun resolveReferencesInFile(
file: JetFile,
fileElements: List<JetElement> = Collections.singletonList(file)
): Map<JetReferenceExpression, BindingContext> {
return JetFileReferencesResolver.resolve(file, fileElements, resolveShortNames = false)
}
private fun shortenReferencesInFile(
file: JetFile,
elements: List<JetElement>,
@@ -135,7 +113,7 @@ public object ShortenReferences {
private fun process(elements: Iterable<JetElement>, elementFilter: (PsiElement) -> FilterResult) {
for ((file, fileElements) in elements.groupBy { element -> element.getContainingJetFile() }) {
// first resolve all qualified references - optimization
val referenceToContext = resolveReferencesInFile(file, fileElements)
val referenceToContext = JetFileReferencesResolver.resolve(file, fileElements, resolveShortNames = false)
shortenReferencesInFile(file, fileElements, referenceToContext, elementFilter)
}
}
@@ -116,7 +116,6 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix {
protected void invoke(@NotNull Project project, Editor editor, JetFile file) {
BindingContext bindingContext = ResolvePackage.analyzeFully((JetFile) callElement.getContainingFile());
runChangeSignature(project, functionDescriptor, addParameterConfiguration(), bindingContext, callElement, getText());
QuickFixUtil.shortenReferencesOfTypes(typesToShorten, file);
}
private JetChangeSignatureConfiguration addParameterConfiguration() {
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2;
import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext;
@@ -83,10 +84,16 @@ public class CastExpressionFix extends JetIntentionAction<JetExpression> {
(JetParenthesizedExpression) element.replace(psiFactory.createExpression("(" + castExpression.getText() + ")"));
if (JetPsiUtil.areParenthesesUseless(castExpressionInParentheses)) {
castExpressionInParentheses.replace(castExpression);
castExpression = (JetBinaryExpressionWithTypeRHS) castExpressionInParentheses.replace(castExpression);
}
else {
castExpression = (JetBinaryExpressionWithTypeRHS) castExpressionInParentheses.getExpression();
assert castExpression != null;
}
QuickFixUtil.shortenReferencesOfType(type, file);
JetTypeReference typeRef = castExpression.getRight();
assert typeRef != null;
ShortenReferences.INSTANCE$.process(typeRef);
}
@NotNull
@@ -19,12 +19,12 @@ package org.jetbrains.kotlin.idea.quickfix;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.types.JetType;
@@ -67,24 +67,21 @@ public class ChangeAccessorTypeFix extends JetIntentionAction<JetPropertyAccesso
@Override
public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException {
JetPropertyAccessor newElement = (JetPropertyAccessor) element.copy();
JetTypeReference newTypeReference = JetPsiFactory(file).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
JetTypeReference typeReference;
if (element.isGetter()) {
JetTypeReference returnTypeReference = newElement.getReturnTypeReference();
assert returnTypeReference != null;
CodeEditUtil.replaceChild(newElement.getNode(), returnTypeReference.getNode(), newTypeReference.getNode());
typeReference = element.getReturnTypeReference();
}
else {
JetParameter parameter = newElement.getParameter();
JetParameter parameter = element.getParameter();
assert parameter != null;
JetTypeReference typeReference = parameter.getTypeReference();
assert typeReference != null;
CodeEditUtil.replaceChild(parameter.getNode(), typeReference.getNode(), newTypeReference.getNode());
typeReference = parameter.getTypeReference();
}
element.replace(newElement);
assert typeReference != null;
QuickFixUtil.shortenReferencesOfType(type, file);
newTypeReference = (JetTypeReference) typeReference.replace(newTypeReference);
ShortenReferences.INSTANCE$.process(newTypeReference);
}
public static JetSingleIntentionActionFactory createFactory() {
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext;
@@ -129,8 +130,9 @@ public class ChangeFunctionLiteralReturnTypeFix extends JetIntentionAction<JetFu
@Override
public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException {
if (functionLiteralReturnTypeRef != null) {
functionLiteralReturnTypeRef.replace(JetPsiFactory(file).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type)));
QuickFixUtil.shortenReferencesOfType(type, file);
JetTypeReference newTypeRef = JetPsiFactory(file).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
newTypeRef = (JetTypeReference) functionLiteralReturnTypeRef.replace(newTypeRef);
ShortenReferences.INSTANCE$.process(newTypeRef);
}
if (appropriateQuickFix != null && appropriateQuickFix.isAvailable(project, editor, file)) {
appropriateQuickFix.invoke(project, editor, file);
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
@@ -108,12 +109,14 @@ public class ChangeFunctionReturnTypeFix extends JetIntentionAction<JetFunction>
}
else {
if (!(KotlinBuiltIns.isUnit(type) && element.hasBlockBody())) {
element.setTypeReference(JetPsiFactory(project).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type)));
JetTypeReference newTypeRef = JetPsiFactory(project).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
newTypeRef = element.setTypeReference(newTypeRef);
assert newTypeRef != null;
ShortenReferences.INSTANCE$.process(newTypeRef);
}
else {
element.setTypeReference(null);
}
QuickFixUtil.shortenReferencesOfType(type, file);
}
}
@@ -23,12 +23,10 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.JetClass;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.psi.JetNamedDeclaration;
import org.jetbrains.kotlin.psi.JetParameter;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.types.JetType;
import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory;
@@ -55,7 +53,7 @@ public class ChangeParameterTypeFix extends JetIntentionAction<JetParameter> {
@NotNull
@Override
public String getText() {
String renderedType = renderedType = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type);
String renderedType = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type);
return isPrimaryConstructorParameter ?
JetBundle.message("change.primary.constructor.parameter.type", element.getName(), containingDeclarationName, renderedType) :
JetBundle.message("change.function.parameter.type", element.getName(), containingDeclarationName, renderedType);
@@ -69,7 +67,9 @@ public class ChangeParameterTypeFix extends JetIntentionAction<JetParameter> {
@Override
public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException {
element.setTypeReference(JetPsiFactory(file).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type)));
QuickFixUtil.shortenReferencesOfType(type, file);
JetTypeReference newTypeRef = JetPsiFactory(file).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
newTypeRef = element.setTypeReference(newTypeRef);
assert newTypeRef != null;
ShortenReferences.INSTANCE$.process(newTypeRef);
}
}
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1;
import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.psi.JetParameter;
@@ -59,8 +60,8 @@ public class ChangeTypeFix extends JetIntentionAction<JetTypeReference> {
@Override
public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException {
element.replace(JetPsiFactory(file).createType(renderedType));
QuickFixUtil.shortenReferencesOfType(type, file);
JetTypeReference newTypeRef = (JetTypeReference) element.replace(JetPsiFactory(file).createType(renderedType));
ShortenReferences.INSTANCE$.process(newTypeRef);
}
@NotNull
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.*;
@@ -41,6 +42,7 @@ import org.jetbrains.kotlin.types.ErrorUtils;
import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -85,23 +87,25 @@ public class ChangeVariableTypeFix extends JetIntentionAction<JetVariableDeclara
assert nameIdentifier != null : "ChangeVariableTypeFix applied to variable without name";
JetTypeReference replacingTypeReference = psiFactory.createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
element.setTypeReference(replacingTypeReference);
ArrayList<JetTypeReference> toShorten = new ArrayList<JetTypeReference>();
toShorten.add(element.setTypeReference(replacingTypeReference));
if (element instanceof JetProperty) {
JetPropertyAccessor getter = ((JetProperty) element).getGetter();
JetTypeReference getterReturnTypeRef = getter == null ? null : getter.getReturnTypeReference();
if (getterReturnTypeRef != null) {
getterReturnTypeRef.replace(replacingTypeReference);
toShorten.add((JetTypeReference) getterReturnTypeRef.replace(replacingTypeReference));
}
JetPropertyAccessor setter = ((JetProperty) element).getSetter();
JetParameter setterParameter = setter == null ? null : setter.getParameter();
JetTypeReference setterParameterTypeRef = setterParameter == null ? null : setterParameter.getTypeReference();
if (setterParameterTypeRef != null) {
setterParameterTypeRef.replace(replacingTypeReference);
toShorten.add((JetTypeReference) setterParameterTypeRef.replace(replacingTypeReference));
}
}
QuickFixUtil.shortenReferencesOfType(type, file);
ShortenReferences.INSTANCE$.process(toShorten);
}
@NotNull
@@ -22,8 +22,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil;
import kotlin.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly;
@@ -32,10 +30,8 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.codeInsight.ShortenReferences;
import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.idea.util.UtilPackage;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
@@ -48,9 +44,6 @@ import org.jetbrains.kotlin.types.DeferredType;
import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class QuickFixUtil {
@@ -215,33 +208,4 @@ public class QuickFixUtil {
: IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES;
return renderer.renderType(type);
}
public static void shortenReferencesOfType(@NotNull JetType type, @NotNull JetFile file) {
shortenReferencesOfTypes(Collections.singletonList(type), file);
}
public static void shortenReferencesOfTypes(@NotNull List<JetType> types, @NotNull JetFile file) {
Set<JetType> typesToShorten = KotlinPackage.flatMapTo(
types,
new LinkedHashSet<JetType>(),
new Function1<JetType, Iterable<JetType>>() {
@Override
public Iterable<JetType> invoke(JetType type) {
return UtilPackage.getAllReferencedTypes(type);
}
}
);
ShortenReferences.INSTANCE$.processAllReferencesInFile(
KotlinPackage.map(
typesToShorten,
new Function1<JetType, DeclarationDescriptor>() {
@Override
public DeclarationDescriptor invoke(JetType type) {
return DescriptorUtils.getClassDescriptorForType(type);
}
}
),
file
);
}
}
@@ -4,7 +4,7 @@
import kotlin.modules.ModuleBuilder
fun foo(x: Int, moduleBuilder: ModuleBuilder) {
foo(, ModuleBuilder("", ""));
foo(1, ModuleBuilder("", ""));
foo(2, ModuleBuilder("", ""));
foo(, kotlin.modules.ModuleBuilder("", ""));
foo(1, kotlin.modules.ModuleBuilder("", ""));
foo(2, kotlin.modules.ModuleBuilder("", ""));
}
@@ -3,6 +3,6 @@
import kotlin.modules.Module
class A() {
val i: Module
val i: kotlin.modules.Module
get(): <caret>Module = kotlin.modules.ModuleBuilder("", "")
}
@@ -3,7 +3,7 @@
import kotlin.modules.ModuleBuilder
import kotlin.modules.Module
fun foo(f: ((ModuleBuilder) -> Module) -> String) {
fun foo(f: ((kotlin.modules.ModuleBuilder) -> kotlin.modules.Module) -> String) {
foo {
(f: (ModuleBuilder) -> Module) -> "42"
}
@@ -3,4 +3,4 @@
import kotlin.modules.Module
fun bar(): Module = kotlin.modules.ModuleBuilder("", "")
fun foo(): Module = bar(<caret>)
fun foo(): kotlin.modules.Module = bar()
@@ -2,7 +2,7 @@
import kotlin.modules.Module
fun foo(f: (Module) -> String) {
fun foo(f: (kotlin.modules.Module) -> String) {
foo {
(x: Module<caret>) -> ""
}
@@ -3,5 +3,5 @@
import kotlin.properties.Delegates
fun foo() {
var f: (Delegates) -> Unit = { (x: Delegates) -> }<caret>
var f: (Delegates) -> Unit = { (x: kotlin.properties.Delegates) -> }<caret>
}
@@ -3,7 +3,7 @@
import kotlin.modules.ModuleBuilder
fun foo(): ModuleBuilder {
val module: kotlin.modules.Module = ModuleBuilder("", "")
fun foo(): kotlin.modules.ModuleBuilder {
val module: kotlin.modules.Module = kotlin.modules.ModuleBuilder("", "")
return module as ModuleBuilder
}
@@ -4,5 +4,5 @@ package bar
import kotlin.modules.Module
fun foo(w: Int = 0, x: (Module) -> Int, y: Int = 0, z: (Int) -> Int = {42}) {
foo(1, {(a: Module) -> 42}<caret>, 1)
foo(1, {(a: kotlin.modules.Module) -> 42}<caret>, 1)
}