[java] better similarity sorting for "Rename reference" fix

GitOrigin-RevId: 57ad391d08da5f8d750f5fb1bf91b96f2cb5c9a7
This commit is contained in:
Bas Leijdekkers
2022-10-06 16:38:58 +02:00
committed by intellij-monorepo-bot
parent 6077252349
commit 3a2f86df34

View File

@@ -1,18 +1,4 @@
/*
* Copyright 2000-2016 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.lookup.LookupElement;
@@ -20,43 +6,24 @@ import com.intellij.codeInsight.template.Expression;
import com.intellij.codeInsight.template.ExpressionContext;
import com.intellij.codeInsight.template.Result;
import com.intellij.codeInsight.template.TextResult;
import com.intellij.util.text.EditDistance;
import java.util.Arrays;
import java.util.Comparator;
public class ReferenceNameExpression extends Expression {
private class HammingComparator implements Comparator<LookupElement> {
@Override
public int compare(LookupElement lookupItem1, LookupElement lookupItem2) {
String s1 = lookupItem1.getLookupString();
String s2 = lookupItem2.getLookupString();
int diff1 = 0;
for (int i = 0; i < Math.min(s1.length(), myOldReferenceName.length()); i++) {
if (s1.charAt(i) != myOldReferenceName.charAt(i)) diff1++;
}
int diff2 = 0;
for (int i = 0; i < Math.min(s2.length(), myOldReferenceName.length()); i++) {
if (s2.charAt(i) != myOldReferenceName.charAt(i)) diff2++;
}
return diff1 - diff2;
}
}
private final LookupElement[] myItems;
private final String myOldReferenceName;
public ReferenceNameExpression(LookupElement[] items, String oldReferenceName) {
myItems = items;
myOldReferenceName = oldReferenceName;
Arrays.sort(myItems, new HammingComparator());
Arrays.sort(myItems, new DifferenceComparator());
}
LookupElement[] myItems;
private final String myOldReferenceName;
@Override
public Result calculateResult(ExpressionContext context) {
if (myItems == null || myItems.length == 0) {
return new TextResult(myOldReferenceName);
}
return new TextResult(myItems[0].getLookupString());
return myItems == null || myItems.length == 0 ? new TextResult(myOldReferenceName) : new TextResult(myItems[0].getLookupString());
}
@Override
@@ -66,7 +33,31 @@ public class ReferenceNameExpression extends Expression {
@Override
public LookupElement[] calculateLookupItems(ExpressionContext context) {
if (myItems == null || myItems.length == 1) return null;
return myItems;
return myItems == null || myItems.length == 1 ? null : myItems;
}
private class DifferenceComparator implements Comparator<LookupElement> {
@Override
public int compare(LookupElement lookupItem1, LookupElement lookupItem2) {
String s1 = lookupItem1.getLookupString();
String s2 = lookupItem2.getLookupString();
int length = myOldReferenceName.length();
int length1 = s1.length();
int length2 = s2.length();
if (length < length1) s1 = s1.substring(0, length + 1);
if (length < length2) s2 = s2.substring(0, length + 1);
int diff1 = EditDistance.optimalAlignment(s1, myOldReferenceName, false);
int diff2 = EditDistance.optimalAlignment(s2, myOldReferenceName, false);
final int diff = diff1 - diff2;
if (diff == 0) {
// prefer shorter string
if (length1 < length2) return -1;
else if (length1 > length2) return +1;
final char c = myOldReferenceName.charAt(0);
if (s1.charAt(0) == c) return -1;
else if (s2.charAt(0) == c) return +1;
}
return diff;
}
}
}