[dart2js] Group modular and global kernel transformations.

This CL reorganizes our collection of kernel transformations into
"modular" and "global" ones. Modular (phase 0a) transformations are
those that can be run on each library before we have "linked" the full
program AST. Global (phase 0b) transformations are those that are run
over the full program AST.

Although we colloquially refer to multiple transformations of each kind,
there is actually a single modular (resp. global) `Transformer`, which
merges all the required transformations into a single AST pass.

Change-Id: I8f53cba6fc9a8aab106188ec3597ab194dd0cde0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330170
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Nate Biggs <natebiggs@google.com>
This commit is contained in:
Mayank Patke 2023-10-18 22:32:43 +00:00 committed by Commit Queue
parent 13791e4fee
commit 580384a28e
21 changed files with 255 additions and 369 deletions

View file

@ -21,9 +21,7 @@ import 'package:kernel/type_environment.dart';
import '../options.dart';
import 'invocation_mirror_constants.dart';
import 'transformations/clone_mixin_methods_with_super.dart' as transformMixins
show transformLibraries;
import 'transformations/lowering.dart' as lowering show transformLibraries;
import 'transformations/modular/lowering.dart' as modularTransforms;
const Iterable<String> _allowedDartSchemePaths = [
'async',
@ -72,14 +70,11 @@ class Dart2jsTarget extends Target {
final String name;
final CompilerOptions? options;
final bool canPerformGlobalTransforms;
final bool supportsUnevaluatedConstants;
Map<String, ir.Class>? _nativeClasses;
Dart2jsTarget(this.name, this.flags,
{this.options,
this.canPerformGlobalTransforms = true,
this.supportsUnevaluatedConstants = true});
{this.options, this.supportsUnevaluatedConstants = true});
@override
bool get enableNoSuchMethodForwarders => true;
@ -178,12 +173,9 @@ class Dart2jsTarget extends Target {
jsUtilOptimizer.visitLibrary(library);
}
}
lowering.transformLibraries(libraries, coreTypes, hierarchy, options);
logger?.call("Lowering transformations performed");
if (canPerformGlobalTransforms) {
transformMixins.transformLibraries(libraries);
logger?.call("Mixin transformations performed");
}
modularTransforms.transformLibraries(
libraries, coreTypes, hierarchy, options);
logger?.call("Modular transformations performed");
}
@override

View file

@ -41,7 +41,7 @@ import '../js_backend/runtime_types_resolution.dart';
import '../js_model/elements.dart';
import '../js_model/locals.dart';
import '../kernel/dart2js_target.dart';
import '../kernel/transformations/late_lowering.dart' as late_lowering
import '../kernel/transformations/modular/late_lowering.dart' as late_lowering
show
isBackingFieldForLateInstanceField,
isBackingFieldForLateFinalInstanceField;

View file

@ -1,95 +0,0 @@
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
import 'package:kernel/clone.dart';
import 'package:kernel/type_algebra.dart';
/// Transforms the libraries in [libraries] by cloning any mixed in methods that
/// use super.
void transformLibraries(List<Library> libraries) {
_CloneMixinMethodsWithSuper.transform(libraries);
}
class _CloneMixinMethodsWithSuper {
/// Transform the given new [libraries]. It is expected that all other
/// libraries have already been transformed.
static void transform(List<Library> libraries) {
// Clone any mixed in methods that uses super.
var processedClasses = Set<Class>();
for (var library in libraries) {
for (var cls in library.classes) {
if (processedClasses.add(cls)) {
transformClass(cls);
}
}
}
}
/// Transforms a given class by cloning any mixed in methods that use super.
static void transformClass(Class cls) {
var mixedInClass = cls.mixedInClass;
if (mixedInClass == null) return;
var mixedInType = cls.mixedInType!;
bool hasProcedureMaps = false;
Map<Name, Procedure> existingNonSetters = {};
Map<Name, Procedure> existingSetters = {};
void ensureExistingProcedureMaps() {
if (hasProcedureMaps) return;
for (Procedure procedure in cls.procedures) {
if (procedure.kind == ProcedureKind.Setter) {
existingSetters[procedure.name] = procedure;
} else {
existingNonSetters[procedure.name] = procedure;
}
}
hasProcedureMaps = true;
}
CloneVisitorWithMembers? cloneVisitor;
for (var field in mixedInClass.mixin.fields) {
if (field.containsSuperCalls) {
cloneVisitor ??= MixinApplicationCloner(cls,
typeSubstitution: getSubstitutionMap(mixedInType));
// TODO(jensj): Provide a "referenceFrom" if we need to support
// the incremental compiler.
ensureExistingProcedureMaps();
Procedure? existingGetter = existingNonSetters[field.name];
Procedure? existingSetter = existingSetters[field.name];
Field clone = cloneVisitor.cloneField(
field, null, existingGetter?.reference, existingSetter?.reference);
cls.addField(clone);
clone.transformerFlags = field.transformerFlags;
if (existingGetter != null) {
cls.procedures.remove(existingGetter);
}
if (existingSetter != null) {
cls.procedures.remove(existingSetter);
}
continue;
}
}
for (var procedure in mixedInClass.mixin.procedures) {
if (procedure.containsSuperCalls) {
cloneVisitor ??= MixinApplicationCloner(cls,
typeSubstitution: getSubstitutionMap(mixedInType));
// TODO(jensj): Provide a "referenceFrom" if we need to support
// the incremental compiler.
ensureExistingProcedureMaps();
Procedure? existingProcedure = procedure.kind == ProcedureKind.Setter
? existingSetters[procedure.name]
: existingNonSetters[procedure.name];
if (existingProcedure != null) {
cls.procedures.remove(existingProcedure);
}
Procedure clone = cloneVisitor.cloneProcedure(
procedure, existingProcedure?.reference);
cls.addProcedure(clone);
clone.transformerFlags = procedure.transformerFlags;
continue;
}
}
}
}

View file

@ -0,0 +1,73 @@
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
import 'package:kernel/clone.dart';
import 'package:kernel/type_algebra.dart';
/// Transforms a given class by cloning any mixed in methods that use super.
void transformClass(Class cls) {
var mixedInClass = cls.mixedInClass;
if (mixedInClass == null) return;
var mixedInType = cls.mixedInType!;
bool hasProcedureMaps = false;
Map<Name, Procedure> existingNonSetters = {};
Map<Name, Procedure> existingSetters = {};
void ensureExistingProcedureMaps() {
if (hasProcedureMaps) return;
for (Procedure procedure in cls.procedures) {
if (procedure.kind == ProcedureKind.Setter) {
existingSetters[procedure.name] = procedure;
} else {
existingNonSetters[procedure.name] = procedure;
}
}
hasProcedureMaps = true;
}
CloneVisitorWithMembers? cloneVisitor;
for (var field in mixedInClass.mixin.fields) {
if (field.containsSuperCalls) {
cloneVisitor ??= MixinApplicationCloner(cls,
typeSubstitution: getSubstitutionMap(mixedInType));
// TODO(jensj): Provide a "referenceFrom" if we need to support
// the incremental compiler.
ensureExistingProcedureMaps();
Procedure? existingGetter = existingNonSetters[field.name];
Procedure? existingSetter = existingSetters[field.name];
Field clone = cloneVisitor.cloneField(
field, null, existingGetter?.reference, existingSetter?.reference);
cls.addField(clone);
clone.transformerFlags = field.transformerFlags;
if (existingGetter != null) {
cls.procedures.remove(existingGetter);
}
if (existingSetter != null) {
cls.procedures.remove(existingSetter);
}
continue;
}
}
for (var procedure in mixedInClass.mixin.procedures) {
if (procedure.containsSuperCalls) {
cloneVisitor ??= MixinApplicationCloner(cls,
typeSubstitution: getSubstitutionMap(mixedInType));
// TODO(jensj): Provide a "referenceFrom" if we need to support
// the incremental compiler.
ensureExistingProcedureMaps();
Procedure? existingProcedure = procedure.kind == ProcedureKind.Setter
? existingSetters[procedure.name]
: existingNonSetters[procedure.name];
if (existingProcedure != null) {
cls.procedures.remove(existingProcedure);
}
Procedure clone =
cloneVisitor.cloneProcedure(procedure, existingProcedure?.reference);
cls.addProcedure(clone);
clone.transformerFlags = procedure.transformerFlags;
continue;
}
}
}

View file

@ -0,0 +1,21 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
import 'clone_mixin_methods_with_super.dart' as transformMixins;
void transformLibraries(List<Library> libraries) {
final transformer = _Lowering();
libraries.forEach(transformer.visitLibrary);
}
class _Lowering extends Transformer {
@override
Class visitClass(Class node) {
node.transformChildren(this);
transformMixins.transformClass(node);
return node;
}
}

View file

@ -6,7 +6,7 @@ import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/type_algebra.dart';
import '../../options.dart';
import '../../../options.dart';
class _Reader {
final Procedure _procedure;

View file

@ -6,7 +6,7 @@ import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/core_types.dart' show CoreTypes;
import '../../options.dart';
import '../../../options.dart';
import 'async_lowering.dart';
import 'await_lowering.dart';
import 'factory_specializer.dart';

View file

@ -20,6 +20,7 @@ enum FeatureStatus {
canary,
}
// TODO(fishythefish): Add an API to associate numbered phases with stages.
enum Dart2JSStage {
all(null,
fromDillFlag: Dart2JSStage.allFromDill,
@ -76,6 +77,21 @@ enum Dart2JSStage {
bool get shouldComputeModularAnalysis =>
this == Dart2JSStage.modularAnalysis ||
this == Dart2JSStage.modularAnalysisFromDill;
/// Global kernel transformations should be run in phase 0b, i.e. after
/// concatenating dills, but before serializing the output of phase 0.
/// We also need to include modular analysis, or else the modular test suite
/// breaks when it deserializes module data because it reads transformed AST
/// nodes when it's expecting untransformed ones.
// TODO(fishythefish, natebiggs): Address the modular analysis inconsistency.
// Ideally, modular analysis shouldn't require global transformations to be
// run again, so we need to either delete modular analysis or make the data
// less brittle in the presence of AST modifications.
// TODO(fishythefish): Add AST metadata to ensure transformations aren't rerun
// unnecessarily.
bool get shouldRunGlobalTransforms =>
this.index <= Dart2JSStage.modularAnalysisFromDill.index;
bool get canUseModularAnalysis =>
this == Dart2JSStage.modularAnalysis ||
this.index >= Dart2JSStage.modularAnalysisFromDill.index;

View file

@ -23,8 +23,7 @@ import '../common.dart';
import '../kernel/front_end_adapter.dart';
import '../kernel/dart2js_target.dart'
show Dart2jsTarget, implicitlyUsedLibraries;
import '../kernel/transformations/clone_mixin_methods_with_super.dart'
as transformMixins show transformLibraries;
import '../kernel/transformations/global/lowering.dart' as globalTransforms;
import '../options.dart';
class Input {
@ -121,23 +120,20 @@ class _LoadFromKernelResult {
this.component, this.entryLibrary, this.moduleLibraries);
}
void _doGlobalTransforms(Component component) {
transformMixins.transformLibraries(component.libraries);
}
// Perform any backend-specific transforms here that can be done on both
// serialized components and components from source.
// TODO(srujzs): Can we combine this with the above?
void _doTransformsOnKernelLoad(Component? component) {
if (component == null) return;
// referenceFromIndex is only necessary in the case where a module
// containing a stub definition is invalidated, and then reloaded, because
// we need to keep existing references to that stub valid. Here, we have the
// whole program, and therefore do not need it.
ir.CoreTypes coreTypes = ir.CoreTypes(component);
StaticInteropClassEraser(coreTypes, null,
additionalCoreLibraries: {'_js_types', 'js_interop'})
.visitComponent(component);
void _doTransformsOnKernelLoad(Component component, CompilerOptions options) {
if (options.stage.shouldRunGlobalTransforms) {
globalTransforms.transformLibraries(component.libraries);
// referenceFromIndex is only necessary in the case where a module
// containing a stub definition is invalidated, and then reloaded, because
// we need to keep existing references to that stub valid. Here, we have the
// whole program, and therefore do not need it.
ir.CoreTypes coreTypes = ir.CoreTypes(component);
StaticInteropClassEraser(coreTypes, null,
additionalCoreLibraries: {'_js_types', 'js_interop'})
.visitComponent(component);
}
}
Future<_LoadFromKernelResult> _loadFromKernel(CompilerOptions options,
@ -200,11 +196,7 @@ Future<_LoadFromKernelResult> _loadFromKernel(CompilerOptions options,
component.setMainMethodAndMode(mainMethod, true, component.mode);
}
// We apply global transforms when running phase 0.
if (options.stage.shouldOnlyComputeDill) {
_doGlobalTransforms(component);
}
_doTransformsOnKernelLoad(component);
_doTransformsOnKernelLoad(component, options);
registerSources(component, compilerInput);
return _LoadFromKernelResult(component, entryLibrary, moduleLibraries);
}
@ -232,7 +224,6 @@ Future<_LoadFromSourceResult> _loadFromSource(
TargetFlags(
soundNullSafety: options.nullSafetyMode == NullSafetyMode.sound),
options: options,
canPerformGlobalTransforms: true,
supportsUnevaluatedConstants: !cfeConstants);
fe.FileSystem fileSystem = CompilerFileSystem(compilerInput);
fe.Verbosity verbosity = options.verbosity;
@ -304,22 +295,24 @@ Future<_LoadFromSourceResult> _loadFromSource(
ir.Component? component = await fe.compile(initializedCompilerState, verbose,
fileSystem, onDiagnostic, sources, isModularCompile);
assert(() {
if (component != null) {
if (component != null) {
assert(() {
verifyComponent(
target, VerificationStage.afterModularTransformations, component);
return true;
}());
_doTransformsOnKernelLoad(component, options);
// We have to compute canonical names on the component here to avoid missing
// canonical names downstream.
if (isModularCompile) {
component.computeCanonicalNames();
}
return true;
}());
_doTransformsOnKernelLoad(component);
// We have to compute canonical names on the component here to avoid missing
// canonical names downstream.
if (isModularCompile) {
component?.computeCanonicalNames();
registerSources(component, compilerInput);
}
registerSources(component, compilerInput);
return _LoadFromSourceResult(
component, initializedCompilerState, isModularCompile ? sources : []);
}
@ -437,8 +430,8 @@ Future<Output?> run(Input input) async {
///
/// This registration improves how locations are presented when errors
/// or crashes are reported by the dart2js compiler.
void registerSources(ir.Component? component, api.CompilerInput compilerInput) {
component?.uriToSource.forEach((uri, source) {
void registerSources(ir.Component component, api.CompilerInput compilerInput) {
component.uriToSource.forEach((uri, source) {
compilerInput.registerUtf8ContentsForDiagnostics(uri, source.source);
});
}

View file

@ -103,14 +103,13 @@ abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymou
abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
mixin-super-stub method mixinMethod(core::int* i) → core::int*
return super.{opt2::Mixin::mixinMethod}(i);
abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
method /*isNonNullableByDefault, from org-dartlang-testcase:///opt_in_lib.dart */ mixinMethod(core::int i) → core::int? {
super.{core::Object::toString}();
}
}
class SubClass extends opt::_SubClass&Class&Mixin {
synthetic constructor •() → opt::SubClass*

View file

@ -103,14 +103,13 @@ abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymou
abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
mixin-super-stub method mixinMethod(core::int* i) → core::int*
return super.{opt2::Mixin::mixinMethod}(i);
abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
method /*isNonNullableByDefault, from org-dartlang-testcase:///opt_in_lib.dart */ mixinMethod(core::int i) → core::int? {
super.{core::Object::toString}();
}
}
class SubClass extends opt::_SubClass&Class&Mixin {
synthetic constructor •() → opt::SubClass*

View file

@ -91,14 +91,13 @@ abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymou
abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
mixin-super-stub method mixinMethod(core::int* i) → core::int*
return super.{opt2::Mixin::mixinMethod}(i);
abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
method /*isNonNullableByDefault, from org-dartlang-testcase:///opt_in_lib.dart */ mixinMethod(core::int i) → core::int? {
super.{core::Object::toString}();
}
}
class SubClass extends opt::_SubClass&Class&Mixin {
synthetic constructor •() → opt::SubClass*

View file

@ -91,14 +91,13 @@ abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymou
abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
mixin-super-stub method mixinMethod(core::int* i) → core::int*
return super.{opt2::Mixin::mixinMethod}(i);
abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
method /*isNonNullableByDefault, from org-dartlang-testcase:///opt_in_lib.dart */ mixinMethod(core::int i) → core::int? {
super.{core::Object::toString}();
}
}
class SubClass extends opt::_SubClass&Class&Mixin {
synthetic constructor •() → opt::SubClass*

View file

@ -54,14 +54,13 @@ abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymou
abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
mixin-super-stub method mixinMethod(core::int* i) → core::int*
return super.{opt2::Mixin::mixinMethod}(i);
abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
method /*isNonNullableByDefault, from org-dartlang-testcase:///opt_in_lib.dart */ mixinMethod(core::int i) → core::int? {
super.{core::Object::toString}();
}
}
class SubClass extends opt::_SubClass&Class&Mixin {
synthetic constructor •() → opt::SubClass*

View file

@ -47,14 +47,13 @@ abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymou
abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
mixin-super-stub method mixinMethod(core::int* i) → core::int*
return super.{opt2::Mixin::mixinMethod}(i);
abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
method /*isNonNullableByDefault, from org-dartlang-testcase:///opt_in_lib.dart */ mixinMethod(core::int i) → core::int? {
super.{core::Object::toString}();
}
}
class SubClass extends opt::_SubClass&Class&Mixin {
synthetic constructor •() → opt::SubClass*

View file

@ -201,35 +201,26 @@ abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAno
synthetic constructor •() → self::_Class1b&Class1a&Mixin1
: super self::Class1a::•()
;
mixin-super-stub get field1() → core::int
return super.{self::Mixin1::field1};
mixin-super-stub set field1(core::int value) → void
return super.{self::Mixin1::field1} = value;
mixin-super-stub get field2() → core::int
return super.{self::Mixin1::field2};
mixin-super-stub set field2(core::int value) → void
return super.{self::Mixin1::field2} = value;
mixin-super-stub get property1() → core::int
return super.{self::Mixin1::property1};
mixin-super-stub set property1(core::int value) → void
return super.{self::Mixin1::property1} = value;
mixin-super-stub get property2() → core::int
return super.{self::Mixin1::property2};
mixin-super-stub set property2(core::int value) → void
return super.{self::Mixin1::property2} = value;
mixin-super-stub method method1() → void
return super.{self::Mixin1::method1}();
mixin-super-stub method method2() → void
return super.{self::Mixin1::method2}();
method method1() → void {
super.{mai::Super1::method1}();
}
get property1() → core::int {
return super.{mai::Super1::property1};
}
set property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get field1() → core::int {
synthesized core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class1b extends self::_Class1b&Class1a&Mixin1 {
synthetic constructor •() → self::Class1b
@ -247,35 +238,26 @@ abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAno
synthetic constructor •() → self::_Class2b&Class2a&Mixin1
: super self::Class2a::•()
;
mixin-super-stub get field1() → core::int
return super.{self::Mixin1::field1};
mixin-super-stub set field1(core::int value) → void
return super.{self::Mixin1::field1} = value;
mixin-super-stub get field2() → core::int
return super.{self::Mixin1::field2};
mixin-super-stub set field2(core::int value) → void
return super.{self::Mixin1::field2} = value;
mixin-super-stub get property1() → core::int
return super.{self::Mixin1::property1};
mixin-super-stub set property1(core::int value) → void
return super.{self::Mixin1::property1} = value;
mixin-super-stub get property2() → core::int
return super.{self::Mixin1::property2};
mixin-super-stub set property2(core::int value) → void
return super.{self::Mixin1::property2} = value;
mixin-super-stub method method1() → void
return super.{self::Mixin1::method1}();
mixin-super-stub method method2() → void
return super.{self::Mixin1::method2}();
method method1() → void {
super.{mai::Super1::method1}();
}
get property1() → core::int {
return super.{mai::Super1::property1};
}
set property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get field1() → core::int {
synthesized core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class2b extends self::_Class2b&Class2a&Mixin1 {
synthetic constructor •() → self::Class2b
@ -293,35 +275,26 @@ abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAno
synthetic constructor •() → self::_Class3b&Class3a&Mixin1
: super self::Class3a::•()
;
mixin-super-stub get field1() → core::int
return super.{self::Mixin1::field1};
mixin-super-stub set field1(core::int value) → void
return super.{self::Mixin1::field1} = value;
mixin-super-stub get field2() → core::int
return super.{self::Mixin1::field2};
mixin-super-stub set field2(core::int value) → void
return super.{self::Mixin1::field2} = value;
mixin-super-stub get property1() → core::int
return super.{self::Mixin1::property1};
mixin-super-stub set property1(core::int value) → void
return super.{self::Mixin1::property1} = value;
mixin-super-stub get property2() → core::int
return super.{self::Mixin1::property2};
mixin-super-stub set property2(core::int value) → void
return super.{self::Mixin1::property2} = value;
mixin-super-stub method method1() → void
return super.{self::Mixin1::method1}();
mixin-super-stub method method2() → void
return super.{self::Mixin1::method2}();
method method1() → void {
super.{mai::Super1::method1}();
}
get property1() → core::int {
return super.{mai::Super1::property1};
}
set property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get field1() → core::int {
synthesized core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class3b extends self::_Class3b&Class3a&Mixin1 {
synthetic constructor •() → self::Class3b
@ -339,10 +312,16 @@ abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnon
synthetic constructor •() → self::_Class4b&Class4a&Mixin2
: super self::Class4a::•()
;
mixin-super-stub get property1() → core::int
return super.{mai::Mixin2::property1};
mixin-super-stub set property1(core::int value) → void
return super.{mai::Mixin2::property1} = value;
mixin-super-stub get property2() → core::int
return super.{mai::Mixin2::property2};
mixin-super-stub set property2(core::int value) → void
return super.{mai::Mixin2::property2} = value;
mixin-super-stub get field1() → core::int
return super.{mai::Mixin2::field1};
mixin-super-stub set field1(core::int value) → void
return super.{mai::Mixin2::field1} = value;
mixin-super-stub get field2() → core::int
@ -357,25 +336,10 @@ abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnon
return super.{mai::Mixin2::_#Mixin2#field2#AI};
mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
mixin-super-stub method method1() → void
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2() → void
return super.{mai::Mixin2::method2}();
method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
super.{mai::Super1::method1}();
}
get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
return super.{mai::Super1::property1};
}
set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
synthesized core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class4b extends self::_Class4b&Class4a&Mixin2 {
synthetic constructor •() → self::Class4b
@ -393,10 +357,16 @@ abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnon
synthetic constructor •() → self::_Class5b&Class5a&Mixin2
: super self::Class5a::•()
;
mixin-super-stub get property1() → core::int
return super.{mai::Mixin2::property1};
mixin-super-stub set property1(core::int value) → void
return super.{mai::Mixin2::property1} = value;
mixin-super-stub get property2() → core::int
return super.{mai::Mixin2::property2};
mixin-super-stub set property2(core::int value) → void
return super.{mai::Mixin2::property2} = value;
mixin-super-stub get field1() → core::int
return super.{mai::Mixin2::field1};
mixin-super-stub set field1(core::int value) → void
return super.{mai::Mixin2::field1} = value;
mixin-super-stub get field2() → core::int
@ -411,25 +381,10 @@ abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnon
return super.{mai::Mixin2::_#Mixin2#field2#AI};
mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
mixin-super-stub method method1() → void
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2() → void
return super.{mai::Mixin2::method2}();
method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
super.{mai::Super1::method1}();
}
get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
return super.{mai::Super1::property1};
}
set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
synthesized core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class5b extends self::_Class5b&Class5a&Mixin2 {
synthetic constructor •() → self::Class5b
@ -447,10 +402,16 @@ abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnon
synthetic constructor •() → self::_Class6b&Class6a&Mixin2
: super self::Class6a::•()
;
mixin-super-stub get property1() → core::int
return super.{mai::Mixin2::property1};
mixin-super-stub set property1(core::int value) → void
return super.{mai::Mixin2::property1} = value;
mixin-super-stub get property2() → core::int
return super.{mai::Mixin2::property2};
mixin-super-stub set property2(core::int value) → void
return super.{mai::Mixin2::property2} = value;
mixin-super-stub get field1() → core::int
return super.{mai::Mixin2::field1};
mixin-super-stub set field1(core::int value) → void
return super.{mai::Mixin2::field1} = value;
mixin-super-stub get field2() → core::int
@ -465,25 +426,10 @@ abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnon
return super.{mai::Mixin2::_#Mixin2#field2#AI};
mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
mixin-super-stub method method1() → void
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2() → void
return super.{mai::Mixin2::method2}();
method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
super.{mai::Super1::method1}();
}
get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
return super.{mai::Super1::property1};
}
set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
synthesized core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class6b extends self::_Class6b&Class6a&Mixin2 {
synthetic constructor •() → self::Class6b

View file

@ -201,35 +201,26 @@ abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAno
synthetic constructor •() → self::_Class1b&Class1a&Mixin1
: super self::Class1a::•()
;
mixin-super-stub get field1() → core::int
return super.{self::Mixin1::field1};
mixin-super-stub set field1(core::int value) → void
return super.{self::Mixin1::field1} = value;
mixin-super-stub get field2() → core::int
return super.{self::Mixin1::field2};
mixin-super-stub set field2(core::int value) → void
return super.{self::Mixin1::field2} = value;
mixin-super-stub get property1() → core::int
return super.{self::Mixin1::property1};
mixin-super-stub set property1(core::int value) → void
return super.{self::Mixin1::property1} = value;
mixin-super-stub get property2() → core::int
return super.{self::Mixin1::property2};
mixin-super-stub set property2(core::int value) → void
return super.{self::Mixin1::property2} = value;
mixin-super-stub method method1() → void
return super.{self::Mixin1::method1}();
mixin-super-stub method method2() → void
return super.{self::Mixin1::method2}();
method method1() → void {
super.{mai::Super1::method1}();
}
get property1() → core::int {
return super.{mai::Super1::property1};
}
set property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get field1() → core::int {
synthesized core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class1b extends self::_Class1b&Class1a&Mixin1 {
synthetic constructor •() → self::Class1b
@ -247,35 +238,26 @@ abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAno
synthetic constructor •() → self::_Class2b&Class2a&Mixin1
: super self::Class2a::•()
;
mixin-super-stub get field1() → core::int
return super.{self::Mixin1::field1};
mixin-super-stub set field1(core::int value) → void
return super.{self::Mixin1::field1} = value;
mixin-super-stub get field2() → core::int
return super.{self::Mixin1::field2};
mixin-super-stub set field2(core::int value) → void
return super.{self::Mixin1::field2} = value;
mixin-super-stub get property1() → core::int
return super.{self::Mixin1::property1};
mixin-super-stub set property1(core::int value) → void
return super.{self::Mixin1::property1} = value;
mixin-super-stub get property2() → core::int
return super.{self::Mixin1::property2};
mixin-super-stub set property2(core::int value) → void
return super.{self::Mixin1::property2} = value;
mixin-super-stub method method1() → void
return super.{self::Mixin1::method1}();
mixin-super-stub method method2() → void
return super.{self::Mixin1::method2}();
method method1() → void {
super.{mai::Super1::method1}();
}
get property1() → core::int {
return super.{mai::Super1::property1};
}
set property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get field1() → core::int {
synthesized core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class2b extends self::_Class2b&Class2a&Mixin1 {
synthetic constructor •() → self::Class2b
@ -293,35 +275,26 @@ abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAno
synthetic constructor •() → self::_Class3b&Class3a&Mixin1
: super self::Class3a::•()
;
mixin-super-stub get field1() → core::int
return super.{self::Mixin1::field1};
mixin-super-stub set field1(core::int value) → void
return super.{self::Mixin1::field1} = value;
mixin-super-stub get field2() → core::int
return super.{self::Mixin1::field2};
mixin-super-stub set field2(core::int value) → void
return super.{self::Mixin1::field2} = value;
mixin-super-stub get property1() → core::int
return super.{self::Mixin1::property1};
mixin-super-stub set property1(core::int value) → void
return super.{self::Mixin1::property1} = value;
mixin-super-stub get property2() → core::int
return super.{self::Mixin1::property2};
mixin-super-stub set property2(core::int value) → void
return super.{self::Mixin1::property2} = value;
mixin-super-stub method method1() → void
return super.{self::Mixin1::method1}();
mixin-super-stub method method2() → void
return super.{self::Mixin1::method2}();
method method1() → void {
super.{mai::Super1::method1}();
}
get property1() → core::int {
return super.{mai::Super1::property1};
}
set property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get field1() → core::int {
synthesized core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class3b extends self::_Class3b&Class3a&Mixin1 {
synthetic constructor •() → self::Class3b
@ -339,10 +312,16 @@ abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnon
synthetic constructor •() → self::_Class4b&Class4a&Mixin2
: super self::Class4a::•()
;
mixin-super-stub get property1() → core::int
return super.{mai::Mixin2::property1};
mixin-super-stub set property1(core::int value) → void
return super.{mai::Mixin2::property1} = value;
mixin-super-stub get property2() → core::int
return super.{mai::Mixin2::property2};
mixin-super-stub set property2(core::int value) → void
return super.{mai::Mixin2::property2} = value;
mixin-super-stub get field1() → core::int
return super.{mai::Mixin2::field1};
mixin-super-stub set field1(core::int value) → void
return super.{mai::Mixin2::field1} = value;
mixin-super-stub get field2() → core::int
@ -357,25 +336,10 @@ abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnon
return super.{mai::Mixin2::_#Mixin2#field2#AI};
mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
mixin-super-stub method method1() → void
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2() → void
return super.{mai::Mixin2::method2}();
method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
super.{mai::Super1::method1}();
}
get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
return super.{mai::Super1::property1};
}
set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
synthesized core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class4b extends self::_Class4b&Class4a&Mixin2 {
synthetic constructor •() → self::Class4b
@ -393,10 +357,16 @@ abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnon
synthetic constructor •() → self::_Class5b&Class5a&Mixin2
: super self::Class5a::•()
;
mixin-super-stub get property1() → core::int
return super.{mai::Mixin2::property1};
mixin-super-stub set property1(core::int value) → void
return super.{mai::Mixin2::property1} = value;
mixin-super-stub get property2() → core::int
return super.{mai::Mixin2::property2};
mixin-super-stub set property2(core::int value) → void
return super.{mai::Mixin2::property2} = value;
mixin-super-stub get field1() → core::int
return super.{mai::Mixin2::field1};
mixin-super-stub set field1(core::int value) → void
return super.{mai::Mixin2::field1} = value;
mixin-super-stub get field2() → core::int
@ -411,25 +381,10 @@ abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnon
return super.{mai::Mixin2::_#Mixin2#field2#AI};
mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
mixin-super-stub method method1() → void
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2() → void
return super.{mai::Mixin2::method2}();
method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
super.{mai::Super1::method1}();
}
get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
return super.{mai::Super1::property1};
}
set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
synthesized core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class5b extends self::_Class5b&Class5a&Mixin2 {
synthetic constructor •() → self::Class5b
@ -447,10 +402,16 @@ abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnon
synthetic constructor •() → self::_Class6b&Class6a&Mixin2
: super self::Class6a::•()
;
mixin-super-stub get property1() → core::int
return super.{mai::Mixin2::property1};
mixin-super-stub set property1(core::int value) → void
return super.{mai::Mixin2::property1} = value;
mixin-super-stub get property2() → core::int
return super.{mai::Mixin2::property2};
mixin-super-stub set property2(core::int value) → void
return super.{mai::Mixin2::property2} = value;
mixin-super-stub get field1() → core::int
return super.{mai::Mixin2::field1};
mixin-super-stub set field1(core::int value) → void
return super.{mai::Mixin2::field1} = value;
mixin-super-stub get field2() → core::int
@ -465,25 +426,10 @@ abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnon
return super.{mai::Mixin2::_#Mixin2#field2#AI};
mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
mixin-super-stub method method1() → void
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2() → void
return super.{mai::Mixin2::method2}();
method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
super.{mai::Super1::method1}();
}
get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
return super.{mai::Super1::property1};
}
set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
super.{mai::Super1::property1} = value;
}
get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
synthesized core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
if(_in::isSentinel(value))
value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
})(){() → core::int};
return value;
}
}
class Class6b extends self::_Class6b&Class6a&Mixin2 {
synthetic constructor •() → self::Class6b