mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Prevent recomputation of superclasses during first call to isNewStyleClass
This commit is contained in:
@@ -1059,8 +1059,7 @@ public class PyClassImpl extends PyBaseElementImpl<PyClassStub> implements PyCla
|
||||
}
|
||||
if (type instanceof PyClassType) {
|
||||
final PyClass pyClass = ((PyClassType)type).getPyClass();
|
||||
if (pyClass == objClass) return true;
|
||||
if (hasNewStyleMetaClass(pyClass)) {
|
||||
if (pyClass == objClass || hasNewStyleMetaClass(pyClass)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1310,7 +1309,7 @@ public class PyClassImpl extends PyBaseElementImpl<PyClassStub> implements PyCla
|
||||
@NotNull
|
||||
private List<PyClassLikeType> getOldStyleAncestorTypes(@NotNull TypeEvalContext context) {
|
||||
final List<PyClassLikeType> results = new ArrayList<PyClassLikeType>();
|
||||
final List<PyClassLikeType> toProcess = new ArrayList<PyClassLikeType>();
|
||||
final Deque<PyClassLikeType> toProcess = new LinkedList<PyClassLikeType>();
|
||||
final Set<PyClassLikeType> seen = new HashSet<PyClassLikeType>();
|
||||
final Set<PyClassLikeType> visited = new HashSet<PyClassLikeType>();
|
||||
final PyType thisType = context.getType(this);
|
||||
@@ -1318,15 +1317,17 @@ public class PyClassImpl extends PyBaseElementImpl<PyClassStub> implements PyCla
|
||||
toProcess.add((PyClassLikeType)thisType);
|
||||
}
|
||||
while (!toProcess.isEmpty()) {
|
||||
final PyClassLikeType currentType = toProcess.remove(0);
|
||||
visited.add(currentType);
|
||||
final PyClassLikeType currentType = toProcess.pollFirst();
|
||||
if (!visited.add(currentType)) {
|
||||
continue;
|
||||
}
|
||||
for (PyClassLikeType superType : currentType.getSuperClassTypes(context)) {
|
||||
if (superType == null || !seen.contains(superType)) {
|
||||
results.add(superType);
|
||||
seen.add(superType);
|
||||
}
|
||||
if (superType != null && !visited.contains(superType)) {
|
||||
toProcess.add(superType);
|
||||
toProcess.addLast(superType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
|
||||
class Class001(object):
|
||||
unique_attr = 1
|
||||
|
||||
@@ -82,9 +83,11 @@ class Class020(Class019, Class018, Class017):
|
||||
class Class021(Class020, Class019, Class018):
|
||||
unique_attr = 21
|
||||
|
||||
|
||||
class Class022(Class021, Class020, Class019):
|
||||
unique_attr = 22
|
||||
|
||||
|
||||
class Class023(Class022, Class021, Class020):
|
||||
unique_attr = 23
|
||||
|
||||
@@ -110,8 +113,289 @@ class Class028(Class027, Class026, Class025):
|
||||
|
||||
|
||||
class Class029(Class028, Class027, Class026):
|
||||
|
||||
unique_attr = 29
|
||||
|
||||
|
||||
class Class030(Class029, Class028, Class027):
|
||||
unique_attr = 30
|
||||
|
||||
|
||||
class Class031(Class030, Class029, Class028):
|
||||
unique_attr = 31
|
||||
|
||||
|
||||
class Class032(Class031, Class030, Class029):
|
||||
unique_attr = 32
|
||||
|
||||
|
||||
class Class033(Class032, Class031, Class030):
|
||||
unique_attr = 33
|
||||
|
||||
|
||||
class Class034(Class033, Class032, Class031):
|
||||
unique_attr = 34
|
||||
|
||||
|
||||
class Class035(Class034, Class033, Class032):
|
||||
unique_attr = 35
|
||||
|
||||
|
||||
class Class036(Class035, Class034, Class033):
|
||||
unique_attr = 36
|
||||
|
||||
|
||||
class Class037(Class036, Class035, Class034):
|
||||
unique_attr = 37
|
||||
|
||||
|
||||
class Class038(Class037, Class036, Class035):
|
||||
unique_attr = 38
|
||||
|
||||
|
||||
class Class039(Class038, Class037, Class036):
|
||||
unique_attr = 39
|
||||
|
||||
|
||||
class Class040(Class039, Class038, Class037):
|
||||
unique_attr = 40
|
||||
|
||||
|
||||
class Class041(Class040, Class039, Class038):
|
||||
unique_attr = 41
|
||||
|
||||
|
||||
class Class042(Class041, Class040, Class039):
|
||||
unique_attr = 42
|
||||
|
||||
|
||||
class Class043(Class042, Class041, Class040):
|
||||
unique_attr = 43
|
||||
|
||||
|
||||
class Class044(Class043, Class042, Class041):
|
||||
unique_attr = 44
|
||||
|
||||
|
||||
class Class045(Class044, Class043, Class042):
|
||||
unique_attr = 45
|
||||
|
||||
|
||||
class Class046(Class045, Class044, Class043):
|
||||
unique_attr = 46
|
||||
|
||||
|
||||
class Class047(Class046, Class045, Class044):
|
||||
unique_attr = 47
|
||||
|
||||
|
||||
class Class048(Class047, Class046, Class045):
|
||||
unique_attr = 48
|
||||
|
||||
|
||||
class Class049(Class048, Class047, Class046):
|
||||
unique_attr = 49
|
||||
|
||||
|
||||
class Class050(Class049, Class048, Class047):
|
||||
unique_attr = 50
|
||||
|
||||
|
||||
class Class051(Class050, Class049, Class048):
|
||||
unique_attr = 51
|
||||
|
||||
|
||||
class Class052(Class051, Class050, Class049):
|
||||
unique_attr = 52
|
||||
|
||||
|
||||
class Class053(Class052, Class051, Class050):
|
||||
unique_attr = 53
|
||||
|
||||
|
||||
class Class054(Class053, Class052, Class051):
|
||||
unique_attr = 54
|
||||
|
||||
|
||||
class Class055(Class054, Class053, Class052):
|
||||
unique_attr = 55
|
||||
|
||||
|
||||
class Class056(Class055, Class054, Class053):
|
||||
unique_attr = 56
|
||||
|
||||
|
||||
class Class057(Class056, Class055, Class054):
|
||||
unique_attr = 57
|
||||
|
||||
|
||||
class Class058(Class057, Class056, Class055):
|
||||
unique_attr = 58
|
||||
|
||||
|
||||
class Class059(Class058, Class057, Class056):
|
||||
unique_attr = 59
|
||||
|
||||
|
||||
class Class060(Class059, Class058, Class057):
|
||||
unique_attr = 60
|
||||
|
||||
|
||||
class Class061(Class060, Class059, Class058):
|
||||
unique_attr = 61
|
||||
|
||||
|
||||
class Class062(Class061, Class060, Class059):
|
||||
unique_attr = 62
|
||||
|
||||
|
||||
class Class063(Class062, Class061, Class060):
|
||||
unique_attr = 63
|
||||
|
||||
|
||||
class Class064(Class063, Class062, Class061):
|
||||
unique_attr = 64
|
||||
|
||||
|
||||
class Class065(Class064, Class063, Class062):
|
||||
unique_attr = 65
|
||||
|
||||
|
||||
class Class066(Class065, Class064, Class063):
|
||||
unique_attr = 66
|
||||
|
||||
|
||||
class Class067(Class066, Class065, Class064):
|
||||
unique_attr = 67
|
||||
|
||||
|
||||
class Class068(Class067, Class066, Class065):
|
||||
unique_attr = 68
|
||||
|
||||
|
||||
class Class069(Class068, Class067, Class066):
|
||||
unique_attr = 69
|
||||
|
||||
|
||||
class Class070(Class069, Class068, Class067):
|
||||
unique_attr = 70
|
||||
|
||||
|
||||
class Class071(Class070, Class069, Class068):
|
||||
unique_attr = 71
|
||||
|
||||
|
||||
class Class072(Class071, Class070, Class069):
|
||||
unique_attr = 72
|
||||
|
||||
|
||||
class Class073(Class072, Class071, Class070):
|
||||
unique_attr = 73
|
||||
|
||||
|
||||
class Class074(Class073, Class072, Class071):
|
||||
unique_attr = 74
|
||||
|
||||
|
||||
class Class075(Class074, Class073, Class072):
|
||||
unique_attr = 75
|
||||
|
||||
|
||||
class Class076(Class075, Class074, Class073):
|
||||
unique_attr = 76
|
||||
|
||||
|
||||
class Class077(Class076, Class075, Class074):
|
||||
unique_attr = 77
|
||||
|
||||
|
||||
class Class078(Class077, Class076, Class075):
|
||||
unique_attr = 78
|
||||
|
||||
|
||||
class Class079(Class078, Class077, Class076):
|
||||
unique_attr = 79
|
||||
|
||||
|
||||
class Class080(Class079, Class078, Class077):
|
||||
unique_attr = 80
|
||||
|
||||
|
||||
class Class081(Class080, Class079, Class078):
|
||||
unique_attr = 81
|
||||
|
||||
|
||||
class Class082(Class081, Class080, Class079):
|
||||
unique_attr = 82
|
||||
|
||||
|
||||
class Class083(Class082, Class081, Class080):
|
||||
unique_attr = 83
|
||||
|
||||
|
||||
class Class084(Class083, Class082, Class081):
|
||||
unique_attr = 84
|
||||
|
||||
|
||||
class Class085(Class084, Class083, Class082):
|
||||
unique_attr = 85
|
||||
|
||||
|
||||
class Class086(Class085, Class084, Class083):
|
||||
unique_attr = 86
|
||||
|
||||
|
||||
class Class087(Class086, Class085, Class084):
|
||||
unique_attr = 87
|
||||
|
||||
|
||||
class Class088(Class087, Class086, Class085):
|
||||
unique_attr = 88
|
||||
|
||||
|
||||
class Class089(Class088, Class087, Class086):
|
||||
unique_attr = 89
|
||||
|
||||
|
||||
class Class090(Class089, Class088, Class087):
|
||||
unique_attr = 90
|
||||
|
||||
|
||||
class Class091(Class090, Class089, Class088):
|
||||
unique_attr = 91
|
||||
|
||||
|
||||
class Class092(Class091, Class090, Class089):
|
||||
unique_attr = 92
|
||||
|
||||
|
||||
class Class093(Class092, Class091, Class090):
|
||||
unique_attr = 93
|
||||
|
||||
|
||||
class Class094(Class093, Class092, Class091):
|
||||
unique_attr = 94
|
||||
|
||||
|
||||
class Class095(Class094, Class093, Class092):
|
||||
unique_attr = 95
|
||||
|
||||
|
||||
class Class096(Class095, Class094, Class093):
|
||||
unique_attr = 96
|
||||
|
||||
|
||||
class Class097(Class096, Class095, Class094):
|
||||
unique_attr = 97
|
||||
|
||||
|
||||
class Class098(Class097, Class096, Class095):
|
||||
unique_attr = 98
|
||||
|
||||
|
||||
class Class099(Class098, Class097, Class096):
|
||||
unique_attr = 99
|
||||
|
||||
|
||||
class Class100(Class099, Class098, Class097):
|
||||
unique_attr = 100
|
||||
|
||||
|
||||
@@ -72,16 +72,19 @@ public class PyClassMROTest extends PyTestCase {
|
||||
assertMRO(getClass("H"), "E", "F", "B", "G", "C", "D", "A", "object");
|
||||
}
|
||||
|
||||
public void testTangledInheritance() throws Exception {
|
||||
public void testTangledInheritance() {
|
||||
final int numClasses = 100;
|
||||
|
||||
final List<String> expectedMRO = new ArrayList<String>();
|
||||
for (int i = 29; i >= 1; i--) {
|
||||
for (int i = numClasses - 1; i >= 1; i--) {
|
||||
expectedMRO.add(String.format("Class%03d", i));
|
||||
}
|
||||
expectedMRO.add("object");
|
||||
final PyClass pyClass = getClass(String.format("Class%03d", numClasses));
|
||||
final long startTime = System.currentTimeMillis();
|
||||
assertMRO(getClass("Class030"), ArrayUtil.toStringArray(expectedMRO));
|
||||
assertMRO(pyClass, ArrayUtil.toStringArray(expectedMRO));
|
||||
final long elapsed = System.currentTimeMillis() - startTime;
|
||||
assertTrue("Calculation of MRO takes too much time: " + elapsed + " ms", elapsed < 5000);
|
||||
assertTrue("Calculation of MRO takes too much time: " + elapsed + " ms", elapsed < 1000);
|
||||
}
|
||||
|
||||
public void assertMRO(@NotNull PyClass cls, @NotNull String... mro) {
|
||||
|
||||
Reference in New Issue
Block a user