Remove KernelMixinApplicationBuilder and KernelNamedTypeBuilder

NamedTypeBuilder and MixinApplicationBuilder are only subclassed by
KernelNamedTypeBuilder and KernelMixinApplicationBuilder, respectively,
so the distinction can be removed.

Change-Id: If0a6434d76c20c3c10a8e25b86d2a5542d5244b2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/109263
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
This commit is contained in:
Johnni Winther 2019-07-23 09:20:28 +00:00 committed by commit-bot@chromium.org
parent 0177076f2f
commit ed38b6d664
19 changed files with 250 additions and 317 deletions

View file

@ -4,17 +4,23 @@
library fasta.mixin_application_builder;
import 'builder.dart' show TypeBuilder, TypeVariableBuilder;
import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeVariableBuilder;
abstract class MixinApplicationBuilder<T extends TypeBuilder>
extends TypeBuilder {
final T supertype;
final List<T> mixins;
import 'package:kernel/ast.dart' show InterfaceType, Supertype;
import '../fasta_codes.dart' show LocatedMessage;
import '../problems.dart' show unsupported;
class MixinApplicationBuilder extends TypeBuilder {
final TypeBuilder supertype;
final List<TypeBuilder> mixins;
Supertype builtType;
List<TypeVariableBuilder> typeVariables;
MixinApplicationBuilder(this.supertype, this.mixins);
void set typeVariables(List<TypeVariableBuilder> variables);
String get name => null;
String get debugName => "MixinApplicationBuilder";
@ -23,11 +29,41 @@ abstract class MixinApplicationBuilder<T extends TypeBuilder>
buffer.write(supertype);
buffer.write(" with ");
bool first = true;
for (T t in mixins) {
for (TypeBuilder t in mixins) {
if (!first) buffer.write(", ");
first = false;
t.printOn(buffer);
}
return buffer;
}
@override
InterfaceType build(LibraryBuilder library) {
int charOffset = -1; // TODO(ahe): Provide these.
Uri fileUri = null; // TODO(ahe): Provide these.
return unsupported("build", charOffset, fileUri);
}
@override
Supertype buildSupertype(
LibraryBuilder library, int charOffset, Uri fileUri) {
return unsupported("buildSupertype", charOffset, fileUri);
}
@override
Supertype buildMixedInType(
LibraryBuilder library, int charOffset, Uri fileUri) {
return unsupported("buildMixedInType", charOffset, fileUri);
}
@override
buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
return unsupported("buildInvalidType", message.charOffset, message.uri);
}
MixinApplicationBuilder clone(List<TypeBuilder> newTypes) {
int charOffset = -1; // TODO(dmitryas): Provide these.
Uri fileUri = null; // TODO(dmitryas): Provide these.
return unsupported("clone", charOffset, fileUri);
}
}

View file

@ -4,6 +4,8 @@
library fasta.named_type_builder;
import 'package:kernel/ast.dart' show DartType, Supertype;
import '../fasta_codes.dart'
show
Message,
@ -17,13 +19,17 @@ import '../fasta_codes.dart'
templateTypeArgumentsOnTypeVariable,
templateTypeNotFound;
import '../messages.dart'
show noLength, templateSupertypeIsIllegal, templateSupertypeIsTypeVariable;
import '../problems.dart' show unhandled;
import '../severity.dart' show Severity;
import 'builder.dart'
show
Declaration,
Identifier,
InvalidTypeBuilder,
LibraryBuilder,
PrefixBuilder,
QualifiedName,
@ -33,20 +39,26 @@ import 'builder.dart'
TypeVariableBuilder,
flattenName;
abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
import '../kernel/kernel_builder.dart'
show
KernelClassBuilder,
KernelInvalidTypeBuilder,
LibraryBuilder,
TypeBuilder,
TypeDeclarationBuilder,
TypeVariableBuilder,
flattenName;
class NamedTypeBuilder extends TypeBuilder {
final Object name;
List<T> arguments;
List<TypeBuilder> arguments;
@override
TypeDeclarationBuilder<T, R> declaration;
TypeDeclarationBuilder<TypeBuilder, DartType> declaration;
NamedTypeBuilder(this.name, this.arguments);
@override
InvalidTypeBuilder<T, R> buildInvalidType(LocatedMessage message,
{List<LocatedMessage> context});
@override
void bind(TypeDeclarationBuilder declaration) {
this.declaration = declaration?.origin;
@ -157,7 +169,7 @@ abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
if (arguments?.isEmpty ?? true) return buffer;
buffer.write("<");
bool first = true;
for (T t in arguments) {
for (TypeBuilder t in arguments) {
if (!first) buffer.write(", ");
first = false;
t.printOn(buffer);
@ -165,4 +177,102 @@ abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
buffer.write(">");
return buffer;
}
KernelInvalidTypeBuilder buildInvalidType(LocatedMessage message,
{List<LocatedMessage> context}) {
// TODO(ahe): Consider if it makes sense to pass a QualifiedName to
// KernelInvalidTypeBuilder?
return new KernelInvalidTypeBuilder(
flattenName(name, message.charOffset, message.uri), message,
context: context);
}
Supertype handleInvalidSupertype(
LibraryBuilder library, int charOffset, Uri fileUri) {
var template = declaration.isTypeVariable
? templateSupertypeIsTypeVariable
: templateSupertypeIsIllegal;
library.addProblem(
template.withArguments(flattenName(name, charOffset, fileUri)),
charOffset,
noLength,
fileUri);
return null;
}
DartType build(LibraryBuilder library) {
return declaration.buildType(library, arguments);
}
Supertype buildSupertype(
LibraryBuilder library, int charOffset, Uri fileUri) {
TypeDeclarationBuilder declaration = this.declaration;
if (declaration is KernelClassBuilder) {
return declaration.buildSupertype(library, arguments);
} else if (declaration is KernelInvalidTypeBuilder) {
library.addProblem(
declaration.message.messageObject,
declaration.message.charOffset,
declaration.message.length,
declaration.message.uri,
severity: Severity.error);
return null;
} else {
return handleInvalidSupertype(library, charOffset, fileUri);
}
}
Supertype buildMixedInType(
LibraryBuilder library, int charOffset, Uri fileUri) {
TypeDeclarationBuilder declaration = this.declaration;
if (declaration is KernelClassBuilder) {
return declaration.buildMixedInType(library, arguments);
} else if (declaration is KernelInvalidTypeBuilder) {
library.addProblem(
declaration.message.messageObject,
declaration.message.charOffset,
declaration.message.length,
declaration.message.uri,
severity: Severity.error);
return null;
} else {
return handleInvalidSupertype(library, charOffset, fileUri);
}
}
TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) {
TypeBuilder result = substitution[declaration];
if (result != null) {
assert(declaration is TypeVariableBuilder);
return result;
} else if (arguments != null) {
List<TypeBuilder> arguments;
int i = 0;
for (TypeBuilder argument in this.arguments) {
TypeBuilder type = argument.subst(substitution);
if (type != argument) {
arguments ??= this.arguments.toList();
arguments[i] = type;
}
i++;
}
if (arguments != null) {
return new NamedTypeBuilder(name, arguments)..bind(declaration);
}
}
return this;
}
NamedTypeBuilder clone(List<TypeBuilder> newTypes) {
List<TypeBuilder> clonedArguments;
if (arguments != null) {
clonedArguments = new List<TypeBuilder>(arguments.length);
for (int i = 0; i < clonedArguments.length; i++) {
clonedArguments[i] = arguments[i].clone(newTypes);
}
}
NamedTypeBuilder newType = new NamedTypeBuilder(name, clonedArguments);
newTypes.add(newType);
return newType;
}
}

View file

@ -1745,7 +1745,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
// This way of computing the superclass is slower than using the kernel
// objects directly.
Object supertype = builder.supertype;
if (supertype is NamedTypeBuilder<TypeBuilder, Object>) {
if (supertype is NamedTypeBuilder) {
Object builder = supertype.declaration;
if (builder is ClassBuilder<TypeBuilder, Object>) return builder;
}
@ -2793,7 +2793,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
library.addProblem(
message, offset, lengthOfSpan(beginToken, suffix), uri);
push(new UnresolvedType<TypeBuilder>(
new KernelNamedTypeBuilder(name, null)
new NamedTypeBuilder(name, null)
..bind(new KernelInvalidTypeBuilder(
name,
message.withLocation(
@ -2813,7 +2813,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
// TODO(ahe): Arguments could be passed here.
library.addProblem(
name.message, name.charOffset, name.name.length, name.fileUri);
result = new KernelNamedTypeBuilder(name.name, null)
result = new NamedTypeBuilder(name.name, null)
..bind(new KernelInvalidTypeBuilder(
name.name,
name.message.withLocation(
@ -2866,7 +2866,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
debugEvent("VoidKeyword");
int offset = offsetForToken(token);
push(new UnresolvedType<TypeBuilder>(
new KernelNamedTypeBuilder("void", null)
new NamedTypeBuilder("void", null)
..bind(new VoidTypeBuilder<TypeBuilder, VoidType>(
const VoidType(), library, offset)),
offset,
@ -5207,8 +5207,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
UnresolvedType<TypeBuilder> validateTypeUse(
UnresolvedType<TypeBuilder> unresolved, bool nonInstanceAccessIsError) {
TypeBuilder builder = unresolved.builder;
if (builder is KernelNamedTypeBuilder &&
builder.declaration.isTypeVariable) {
if (builder is NamedTypeBuilder && builder.declaration.isTypeVariable) {
TypeParameter typeParameter = builder.declaration.target;
LocatedMessage message;
if (!isInstanceContext && typeParameter.parent is Class) {
@ -5226,7 +5225,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
}
addProblem(message.messageObject, message.charOffset, message.length);
return new UnresolvedType<TypeBuilder>(
new KernelNamedTypeBuilder(typeParameter.name, null)
new NamedTypeBuilder(typeParameter.name, null)
..bind(new KernelInvalidTypeBuilder(typeParameter.name, message)),
unresolved.charOffset,
unresolved.fileUri);

View file

@ -81,7 +81,7 @@ import 'kernel_builder.dart'
KernelClassBuilder,
KernelFieldBuilder,
KernelLibraryBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
KernelProcedureBuilder,
KernelTypeVariableBuilder,
LibraryBuilder,
@ -247,8 +247,7 @@ class ClassHierarchyBuilder {
TypeBuilder asSupertypeOf(Class cls, Class supertype) {
ClassHierarchyNode clsNode = getNodeFromKernelClass(cls);
if (cls == supertype) {
return new KernelNamedTypeBuilder(clsNode.cls.name, null)
..bind(clsNode.cls);
return new NamedTypeBuilder(clsNode.cls.name, null)..bind(clsNode.cls);
}
ClassHierarchyNode supertypeNode = getNodeFromKernelClass(supertype);
List<TypeBuilder> supertypes = clsNode.superclasses;
@ -283,7 +282,7 @@ class ClassHierarchyBuilder {
superclass.typeParameters.length, nullKernelClass.rawType));
}
}
KernelNamedTypeBuilder supertype = asSupertypeOf(kernelClass, superclass);
NamedTypeBuilder supertype = asSupertypeOf(kernelClass, superclass);
if (supertype == null) return null;
if (supertype.arguments == null && superclass.typeParameters.isEmpty) {
return superclass.rawType;
@ -1325,7 +1324,7 @@ class ClassHierarchyNodeBuilder {
}
TypeBuilder recordSupertype(TypeBuilder supertype) {
if (supertype is KernelNamedTypeBuilder) {
if (supertype is NamedTypeBuilder) {
debug?.log(
"In ${this.cls.fullNameForErrors} recordSupertype(${supertype.fullNameForErrors})");
Declaration declaration = supertype.declaration;
@ -1360,7 +1359,7 @@ class ClassHierarchyNodeBuilder {
}
List<TypeBuilder> substSupertypes(
KernelNamedTypeBuilder supertype, List<TypeBuilder> supertypes) {
NamedTypeBuilder supertype, List<TypeBuilder> supertypes) {
Declaration declaration = supertype.declaration;
if (declaration is! KernelClassBuilder) return supertypes;
KernelClassBuilder cls = declaration;
@ -1639,7 +1638,7 @@ class ClassHierarchyNodeBuilder {
inferredArguments[i] =
hierarchy.loader.computeTypeBuilder(typeArguments[i]);
}
KernelNamedTypeBuilder mixedInType = cls.mixedInType;
NamedTypeBuilder mixedInType = cls.mixedInType;
mixedInType.arguments = inferredArguments;
}

View file

@ -114,7 +114,7 @@ import 'kernel_builder.dart'
Declaration,
KernelClassBuilder,
KernelInvalidTypeBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
TypeBuilder,
UnresolvedType;
@ -442,8 +442,7 @@ abstract class Generator {
TypeBuilder buildTypeWithResolvedArguments(
List<UnresolvedType<TypeBuilder>> arguments) {
KernelNamedTypeBuilder result =
new KernelNamedTypeBuilder(token.lexeme, null);
NamedTypeBuilder result = new NamedTypeBuilder(token.lexeme, null);
Message message = templateNotAType.withArguments(token.lexeme);
_helper.library.addProblem(
message, offsetForToken(token), lengthForToken(token), _uri);
@ -1653,7 +1652,7 @@ class DeferredAccessGenerator extends Generator {
TypeBuilder type =
suffixGenerator.buildTypeWithResolvedArguments(arguments);
LocatedMessage message;
if (type is KernelNamedTypeBuilder &&
if (type is NamedTypeBuilder &&
type.declaration is KernelInvalidTypeBuilder) {
KernelInvalidTypeBuilder declaration = type.declaration;
message = declaration.message;
@ -1667,7 +1666,7 @@ class DeferredAccessGenerator extends Generator {
.withLocation(
_uri, charOffset, lengthOfSpan(prefixGenerator.token, token));
}
KernelNamedTypeBuilder result = new KernelNamedTypeBuilder(name, null);
NamedTypeBuilder result = new NamedTypeBuilder(name, null);
_helper.library.addProblem(
message.messageObject, message.charOffset, message.length, message.uri);
result.bind(result.buildInvalidType(message));
@ -1748,7 +1747,7 @@ class TypeUseGenerator extends ReadOnlyAccessGenerator {
_helper.validateTypeUse(arguments[i], false).builder;
}
}
return new KernelNamedTypeBuilder(_plainNameForRead, argumentBuilders)
return new NamedTypeBuilder(_plainNameForRead, argumentBuilders)
..bind(declaration);
}
@ -2504,8 +2503,7 @@ class UnexpectedQualifiedUseGenerator extends Generator {
Template<Message Function(String, String)> template = isUnresolved
? templateUnresolvedPrefixInTypeAnnotation
: templateNotAPrefixInTypeAnnotation;
KernelNamedTypeBuilder result =
new KernelNamedTypeBuilder(_plainNameForRead, null);
NamedTypeBuilder result = new NamedTypeBuilder(_plainNameForRead, null);
Message message =
template.withArguments(prefixGenerator.token.lexeme, token.lexeme);
_helper.library.addProblem(message, offsetForToken(prefixGenerator.token),
@ -2600,8 +2598,7 @@ class ParserErrorGenerator extends Generator {
TypeBuilder buildTypeWithResolvedArguments(
List<UnresolvedType<TypeBuilder>> arguments) {
KernelNamedTypeBuilder result =
new KernelNamedTypeBuilder(token.lexeme, null);
NamedTypeBuilder result = new NamedTypeBuilder(token.lexeme, null);
_helper.library.addProblem(message, offsetForToken(token), noLength, _uri);
result.bind(result.buildInvalidType(
message.withLocation(_uri, offsetForToken(token), noLength)));

View file

@ -35,11 +35,6 @@ export 'kernel_library_builder.dart' show KernelLibraryBuilder;
export 'kernel_metadata_builder.dart' show KernelMetadataBuilder;
export 'kernel_mixin_application_builder.dart'
show KernelMixinApplicationBuilder;
export 'kernel_named_type_builder.dart' show KernelNamedTypeBuilder;
export 'kernel_prefix_builder.dart' show KernelPrefixBuilder;
export 'kernel_procedure_builder.dart'

View file

@ -106,7 +106,7 @@ import 'kernel_builder.dart'
KernelFunctionBuilder,
KernelLibraryBuilder,
KernelMetadataBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
KernelProcedureBuilder,
KernelRedirectingFactoryBuilder,
TypeBuilder,
@ -249,7 +249,7 @@ abstract class KernelClassBuilder
// Extract super class (if it exists).
ClassBuilder superClass;
TypeBuilder superClassType = supertype;
if (superClassType is KernelNamedTypeBuilder) {
if (superClassType is NamedTypeBuilder) {
Declaration decl = superClassType.declaration;
if (decl is ClassBuilder) {
superClass = decl;
@ -261,7 +261,7 @@ abstract class KernelClassBuilder
Map<ClassBuilder, int> problemsOffsets;
Set<ClassBuilder> implemented = new Set<ClassBuilder>();
for (TypeBuilder type in interfaces) {
if (type is KernelNamedTypeBuilder) {
if (type is NamedTypeBuilder) {
int charOffset = -1; // TODO(ahe): Get offset from type.
Declaration decl = type.declaration;
if (decl is ClassBuilder) {

View file

@ -55,7 +55,7 @@ import 'kernel_builder.dart'
KernelFieldBuilder,
KernelFormalParameterBuilder,
KernelLibraryBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
KernelProcedureBuilder,
TypeBuilder,
LibraryBuilder,
@ -70,13 +70,13 @@ class KernelEnumBuilder extends SourceClassBuilder
@override
final List<EnumConstantInfo> enumConstantInfos;
final KernelNamedTypeBuilder intType;
final NamedTypeBuilder intType;
final KernelNamedTypeBuilder stringType;
final NamedTypeBuilder stringType;
final KernelNamedTypeBuilder objectType;
final NamedTypeBuilder objectType;
final KernelNamedTypeBuilder listType;
final NamedTypeBuilder listType;
KernelEnumBuilder.internal(
List<MetadataBuilder> metadata,
@ -109,16 +109,15 @@ class KernelEnumBuilder extends SourceClassBuilder
assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
// TODO(ahe): These types shouldn't be looked up in scope, they come
// directly from dart:core.
TypeBuilder intType = new KernelNamedTypeBuilder("int", null);
TypeBuilder stringType = new KernelNamedTypeBuilder("String", null);
KernelNamedTypeBuilder objectType =
new KernelNamedTypeBuilder("Object", null);
TypeBuilder intType = new NamedTypeBuilder("int", null);
TypeBuilder stringType = new NamedTypeBuilder("String", null);
NamedTypeBuilder objectType = new NamedTypeBuilder("Object", null);
Class cls = new Class(name: name);
Map<String, MemberBuilder> members = <String, MemberBuilder>{};
Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
KernelNamedTypeBuilder selfType = new KernelNamedTypeBuilder(name, null);
NamedTypeBuilder selfType = new NamedTypeBuilder(name, null);
TypeBuilder listType =
new KernelNamedTypeBuilder("List", <TypeBuilder>[selfType]);
new NamedTypeBuilder("List", <TypeBuilder>[selfType]);
/// metadata class E {
/// final int index;

View file

@ -138,8 +138,8 @@ import 'kernel_builder.dart'
KernelTypeAliasBuilder,
KernelInvalidTypeBuilder,
KernelMetadataBuilder,
KernelMixinApplicationBuilder,
KernelNamedTypeBuilder,
MixinApplicationBuilder,
NamedTypeBuilder,
KernelProcedureBuilder,
KernelRedirectingFactoryBuilder,
KernelTypeVariableBuilder,
@ -236,13 +236,12 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
TypeBuilder addNamedType(
Object name, List<TypeBuilder> arguments, int charOffset) {
return addType(new KernelNamedTypeBuilder(name, arguments), charOffset);
return addType(new NamedTypeBuilder(name, arguments), charOffset);
}
TypeBuilder addMixinApplication(
TypeBuilder supertype, List<TypeBuilder> mixins, int charOffset) {
return addType(
new KernelMixinApplicationBuilder(supertype, mixins), charOffset);
return addType(new MixinApplicationBuilder(supertype, mixins), charOffset);
}
TypeBuilder addVoidType(int charOffset) {
@ -498,7 +497,7 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
"interfaces", "unnamed mixin application", charOffset, fileUri);
}
}
if (type is KernelMixinApplicationBuilder) {
if (type is MixinApplicationBuilder) {
// Documentation below assumes the given mixin application is in one of
// these forms:
//
@ -559,7 +558,7 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
/// Helper function that returns `true` if a type variable with a name
/// from [typeVariableNames] is referenced in [type].
bool usesTypeVariables(TypeBuilder type) {
if (type is KernelNamedTypeBuilder) {
if (type is NamedTypeBuilder) {
if (type.declaration is KernelTypeVariableBuilder) {
return typeVariableNames.contains(type.declaration.name);
}
@ -593,10 +592,10 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
isNamedMixinApplication = name != null && mixin == type.mixins.last;
bool isGeneric = false;
if (!isNamedMixinApplication) {
if (supertype is KernelNamedTypeBuilder) {
if (supertype is NamedTypeBuilder) {
isGeneric = isGeneric || usesTypeVariables(supertype);
}
if (mixin is KernelNamedTypeBuilder) {
if (mixin is NamedTypeBuilder) {
runningName += "&${extractName(mixin.name)}";
isGeneric = isGeneric || usesTypeVariables(mixin);
}
@ -619,13 +618,12 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
copyTypeVariables(typeVariables, currentDeclaration);
List<TypeBuilder> newTypes = <TypeBuilder>[];
if (supertype is KernelNamedTypeBuilder &&
supertype.arguments != null) {
if (supertype is NamedTypeBuilder && supertype.arguments != null) {
for (int i = 0; i < supertype.arguments.length; ++i) {
supertype.arguments[i] = supertype.arguments[i].clone(newTypes);
}
}
if (mixin is KernelNamedTypeBuilder && mixin.arguments != null) {
if (mixin is NamedTypeBuilder && mixin.arguments != null) {
for (int i = 0; i < mixin.arguments.length; ++i) {
mixin.arguments[i] = mixin.arguments[i].clone(newTypes);
}
@ -709,8 +707,8 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
int charEndOffset) {
// Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
endNestedDeclaration(name).resolveTypes(typeVariables, this);
KernelNamedTypeBuilder supertype = applyMixins(mixinApplication,
startCharOffset, charOffset, charEndOffset, name, false,
NamedTypeBuilder supertype = applyMixins(mixinApplication, startCharOffset,
charOffset, charEndOffset, name, false,
documentationComment: documentationComment,
metadata: metadata,
name: name,
@ -912,7 +910,7 @@ class KernelLibraryBuilder extends SourceLibraryBuilder<TypeBuilder, Library> {
DeclarationBuilder<TypeBuilder> savedDeclaration = currentDeclaration;
currentDeclaration = factoryDeclaration;
for (TypeVariableBuilder tv in procedure.typeVariables) {
KernelNamedTypeBuilder t = procedure.returnType;
NamedTypeBuilder t = procedure.returnType;
t.arguments.add(addNamedType(tv.name, null, procedure.charOffset));
}
currentDeclaration = savedDeclaration;

View file

@ -1,59 +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_mixin_application_builder;
import 'package:kernel/ast.dart' show InterfaceType, Supertype;
import '../fasta_codes.dart' show LocatedMessage;
import '../problems.dart' show unsupported;
import 'kernel_builder.dart'
show
LibraryBuilder,
MixinApplicationBuilder,
TypeBuilder,
TypeVariableBuilder;
class KernelMixinApplicationBuilder extends MixinApplicationBuilder<TypeBuilder>
implements TypeBuilder {
Supertype builtType;
List<TypeVariableBuilder> typeVariables;
KernelMixinApplicationBuilder(TypeBuilder supertype, List<TypeBuilder> mixins)
: assert(mixins != null),
super(supertype, mixins);
@override
InterfaceType build(LibraryBuilder library) {
int charOffset = -1; // TODO(ahe): Provide these.
Uri fileUri = null; // TODO(ahe): Provide these.
return unsupported("build", charOffset, fileUri);
}
@override
Supertype buildSupertype(
LibraryBuilder library, int charOffset, Uri fileUri) {
return unsupported("buildSupertype", charOffset, fileUri);
}
@override
Supertype buildMixedInType(
LibraryBuilder library, int charOffset, Uri fileUri) {
return unsupported("buildMixedInType", charOffset, fileUri);
}
@override
buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
return unsupported("buildInvalidType", message.charOffset, message.uri);
}
KernelMixinApplicationBuilder clone(List<TypeBuilder> newTypes) {
int charOffset = -1; // TODO(dmitryas): Provide these.
Uri fileUri = null; // TODO(dmitryas): Provide these.
return unsupported("clone", charOffset, fileUri);
}
}

View file

@ -1,130 +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_interface_type_builder;
import 'package:kernel/ast.dart' show DartType, Supertype;
import '../fasta_codes.dart' show LocatedMessage;
import '../messages.dart'
show noLength, templateSupertypeIsIllegal, templateSupertypeIsTypeVariable;
import '../severity.dart' show Severity;
import 'kernel_builder.dart'
show
KernelClassBuilder,
KernelInvalidTypeBuilder,
LibraryBuilder,
NamedTypeBuilder,
TypeBuilder,
TypeDeclarationBuilder,
TypeVariableBuilder,
flattenName;
class KernelNamedTypeBuilder extends NamedTypeBuilder<TypeBuilder, DartType>
implements TypeBuilder {
KernelNamedTypeBuilder(Object name, List<TypeBuilder> arguments)
: super(name, arguments);
KernelInvalidTypeBuilder buildInvalidType(LocatedMessage message,
{List<LocatedMessage> context}) {
// TODO(ahe): Consider if it makes sense to pass a QualifiedName to
// KernelInvalidTypeBuilder?
return new KernelInvalidTypeBuilder(
flattenName(name, message.charOffset, message.uri), message,
context: context);
}
Supertype handleInvalidSupertype(
LibraryBuilder library, int charOffset, Uri fileUri) {
var template = declaration.isTypeVariable
? templateSupertypeIsTypeVariable
: templateSupertypeIsIllegal;
library.addProblem(
template.withArguments(flattenName(name, charOffset, fileUri)),
charOffset,
noLength,
fileUri);
return null;
}
DartType build(LibraryBuilder library) {
return declaration.buildType(library, arguments);
}
Supertype buildSupertype(
LibraryBuilder library, int charOffset, Uri fileUri) {
TypeDeclarationBuilder declaration = this.declaration;
if (declaration is KernelClassBuilder) {
return declaration.buildSupertype(library, arguments);
} else if (declaration is KernelInvalidTypeBuilder) {
library.addProblem(
declaration.message.messageObject,
declaration.message.charOffset,
declaration.message.length,
declaration.message.uri,
severity: Severity.error);
return null;
} else {
return handleInvalidSupertype(library, charOffset, fileUri);
}
}
Supertype buildMixedInType(
LibraryBuilder library, int charOffset, Uri fileUri) {
TypeDeclarationBuilder declaration = this.declaration;
if (declaration is KernelClassBuilder) {
return declaration.buildMixedInType(library, arguments);
} else if (declaration is KernelInvalidTypeBuilder) {
library.addProblem(
declaration.message.messageObject,
declaration.message.charOffset,
declaration.message.length,
declaration.message.uri,
severity: Severity.error);
return null;
} else {
return handleInvalidSupertype(library, charOffset, fileUri);
}
}
TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) {
TypeBuilder result = substitution[declaration];
if (result != null) {
assert(declaration is TypeVariableBuilder);
return result;
} else if (arguments != null) {
List<TypeBuilder> arguments;
int i = 0;
for (TypeBuilder argument in this.arguments) {
TypeBuilder type = argument.subst(substitution);
if (type != argument) {
arguments ??= this.arguments.toList();
arguments[i] = type;
}
i++;
}
if (arguments != null) {
return new KernelNamedTypeBuilder(name, arguments)..bind(declaration);
}
}
return this;
}
KernelNamedTypeBuilder clone(List<TypeBuilder> newTypes) {
List<TypeBuilder> clonedArguments;
if (arguments != null) {
clonedArguments = new List<TypeBuilder>(arguments.length);
for (int i = 0; i < clonedArguments.length; i++) {
clonedArguments[i] = arguments[i].clone(newTypes);
}
}
KernelNamedTypeBuilder newType =
new KernelNamedTypeBuilder(name, clonedArguments);
newTypes.add(newType);
return newType;
}
}

View file

@ -92,7 +92,6 @@ import 'kernel_builder.dart'
KernelClassBuilder,
KernelFieldBuilder,
KernelLibraryBuilder,
KernelNamedTypeBuilder,
KernelProcedureBuilder,
LibraryBuilder,
NamedTypeBuilder,
@ -121,12 +120,11 @@ class KernelTarget extends TargetImplementation {
Component component;
final TypeBuilder dynamicType = new KernelNamedTypeBuilder("dynamic", null);
final TypeBuilder dynamicType = new NamedTypeBuilder("dynamic", null);
final NamedTypeBuilder objectType =
new KernelNamedTypeBuilder("Object", null);
final NamedTypeBuilder objectType = new NamedTypeBuilder("Object", null);
final TypeBuilder bottomType = new KernelNamedTypeBuilder("Null", null);
final TypeBuilder bottomType = new NamedTypeBuilder("Null", null);
bool get legacyMode => backendTarget.legacyMode;
@ -232,7 +230,7 @@ class KernelTarget extends TargetImplementation {
cls.implementedTypes.clear();
cls.supertype = null;
cls.mixedInType = null;
builder.supertype = new KernelNamedTypeBuilder("Object", null)
builder.supertype = new NamedTypeBuilder("Object", null)
..bind(objectClassBuilder);
builder.interfaces = null;
builder.mixedInType = null;
@ -373,9 +371,8 @@ class KernelTarget extends TargetImplementation {
Class cls = declaration.target;
if (cls != objectClass) {
cls.supertype ??= objectClass.asRawSupertype;
declaration.supertype ??=
new KernelNamedTypeBuilder("Object", null)
..bind(objectClassBuilder);
declaration.supertype ??= new NamedTypeBuilder("Object", null)
..bind(objectClassBuilder);
}
if (declaration.isMixinApplication) {
cls.mixedInType = declaration.mixedInType.buildMixedInType(

View file

@ -13,7 +13,7 @@ import 'kernel_builder.dart'
show
KernelClassBuilder,
KernelLibraryBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
LibraryBuilder,
TypeBuilder,
TypeVariableBuilder;
@ -74,7 +74,7 @@ class KernelTypeVariableBuilder
}
TypeBuilder asTypeBuilder() {
return new KernelNamedTypeBuilder(name, null)..bind(this);
return new NamedTypeBuilder(name, null)..bind(this);
}
void finish(LibraryBuilder library, KernelClassBuilder object,

View file

@ -31,7 +31,6 @@ import 'kernel_builder.dart'
FunctionTypeBuilder,
KernelClassBuilder,
KernelFormalParameterBuilder,
KernelNamedTypeBuilder,
KernelTypeAliasBuilder,
KernelTypeVariableBuilder,
NamedTypeBuilder,
@ -60,7 +59,7 @@ export 'package:kernel/src/bounds_checks.dart' show Variance;
// name matches that of the variable, it's interpreted as an occurrence of a
// type variable.
int computeVariance(KernelTypeVariableBuilder variable, TypeBuilder type) {
if (type is KernelNamedTypeBuilder) {
if (type is NamedTypeBuilder) {
TypeDeclarationBuilder declaration = type.declaration;
if (declaration == null || declaration is KernelTypeVariableBuilder) {
if (type.name == variable.name) {
@ -129,7 +128,7 @@ TypeBuilder substituteRange(
Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
Map<TypeVariableBuilder, TypeBuilder> lowerSubstitution,
{bool isCovariant = true}) {
if (type is KernelNamedTypeBuilder) {
if (type is NamedTypeBuilder) {
if (type.declaration is KernelTypeVariableBuilder) {
if (isCovariant) {
return upperSubstitution[type.declaration] ?? type;
@ -150,8 +149,7 @@ TypeBuilder substituteRange(
}
}
if (arguments != null) {
return new KernelNamedTypeBuilder(type.name, arguments)
..bind(type.declaration);
return new NamedTypeBuilder(type.name, arguments)..bind(type.declaration);
}
return type;
}
@ -344,11 +342,11 @@ class TypeVariablesGraph implements Graph<int> {
/// Finds all type builders for [variable] in [type].
///
/// Returns list of the found type builders.
List<NamedTypeBuilder<TypeBuilder, Object>> findVariableUsesInType(
List<NamedTypeBuilder> findVariableUsesInType(
TypeVariableBuilder<TypeBuilder, Object> variable,
TypeBuilder type,
) {
var uses = <NamedTypeBuilder<TypeBuilder, Object>>[];
var uses = <NamedTypeBuilder>[];
if (type is NamedTypeBuilder) {
if (type.declaration == variable) {
uses.add(type);
@ -393,9 +391,9 @@ List<Object> findInboundReferences(
List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
var variablesAndDependencies = <Object>[];
for (TypeVariableBuilder<TypeBuilder, Object> dependent in variables) {
var dependencies = <NamedTypeBuilder<TypeBuilder, Object>>[];
var dependencies = <NamedTypeBuilder>[];
for (TypeVariableBuilder<TypeBuilder, Object> dependence in variables) {
List<NamedTypeBuilder<TypeBuilder, Object>> uses =
List<NamedTypeBuilder> uses =
findVariableUsesInType(dependence, dependent.bound);
if (uses.length != 0) {
dependencies.addAll(uses);
@ -417,7 +415,7 @@ List<Object> findInboundReferences(
/// [findInboundReferences].
List<Object> findRawTypesWithInboundReferences(TypeBuilder type) {
var typesAndDependencies = <Object>[];
if (type is NamedTypeBuilder<TypeBuilder, Object>) {
if (type is NamedTypeBuilder) {
if (type.arguments == null) {
TypeDeclarationBuilder<TypeBuilder, Object> declaration =
type.declaration;
@ -522,17 +520,14 @@ List<Object> getInboundReferenceIssues(
List<Object> rawTypesAndMutualDependencies =
findRawTypesWithInboundReferences(variable.bound);
for (int i = 0; i < rawTypesAndMutualDependencies.length; i += 2) {
NamedTypeBuilder<TypeBuilder, Object> type =
rawTypesAndMutualDependencies[i];
NamedTypeBuilder type = rawTypesAndMutualDependencies[i];
List<Object> variablesAndDependencies =
rawTypesAndMutualDependencies[i + 1];
for (int j = 0; j < variablesAndDependencies.length; j += 2) {
TypeVariableBuilder<TypeBuilder, Object> dependent =
variablesAndDependencies[j];
List<NamedTypeBuilder<TypeBuilder, Object>> dependencies =
variablesAndDependencies[j + 1];
for (NamedTypeBuilder<TypeBuilder, Object> dependency
in dependencies) {
List<NamedTypeBuilder> dependencies = variablesAndDependencies[j + 1];
for (NamedTypeBuilder dependency in dependencies) {
issues.add(variable);
issues.add(templateBoundIssueViaRawTypeWithNonSimpleBounds
.withArguments(type.declaration.name));
@ -573,7 +568,7 @@ List<List<Object>> findRawTypePathsToDeclaration(
[Set<TypeDeclarationBuilder<TypeBuilder, Object>> visited]) {
visited ??= new Set<TypeDeclarationBuilder<TypeBuilder, Object>>.identity();
var paths = <List<Object>>[];
if (start is NamedTypeBuilder<TypeBuilder, Object>) {
if (start is NamedTypeBuilder) {
TypeDeclarationBuilder<TypeBuilder, Object> declaration = start.declaration;
if (start.arguments == null) {
if (start.declaration == end) {
@ -722,7 +717,7 @@ List<Object> convertRawTypeCyclesIntoIssues(
if (cycle.length == 2) {
// Loop.
TypeVariableBuilder<TypeBuilder, Object> variable = cycle[0];
NamedTypeBuilder<TypeBuilder, Object> type = cycle[1];
NamedTypeBuilder type = cycle[1];
issues.add(variable);
issues.add(templateBoundIssueViaLoopNonSimplicity
.withArguments(type.declaration.name));
@ -731,13 +726,13 @@ List<Object> convertRawTypeCyclesIntoIssues(
var context = <LocatedMessage>[];
for (int i = 0; i < cycle.length; i += 2) {
TypeVariableBuilder<TypeBuilder, Object> variable = cycle[i];
NamedTypeBuilder<TypeBuilder, Object> type = cycle[i + 1];
NamedTypeBuilder type = cycle[i + 1];
context.add(templateNonSimpleBoundViaReference
.withArguments(type.declaration.name)
.withLocation(
variable.fileUri, variable.charOffset, variable.name.length));
}
NamedTypeBuilder<TypeBuilder, Object> firstEncounteredType = cycle[1];
NamedTypeBuilder firstEncounteredType = cycle[1];
issues.add(declaration);
issues.add(templateBoundIssueViaCycleNonSimplicity.withArguments(
@ -796,7 +791,7 @@ List<Object> getNonSimplicityIssuesForDeclaration(
"${declaration.fileUri}:${declaration.name}";
String lexMinPathAndName = null;
for (int i = 1; i < cycle.length; i += 2) {
NamedTypeBuilder<TypeBuilder, Object> type = cycle[i];
NamedTypeBuilder type = cycle[i];
String pathAndName =
"${type.declaration.fileUri}:${type.declaration.name}";
if (lexMinPathAndName == null ||
@ -849,8 +844,7 @@ void findGenericFunctionTypes(TypeBuilder type, {List<TypeBuilder> result}) {
findGenericFunctionTypes(formal.type, result: result);
}
}
} else if (type is NamedTypeBuilder<TypeBuilder, Object> &&
type.arguments != null) {
} else if (type is NamedTypeBuilder && type.arguments != null) {
for (TypeBuilder argument in type.arguments) {
findGenericFunctionTypes(argument, result: result);
}

View file

@ -27,7 +27,7 @@ import '../kernel/kernel_builder.dart'
FunctionTypeBuilder,
KernelClassBuilder,
KernelFormalParameterBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
KernelTypeVariableBuilder,
LibraryBuilder,
TypeBuilder,
@ -51,13 +51,13 @@ class TypeBuilderComputer implements DartTypeVisitor<TypeBuilder> {
}
TypeBuilder visitDynamicType(DynamicType node) {
return new KernelNamedTypeBuilder("dynamic", null)
return new NamedTypeBuilder("dynamic", null)
..bind(new DynamicTypeBuilder<TypeBuilder, DartType>(
const DynamicType(), loader.coreLibrary, -1));
}
TypeBuilder visitVoidType(VoidType node) {
return new KernelNamedTypeBuilder("void", null)
return new NamedTypeBuilder("void", null)
..bind(new VoidTypeBuilder<TypeBuilder, VoidType>(
const VoidType(), loader.coreLibrary, -1));
}
@ -77,7 +77,7 @@ class TypeBuilderComputer implements DartTypeVisitor<TypeBuilder> {
arguments[i] = kernelArguments[i].accept(this);
}
}
return new KernelNamedTypeBuilder(cls.name, arguments)..bind(cls);
return new NamedTypeBuilder(cls.name, arguments)..bind(cls);
}
@override
@ -119,7 +119,7 @@ class TypeBuilderComputer implements DartTypeVisitor<TypeBuilder> {
Library kernelLibrary = kernelClass.enclosingLibrary;
LibraryBuilder<TypeBuilder, Library> library =
loader.builders[kernelLibrary.importUri];
return new KernelNamedTypeBuilder(parameter.name, null)
return new NamedTypeBuilder(parameter.name, null)
..bind(new KernelTypeVariableBuilder.fromKernel(parameter, library));
}

View file

@ -42,8 +42,8 @@ import '../ignored_parser_errors.dart' show isIgnoredParserError;
import '../kernel/kernel_builder.dart'
show
KernelMetadataBuilder,
KernelMixinApplicationBuilder,
KernelNamedTypeBuilder,
MixinApplicationBuilder,
NamedTypeBuilder,
TypeBuilder;
import '../modifier.dart'
@ -491,7 +491,7 @@ class OutlineBuilder extends StackListener {
void handleClassOrMixinImplements(
Token implementsKeyword, int interfacesCount) {
debugEvent("ClassOrMixinImplements");
push(const FixedNullableList<KernelNamedTypeBuilder>()
push(const FixedNullableList<NamedTypeBuilder>()
.pop(stack, interfacesCount) ??
NullValue.TypeBuilderList);
}
@ -520,8 +520,7 @@ class OutlineBuilder extends StackListener {
@override
void handleMixinOn(Token onKeyword, int typeCount) {
debugEvent("handleMixinOn");
push(const FixedNullableList<KernelNamedTypeBuilder>()
.pop(stack, typeCount) ??
push(const FixedNullableList<NamedTypeBuilder>().pop(stack, typeCount) ??
new ParserRecovery(offsetForToken(onKeyword)));
}
@ -590,7 +589,7 @@ class OutlineBuilder extends StackListener {
if (supertypeConstraints.length == 1) {
supertype = supertypeConstraints.first;
} else {
supertype = new KernelMixinApplicationBuilder(
supertype = new MixinApplicationBuilder(
supertypeConstraints.first, supertypeConstraints.skip(1).toList());
}
}
@ -1050,7 +1049,7 @@ class OutlineBuilder extends StackListener {
@override
void endTypeList(int count) {
debugEvent("TypeList");
push(const FixedNullableList<KernelNamedTypeBuilder>().pop(stack, count) ??
push(const FixedNullableList<NamedTypeBuilder>().pop(stack, count) ??
new ParserRecovery(-1));
}

View file

@ -32,7 +32,7 @@ import '../kernel/kernel_builder.dart'
KernelFunctionBuilder,
KernelInvalidTypeBuilder,
KernelLibraryBuilder,
KernelNamedTypeBuilder,
NamedTypeBuilder,
TypeBuilder,
KernelTypeVariableBuilder,
LibraryBuilder,
@ -163,14 +163,13 @@ class SourceClassBuilder extends KernelClassBuilder
fileUri);
actualCls.supertype = null;
}
if (actualCls.supertype == null && supertype is! KernelNamedTypeBuilder) {
if (actualCls.supertype == null && supertype is! NamedTypeBuilder) {
supertype = null;
}
mixedInType = checkSupertype(mixedInType);
actualCls.mixedInType =
mixedInType?.buildMixedInType(library, charOffset, fileUri);
if (actualCls.mixedInType == null &&
mixedInType is! KernelNamedTypeBuilder) {
if (actualCls.mixedInType == null && mixedInType is! NamedTypeBuilder) {
mixedInType = null;
}
actualCls.isMixinDeclaration = isMixinDeclaration;
@ -259,7 +258,7 @@ class SourceClassBuilder extends KernelClassBuilder
}
}
if (message != null) {
return new KernelNamedTypeBuilder(supertype.name, null)
return new NamedTypeBuilder(supertype.name, null)
..bind(new KernelInvalidTypeBuilder(supertype.name,
message.withLocation(fileUri, charOffset, noLength)));
}

View file

@ -657,7 +657,7 @@ abstract class SourceLibraryBuilder<T extends TypeBuilder, R>
/// Used to add implementation builder during the call to [build] above.
/// Currently, only anonymous mixins are using implementation builders (see
/// [KernelMixinApplicationBuilder]
/// [MixinApplicationBuilder]
/// (../kernel/kernel_mixin_application_builder.dart)).
void addImplementationBuilder(
String name, Declaration declaration, int charOffset) {

View file

@ -670,7 +670,7 @@ class SourceLoader extends Loader<Library> {
bool isClassBuilder = false;
if (mixedInType is NamedTypeBuilder) {
var builder = mixedInType.declaration;
if (builder is ClassBuilder) {
if (builder is ClassBuilder<TypeBuilder, DartType>) {
isClassBuilder = true;
for (Declaration constructory in builder.constructors.local.values) {
if (constructory.isConstructor && !constructory.isSynthetic) {