Skip to content

Commit 6ec321f

Browse files
Sort classes topologically when checking for cycles
Change-Id: I4d2fd8a1d3f2d369e69ed93665ce43ca4747b02d Reviewed-on: https://dart-review.googlesource.com/c/86204 Reviewed-by: Dmitry Stefantsov <[email protected]>
1 parent 77889c1 commit 6ec321f

20 files changed

+218
-292
lines changed

pkg/front_end/lib/src/fasta/dill/dill_target.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ class DillTarget extends TargetImplementation {
5757
return new DillLibraryBuilder(uri, loader);
5858
}
5959

60-
@override
61-
void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {}
62-
6360
@override
6461
void breakCycle(ClassBuilder cls) {}
6562
}

pkg/front_end/lib/src/fasta/fasta_codes_generated.dart

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,27 +1754,24 @@ Message _withArgumentsCycleInTypeVariables(String name, String string) {
17541754
}
17551755

17561756
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
1757-
const Template<Message Function(String name, String string)>
1758-
templateCyclicClassHierarchy =
1759-
const Template<Message Function(String name, String string)>(
1760-
messageTemplate: r"""'#name' is a supertype of itself via '#string'.""",
1757+
const Template<Message Function(String name)> templateCyclicClassHierarchy =
1758+
const Template<Message Function(String name)>(
1759+
messageTemplate: r"""'#name' is a supertype of itself.""",
17611760
withArguments: _withArgumentsCyclicClassHierarchy);
17621761

17631762
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
1764-
const Code<Message Function(String name, String string)>
1765-
codeCyclicClassHierarchy =
1766-
const Code<Message Function(String name, String string)>(
1763+
const Code<Message Function(String name)> codeCyclicClassHierarchy =
1764+
const Code<Message Function(String name)>(
17671765
"CyclicClassHierarchy", templateCyclicClassHierarchy,
17681766
analyzerCodes: <String>["RECURSIVE_INTERFACE_INHERITANCE"]);
17691767

17701768
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
1771-
Message _withArgumentsCyclicClassHierarchy(String name, String string) {
1769+
Message _withArgumentsCyclicClassHierarchy(String name) {
17721770
if (name.isEmpty) throw 'No name provided';
17731771
name = demangleMixinApplicationName(name);
1774-
if (string.isEmpty) throw 'No string provided';
17751772
return new Message(codeCyclicClassHierarchy,
1776-
message: """'${name}' is a supertype of itself via '${string}'.""",
1777-
arguments: {'name': name, 'string': string});
1773+
message: """'${name}' is a supertype of itself.""",
1774+
arguments: {'name': name});
17781775
}
17791776

17801777
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2043,28 +2040,6 @@ Message _withArgumentsDirectCycleInTypeVariables(String name) {
20432040
arguments: {'name': name});
20442041
}
20452042

2046-
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2047-
const Template<Message Function(String name)>
2048-
templateDirectCyclicClassHierarchy =
2049-
const Template<Message Function(String name)>(
2050-
messageTemplate: r"""'#name' can't use itself as a supertype.""",
2051-
withArguments: _withArgumentsDirectCyclicClassHierarchy);
2052-
2053-
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2054-
const Code<Message Function(String name)> codeDirectCyclicClassHierarchy =
2055-
const Code<Message Function(String name)>(
2056-
"DirectCyclicClassHierarchy", templateDirectCyclicClassHierarchy,
2057-
analyzerCodes: <String>["RECURSIVE_INTERFACE_INHERITANCE"]);
2058-
2059-
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2060-
Message _withArgumentsDirectCyclicClassHierarchy(String name) {
2061-
if (name.isEmpty) throw 'No name provided';
2062-
name = demangleMixinApplicationName(name);
2063-
return new Message(codeDirectCyclicClassHierarchy,
2064-
message: """'${name}' can't use itself as a supertype.""",
2065-
arguments: {'name': name});
2066-
}
2067-
20682043
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
20692044
const Code<Null> codeDirectiveAfterDeclaration =
20702045
messageDirectiveAfterDeclaration;

pkg/front_end/lib/src/fasta/kernel/kernel_target.dart

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -197,37 +197,6 @@ class KernelTarget extends TargetImplementation {
197197
return new KernelLibraryBuilder(uri, fileUri, loader, origin);
198198
}
199199

200-
void forEachDirectSupertype(ClassBuilder cls, void f(NamedTypeBuilder type)) {
201-
TypeBuilder supertype = cls.supertype;
202-
if (supertype is NamedTypeBuilder) {
203-
f(supertype);
204-
} else if (supertype != null) {
205-
unhandled("${supertype.runtimeType}", "forEachDirectSupertype",
206-
cls.charOffset, cls.fileUri);
207-
}
208-
if (cls.interfaces != null) {
209-
for (NamedTypeBuilder t in cls.interfaces) {
210-
f(t);
211-
}
212-
}
213-
if (cls.library.loader == loader &&
214-
// TODO(ahe): Implement DillClassBuilder.mixedInType and remove the
215-
// above check.
216-
cls.mixedInType != null) {
217-
f(cls.mixedInType);
218-
}
219-
}
220-
221-
void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {
222-
if (cls == null) return;
223-
forEachDirectSupertype(cls, (NamedTypeBuilder type) {
224-
Declaration declaration = type.declaration;
225-
if (declaration is ClassBuilder) {
226-
set.add(declaration);
227-
}
228-
});
229-
}
230-
231200
/// Returns classes defined in libraries in [loader].
232201
List<SourceClassBuilder> collectMyClasses() {
233202
List<SourceClassBuilder> result = <SourceClassBuilder>[];
@@ -270,8 +239,8 @@ class KernelTarget extends TargetImplementation {
270239
bottomType.bind(loader.coreLibrary["Null"]);
271240
loader.resolveTypes();
272241
loader.computeDefaultTypes(dynamicType, bottomType, objectClassBuilder);
273-
List<SourceClassBuilder> myClasses = collectMyClasses();
274-
loader.checkSemantics(myClasses, objectClassBuilder);
242+
List<SourceClassBuilder> myClasses =
243+
loader.checkSemantics(objectClassBuilder);
275244
loader.finishTypeVariables(objectClassBuilder, dynamicType);
276245
loader.buildComponent();
277246
installDefaultSupertypes();
@@ -412,7 +381,7 @@ class KernelTarget extends TargetImplementation {
412381
void installSyntheticConstructors(List<SourceClassBuilder> builders) {
413382
Class objectClass = this.objectClass;
414383
for (SourceClassBuilder builder in builders) {
415-
if (builder.target != objectClass) {
384+
if (builder.target != objectClass && !builder.isPatch) {
416385
if (builder.isPatch || builder.isMixinDeclaration) continue;
417386
if (builder.isMixinApplication) {
418387
installForwardingConstructors(builder);

pkg/front_end/lib/src/fasta/source/source_class_builder.dart

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@ import '../fasta_codes.dart'
2424

2525
import '../kernel/kernel_builder.dart'
2626
show
27+
ClassBuilder,
2728
ConstructorReferenceBuilder,
2829
Declaration,
2930
KernelClassBuilder,
3031
KernelFieldBuilder,
3132
KernelFunctionBuilder,
3233
KernelLibraryBuilder,
34+
KernelNamedTypeBuilder,
3335
KernelTypeBuilder,
3436
KernelTypeVariableBuilder,
3537
LibraryBuilder,
@@ -69,7 +71,8 @@ ShadowClass initializeClass(
6971
return cls;
7072
}
7173

72-
class SourceClassBuilder extends KernelClassBuilder {
74+
class SourceClassBuilder extends KernelClassBuilder
75+
implements Comparable<SourceClassBuilder> {
7376
@override
7477
final Class actualCls;
7578

@@ -247,7 +250,9 @@ class SourceClassBuilder extends KernelClassBuilder {
247250
declaration.prepareTopLevelInference();
248251
}
249252
});
250-
cls.setupApiMembers(library.loader.interfaceResolver);
253+
if (!isPatch) {
254+
cls.setupApiMembers(library.loader.interfaceResolver);
255+
}
251256
}
252257

253258
@override
@@ -274,4 +279,33 @@ class SourceClassBuilder extends KernelClassBuilder {
274279
});
275280
return count;
276281
}
282+
283+
List<Declaration> computeDirectSupertypes(ClassBuilder objectClass) {
284+
final List<Declaration> result = <Declaration>[];
285+
final KernelNamedTypeBuilder supertype = this.supertype;
286+
if (supertype != null) {
287+
result.add(supertype.declaration);
288+
} else if (objectClass != this) {
289+
result.add(objectClass);
290+
}
291+
final List<KernelTypeBuilder> interfaces = this.interfaces;
292+
if (interfaces != null) {
293+
for (int i = 0; i < interfaces.length; i++) {
294+
KernelNamedTypeBuilder interface = interfaces[i];
295+
result.add(interface.declaration);
296+
}
297+
}
298+
final KernelNamedTypeBuilder mixedInType = this.mixedInType;
299+
if (mixedInType != null) {
300+
result.add(mixedInType.declaration);
301+
}
302+
return result;
303+
}
304+
305+
@override
306+
int compareTo(SourceClassBuilder other) {
307+
int result = "$fileUri".compareTo("${other.fileUri}");
308+
if (result != 0) return result;
309+
return charOffset.compareTo(other.charOffset);
310+
}
277311
}

0 commit comments

Comments
 (0)