mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-02-05 16:36:56 +07:00
[java] better similarity sorting for "Rename reference" fix
GitOrigin-RevId: 57ad391d08da5f8d750f5fb1bf91b96f2cb5c9a7
This commit is contained in:
committed by
intellij-monorepo-bot
parent
6077252349
commit
3a2f86df34
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user