Rewrite mixin application handling in Fasta.
R=johnniwinther@google.com Review-Url: https://codereview.chromium.org/2862223002 .
This commit is contained in:
@@ -3594,7 +3594,7 @@ If $e$ is of the form \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots
|
||||
\LMHash{}
|
||||
In all of the above cases, it is a compile-time error if $a_i, i\in 1 .. n + k$, is not a compile-time constant expression.
|
||||
|
||||
%If $T$ is a parameterized type (\ref{parameterizedTypes}) $S<U_1, \ldots, U_m>$, let $R = S$. It is a compile-time error if $T$ is is malformed. If $T$ is not a parameterized type, let $R = T$.
|
||||
%If $T$ is a parameterized type (\ref{parameterizedTypes}) $S<U_1, \ldots, U_m>$, let $R = S$. It is a compile-time error if $T$ is malformed. If $T$ is not a parameterized type, let $R = T$.
|
||||
%Finally,
|
||||
% If $T$ is a generic with $l$ retype parameters, then for all $ i \in 1 .. l$, let $V_i = \DYNAMIC{}$.
|
||||
|
||||
@@ -3911,7 +3911,7 @@ If $e_f$ is a type literal, then it is equivalent to the expression $(e_f)$.
|
||||
The expression $(e_f)$ where $e_f$ is a type literal always evaluates to an instance of class \code{Type} which is not a function. This ensures that a runtime error occurs when trying to call a type literal.
|
||||
}
|
||||
|
||||
If $e_f$ is a property extraction expression (\ref{propertyExtraction}), then $i$ is is not a function expression invocation and is instead recognized as an ordinary method invocation (\ref{ordinaryInvocation}).
|
||||
If $e_f$ is a property extraction expression (\ref{propertyExtraction}), then $i$ isn't a function expression invocation and is instead recognized as an ordinary method invocation (\ref{ordinaryInvocation}).
|
||||
|
||||
\commentary{
|
||||
\code{$a.b(x)$} is parsed as a method invocation of method \code{$b()$} on object \code{$a$}, not as an invocation of getter \code{$b$} on \code{$a$} followed by a function call \code{$(a.b)(x)$}. If a method or getter \code{$b$} exists, the two will be equivalent. However, if \code{$b$} is not defined on \code{$a$}, the resulting invocation of \code{noSuchMethod()} would differ. The \code{Invocation} passed to \code{noSuchMethod()} would describe a call to a method \code{$b$} with argument \code{$x$} in the former case, and a call to a getter \code{$b$} (with no arguments) in the latter.
|
||||
@@ -6886,7 +6886,7 @@ If $I$ is a deferred import, no evaluation takes place. Instead, a mapping of th
|
||||
The deferred prefix object has the following methods:
|
||||
|
||||
\begin{itemize}
|
||||
\item \code{loadLibrary}. This method returns a future $f$. When called, the method causes an immediate import $I'$ to be executed at some future time, where $I'$ is is derived from $I$ by eliding the word \DEFERRED{} and adding a \HIDE{} \code{loadLibrary} combinator clause. When $I'$ executes without error, $f$ completes successfully. If $I'$ executes without error, we say that the call to \code{loadLibrary} has succeeded, otherwise we say the call has failed.
|
||||
\item \code{loadLibrary}. This method returns a future $f$. When called, the method causes an immediate import $I'$ to be executed at some future time, where $I'$ is derived from $I$ by eliding the word \DEFERRED{} and adding a \HIDE{} \code{loadLibrary} combinator clause. When $I'$ executes without error, $f$ completes successfully. If $I'$ executes without error, we say that the call to \code{loadLibrary} has succeeded, otherwise we say the call has failed.
|
||||
\item For every top level function $f$ named $id$ in the imported library $B$, a corresponding method named $id$ with the same signature as $f$. Calling the method results in a runtime error.
|
||||
\item For every top level getter $g$ named $id$ in $B$, a corresponding getter named $id$ with the same signature as $g$. Calling the method results in a runtime error.
|
||||
\item For every top level setter $s$ named $id$ in $B$, a corresponding setter named $id$ with the same signature as $s$. Calling the method results in a runtime error.
|
||||
@@ -7441,7 +7441,9 @@ A {\em type alias} declares a name for a type expression.
|
||||
\end{grammar}
|
||||
|
||||
\LMHash{}
|
||||
The effect of a type alias of the form \code{\TYPEDEF{} $T$ $id (T_1$ $p_1, \ldots, T_n$ $p_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}])$} declared in a library $L$ is is to introduce the name $id$ into the scope of $L$, bound to the function type $(T_1, \ldots, T_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}]) \rightarrow T$. The effect of a type alias of the form \code{\TYPEDEF{} $T$ $id (T_1$ $p_1, \ldots, T_n$ $p_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\})$} declared in a library $L$ is is to introduce the name $id$ into the scope of $L$, bound to the function type $(T_1, \ldots, T_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\}) \rightarrow T$. . In either case, iff no return type is specified, it is taken to be \DYNAMIC{}. Likewise, if a type annotation is omitted on a formal parameter, it is taken to be \DYNAMIC{}.
|
||||
The effect of a type alias of the form \code{\TYPEDEF{} $T$ $id (T_1$ $p_1, \ldots, T_n$ $p_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}])$} declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type $(T_1, \ldots, T_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}]) \rightarrow T$.
|
||||
The effect of a type alias of the form \code{\TYPEDEF{} $T$ $id (T_1$ $p_1, \ldots, T_n$ $p_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\})$} declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type $(T_1, \ldots, T_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\}) \rightarrow T$.
|
||||
In either case, iff no return type is specified, it is taken to be \DYNAMIC{}. Likewise, if a type annotation is omitted on a formal parameter, it is taken to be \DYNAMIC{}.
|
||||
|
||||
\LMHash{}
|
||||
It is a compile-time error if any default values are specified in the signature of a function type alias.
|
||||
|
||||
@@ -24,8 +24,6 @@ export 'type_variable_builder.dart' show TypeVariableBuilder;
|
||||
|
||||
export 'function_type_alias_builder.dart' show FunctionTypeAliasBuilder;
|
||||
|
||||
export 'named_mixin_application_builder.dart' show NamedMixinApplicationBuilder;
|
||||
|
||||
export 'mixin_application_builder.dart' show MixinApplicationBuilder;
|
||||
|
||||
export 'enum_builder.dart' show EnumBuilder;
|
||||
@@ -124,6 +122,8 @@ abstract class Builder {
|
||||
|
||||
bool get isConst => false;
|
||||
|
||||
bool get isSynthetic => false;
|
||||
|
||||
get target => internalError("Unsupported operation $runtimeType.");
|
||||
|
||||
bool get hasProblem => false;
|
||||
|
||||
@@ -56,8 +56,14 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
|
||||
/// superclass.
|
||||
bool get isMixinApplication => mixedInType != null;
|
||||
|
||||
bool get isNamedMixinApplication {
|
||||
return isMixinApplication && super.isNamedMixinApplication;
|
||||
}
|
||||
|
||||
T get mixedInType;
|
||||
|
||||
void set mixedInType(T mixin);
|
||||
|
||||
List<ConstructorReferenceBuilder> get constructorReferences => null;
|
||||
|
||||
LibraryBuilder get library {
|
||||
@@ -115,30 +121,52 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
|
||||
List arguments;
|
||||
List variables;
|
||||
Builder builder;
|
||||
while (builder != superclass) {
|
||||
if (supertype is NamedTypeBuilder) {
|
||||
NamedTypeBuilder t = supertype;
|
||||
builder = t.builder;
|
||||
arguments = t.arguments;
|
||||
if (builder is ClassBuilder) {
|
||||
variables = builder.typeVariables;
|
||||
if (builder != superclass) {
|
||||
supertype = builder.supertype;
|
||||
}
|
||||
|
||||
/// If [application] is mixing in [superclass] directly or via other named
|
||||
/// mixin applications, return it.
|
||||
NamedTypeBuilder findSuperclass(MixinApplicationBuilder application) {
|
||||
for (TypeBuilder t in application.mixins) {
|
||||
if (t is NamedTypeBuilder) {
|
||||
if (t.builder == superclass) return t;
|
||||
} else if (t is MixinApplicationBuilder) {
|
||||
NamedTypeBuilder s = findSuperclass(t);
|
||||
if (s != null) return s;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void handleNamedTypeBuilder(NamedTypeBuilder t) {
|
||||
builder = t.builder;
|
||||
arguments = t.arguments ?? const [];
|
||||
if (builder is ClassBuilder) {
|
||||
ClassBuilder cls = builder;
|
||||
variables = cls.typeVariables;
|
||||
supertype = cls.supertype;
|
||||
}
|
||||
}
|
||||
|
||||
while (builder != superclass) {
|
||||
variables = null;
|
||||
if (supertype is NamedTypeBuilder) {
|
||||
handleNamedTypeBuilder(supertype);
|
||||
} else if (supertype is MixinApplicationBuilder) {
|
||||
MixinApplicationBuilder t = supertype;
|
||||
NamedTypeBuilder s = findSuperclass(t);
|
||||
if (s != null) {
|
||||
handleNamedTypeBuilder(s);
|
||||
}
|
||||
supertype = t.supertype;
|
||||
} else {
|
||||
internalError("Superclass not found.", fileUri, charOffset);
|
||||
internalError("Superclass not found '${superclass.fullNameForErrors}'.",
|
||||
fileUri, charOffset);
|
||||
}
|
||||
if (variables != null) {
|
||||
Map<TypeVariableBuilder, TypeBuilder> directSubstitutionMap =
|
||||
<TypeVariableBuilder, TypeBuilder>{};
|
||||
arguments ??= const [];
|
||||
for (int i = 0; i < variables.length; i++) {
|
||||
TypeBuilder argument =
|
||||
arguments.length < i ? arguments[i] : dynamicType;
|
||||
i < arguments.length ? arguments[i] : dynamicType;
|
||||
if (substitutionMap != null) {
|
||||
argument = argument.subst(substitutionMap);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,13 @@
|
||||
library fasta.modifier_builder;
|
||||
|
||||
import '../modifier.dart'
|
||||
show abstractMask, constMask, externalMask, finalMask, staticMask;
|
||||
show
|
||||
abstractMask,
|
||||
constMask,
|
||||
externalMask,
|
||||
finalMask,
|
||||
namedMixinApplicationMask,
|
||||
staticMask;
|
||||
|
||||
import 'builder.dart' show Builder;
|
||||
|
||||
@@ -26,4 +32,8 @@ abstract class ModifierBuilder extends Builder {
|
||||
bool get isFinal => (modifiers & finalMask) != 0;
|
||||
|
||||
bool get isStatic => (modifiers & staticMask) != 0;
|
||||
|
||||
bool get isNamedMixinApplication {
|
||||
return (modifiers & namedMixinApplicationMask) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
// Copyright (c) 2016, 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.
|
||||
|
||||
library fasta.named_mixin_application_builder;
|
||||
|
||||
import 'builder.dart'
|
||||
show
|
||||
ClassBuilder,
|
||||
LibraryBuilder,
|
||||
MemberBuilder,
|
||||
MetadataBuilder,
|
||||
Scope,
|
||||
TypeBuilder,
|
||||
TypeVariableBuilder;
|
||||
|
||||
abstract class NamedMixinApplicationBuilder<T extends TypeBuilder, R>
|
||||
extends ClassBuilder<T, R> {
|
||||
NamedMixinApplicationBuilder(
|
||||
List<MetadataBuilder> metadata,
|
||||
String name,
|
||||
List<TypeVariableBuilder> typeVariables,
|
||||
int modifiers,
|
||||
T supertype,
|
||||
List<T> interfaces,
|
||||
LibraryBuilder parent,
|
||||
int charOffset)
|
||||
: super(
|
||||
metadata,
|
||||
modifiers,
|
||||
name,
|
||||
typeVariables,
|
||||
supertype,
|
||||
interfaces,
|
||||
new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
|
||||
parent.scope.withTypeVariables(typeVariables),
|
||||
isModifiable: false),
|
||||
new Scope(<String, MemberBuilder>{}, null, null,
|
||||
isModifiable: false),
|
||||
parent,
|
||||
charOffset);
|
||||
|
||||
T get mixinApplication => supertype;
|
||||
}
|
||||
@@ -30,6 +30,7 @@ abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
|
||||
}
|
||||
|
||||
void resolveIn(Scope scope) {
|
||||
if (builder != null) return;
|
||||
Builder member = scope.lookup(name, charOffset, fileUri);
|
||||
if (member is TypeDeclarationBuilder) {
|
||||
builder = member;
|
||||
@@ -55,7 +56,7 @@ abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
|
||||
|
||||
StringBuffer printOn(StringBuffer buffer) {
|
||||
buffer.write(name);
|
||||
if (arguments == null) return buffer;
|
||||
if (arguments?.isEmpty ?? true) return buffer;
|
||||
buffer.write("<");
|
||||
bool first = true;
|
||||
for (T t in arguments) {
|
||||
|
||||
@@ -32,6 +32,8 @@ abstract class TypeDeclarationBuilder<T extends TypeBuilder, R>
|
||||
|
||||
bool get isTypeDeclaration => true;
|
||||
|
||||
bool get isMixinApplication => false;
|
||||
|
||||
R buildType(LibraryBuilder library, List<T> arguments);
|
||||
|
||||
/// [arguments] have already been built.
|
||||
|
||||
@@ -53,6 +53,10 @@ class DillClassBuilder extends KernelClassBuilder {
|
||||
bool get isMixinApplication => cls.isMixinApplication;
|
||||
|
||||
KernelTypeBuilder get mixedInType => internalError("Not implemented.");
|
||||
|
||||
void set mixedInType(KernelTypeBuilder mixin) {
|
||||
internalError("Not implemented.");
|
||||
}
|
||||
}
|
||||
|
||||
int computeModifiers(Class cls) {
|
||||
|
||||
@@ -53,6 +53,13 @@ class DillMemberBuilder extends MemberBuilder {
|
||||
return isConstructor &&
|
||||
isRedirectingGenerativeConstructorImplementation(member);
|
||||
}
|
||||
|
||||
bool get isSynthetic {
|
||||
// TODO(ahe): Kernel should eventually support a synthetic bit.
|
||||
return isConstructor &&
|
||||
name == "" &&
|
||||
(charOffset == parent.charOffset || charOffset == -1);
|
||||
}
|
||||
}
|
||||
|
||||
int computeModifiers(Member member) {
|
||||
|
||||
@@ -24,9 +24,6 @@ export 'kernel_library_builder.dart' show KernelLibraryBuilder;
|
||||
export 'kernel_mixin_application_builder.dart'
|
||||
show KernelMixinApplicationBuilder;
|
||||
|
||||
export 'kernel_named_mixin_application_builder.dart'
|
||||
show KernelNamedMixinApplicationBuilder;
|
||||
|
||||
export 'kernel_procedure_builder.dart'
|
||||
show
|
||||
KernelConstructorBuilder,
|
||||
|
||||
@@ -272,4 +272,10 @@ abstract class KernelClassBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String get fullNameForErrors {
|
||||
return isMixinApplication
|
||||
? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
|
||||
: name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ import '../errors.dart' show internalError;
|
||||
|
||||
import '../loader.dart' show Loader;
|
||||
|
||||
import '../modifier.dart' show abstractMask, staticMask;
|
||||
import '../modifier.dart'
|
||||
show abstractMask, namedMixinApplicationMask, staticMask;
|
||||
|
||||
import '../source/source_library_builder.dart'
|
||||
show DeclarationBuilder, SourceLibraryBuilder;
|
||||
@@ -41,7 +42,6 @@ import 'kernel_builder.dart'
|
||||
KernelFunctionTypeBuilder,
|
||||
KernelInvalidTypeBuilder,
|
||||
KernelMixinApplicationBuilder,
|
||||
KernelNamedMixinApplicationBuilder,
|
||||
KernelNamedTypeBuilder,
|
||||
KernelProcedureBuilder,
|
||||
KernelTypeBuilder,
|
||||
@@ -49,7 +49,7 @@ import 'kernel_builder.dart'
|
||||
LibraryBuilder,
|
||||
MemberBuilder,
|
||||
MetadataBuilder,
|
||||
NamedMixinApplicationBuilder,
|
||||
NamedTypeBuilder,
|
||||
PrefixBuilder,
|
||||
ProcedureBuilder,
|
||||
Scope,
|
||||
@@ -104,10 +104,12 @@ class KernelLibraryBuilder
|
||||
KernelTypeBuilder supertype,
|
||||
List<KernelTypeBuilder> interfaces,
|
||||
int charOffset) {
|
||||
assert(currentDeclaration.parent == libraryDeclaration);
|
||||
Map<String, MemberBuilder> members = currentDeclaration.members;
|
||||
Map<String, MemberBuilder> constructors = currentDeclaration.constructors;
|
||||
Map<String, MemberBuilder> setters = currentDeclaration.setters;
|
||||
// Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
|
||||
var declaration = endNestedDeclaration()..resolveTypes(typeVariables, this);
|
||||
assert(declaration.parent == libraryDeclaration);
|
||||
Map<String, MemberBuilder> members = declaration.members;
|
||||
Map<String, MemberBuilder> constructors = declaration.constructors;
|
||||
Map<String, MemberBuilder> setters = declaration.setters;
|
||||
|
||||
Scope classScope = new Scope(
|
||||
members, setters, scope.withTypeVariables(typeVariables),
|
||||
@@ -122,7 +124,8 @@ class KernelLibraryBuilder
|
||||
modifiers,
|
||||
className,
|
||||
typeVariables,
|
||||
supertype,
|
||||
applyMixins(supertype,
|
||||
subclassName: className, typeVariables: typeVariables),
|
||||
interfaces,
|
||||
classScope,
|
||||
constructorScope,
|
||||
@@ -130,6 +133,8 @@ class KernelLibraryBuilder
|
||||
new List<ConstructorReferenceBuilder>.from(constructorReferences),
|
||||
charOffset);
|
||||
constructorReferences.clear();
|
||||
Map<String, TypeVariableBuilder> typeVariablesByName =
|
||||
checkTypeVariables(typeVariables, cls);
|
||||
void setParent(String name, MemberBuilder member) {
|
||||
while (member != null) {
|
||||
member.parent = cls;
|
||||
@@ -137,14 +142,305 @@ class KernelLibraryBuilder
|
||||
}
|
||||
}
|
||||
|
||||
members.forEach(setParent);
|
||||
constructors.forEach(setParent);
|
||||
void setParentAndCheckConflicts(String name, MemberBuilder member) {
|
||||
if (typeVariablesByName != null) {
|
||||
TypeVariableBuilder tv = typeVariablesByName[name];
|
||||
if (tv != null) {
|
||||
cls.addCompileTimeError(
|
||||
member.charOffset, "Conflict with type variable '$name'.");
|
||||
cls.addCompileTimeError(tv.charOffset, "This is the type variable.");
|
||||
}
|
||||
}
|
||||
setParent(name, member);
|
||||
}
|
||||
|
||||
members.forEach(setParentAndCheckConflicts);
|
||||
constructors.forEach(setParentAndCheckConflicts);
|
||||
// Formally, a setter has the name `id=`, so it can never conflict with a
|
||||
// type variable.
|
||||
setters.forEach(setParent);
|
||||
// Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
|
||||
endNestedDeclaration().resolveTypes(typeVariables, this);
|
||||
addBuilder(className, cls, charOffset);
|
||||
}
|
||||
|
||||
Map<String, TypeVariableBuilder> checkTypeVariables(
|
||||
List<TypeVariableBuilder> typeVariables, Builder owner) {
|
||||
if (typeVariables?.isEmpty ?? true) return null;
|
||||
Map<String, TypeVariableBuilder> typeVariablesByName =
|
||||
<String, TypeVariableBuilder>{};
|
||||
for (TypeVariableBuilder tv in typeVariables) {
|
||||
TypeVariableBuilder existing = typeVariablesByName[tv.name];
|
||||
if (existing != null) {
|
||||
addCompileTimeError(tv.charOffset,
|
||||
"A type variable can't have the same name as another.");
|
||||
addCompileTimeError(
|
||||
existing.charOffset, "The other type variable named '${tv.name}'.");
|
||||
} else {
|
||||
typeVariablesByName[tv.name] = tv;
|
||||
if (owner is ClassBuilder) {
|
||||
// Only classes and type variables can't have the same name. See
|
||||
// [#29555](https://github.com/dart-lang/sdk/issues/29555).
|
||||
if (tv.name == owner.name) {
|
||||
addCompileTimeError(
|
||||
tv.charOffset,
|
||||
"A type variable can't have the same name as its enclosing "
|
||||
"declaration.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return typeVariablesByName;
|
||||
}
|
||||
|
||||
KernelTypeBuilder applyMixin(
|
||||
KernelTypeBuilder supertype, KernelTypeBuilder mixin, String signature,
|
||||
{List<MetadataBuilder> metadata,
|
||||
String name,
|
||||
List<TypeVariableBuilder> typeVariables,
|
||||
int modifiers: abstractMask,
|
||||
List<KernelTypeBuilder> interfaces,
|
||||
int charOffset: -1}) {
|
||||
var constructors = <String, MemberBuilder>{};
|
||||
bool isNamed = name != null;
|
||||
SourceClassBuilder builder;
|
||||
if (isNamed) {
|
||||
modifiers |= namedMixinApplicationMask;
|
||||
} else {
|
||||
name = supertype.name;
|
||||
int index = name.indexOf("^");
|
||||
if (index != -1) {
|
||||
name = name.substring(0, index);
|
||||
}
|
||||
name = "$name&${mixin.name}$signature";
|
||||
builder = mixinApplicationClasses[name];
|
||||
}
|
||||
if (builder == null) {
|
||||
builder = new SourceClassBuilder(
|
||||
metadata,
|
||||
modifiers,
|
||||
name,
|
||||
typeVariables,
|
||||
supertype,
|
||||
interfaces,
|
||||
new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
|
||||
scope.withTypeVariables(typeVariables),
|
||||
isModifiable: false),
|
||||
new Scope(constructors, null, null, isModifiable: false),
|
||||
this,
|
||||
<ConstructorReferenceBuilder>[],
|
||||
charOffset,
|
||||
null,
|
||||
mixin);
|
||||
addBuilder(name, builder, charOffset);
|
||||
if (!isNamed) {
|
||||
mixinApplicationClasses[name] = builder;
|
||||
}
|
||||
}
|
||||
return addNamedType(name, <KernelTypeBuilder>[], charOffset)
|
||||
..bind(isNamed ? builder : null);
|
||||
}
|
||||
|
||||
KernelTypeBuilder applyMixins(KernelTypeBuilder type,
|
||||
{List<MetadataBuilder> metadata,
|
||||
String name,
|
||||
String subclassName,
|
||||
List<TypeVariableBuilder> typeVariables,
|
||||
int modifiers: abstractMask,
|
||||
List<KernelTypeBuilder> interfaces,
|
||||
int charOffset: -1}) {
|
||||
if (type is KernelMixinApplicationBuilder) {
|
||||
subclassName ??= name;
|
||||
List<List<String>> signatureParts = <List<String>>[];
|
||||
Map<String, String> unresolved = <String, String>{};
|
||||
Map<String, String> unresolvedReversed = <String, String>{};
|
||||
int unresolvedCount = 0;
|
||||
Map<String, TypeBuilder> freeTypes = <String, TypeBuilder>{};
|
||||
|
||||
if (name == null || type.mixins.length != 1) {
|
||||
TypeBuilder last = type.mixins.last;
|
||||
|
||||
/// Compute a signature of the type arguments used by the supertype and
|
||||
/// mixins. These types are free variables. At this point we can't
|
||||
/// trust that the number of type arguments match the type parameters,
|
||||
/// so we also need to be able to detect missing type arguments. To do
|
||||
/// so, we separate each list of type arguments by `^` and type
|
||||
/// arguments by `&`. For example, the mixin `C<S> with M<T, U>` would
|
||||
/// look like this:
|
||||
///
|
||||
/// ^#U0^#U1&#U2
|
||||
///
|
||||
/// Where `#U0`, `#U1`, and `#U2` are the free variables arising from
|
||||
/// `S`, `T`, and `U` respectively.
|
||||
///
|
||||
/// As we can resolve any type parameters used at this point, those are
|
||||
/// named `#T0` and so forth. This reduces the number of free variables
|
||||
/// which is crucial for memory usage and the Dart VM's bootstrap
|
||||
/// sequence.
|
||||
///
|
||||
/// For example, consider this use of mixin applications:
|
||||
///
|
||||
/// class _InternalLinkedHashMap<K, V> extends _HashVMBase
|
||||
/// with
|
||||
/// MapMixin<K, V>,
|
||||
/// _LinkedHashMapMixin<K, V>,
|
||||
/// _HashBase,
|
||||
/// _OperatorEqualsAndHashCode {}
|
||||
///
|
||||
/// In this case, only two variables are free, and we produce this
|
||||
/// signature: `^^#T0&#T1^#T0&#T1^^`. Assume another class uses the
|
||||
/// sames mixins but with missing type arguments for `MapMixin`, its
|
||||
/// signature would be: `^^^#T0&#T1^^`.
|
||||
///
|
||||
/// Note that we do not need to compute a signature for a named mixin
|
||||
/// application with only one mixin as we don't have to invent a name
|
||||
/// for any classes in this situation.
|
||||
void analyzeArguments(TypeBuilder type) {
|
||||
if (name != null && type == last) {
|
||||
// The last mixin of a named mixin application doesn't contribute
|
||||
// to free variables.
|
||||
return;
|
||||
}
|
||||
if (type is NamedTypeBuilder) {
|
||||
List<String> part = <String>[];
|
||||
for (int i = 0; i < (type.arguments?.length ?? 0); i++) {
|
||||
var argument = type.arguments[i];
|
||||
String name;
|
||||
if (argument is NamedTypeBuilder) {
|
||||
if (argument.builder != null) {
|
||||
int index = typeVariables?.indexOf(argument.builder) ?? -1;
|
||||
if (index != -1) {
|
||||
name = "#T${index}";
|
||||
}
|
||||
} else if (argument.arguments == null) {
|
||||
name = unresolved[argument.name] ??= "#U${unresolvedCount++}";
|
||||
}
|
||||
}
|
||||
name ??= "#U${unresolvedCount++}";
|
||||
unresolvedReversed[name] = argument.name;
|
||||
freeTypes[name] = argument;
|
||||
part.add(name);
|
||||
type.arguments[i] =
|
||||
new KernelNamedTypeBuilder(name, null, -1, fileUri);
|
||||
}
|
||||
signatureParts.add(part);
|
||||
}
|
||||
}
|
||||
|
||||
analyzeArguments(type.supertype);
|
||||
type.mixins.forEach(analyzeArguments);
|
||||
}
|
||||
KernelTypeBuilder supertype = type.supertype;
|
||||
List<List<String>> currentSignatureParts = <List<String>>[];
|
||||
int currentSignatureCount = 0;
|
||||
String computeSignature() {
|
||||
if (freeTypes.isEmpty) return "";
|
||||
currentSignatureParts.add(signatureParts[currentSignatureCount++]);
|
||||
if (currentSignatureParts.any((l) => l.isNotEmpty)) {
|
||||
return "^${currentSignatureParts.map((l) => l.join('&')).join('^')}";
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, TypeVariableBuilder> computeTypeVariables() {
|
||||
Map<String, TypeVariableBuilder> variables =
|
||||
<String, TypeVariableBuilder>{};
|
||||
for (List<String> strings in currentSignatureParts) {
|
||||
for (String name in strings) {
|
||||
variables[name] ??= addTypeVariable(name, null, -1);
|
||||
}
|
||||
}
|
||||
return variables;
|
||||
}
|
||||
|
||||
checkArguments(t) {
|
||||
for (var argument in t.arguments ?? const []) {
|
||||
if (argument.builder == null && argument.name.startsWith("#")) {
|
||||
throw "No builder on ${argument.name}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
computeSignature(); // This combines the supertype with the first mixin.
|
||||
for (int i = 0; i < type.mixins.length - 1; i++) {
|
||||
Set<String> supertypeArguments = new Set<String>();
|
||||
for (var part in currentSignatureParts) {
|
||||
supertypeArguments.addAll(part);
|
||||
}
|
||||
String signature = computeSignature();
|
||||
var variables = computeTypeVariables();
|
||||
if (supertypeArguments.isNotEmpty) {
|
||||
supertype = addNamedType(
|
||||
supertype.name,
|
||||
supertypeArguments
|
||||
.map((n) => addNamedType(n, null, -1)..bind(variables[n]))
|
||||
.toList(),
|
||||
-1);
|
||||
}
|
||||
KernelNamedTypeBuilder mixin = type.mixins[i];
|
||||
for (var type in mixin.arguments ?? const []) {
|
||||
type.bind(variables[type.name]);
|
||||
}
|
||||
checkArguments(supertype);
|
||||
checkArguments(mixin);
|
||||
supertype = applyMixin(supertype, mixin, signature,
|
||||
typeVariables:
|
||||
new List<TypeVariableBuilder>.from(variables.values));
|
||||
}
|
||||
KernelNamedTypeBuilder mixin = type.mixins.last;
|
||||
|
||||
Set<String> supertypeArguments = new Set<String>();
|
||||
for (var part in currentSignatureParts) {
|
||||
supertypeArguments.addAll(part);
|
||||
}
|
||||
String signature = name == null ? computeSignature() : "";
|
||||
var variables;
|
||||
if (name == null) {
|
||||
variables = computeTypeVariables();
|
||||
typeVariables = new List<TypeVariableBuilder>.from(variables.values);
|
||||
if (supertypeArguments.isNotEmpty) {
|
||||
supertype = addNamedType(
|
||||
supertype.name,
|
||||
supertypeArguments
|
||||
.map((n) => addNamedType(n, null, -1)..bind(variables[n]))
|
||||
.toList(),
|
||||
-1);
|
||||
}
|
||||
} else {
|
||||
if (supertypeArguments.isNotEmpty) {
|
||||
supertype = addNamedType(supertype.name,
|
||||
supertypeArguments.map((n) => freeTypes[n]).toList(), -1);
|
||||
}
|
||||
}
|
||||
|
||||
if (name == null) {
|
||||
for (var type in mixin.arguments ?? const []) {
|
||||
type.bind(variables[type.name]);
|
||||
}
|
||||
}
|
||||
checkArguments(supertype);
|
||||
checkArguments(mixin);
|
||||
|
||||
KernelNamedTypeBuilder t = applyMixin(supertype, mixin, signature,
|
||||
metadata: metadata,
|
||||
name: name,
|
||||
typeVariables: typeVariables,
|
||||
modifiers: modifiers,
|
||||
interfaces: interfaces,
|
||||
charOffset: charOffset);
|
||||
if (name == null) {
|
||||
var builder = t.builder;
|
||||
t = addNamedType(
|
||||
t.name, freeTypes.keys.map((k) => freeTypes[k]).toList(), -1);
|
||||
if (builder != null) {
|
||||
t.bind(builder);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
} else {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
void addNamedMixinApplication(
|
||||
List<MetadataBuilder> metadata,
|
||||
String name,
|
||||
@@ -153,12 +449,16 @@ class KernelLibraryBuilder
|
||||
KernelTypeBuilder mixinApplication,
|
||||
List<KernelTypeBuilder> interfaces,
|
||||
int charOffset) {
|
||||
NamedMixinApplicationBuilder builder =
|
||||
new KernelNamedMixinApplicationBuilder(metadata, name, typeVariables,
|
||||
modifiers, mixinApplication, interfaces, this, charOffset);
|
||||
// Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
|
||||
endNestedDeclaration().resolveTypes(typeVariables, this);
|
||||
addBuilder(name, builder, charOffset);
|
||||
KernelNamedTypeBuilder supertype = applyMixins(mixinApplication,
|
||||
metadata: metadata,
|
||||
name: name,
|
||||
typeVariables: typeVariables,
|
||||
modifiers: modifiers,
|
||||
interfaces: interfaces,
|
||||
charOffset: charOffset);
|
||||
checkTypeVariables(typeVariables, supertype.builder);
|
||||
}
|
||||
|
||||
void addField(List<MetadataBuilder> metadata, int modifiers,
|
||||
@@ -542,9 +842,16 @@ class KernelLibraryBuilder
|
||||
|
||||
@override
|
||||
void includePart(covariant KernelLibraryBuilder part) {
|
||||
part.mixinApplicationClasses
|
||||
.forEach((String name, SourceClassBuilder builder) {
|
||||
SourceClassBuilder existing =
|
||||
mixinApplicationClasses.putIfAbsent(name, () => builder);
|
||||
if (existing != builder) {
|
||||
part.scope.local.remove(name);
|
||||
}
|
||||
});
|
||||
super.includePart(part);
|
||||
nativeMethods.addAll(part.nativeMethods);
|
||||
boundlessTypeVariables.addAll(part.boundlessTypeVariables);
|
||||
assert(mixinApplicationClasses.isEmpty);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,26 +4,18 @@
|
||||
|
||||
library fasta.kernel_mixin_application_builder;
|
||||
|
||||
import 'package:kernel/ast.dart' show InterfaceType, Supertype, setParents;
|
||||
import 'package:kernel/ast.dart' show InterfaceType, Supertype;
|
||||
|
||||
import '../modifier.dart' show abstractMask;
|
||||
|
||||
import '../source/source_class_builder.dart' show SourceClassBuilder;
|
||||
import '../errors.dart' show internalError;
|
||||
|
||||
import '../util/relativize.dart' show relativizeUri;
|
||||
|
||||
import 'kernel_builder.dart'
|
||||
show
|
||||
ConstructorReferenceBuilder,
|
||||
KernelLibraryBuilder,
|
||||
KernelNamedTypeBuilder,
|
||||
KernelTypeBuilder,
|
||||
KernelTypeVariableBuilder,
|
||||
LibraryBuilder,
|
||||
MemberBuilder,
|
||||
MixinApplicationBuilder,
|
||||
Scope,
|
||||
TypeBuilder,
|
||||
TypeVariableBuilder;
|
||||
|
||||
class KernelMixinApplicationBuilder
|
||||
@@ -48,72 +40,10 @@ class KernelMixinApplicationBuilder
|
||||
super(supertype, mixins, charOffset, fileUri);
|
||||
|
||||
InterfaceType build(LibraryBuilder library) {
|
||||
return buildSupertype(library)?.asInterfaceType;
|
||||
return internalError("Unsupported operation.");
|
||||
}
|
||||
|
||||
Supertype buildSupertype(LibraryBuilder library) {
|
||||
if (builtType != null) return builtType;
|
||||
KernelTypeBuilder s = this.supertype;
|
||||
for (KernelTypeBuilder builder in mixins) {
|
||||
s = applyMixin(s, builder);
|
||||
}
|
||||
builtType = s.buildSupertype(library);
|
||||
return builtType;
|
||||
}
|
||||
|
||||
TypeBuilder applyMixin(TypeBuilder supertype, TypeBuilder mixin) {
|
||||
KernelLibraryBuilder library = this.library.partOfLibrary ?? this.library;
|
||||
List<KernelTypeBuilder> typeArguments;
|
||||
List<TypeVariableBuilder> newTypeVariables;
|
||||
if (typeVariables != null) {
|
||||
assert(subclassName != null);
|
||||
newTypeVariables = library.copyTypeVariables(typeVariables);
|
||||
Map<TypeVariableBuilder, TypeBuilder> substitution =
|
||||
<TypeVariableBuilder, TypeBuilder>{};
|
||||
typeArguments = <KernelTypeBuilder>[];
|
||||
for (int i = 0; i < typeVariables.length; i++) {
|
||||
substitution[typeVariables[i]] = newTypeVariables[i].asTypeBuilder();
|
||||
typeArguments.add(typeVariables[i].asTypeBuilder());
|
||||
}
|
||||
supertype = supertype.subst(substitution);
|
||||
mixin = mixin.subst(substitution);
|
||||
}
|
||||
// To reduce diff against dartk, we create a different name for mixin
|
||||
// applications that have free type variables. We do this by setting
|
||||
// [subclassName] when setting typeVariables.
|
||||
String name = subclassName != null
|
||||
? "${subclassName}^${mixin.name}"
|
||||
: "${supertype.name}&${mixin.name}";
|
||||
|
||||
SourceClassBuilder cls =
|
||||
library.mixinApplicationClasses.putIfAbsent(name, () {
|
||||
SourceClassBuilder cls = new SourceClassBuilder(
|
||||
null,
|
||||
abstractMask,
|
||||
name,
|
||||
newTypeVariables,
|
||||
supertype,
|
||||
null,
|
||||
new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
|
||||
library.scope.withTypeVariables(newTypeVariables),
|
||||
isModifiable: false),
|
||||
new Scope(<String, MemberBuilder>{}, null, null, isModifiable: false),
|
||||
library,
|
||||
<ConstructorReferenceBuilder>[],
|
||||
charOffset,
|
||||
null,
|
||||
mixin);
|
||||
library.addImplementationBuilder(name, cls, charOffset);
|
||||
if (newTypeVariables != null) {
|
||||
for (KernelTypeVariableBuilder t in newTypeVariables) {
|
||||
cls.cls.typeParameters.add(t.parameter);
|
||||
}
|
||||
setParents(cls.cls.typeParameters, cls.cls);
|
||||
}
|
||||
return cls;
|
||||
});
|
||||
return new KernelNamedTypeBuilder(
|
||||
name, typeArguments, charOffset, library.fileUri)
|
||||
..builder = cls;
|
||||
return internalError("Unsupported operation.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
// Copyright (c) 2016, 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.
|
||||
|
||||
library fasta.kernel_named_mixin_application_builder;
|
||||
|
||||
import 'package:kernel/ast.dart' show InterfaceType;
|
||||
|
||||
import '../source/source_class_builder.dart' show SourceClassBuilder;
|
||||
|
||||
import 'kernel_builder.dart'
|
||||
show
|
||||
KernelTypeBuilder,
|
||||
LibraryBuilder,
|
||||
MemberBuilder,
|
||||
MetadataBuilder,
|
||||
NamedMixinApplicationBuilder,
|
||||
Scope,
|
||||
TypeVariableBuilder;
|
||||
|
||||
class KernelNamedMixinApplicationBuilder extends SourceClassBuilder
|
||||
implements NamedMixinApplicationBuilder<KernelTypeBuilder, InterfaceType> {
|
||||
KernelNamedMixinApplicationBuilder(
|
||||
List<MetadataBuilder> metadata,
|
||||
String name,
|
||||
List<TypeVariableBuilder> typeVariables,
|
||||
int modifiers,
|
||||
KernelTypeBuilder mixinApplication,
|
||||
List<KernelTypeBuilder> interfaces,
|
||||
LibraryBuilder parent,
|
||||
int charOffset)
|
||||
: super(
|
||||
metadata,
|
||||
modifiers,
|
||||
name,
|
||||
typeVariables,
|
||||
mixinApplication,
|
||||
interfaces,
|
||||
new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
|
||||
parent.scope.withTypeVariables(typeVariables),
|
||||
isModifiable: false),
|
||||
new Scope(<String, MemberBuilder>{}, null, null,
|
||||
isModifiable: false),
|
||||
parent,
|
||||
null,
|
||||
charOffset);
|
||||
|
||||
KernelTypeBuilder get mixinApplication => supertype;
|
||||
|
||||
// TODO(ahe): This is a bit odd, as it means this answers false to
|
||||
// [isMixinApplication], but its superclass is the mixin application.
|
||||
KernelTypeBuilder get mixedInType => null;
|
||||
}
|
||||
@@ -81,10 +81,9 @@ import 'kernel_builder.dart'
|
||||
KernelProcedureBuilder,
|
||||
LibraryBuilder,
|
||||
MemberBuilder,
|
||||
MixinApplicationBuilder,
|
||||
NamedMixinApplicationBuilder,
|
||||
NamedTypeBuilder,
|
||||
TypeBuilder,
|
||||
TypeDeclarationBuilder,
|
||||
TypeVariableBuilder;
|
||||
|
||||
import 'verifier.dart' show verifyProgram;
|
||||
@@ -148,33 +147,34 @@ class KernelTarget extends TargetImplementation {
|
||||
return new KernelLibraryBuilder(uri, fileUri, loader);
|
||||
}
|
||||
|
||||
void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {
|
||||
if (cls == null) return;
|
||||
void forEachDirectSupertype(ClassBuilder cls, void f(NamedTypeBuilder type)) {
|
||||
TypeBuilder supertype = cls.supertype;
|
||||
add(NamedTypeBuilder type) {
|
||||
Builder builder = type.builder;
|
||||
if (builder is ClassBuilder) {
|
||||
set.add(builder);
|
||||
}
|
||||
}
|
||||
|
||||
if (supertype == null) {
|
||||
// OK.
|
||||
} else if (supertype is MixinApplicationBuilder) {
|
||||
add(supertype.supertype);
|
||||
for (NamedTypeBuilder t in supertype.mixins) {
|
||||
add(t);
|
||||
}
|
||||
} else if (supertype is NamedTypeBuilder) {
|
||||
add(supertype);
|
||||
} else {
|
||||
if (supertype is NamedTypeBuilder) {
|
||||
f(supertype);
|
||||
} else if (supertype != null) {
|
||||
internalError("Unhandled: ${supertype.runtimeType}");
|
||||
}
|
||||
if (cls.interfaces != null) {
|
||||
for (NamedTypeBuilder t in cls.interfaces) {
|
||||
add(t);
|
||||
f(t);
|
||||
}
|
||||
}
|
||||
if (cls.library.loader == loader &&
|
||||
// TODO(ahe): Implement DillClassBuilder.mixedInType and remove the
|
||||
// above check.
|
||||
cls.mixedInType != null) {
|
||||
f(cls.mixedInType);
|
||||
}
|
||||
}
|
||||
|
||||
void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {
|
||||
if (cls == null) return;
|
||||
forEachDirectSupertype(cls, (NamedTypeBuilder type) {
|
||||
Builder builder = type.builder;
|
||||
if (builder is ClassBuilder) {
|
||||
set.add(builder);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
List<ClassBuilder> collectAllClasses() {
|
||||
@@ -214,6 +214,7 @@ class KernelTarget extends TargetImplementation {
|
||||
builder.charOffset, builder.fileUri ?? Uri.parse(cls.fileUri))
|
||||
..builder = objectClassBuilder;
|
||||
builder.interfaces = null;
|
||||
builder.mixedInType = null;
|
||||
}
|
||||
|
||||
Future<Program> handleInputError(Uri uri, InputError error,
|
||||
@@ -240,8 +241,8 @@ class KernelTarget extends TargetImplementation {
|
||||
loader.resolveParts();
|
||||
loader.computeLibraryScopes();
|
||||
loader.resolveTypes();
|
||||
loader.buildProgram();
|
||||
loader.checkSemantics();
|
||||
loader.buildProgram();
|
||||
List<SourceClassBuilder> sourceClasses = collectAllSourceClasses();
|
||||
installDefaultSupertypes();
|
||||
installDefaultConstructors(sourceClasses);
|
||||
@@ -447,19 +448,13 @@ class KernelTarget extends TargetImplementation {
|
||||
|
||||
/// If [builder] doesn't have a constructors, install the defaults.
|
||||
void installDefaultConstructor(SourceClassBuilder builder) {
|
||||
if (builder.cls.isMixinApplication) {
|
||||
// We have to test if builder.cls is a mixin application. [builder] may
|
||||
// think it's a mixin application, but if its mixed-in type couldn't be
|
||||
// resolved, the target class won't be a mixin application and we need
|
||||
// to add a default constructor to complete error recovery.
|
||||
return;
|
||||
}
|
||||
if (builder.isMixinApplication && !builder.isNamedMixinApplication) return;
|
||||
if (builder.constructors.local.isNotEmpty) return;
|
||||
|
||||
/// Quotes below are from [Dart Programming Language Specification, 4th
|
||||
/// Edition](
|
||||
/// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
|
||||
if (builder is NamedMixinApplicationBuilder) {
|
||||
if (builder.isNamedMixinApplication) {
|
||||
/// >A mixin application of the form S with M; defines a class C with
|
||||
/// >superclass S.
|
||||
/// >...
|
||||
@@ -469,14 +464,10 @@ class KernelTarget extends TargetImplementation {
|
||||
/// >that is accessible to LM , C has an implicitly declared constructor
|
||||
/// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) :
|
||||
/// >super(ai1,...,aiki);.
|
||||
Builder supertype = builder;
|
||||
while (supertype is NamedMixinApplicationBuilder) {
|
||||
NamedMixinApplicationBuilder named = supertype;
|
||||
TypeBuilder type = named.mixinApplication;
|
||||
if (type is MixinApplicationBuilder) {
|
||||
MixinApplicationBuilder t = type;
|
||||
type = t.supertype;
|
||||
}
|
||||
TypeDeclarationBuilder supertype = builder;
|
||||
while (supertype.isMixinApplication) {
|
||||
SourceClassBuilder named = supertype;
|
||||
TypeBuilder type = named.supertype;
|
||||
if (type is NamedTypeBuilder) {
|
||||
supertype = type.builder;
|
||||
} else {
|
||||
|
||||
@@ -27,8 +27,10 @@ const int finalMask = externalMask << 1;
|
||||
|
||||
const int staticMask = finalMask << 1;
|
||||
|
||||
/// Not a real modifier, and by setting it to null, it is automatically
|
||||
/// ignored by [Modifier.validate] below.
|
||||
const int namedMixinApplicationMask = staticMask << 1;
|
||||
|
||||
/// Not a real modifier, and by setting it to zero, it is automatically ignored
|
||||
/// by [Modifier.validate] below.
|
||||
const int varMask = 0;
|
||||
|
||||
const Modifier Abstract = const Modifier(ModifierEnum.Abstract, abstractMask);
|
||||
|
||||
@@ -436,10 +436,6 @@ class OutlineBuilder extends UnhandledListener {
|
||||
List<TypeVariableBuilder> typeVariables = pop();
|
||||
int charOffset = pop();
|
||||
String name = pop();
|
||||
if (typeVariables != null && mixinApplication is MixinApplicationBuilder) {
|
||||
mixinApplication.typeVariables = typeVariables;
|
||||
mixinApplication.subclassName = name;
|
||||
}
|
||||
int modifiers = Modifier.validate(pop());
|
||||
List<MetadataBuilder> metadata = pop();
|
||||
library.addNamedMixinApplication(metadata, name, typeVariables, modifiers,
|
||||
|
||||
@@ -50,7 +50,7 @@ class SourceClassBuilder extends KernelClassBuilder {
|
||||
|
||||
final List<ConstructorReferenceBuilder> constructorReferences;
|
||||
|
||||
final KernelTypeBuilder mixedInType;
|
||||
KernelTypeBuilder mixedInType;
|
||||
|
||||
SourceClassBuilder(
|
||||
List<MetadataBuilder> metadata,
|
||||
|
||||
@@ -31,7 +31,14 @@ import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
|
||||
|
||||
import 'package:kernel/core_types.dart' show CoreTypes;
|
||||
|
||||
import '../builder/builder.dart' show Builder, ClassBuilder, LibraryBuilder;
|
||||
import '../builder/builder.dart'
|
||||
show
|
||||
Builder,
|
||||
ClassBuilder,
|
||||
EnumBuilder,
|
||||
LibraryBuilder,
|
||||
NamedTypeBuilder,
|
||||
TypeBuilder;
|
||||
|
||||
import '../compiler_context.dart' show CompilerContext;
|
||||
|
||||
@@ -358,13 +365,68 @@ class SourceLoader<L> extends Loader<L> {
|
||||
reported.add(cls);
|
||||
}
|
||||
}
|
||||
String involvedString =
|
||||
involved.map((c) => c.fullNameForErrors).join("', '");
|
||||
cls.addCompileTimeError(
|
||||
cls.charOffset,
|
||||
"'${cls.name}' is a supertype of "
|
||||
"itself via '${involved.map((c) => c.name).join(' ')}'.");
|
||||
"'${cls.fullNameForErrors}' is a supertype of itself via "
|
||||
"'$involvedString'.");
|
||||
}
|
||||
});
|
||||
ticker.logMs("Found cycles");
|
||||
Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([
|
||||
coreLibrary["bool"],
|
||||
coreLibrary["int"],
|
||||
coreLibrary["num"],
|
||||
coreLibrary["double"],
|
||||
coreLibrary["String"],
|
||||
]);
|
||||
for (ClassBuilder cls in allClasses) {
|
||||
if (cls.library.loader != this) continue;
|
||||
Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>();
|
||||
target.addDirectSupertype(cls, directSupertypes);
|
||||
for (ClassBuilder supertype in directSupertypes) {
|
||||
if (supertype is EnumBuilder) {
|
||||
cls.addCompileTimeError(
|
||||
cls.charOffset,
|
||||
"'${supertype.name}' is an enum and can't be extended or "
|
||||
"implemented.");
|
||||
} else if (cls.library != coreLibrary &&
|
||||
blackListedClasses.contains(supertype)) {
|
||||
cls.addCompileTimeError(
|
||||
cls.charOffset,
|
||||
"'${supertype.name}' is restricted and can't be extended or "
|
||||
"implemented.");
|
||||
}
|
||||
}
|
||||
TypeBuilder mixedInType = cls.mixedInType;
|
||||
if (mixedInType != null) {
|
||||
bool isClassBuilder = false;
|
||||
if (mixedInType is NamedTypeBuilder) {
|
||||
var builder = mixedInType.builder;
|
||||
if (builder is ClassBuilder) {
|
||||
isClassBuilder = true;
|
||||
for (Builder constructory in builder.constructors.local.values) {
|
||||
if (constructory.isConstructor && !constructory.isSynthetic) {
|
||||
cls.addCompileTimeError(
|
||||
cls.charOffset,
|
||||
"Can't use '${builder.fullNameForErrors}' as a mixin "
|
||||
"because it has constructors.");
|
||||
builder.addCompileTimeError(
|
||||
constructory.charOffset,
|
||||
"This constructor prevents using "
|
||||
"'${builder.fullNameForErrors}' as a mixin.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isClassBuilder) {
|
||||
cls.addCompileTimeError(cls.charOffset,
|
||||
"The type '${mixedInType.fullNameForErrors}' can't be mixed in.");
|
||||
}
|
||||
}
|
||||
}
|
||||
ticker.logMs("Checked restricted supertypes");
|
||||
}
|
||||
|
||||
void buildProgram() {
|
||||
|
||||
@@ -2,6 +2,20 @@ library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract class Object&M1 extends core::Object implements self::M1 {
|
||||
constructor •() → void
|
||||
: super core::Object::•()
|
||||
;
|
||||
method m() → dynamic
|
||||
return core::print("M1");
|
||||
}
|
||||
abstract class Object&M1&M2 extends self::Object&M1 implements self::M2 {
|
||||
constructor •() → void
|
||||
: super self::Object&M1::•()
|
||||
;
|
||||
method m() → dynamic
|
||||
return core::print("M2");
|
||||
}
|
||||
class B extends self::Object&M1&M2 {
|
||||
constructor •(dynamic value) → void
|
||||
: super self::Object&M1&M2::•()
|
||||
@@ -33,31 +47,17 @@ abstract class G1<T extends core::Object> extends core::Object {
|
||||
method m() → dynamic
|
||||
return core::print(self::G1::T);
|
||||
}
|
||||
class D<S extends core::Object> extends self::D^G1<self::D::S> {
|
||||
constructor •() → void
|
||||
: super self::D^G1::•()
|
||||
;
|
||||
}
|
||||
abstract class Object&M1 extends core::Object implements self::M1 {
|
||||
abstract class Object&G1^^#T0<#T0 extends core::Object> extends core::Object implements self::G1<self::Object&G1^^#T0::#T0> {
|
||||
constructor •() → void
|
||||
: super core::Object::•()
|
||||
;
|
||||
method m() → dynamic
|
||||
return core::print("M1");
|
||||
return core::print(self::Object&G1^^#T0::#T0);
|
||||
}
|
||||
abstract class Object&M1&M2 extends self::Object&M1 implements self::M2 {
|
||||
class D<S extends core::Object> extends self::Object&G1^^#T0<self::D::S> {
|
||||
constructor •() → void
|
||||
: super self::Object&M1::•()
|
||||
: super self::Object&G1^^#T0::•()
|
||||
;
|
||||
method m() → dynamic
|
||||
return core::print("M2");
|
||||
}
|
||||
abstract class D^G1<S extends core::Object> extends core::Object implements self::G1<self::D^G1::S> {
|
||||
constructor •() → void
|
||||
: super core::Object::•()
|
||||
;
|
||||
method m() → dynamic
|
||||
return core::print(self::D^G1::S);
|
||||
}
|
||||
static method main() → dynamic {
|
||||
new self::B::•(null).m();
|
||||
|
||||
@@ -2,6 +2,10 @@ library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract class Object&M1 = core::Object with self::M1 {
|
||||
}
|
||||
abstract class Object&M1&M2 = self::Object&M1 with self::M2 {
|
||||
}
|
||||
class B extends self::Object&M1&M2 {
|
||||
constructor •(dynamic value) → void
|
||||
;
|
||||
@@ -28,15 +32,11 @@ abstract class G1<T extends core::Object> extends core::Object {
|
||||
method m() → dynamic
|
||||
;
|
||||
}
|
||||
class D<S extends core::Object> extends self::D^G1<self::D::S> {
|
||||
abstract class Object&G1^^#T0<#T0 extends core::Object> = core::Object with self::G1<self::Object&G1^^#T0::#T0> {
|
||||
}
|
||||
class D<S extends core::Object> extends self::Object&G1^^#T0<self::D::S> {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
abstract class Object&M1 = core::Object with self::M1 {
|
||||
}
|
||||
abstract class Object&M1&M2 = self::Object&M1 with self::M2 {
|
||||
}
|
||||
abstract class D^G1<S extends core::Object> = core::Object with self::G1<self::D^G1::S> {
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
|
||||
@@ -10,7 +10,7 @@ class B extends core::Object {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
class C extends self::Object&Missing {
|
||||
class C extends core::Object {
|
||||
constructor •() → void
|
||||
: super core::Object::•()
|
||||
;
|
||||
@@ -20,9 +20,5 @@ class D extends core::Object {
|
||||
static factory •() → dynamic
|
||||
throw "Redirection constructor target not found: Missing";
|
||||
}
|
||||
abstract class Object&Missing extends core::Object {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
static method main() → void
|
||||
;
|
||||
|
||||
@@ -7,11 +7,11 @@ class Mixin extends core::Object {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
class A extends self::Object&Mixin&Mixin {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
abstract class Object&Mixin = core::Object with self::Mixin {
|
||||
}
|
||||
abstract class Object&Mixin&Mixin = self::Object&Mixin with self::Mixin {
|
||||
}
|
||||
class A extends self::Object&Mixin&Mixin {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
|
||||
@@ -14,11 +14,6 @@ class Mixin extends core::Object {
|
||||
method foo() → dynamic
|
||||
return core::print("foo");
|
||||
}
|
||||
class Sub extends self::Base&Mixin {
|
||||
constructor •() → void
|
||||
: super self::Base&Mixin::•()
|
||||
;
|
||||
}
|
||||
abstract class Base&Mixin extends self::Base implements self::Mixin {
|
||||
constructor •() → void
|
||||
: super self::Base::•()
|
||||
@@ -26,6 +21,11 @@ abstract class Base&Mixin extends self::Base implements self::Mixin {
|
||||
method foo() → dynamic
|
||||
return core::print("foo");
|
||||
}
|
||||
class Sub extends self::Base&Mixin {
|
||||
constructor •() → void
|
||||
: super self::Base&Mixin::•()
|
||||
;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
new self::Sub::•().foo();
|
||||
}
|
||||
|
||||
@@ -12,11 +12,11 @@ class Mixin extends core::Object {
|
||||
method foo() → dynamic
|
||||
;
|
||||
}
|
||||
abstract class Base&Mixin = self::Base with self::Mixin {
|
||||
}
|
||||
class Sub extends self::Base&Mixin {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
abstract class Base&Mixin = self::Base with self::Mixin {
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
|
||||
@@ -15,14 +15,9 @@ class M1 extends core::Object {
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class C extends self::A&M1 {
|
||||
constructor •(core::bool v1, core::num v2) → void
|
||||
: super self::A&M1::•(v1, v2)
|
||||
;
|
||||
}
|
||||
abstract class A&M1 extends self::A implements self::M1 {
|
||||
class C extends self::A implements self::M1 {
|
||||
field core::num v2 = 0;
|
||||
constructor •(final core::bool v1, final core::num v2) → void
|
||||
constructor •(core::bool v1, core::num v2) → void
|
||||
: super self::A::•(v1, v2)
|
||||
;
|
||||
}
|
||||
|
||||
@@ -13,12 +13,10 @@ class M1 extends core::Object {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
class C extends self::A&M1 {
|
||||
class C = self::A with self::M1 {
|
||||
constructor •(core::bool v1, core::num v2) → void
|
||||
: super self::A::•(v1, v2)
|
||||
;
|
||||
}
|
||||
abstract class A&M1 = self::A with self::M1 {
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
|
||||
@@ -10,6 +10,14 @@ class Mixin extends core::Object {
|
||||
method foo() → dynamic
|
||||
return 87;
|
||||
}
|
||||
abstract class Object&Mixin extends core::Object implements self::Mixin {
|
||||
field dynamic field = null;
|
||||
constructor •() → void
|
||||
: super core::Object::•()
|
||||
;
|
||||
method foo() → dynamic
|
||||
return 87;
|
||||
}
|
||||
class Foo extends self::Object&Mixin {
|
||||
constructor •() → void
|
||||
: super self::Object&Mixin::•()
|
||||
@@ -19,14 +27,6 @@ class Foo extends self::Object&Mixin {
|
||||
method bar() → dynamic
|
||||
return this.{=self::Object&Mixin::field};
|
||||
}
|
||||
abstract class Object&Mixin extends core::Object implements self::Mixin {
|
||||
field dynamic field = null;
|
||||
constructor •() → void
|
||||
: super core::Object::•()
|
||||
;
|
||||
method foo() → dynamic
|
||||
return 87;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
dynamic f = new self::Foo::•();
|
||||
f.field = 42;
|
||||
|
||||
@@ -9,6 +9,8 @@ class Mixin extends core::Object {
|
||||
method foo() → dynamic
|
||||
;
|
||||
}
|
||||
abstract class Object&Mixin = core::Object with self::Mixin {
|
||||
}
|
||||
class Foo extends self::Object&Mixin {
|
||||
constructor •() → void
|
||||
;
|
||||
@@ -17,7 +19,5 @@ class Foo extends self::Object&Mixin {
|
||||
method bar() → dynamic
|
||||
;
|
||||
}
|
||||
abstract class Object&Mixin = core::Object with self::Mixin {
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
|
||||
@@ -46,12 +46,10 @@ class Mixin<M extends core::Object> extends core::Object {
|
||||
constructor •() → void
|
||||
;
|
||||
}
|
||||
class Mix<M extends core::Object> extends self::Mix^Mixin<self::Mix::M> {
|
||||
class Mix<M extends core::Object> = self::Base<self::Mix::M> with self::Mixin<self::Mix::M> {
|
||||
constructor •() → void
|
||||
: super self::Base::•()
|
||||
;
|
||||
}
|
||||
abstract class Mix^Mixin<M extends core::Object> = self::Base<self::Mix^Mixin::M> with self::Mixin<self::Mix^Mixin::M> {
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
|
||||
@@ -54,7 +54,6 @@ Language/Classes/Setters/parameter_t08: MissingCompileTimeError
|
||||
Language/Classes/Setters/syntax_t03: MissingCompileTimeError
|
||||
Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
|
||||
Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
|
||||
Language/Classes/Superinterfaces/wrong_type_t04: MissingCompileTimeError
|
||||
Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
|
||||
Language/Classes/declarations_t02: MissingCompileTimeError
|
||||
Language/Classes/declarations_t03: MissingCompileTimeError
|
||||
@@ -62,21 +61,9 @@ Language/Classes/declarations_t04: MissingCompileTimeError
|
||||
Language/Classes/declarations_t06: MissingCompileTimeError
|
||||
Language/Classes/declarations_t08: MissingCompileTimeError
|
||||
Language/Classes/declarations_t33: MissingCompileTimeError
|
||||
Language/Classes/definition_t23: CompileTimeError
|
||||
Language/Classes/same_name_member_and_class_t01: MissingCompileTimeError
|
||||
Language/Classes/same_name_member_and_class_t03: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t01: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t02: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t03: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t05: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t06: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t08: MissingCompileTimeError
|
||||
Language/Classes/same_name_type_variable_t09: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t02: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t03: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t04: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t05: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t06: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t07: MissingCompileTimeError
|
||||
Language/Enums/restrictions_t08: MissingCompileTimeError
|
||||
Language/Expressions/Assignment/expression_assignment_failed_t03: CompileTimeError
|
||||
Language/Expressions/Assignment/expression_assignment_t07: CompileTimeError
|
||||
@@ -233,21 +220,8 @@ Language/Metadata/compilation_t10: MissingCompileTimeError
|
||||
Language/Metadata/compilation_t11: MissingCompileTimeError
|
||||
Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
|
||||
Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError # Issue 25765
|
||||
Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
|
||||
Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError
|
||||
Language/Mixins/Mixin_Application/wrong_mixin_type_t07: MissingCompileTimeError
|
||||
Language/Mixins/Mixin_Application/wrong_type_t01: MissingCompileTimeError
|
||||
Language/Mixins/Mixin_Application/wrong_type_t05: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t01: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t02: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t03: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t04: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
|
||||
Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
|
||||
Language/Mixins/declaring_constructor_t07: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t08: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t09: MissingCompileTimeError
|
||||
Language/Mixins/declaring_constructor_t10: MissingCompileTimeError
|
||||
Language/Overview/Privacy/private_and_public_t06: RuntimeError
|
||||
Language/Overview/Privacy/private_and_public_t09: RuntimeError
|
||||
Language/Overview/Privacy/private_and_public_t10: RuntimeError
|
||||
@@ -262,7 +236,6 @@ Language/Overview/Scoping/conflicting_names_t27: Crash
|
||||
Language/Overview/Scoping/conflicting_names_t31: MissingCompileTimeError
|
||||
Language/Overview/Scoping/conflicting_names_t32: MissingCompileTimeError
|
||||
Language/Overview/Scoping/conflicting_names_t33: MissingCompileTimeError
|
||||
Language/Overview/Scoping/conflicting_names_t34: MissingCompileTimeError
|
||||
Language/Overview/Scoping/conflicting_names_t35: MissingCompileTimeError
|
||||
Language/Overview/Scoping/conflicting_names_t37: Crash
|
||||
Language/Overview/Scoping/conflicting_names_t38: Crash
|
||||
|
||||
@@ -13,48 +13,28 @@ multiline_newline_test/06r: MissingCompileTimeError # Fixed in ahe's dev-branch
|
||||
built_in_identifier_test/01: CompileTimeError
|
||||
call_nonexistent_static_test/01: CompileTimeError
|
||||
call_nonexistent_static_test/04: CompileTimeError
|
||||
compile_time_constant_c_test/02: MissingCompileTimeError
|
||||
compile_time_constant_c_test/03: MissingCompileTimeError
|
||||
compile_time_constant_k_test/01: RuntimeError
|
||||
compile_time_constant_k_test/02: RuntimeError
|
||||
compile_time_constant_k_test/03: RuntimeError
|
||||
compile_time_constant_o_test/01: RuntimeError
|
||||
compile_time_constant_o_test/02: RuntimeError
|
||||
compile_time_constant_test/01: MissingCompileTimeError
|
||||
conditional_method_invocation_test/11: MissingCompileTimeError
|
||||
conditional_property_access_test/09: MissingCompileTimeError
|
||||
conditional_property_assignment_test/20: MissingCompileTimeError
|
||||
conditional_property_assignment_test/21: MissingCompileTimeError
|
||||
conditional_property_assignment_test/22: MissingCompileTimeError
|
||||
config_import_corelib_test: RuntimeError
|
||||
config_import_test: RuntimeError
|
||||
const_conditional_test/08: MissingCompileTimeError
|
||||
const_constructor_mixin2_test/01: MissingCompileTimeError
|
||||
const_constructor_mixin3_test/01: MissingCompileTimeError
|
||||
const_constructor_mixin_test/01: MissingCompileTimeError
|
||||
const_constructor_nonconst_field_test/01: MissingCompileTimeError
|
||||
const_constructor_super_test/01: MissingCompileTimeError
|
||||
const_constructor_syntax_test/01: MissingCompileTimeError
|
||||
const_constructor_syntax_test/02: MissingCompileTimeError
|
||||
const_constructor_syntax_test/03: MissingCompileTimeError
|
||||
const_constructor_test/01: MissingCompileTimeError
|
||||
const_dynamic_type_literal_test/02: RuntimeError
|
||||
const_error_multiply_initialized_test/01: MissingCompileTimeError
|
||||
const_error_multiply_initialized_test/02: RuntimeError
|
||||
const_error_multiply_initialized_test/03: MissingCompileTimeError
|
||||
const_error_multiply_initialized_test/04: RuntimeError
|
||||
const_evaluation_test/01: RuntimeError
|
||||
const_factory_with_body_test/01: MissingCompileTimeError
|
||||
const_for_in_variable_test/01: MissingCompileTimeError
|
||||
const_instance_field_test/01: MissingCompileTimeError
|
||||
const_map2_test/00: MissingCompileTimeError
|
||||
const_map3_test/00: MissingCompileTimeError
|
||||
const_nested_test: RuntimeError
|
||||
const_optional_args_negative_test: Fail
|
||||
const_switch2_test/01: MissingCompileTimeError
|
||||
const_syntax_test/01: MissingCompileTimeError
|
||||
const_syntax_test/02: MissingCompileTimeError
|
||||
const_syntax_test/05: MissingCompileTimeError
|
||||
const_types_test/23: MissingCompileTimeError
|
||||
const_types_test/24: MissingCompileTimeError
|
||||
const_types_test/25: MissingCompileTimeError
|
||||
@@ -64,14 +44,10 @@ const_types_test/28: MissingCompileTimeError
|
||||
const_types_test/29: MissingCompileTimeError
|
||||
const_types_test/30: MissingCompileTimeError
|
||||
const_types_test/41: MissingCompileTimeError
|
||||
constant_expression_test/01: MissingCompileTimeError
|
||||
constant_expression_test/03: MissingCompileTimeError
|
||||
constant_locals_test/01: MissingCompileTimeError
|
||||
constructor_duplicate_final_test/01: MissingRuntimeError
|
||||
constructor_duplicate_final_test/02: MissingRuntimeError
|
||||
constructor_duplicate_initializers_test/03: MissingCompileTimeError
|
||||
constructor_redirect2_test/01: MissingCompileTimeError
|
||||
constructor_redirect_test/01: MissingCompileTimeError
|
||||
covariant_test/02: MissingCompileTimeError
|
||||
covariant_test/08: MissingCompileTimeError
|
||||
covariant_test/12: MissingCompileTimeError
|
||||
@@ -87,10 +63,6 @@ covariant_test/39: MissingCompileTimeError
|
||||
covariant_test/46: MissingCompileTimeError
|
||||
covariant_test/46b: MissingCompileTimeError
|
||||
covariant_test/59: MissingCompileTimeError
|
||||
cyclic_constructor_test/01: MissingCompileTimeError
|
||||
cyclic_type_test/00: RuntimeError
|
||||
cyclic_type_test/01: RuntimeError
|
||||
cyclic_type_test/03: RuntimeError
|
||||
cyclic_typedef_test/01: MissingCompileTimeError
|
||||
cyclic_typedef_test/02: MissingCompileTimeError
|
||||
cyclic_typedef_test/03: MissingCompileTimeError
|
||||
@@ -100,8 +72,6 @@ cyclic_typedef_test/06: MissingCompileTimeError
|
||||
cyclic_typedef_test/07: MissingCompileTimeError
|
||||
cyclic_typedef_test/08: MissingCompileTimeError
|
||||
cyclic_typedef_test/09: MissingCompileTimeError
|
||||
cyclic_typedef_test/10: MissingCompileTimeError
|
||||
cyclic_typedef_test/11: MissingCompileTimeError
|
||||
deferred_call_empty_before_load_test: RuntimeError # Deferred Loading Issue 28335
|
||||
deferred_duplicate_prefix1_test/01: MissingCompileTimeError
|
||||
deferred_duplicate_prefix2_test/01: MissingCompileTimeError
|
||||
@@ -113,19 +83,12 @@ deferred_inheritance_constraints_test/redirecting_constructor: RuntimeError
|
||||
deferred_no_prefix_test/01: MissingCompileTimeError
|
||||
deferred_not_loaded_check_test: RuntimeError
|
||||
deferred_shadow_load_library_test: RuntimeError
|
||||
dynamic_prefix_core_test/01: RuntimeError
|
||||
enum_private_test/02: RuntimeError
|
||||
enum_syntax_test/06: MissingCompileTimeError
|
||||
enum_syntax_test/21: MissingCompileTimeError
|
||||
enum_syntax_test/30: MissingCompileTimeError
|
||||
evaluation_redirecting_constructor_test: RuntimeError
|
||||
export_double_same_main_test: CompileTimeError
|
||||
export_main_test: CompileTimeError
|
||||
export_private_test/01: MissingCompileTimeError
|
||||
external_test/11: MissingCompileTimeError
|
||||
external_test/12: MissingCompileTimeError
|
||||
external_test/13: MissingRuntimeError
|
||||
external_test/20: MissingRuntimeError
|
||||
external_test/21: MissingCompileTimeError
|
||||
external_test/22: MissingCompileTimeError
|
||||
external_test/23: MissingCompileTimeError
|
||||
@@ -133,7 +96,6 @@ external_test/24: MissingCompileTimeError
|
||||
external_test/25: MissingCompileTimeError
|
||||
external_test/30: MissingCompileTimeError
|
||||
external_test/31: MissingCompileTimeError
|
||||
factory_redirection_test/07: MissingCompileTimeError
|
||||
field_decl_missing_var_type_test/01: MissingCompileTimeError
|
||||
final_initializer_instance_reference_test/01: MissingCompileTimeError
|
||||
final_super_field_set_test/01: RuntimeError
|
||||
@@ -141,18 +103,8 @@ final_syntax_test/01: MissingCompileTimeError
|
||||
final_syntax_test/02: MissingCompileTimeError
|
||||
final_syntax_test/03: MissingCompileTimeError
|
||||
final_syntax_test/04: MissingCompileTimeError
|
||||
for2_test: RuntimeError
|
||||
for_variable_capture_test: RuntimeError
|
||||
function_subtype0_test: RuntimeError
|
||||
function_subtype1_test: RuntimeError
|
||||
function_subtype2_test: RuntimeError
|
||||
function_subtype_bound_closure3_test: RuntimeError
|
||||
function_subtype_bound_closure4_test: RuntimeError
|
||||
function_subtype_cast1_test: RuntimeError
|
||||
function_subtype_inline0_test: RuntimeError
|
||||
function_subtype_local3_test: RuntimeError
|
||||
function_subtype_local4_test: RuntimeError
|
||||
function_subtype_not1_test: RuntimeError
|
||||
function_syntax_test/00: MissingCompileTimeError
|
||||
function_syntax_test/01: MissingCompileTimeError
|
||||
function_syntax_test/22: MissingCompileTimeError
|
||||
@@ -163,9 +115,6 @@ function_syntax_test/69: MissingCompileTimeError
|
||||
function_syntax_test/71: MissingCompileTimeError
|
||||
function_syntax_test/73: MissingCompileTimeError
|
||||
function_syntax_test/74: MissingCompileTimeError
|
||||
function_type_alias2_test: RuntimeError
|
||||
function_type_alias3_test: RuntimeError
|
||||
function_type_alias4_test: RuntimeError
|
||||
function_type_alias5_test/00: MissingCompileTimeError
|
||||
function_type_alias5_test/01: MissingCompileTimeError
|
||||
function_type_alias5_test/02: MissingCompileTimeError
|
||||
@@ -173,17 +122,7 @@ function_type_alias6_test/00: MissingCompileTimeError
|
||||
function_type_alias7_test/00: MissingCompileTimeError
|
||||
function_type_alias7_test/02: MissingCompileTimeError
|
||||
function_type_alias9_test/00: MissingCompileTimeError
|
||||
function_type_parameter2_negative_test: Crash
|
||||
function_type_parameter_negative_test: Crash
|
||||
function_type/*: DartkCrash
|
||||
generic_closure_test: RuntimeError
|
||||
generic_field_mixin2_test: RuntimeError
|
||||
generic_field_mixin3_test: RuntimeError
|
||||
generic_field_mixin4_test: RuntimeError
|
||||
generic_field_mixin5_test: RuntimeError
|
||||
generic_field_mixin_test: RuntimeError
|
||||
generic_metadata_test/02: MissingCompileTimeError
|
||||
generic_metadata_test/03: MissingCompileTimeError
|
||||
generic_method_types_test: Pass, RuntimeError
|
||||
getter_closure_execution_order_test: RuntimeError
|
||||
getter_parameters_test/01: MissingCompileTimeError
|
||||
@@ -205,53 +144,17 @@ is_malformed_type_test/98: RuntimeError
|
||||
is_malformed_type_test/99: RuntimeError
|
||||
is_not_class2_test: RuntimeError
|
||||
isnot_malformed_type_test: RuntimeError
|
||||
large_class_declaration_test: SkipSlow # KernelVM Issue 28312
|
||||
library_ambiguous_test/00: MissingRuntimeError
|
||||
library_ambiguous_test/04: MissingRuntimeError
|
||||
library_env_test/has_html_support: RuntimeError
|
||||
library_env_test/has_no_io_support: RuntimeError
|
||||
list_literal4_test: RuntimeError
|
||||
malformed2_test/00: RuntimeError
|
||||
malformed_inheritance_test/09: MissingCompileTimeError
|
||||
malformed_inheritance_test/10: MissingCompileTimeError
|
||||
malformed_test/none: RuntimeError
|
||||
map_literal3_test: RuntimeError
|
||||
map_literal6_test: RuntimeError
|
||||
metadata_test: CompileTimeError
|
||||
method_name_test: CompileTimeError
|
||||
method_override_test: RuntimeError
|
||||
mixin_forwarding_constructor4_test/01: MissingCompileTimeError
|
||||
mixin_forwarding_constructor4_test/02: MissingCompileTimeError
|
||||
mixin_forwarding_constructor4_test/03: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/01: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/02: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/03: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/04: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/05: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/06: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/07: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/08: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/09: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/10: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/11: MissingCompileTimeError
|
||||
mixin_illegal_constructor_test/12: MissingCompileTimeError
|
||||
mixin_illegal_object_test/01: MissingCompileTimeError
|
||||
mixin_illegal_object_test/02: MissingCompileTimeError
|
||||
mixin_issue10216_2_test: RuntimeError
|
||||
mixin_mixin2_test: RuntimeError
|
||||
mixin_mixin3_test: RuntimeError
|
||||
mixin_mixin4_test: RuntimeError
|
||||
mixin_mixin5_test: RuntimeError
|
||||
mixin_mixin6_test: RuntimeError
|
||||
mixin_mixin7_test: RuntimeError
|
||||
mixin_mixin_bound2_test: RuntimeError
|
||||
mixin_mixin_bound_test: RuntimeError
|
||||
mixin_mixin_test: RuntimeError
|
||||
mixin_of_mixin_test/03: RuntimeError
|
||||
mixin_of_mixin_test/14: RuntimeError
|
||||
mixin_super_constructor_named_test/01: MissingCompileTimeError
|
||||
mixin_super_constructor_positionals_test/01: MissingCompileTimeError
|
||||
mixin_super_test: RuntimeError
|
||||
mixin_type_parameters_super_extends_test: RuntimeError
|
||||
mixin_type_parameters_super_test: RuntimeError
|
||||
named_constructor_test/01: MissingRuntimeError
|
||||
@@ -259,16 +162,10 @@ named_parameters_aggregated_test/01: MissingCompileTimeError
|
||||
named_parameters_aggregated_test/03: MissingCompileTimeError
|
||||
named_parameters_aggregated_test/04: MissingCompileTimeError
|
||||
named_parameters_default_eq_test/01: MissingCompileTimeError
|
||||
named_parameters_default_eq_test/02: MissingCompileTimeError
|
||||
on_catch_malformed_type_test: RuntimeError
|
||||
parameter_initializer6_negative_test: Fail
|
||||
private_access_test/05: RuntimeError
|
||||
private_access_test/06: RuntimeError
|
||||
private_super_constructor_test/01: MissingCompileTimeError
|
||||
redirecting_constructor_initializer_test: RuntimeError
|
||||
redirecting_factory_default_values_test/01: MissingCompileTimeError
|
||||
redirecting_factory_default_values_test/02: MissingCompileTimeError
|
||||
redirecting_factory_long_test: RuntimeError
|
||||
ref_before_declaration_test/00: MissingCompileTimeError
|
||||
ref_before_declaration_test/01: MissingCompileTimeError
|
||||
ref_before_declaration_test/02: MissingCompileTimeError
|
||||
@@ -278,13 +175,8 @@ ref_before_declaration_test/05: MissingCompileTimeError
|
||||
ref_before_declaration_test/06: MissingCompileTimeError
|
||||
ref_before_declaration_test/07: MissingCompileTimeError
|
||||
regress_13494_test: CompileTimeError
|
||||
regress_20394_test/01: MissingCompileTimeError
|
||||
regress_22438_test: RuntimeError
|
||||
regress_27617_test/1: MissingCompileTimeError
|
||||
regress_28217_test/01: MissingCompileTimeError
|
||||
regress_28217_test/none: MissingCompileTimeError
|
||||
regress_29243_test: Crash
|
||||
runtime_type_function_test: RuntimeError
|
||||
scope_variable_test/01: MissingCompileTimeError
|
||||
static_field3_test/03: CompileTimeError
|
||||
static_field3_test/04: CompileTimeError
|
||||
@@ -324,11 +216,6 @@ super_no_such_method3_test/01: RuntimeError
|
||||
super_no_such_method4_test/01: RuntimeError
|
||||
super_no_such_method5_test/01: RuntimeError
|
||||
switch1_negative_test: Fail
|
||||
switch_bad_case_test/01: MissingCompileTimeError
|
||||
switch_bad_case_test/02: MissingCompileTimeError
|
||||
switch_case_test/00: MissingCompileTimeError
|
||||
switch_case_test/01: MissingCompileTimeError
|
||||
switch_case_test/02: MissingCompileTimeError
|
||||
syntax_test/02: MissingCompileTimeError
|
||||
syntax_test/03: MissingCompileTimeError
|
||||
syntax_test/27: MissingCompileTimeError
|
||||
@@ -339,20 +226,148 @@ try_catch_syntax_test/09: MissingCompileTimeError
|
||||
try_catch_syntax_test/10: MissingCompileTimeError
|
||||
try_catch_syntax_test/11: MissingCompileTimeError
|
||||
try_catch_syntax_test/12: MissingCompileTimeError
|
||||
type_variable_conflict_test/01: MissingCompileTimeError
|
||||
type_variable_conflict_test/02: MissingCompileTimeError
|
||||
type_variable_conflict_test/03: MissingCompileTimeError
|
||||
type_variable_conflict_test/04: MissingCompileTimeError
|
||||
type_variable_conflict_test/05: MissingCompileTimeError
|
||||
type_variable_conflict_test/06: MissingCompileTimeError
|
||||
type_variable_function_type_test: RuntimeError
|
||||
type_variable_scope3_test/00: MissingCompileTimeError
|
||||
vm/closure_memory_retention_test: Skip # Hits OOM
|
||||
vm/debug_break_enabled_vm_test/01: CompileTimeError
|
||||
vm/debug_break_enabled_vm_test/none: CompileTimeError
|
||||
vm/regress_27201_test: CompileTimeError
|
||||
vm/regress_27671_test: RuntimeError
|
||||
vm/type_vm_test: RuntimeError
|
||||
|
||||
config_import_corelib_test: RuntimeError # KernelVM bug: Configurable imports.
|
||||
config_import_test: RuntimeError # KernelVM bug: Configurable imports.
|
||||
library_env_test/has_html_support: RuntimeError # KernelVM bug: Configurable imports.
|
||||
library_env_test/has_no_io_support: RuntimeError # KernelVM bug: Configurable imports.
|
||||
|
||||
compile_time_constant_c_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
const_conditional_test/08: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
const_map2_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
const_map3_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
|
||||
const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
constant_expression_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
constant_expression_test/03: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
function_type_parameter2_negative_test: Crash # KernelVM bug: Constant evaluation.
|
||||
function_type_parameter_negative_test: Crash # KernelVM bug: Constant evaluation.
|
||||
multiline_newline_test/04: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
multiline_newline_test/04r: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
multiline_newline_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
multiline_newline_test/05r: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
multiline_newline_test/06: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
multiline_newline_test/06r: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
switch_bad_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
switch_bad_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
switch_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
switch_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
|
||||
|
||||
compile_time_constant_k_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
compile_time_constant_k_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
compile_time_constant_k_test/03: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
compile_time_constant_o_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
compile_time_constant_o_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
map_literal3_test: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
map_literal6_test: RuntimeError # KernelVM bug: Constant map duplicated key.
|
||||
|
||||
const_evaluation_test/01: RuntimeError # KernelVM bug: Reflecting on metadata.
|
||||
|
||||
cyclic_type_test/00: RuntimeError # KernelVM bug: Incorrect type argument.
|
||||
cyclic_type_test/01: RuntimeError # KernelVM bug: Incorrect type argument.
|
||||
cyclic_type_test/03: RuntimeError # KernelVM bug: Incorrect type argument.
|
||||
|
||||
dynamic_prefix_core_test/01: RuntimeError # KernelVM bug: Blocked on language issue 29125.
|
||||
|
||||
for2_test: RuntimeError # KernelVM bug: Closure conversion?
|
||||
for_variable_capture_test: RuntimeError # KernelVM bug: Closure conversion?
|
||||
|
||||
external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
|
||||
external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
|
||||
|
||||
function_subtype2_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_bound_closure3_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_bound_closure4_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_cast1_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_inline0_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_local3_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_local4_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_subtype_not1_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_type_alias2_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_type_alias3_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
function_type_alias4_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
generic_closure_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
generic_method_types_test/01: RuntimeError # KernelVM bug: Issue 29409
|
||||
generic_method_types_test/02: RuntimeError # KernelVM bug: Issue 29409
|
||||
method_override_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
runtime_type_function_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
type_variable_function_type_test: RuntimeError # KernelVM bug: Issue 29409
|
||||
|
||||
large_class_declaration_test: SkipSlow # KernelVM bug: KernelVM Issue 28312
|
||||
|
||||
mixin_forwarding_constructor4_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
|
||||
mixin_forwarding_constructor4_test/02: MissingCompileTimeError # KernelVM bug: Issue 15101
|
||||
mixin_forwarding_constructor4_test/03: MissingCompileTimeError # KernelVM bug: Issue 15101
|
||||
mixin_super_constructor_named_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
|
||||
mixin_super_constructor_positionals_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
|
||||
|
||||
mixin_mixin_type_arguments_test: RuntimeError # KernelVM bug: Issue 29537
|
||||
mixin_type_parameters_mixin_extends_test: RuntimeError # KernelVM bug: Issue 29537
|
||||
mixin_type_parameters_super_extends_test: RuntimeError # KernelVM bug: Issue 29537
|
||||
mixin_type_parameters_super_test: RuntimeError # KernelVM bug: Issue 29537
|
||||
|
||||
evaluation_redirecting_constructor_test: RuntimeError # KernelVM bug: Field initializers evaluated multiple times
|
||||
redirecting_constructor_initializer_test: RuntimeError # KernelVM bug: Field initializers evaluated multiple times
|
||||
|
||||
vm/regress_27671_test: RuntimeError # KernelVM bug: Problem with checked mode or other VMOptions?
|
||||
|
||||
vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
|
||||
vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
|
||||
|
||||
vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
|
||||
|
||||
list_literal4_test: RuntimeError # KernelVM bug: Checked mode problem: list literals aren't checked.
|
||||
|
||||
generic_field_mixin4_test: RuntimeError # KernelVM bug: Issue 29553
|
||||
|
||||
redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
|
||||
|
||||
factory_redirection_test/07: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
|
||||
regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
|
||||
regress_28217_test/01: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
|
||||
regress_28217_test/none: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
|
||||
|
||||
vm/type_vm_test: RuntimeError # Fasta bug: Bad position information in stack trace.
|
||||
|
||||
constructor_redirect2_test/01: MissingCompileTimeError # Fasta bug: Body on redirecting constructor.
|
||||
|
||||
const_factory_with_body_test/01: MissingCompileTimeError # Fasta bug: Const factory with body.
|
||||
|
||||
const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field.
|
||||
|
||||
cyclic_constructor_test/01: MissingCompileTimeError # Fasta bug: Cyclic constructor redirection.
|
||||
|
||||
cyclic_typedef_test/10: MissingCompileTimeError # Fasta bug: Cyclic typedef via type variable.
|
||||
cyclic_typedef_test/11: MissingCompileTimeError # Fasta bug: Cyclic typedef via type variable.
|
||||
|
||||
const_optional_args_negative_test: Fail # Fasta bug: Default parameter values must be const.
|
||||
|
||||
named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
|
||||
redirecting_factory_default_values_test/01: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
|
||||
redirecting_factory_default_values_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
|
||||
|
||||
private_super_constructor_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
|
||||
regress_20394_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
|
||||
|
||||
constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
|
||||
|
||||
malformed_test/none: RuntimeError # Fasta bug: Leads to assertion error in Fasta.
|
||||
|
||||
export_double_same_main_test: CompileTimeError # Fasta bug: Main is exported.
|
||||
export_main_test: CompileTimeError # Fasta bug: Main is exported.
|
||||
|
||||
const_constructor_nonconst_field_test/01: MissingCompileTimeError # Fasta bug: Non-const expression in field initializer.
|
||||
|
||||
method_name_test: CompileTimeError # Fasta bug: Parser bug.
|
||||
|
||||
generic_metadata_test/02: MissingCompileTimeError # Fasta bug: Type arguments aren't allowed on metadata?!
|
||||
generic_metadata_test/03: MissingCompileTimeError # Fasta bug: Type arguments aren't allowed on metadata?!
|
||||
|
||||
named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
|
||||
|
||||
# dartk: JIT & AOT failures (debug)
|
||||
[ ($compiler == dartk || $compiler == dartkp) && $mode == debug ]
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
// Copyright (c) 2017, 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:expect/expect.dart' show Expect;
|
||||
|
||||
class A {}
|
||||
|
||||
class B {}
|
||||
|
||||
class C {}
|
||||
|
||||
class D {}
|
||||
|
||||
class E {}
|
||||
|
||||
class F {}
|
||||
|
||||
class M1<Tm1> {
|
||||
m1() => "M1<$Tm1>";
|
||||
}
|
||||
|
||||
class M2<Tm2> {
|
||||
m2() => "M2<$Tm2>";
|
||||
}
|
||||
|
||||
class M3<Tm3> {
|
||||
m3() => "M3<$Tm3>";
|
||||
}
|
||||
|
||||
class M4<Tm4> {
|
||||
m4() => "M4<$Tm4>";
|
||||
}
|
||||
|
||||
class M5<Tm5> {
|
||||
m5() => "M5<$Tm5>";
|
||||
}
|
||||
|
||||
class C1 = Object with M1, M2<A>, M3, M4<B>, M5<C>;
|
||||
|
||||
class C2 = Object with M1<A>, M2<B>, M3<C>, M4<D>, M5<E>;
|
||||
|
||||
class C3<T> = Object with M1<A>, M2<T>, M3, M4, M5<B>;
|
||||
|
||||
class C4 extends Object with M1, M2<A>, M3, M4<B>, M5<C> {}
|
||||
|
||||
class C5 extends Object with M1<A>, M2<B>, M3<C>, M4<D>, M5<E> {}
|
||||
|
||||
class C6<T> extends Object with M1<A>, M2<T>, M3, M4, M5<B> {}
|
||||
|
||||
class C7 = Object with M1<A>, M2<A>, M3<A>, M4<A>, M5<A>;
|
||||
|
||||
class C8 extends Object with M1<A>, M2<A>, M3<A>, M4<A>, M5<A> {}
|
||||
|
||||
class C9 = Object
|
||||
with M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>>;
|
||||
|
||||
class CA extends Object
|
||||
with M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>> {}
|
||||
|
||||
trace(x) => "${x.m1()}, ${x.m2()}, ${x.m3()}, ${x.m4()}, ${x.m5()}";
|
||||
|
||||
main() {
|
||||
Expect.stringEquals(
|
||||
"M1<dynamic>, M2<A>, M3<dynamic>, M4<B>, M5<C>", trace(new C1()));
|
||||
Expect.stringEquals("M1<A>, M2<B>, M3<C>, M4<D>, M5<E>", trace(new C2()));
|
||||
Expect.stringEquals(
|
||||
"M1<A>, M2<dynamic>, M3<dynamic>, M4<dynamic>, M5<B>", trace(new C3()));
|
||||
Expect.stringEquals(
|
||||
"M1<A>, M2<F>, M3<dynamic>, M4<dynamic>, M5<B>", trace(new C3<F>()));
|
||||
Expect.stringEquals(
|
||||
"M1<dynamic>, M2<A>, M3<dynamic>, M4<B>, M5<C>", trace(new C4()));
|
||||
Expect.stringEquals("M1<A>, M2<B>, M3<C>, M4<D>, M5<E>", trace(new C5()));
|
||||
Expect.stringEquals(
|
||||
"M1<A>, M2<dynamic>, M3<dynamic>, M4<dynamic>, M5<B>", trace(new C6()));
|
||||
Expect.stringEquals(
|
||||
"M1<A>, M2<F>, M3<dynamic>, M4<dynamic>, M5<B>", trace(new C6<F>()));
|
||||
Expect.stringEquals("M1<A>, M2<A>, M3<A>, M4<A>, M5<A>", trace(new C7()));
|
||||
Expect.stringEquals("M1<A>, M2<A>, M3<A>, M4<A>, M5<A>", trace(new C8()));
|
||||
Expect.stringEquals(
|
||||
"M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>>",
|
||||
trace(new C9()));
|
||||
Expect.stringEquals(
|
||||
"M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>>",
|
||||
trace(new CA()));
|
||||
}
|
||||
@@ -497,6 +497,8 @@ mirrors/function_type_mirror_test: RuntimeError
|
||||
mirrors/generic_class_declaration_test: RuntimeError
|
||||
mirrors/generic_f_bounded_mixin_application_test: RuntimeError
|
||||
mirrors/generic_function_typedef_test: RuntimeError
|
||||
mirrors/generic_interface_test/01: RuntimeError
|
||||
mirrors/generic_interface_test/none: RuntimeError
|
||||
mirrors/generic_local_function_test: RuntimeError
|
||||
mirrors/generic_mixin_applications_test: RuntimeError
|
||||
mirrors/generic_mixin_test: RuntimeError
|
||||
|
||||
Reference in New Issue
Block a user