[cfe] Remove UnresolvedType
All NamedTypeBuilder objects from user code contain the needed file uri and char offset. Change-Id: Ia067c5ef740967302aa207eaf2d46fc2f75c1c8f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/215600 Reviewed-by: Jens Johansen <jensj@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
committed by
commit-bot@chromium.org
parent
1d28bf98da
commit
3171c7cc0e
@@ -65,11 +65,11 @@ enum NullValue {
|
||||
Token,
|
||||
Type,
|
||||
TypeArguments,
|
||||
TypeBuilder,
|
||||
TypeBuilderList,
|
||||
TypeList,
|
||||
TypeVariable,
|
||||
TypeVariables,
|
||||
UnresolvedType,
|
||||
VarFinalOrConstToken,
|
||||
WithClause,
|
||||
}
|
||||
@@ -377,7 +377,7 @@ abstract class StackListener extends Listener {
|
||||
@override
|
||||
void handleNoType(Token lastConsumed) {
|
||||
debugEvent("NoType");
|
||||
push(NullValue.UnresolvedType);
|
||||
push(NullValue.TypeBuilder);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -7,6 +7,7 @@ import 'package:kernel/ast.dart';
|
||||
import '../problems.dart';
|
||||
import '../source/source_library_builder.dart';
|
||||
import 'library_builder.dart';
|
||||
import 'named_type_builder.dart';
|
||||
import 'nullability_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
|
||||
@@ -21,7 +22,7 @@ class FixedTypeBuilder extends TypeBuilder {
|
||||
|
||||
@override
|
||||
TypeBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration) {
|
||||
return this;
|
||||
|
||||
@@ -42,6 +42,7 @@ import 'field_builder.dart';
|
||||
import 'library_builder.dart';
|
||||
import 'metadata_builder.dart';
|
||||
import 'modifier_builder.dart';
|
||||
import 'named_type_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
import 'variable_builder.dart';
|
||||
|
||||
@@ -150,7 +151,7 @@ class FormalParameterBuilder extends ModifierBuilderImpl
|
||||
}
|
||||
|
||||
FormalParameterBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration) {
|
||||
// TODO(dmitryas): It's not clear how [metadata] is used currently, and
|
||||
|
||||
@@ -20,6 +20,7 @@ import '../source/source_library_builder.dart';
|
||||
|
||||
import 'formal_parameter_builder.dart';
|
||||
import 'library_builder.dart';
|
||||
import 'named_type_builder.dart';
|
||||
import 'nullability_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
import 'type_variable_builder.dart';
|
||||
@@ -137,7 +138,7 @@ class FunctionTypeBuilder extends TypeBuilder {
|
||||
|
||||
@override
|
||||
FunctionTypeBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration) {
|
||||
List<TypeVariableBuilder>? clonedTypeVariables;
|
||||
@@ -153,15 +154,13 @@ class FunctionTypeBuilder extends TypeBuilder {
|
||||
return formal.clone(newTypes, contextLibrary, contextDeclaration);
|
||||
}, growable: false);
|
||||
}
|
||||
FunctionTypeBuilder newType = new FunctionTypeBuilder(
|
||||
return new FunctionTypeBuilder(
|
||||
returnType?.clone(newTypes, contextLibrary, contextDeclaration),
|
||||
clonedTypeVariables,
|
||||
clonedFormals,
|
||||
nullabilityBuilder,
|
||||
fileUri,
|
||||
charOffset);
|
||||
newTypes.add(newType);
|
||||
return newType;
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -10,6 +10,7 @@ import '../problems.dart' show unsupported;
|
||||
import '../source/source_library_builder.dart';
|
||||
|
||||
import 'library_builder.dart';
|
||||
import 'named_type_builder.dart';
|
||||
import 'nullability_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
import 'type_variable_builder.dart';
|
||||
@@ -82,7 +83,7 @@ class MixinApplicationBuilder extends TypeBuilder {
|
||||
|
||||
@override
|
||||
MixinApplicationBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration) {
|
||||
int charOffset = -1; // TODO(dmitryas): Provide these.
|
||||
|
||||
@@ -507,7 +507,7 @@ class NamedTypeBuilder extends TypeBuilder {
|
||||
|
||||
@override
|
||||
NamedTypeBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration) {
|
||||
List<TypeBuilder>? clonedArguments;
|
||||
|
||||
@@ -9,6 +9,7 @@ import 'package:kernel/ast.dart' show DartType, Supertype, TypedefType;
|
||||
import '../scope.dart';
|
||||
import '../source/source_library_builder.dart';
|
||||
import 'library_builder.dart';
|
||||
import 'named_type_builder.dart';
|
||||
import 'nullability_builder.dart';
|
||||
import 'type_declaration_builder.dart';
|
||||
import 'type_variable_builder.dart';
|
||||
@@ -62,7 +63,7 @@ abstract class TypeBuilder {
|
||||
/// are added to [newTypes], so that they can be added to a proper scope and
|
||||
/// resolved later.
|
||||
TypeBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration);
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import 'declaration_builder.dart';
|
||||
import 'library_builder.dart';
|
||||
import 'member_builder.dart';
|
||||
import 'metadata_builder.dart';
|
||||
import 'named_type_builder.dart';
|
||||
import 'nullability_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
import 'type_declaration_builder.dart';
|
||||
@@ -185,7 +186,7 @@ class TypeVariableBuilder extends TypeDeclarationBuilderImpl {
|
||||
}
|
||||
|
||||
TypeVariableBuilder clone(
|
||||
List<TypeBuilder> newTypes,
|
||||
List<NamedTypeBuilder> newTypes,
|
||||
SourceLibraryBuilder contextLibrary,
|
||||
TypeParameterScopeBuilder contextDeclaration) {
|
||||
// TODO(dmitryas): Figure out if using [charOffset] here is a good idea.
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
// 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.
|
||||
|
||||
library fasta.unresolved_type;
|
||||
|
||||
import '../scope.dart';
|
||||
|
||||
import 'library_builder.dart';
|
||||
import 'type_builder.dart';
|
||||
|
||||
/// A wrapper around a type that is yet to be resolved.
|
||||
class UnresolvedType {
|
||||
final TypeBuilder builder;
|
||||
final int charOffset;
|
||||
final Uri fileUri;
|
||||
|
||||
UnresolvedType(this.builder, this.charOffset, this.fileUri);
|
||||
|
||||
void resolveIn(Scope scope, LibraryBuilder library) {
|
||||
builder.resolveIn(scope, charOffset, fileUri, library);
|
||||
}
|
||||
|
||||
/// Performs checks on the type after it's resolved.
|
||||
void checkType(LibraryBuilder library) {
|
||||
return builder.check(library, charOffset, fileUri);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() => "UnresolvedType(@$charOffset, $builder)";
|
||||
}
|
||||
@@ -71,7 +71,6 @@ import '../builder/type_alias_builder.dart';
|
||||
import '../builder/type_builder.dart';
|
||||
import '../builder/type_declaration_builder.dart';
|
||||
import '../builder/type_variable_builder.dart';
|
||||
import '../builder/unresolved_type.dart';
|
||||
import '../builder/variable_builder.dart';
|
||||
import '../builder/void_type_declaration_builder.dart';
|
||||
|
||||
@@ -868,7 +867,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
// not calling [buildDartType] leads to a missing compile-time
|
||||
// error. Also, notice that the type of the problematic field isn't
|
||||
// `invalid-type`.
|
||||
UnresolvedType? type = pop() as UnresolvedType?;
|
||||
TypeBuilder? type = pop() as TypeBuilder?;
|
||||
if (type != null) {
|
||||
buildDartType(type, allowPotentiallyConstantType: false);
|
||||
}
|
||||
@@ -1851,7 +1850,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
]));
|
||||
debugEvent("Send");
|
||||
Object? arguments = pop();
|
||||
List<UnresolvedType>? typeArguments = pop() as List<UnresolvedType>?;
|
||||
List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
|
||||
Object receiver = pop()!;
|
||||
// Delay adding [typeArguments] to [forest] for type aliases: They
|
||||
// must be unaliased to the type arguments of the denoted type.
|
||||
@@ -1901,11 +1900,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
|
||||
@override
|
||||
Expression_Generator_Initializer finishSend(
|
||||
Object receiver,
|
||||
List<UnresolvedType>? typeArguments,
|
||||
ArgumentsImpl arguments,
|
||||
int charOffset,
|
||||
Expression_Generator_Initializer finishSend(Object receiver,
|
||||
List<TypeBuilder>? typeArguments, ArgumentsImpl arguments, int charOffset,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (receiver is Generator) {
|
||||
return receiver.doInvocation(charOffset, typeArguments, arguments,
|
||||
@@ -3030,8 +3026,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
if (!libraryBuilder.isNonNullableByDefault) {
|
||||
reportNonNullableModifierError(lateToken);
|
||||
}
|
||||
UnresolvedType? unresolvedType =
|
||||
pop(NullValue.UnresolvedType) as UnresolvedType?;
|
||||
TypeBuilder? unresolvedType = pop(NullValue.TypeBuilder) as TypeBuilder?;
|
||||
DartType? type = unresolvedType != null
|
||||
? buildDartType(unresolvedType, allowPotentiallyConstantType: false)
|
||||
: null;
|
||||
@@ -3464,7 +3459,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
}
|
||||
|
||||
List<UnresolvedType>? typeArguments = pop() as List<UnresolvedType>?;
|
||||
List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
|
||||
|
||||
DartType typeArgument;
|
||||
if (typeArguments != null) {
|
||||
@@ -3496,7 +3491,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
push(node);
|
||||
}
|
||||
|
||||
void buildLiteralSet(List<UnresolvedType>? typeArguments, Token? constKeyword,
|
||||
void buildLiteralSet(List<TypeBuilder>? typeArguments, Token? constKeyword,
|
||||
Token leftBrace, List<dynamic>? setOrMapEntries) {
|
||||
DartType typeArgument;
|
||||
if (typeArguments != null) {
|
||||
@@ -3565,7 +3560,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
setOrMapEntries[i] = toValue(elem);
|
||||
}
|
||||
}
|
||||
List<UnresolvedType>? typeArguments = pop() as List<UnresolvedType>?;
|
||||
List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
|
||||
|
||||
// Replicate existing behavior that has been removed from the parser.
|
||||
// This will be removed once unified collections is implemented.
|
||||
@@ -3632,7 +3627,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
push(forest.createNullLiteral(offsetForToken(token)));
|
||||
}
|
||||
|
||||
void buildLiteralMap(List<UnresolvedType>? typeArguments, Token? constKeyword,
|
||||
void buildLiteralMap(List<TypeBuilder>? typeArguments, Token? constKeyword,
|
||||
Token leftBrace, List<MapLiteralEntry> entries) {
|
||||
DartType keyType;
|
||||
DartType valueType;
|
||||
@@ -3740,7 +3735,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
reportErrorIfNullableType(questionMark);
|
||||
}
|
||||
bool isMarkedAsNullable = questionMark != null;
|
||||
List<UnresolvedType>? arguments = pop() as List<UnresolvedType>?;
|
||||
List<TypeBuilder>? arguments = pop() as List<TypeBuilder>?;
|
||||
Object? name = pop();
|
||||
if (name is QualifiedName) {
|
||||
QualifiedName qualified = name;
|
||||
@@ -3755,19 +3750,16 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
Message message = fasta.templateNotAType.withArguments(displayName);
|
||||
libraryBuilder.addProblem(
|
||||
message, offset, lengthOfSpan(beginToken, suffix), uri);
|
||||
push(new UnresolvedType(
|
||||
new NamedTypeBuilder.fromTypeDeclarationBuilder(
|
||||
new InvalidTypeDeclarationBuilder(
|
||||
name,
|
||||
message.withLocation(
|
||||
uri, offset, lengthOfSpan(beginToken, suffix))),
|
||||
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable),
|
||||
fileUri: uri,
|
||||
charOffset: offset,
|
||||
instanceTypeVariableAccess:
|
||||
InstanceTypeVariableAccessState.Unexpected),
|
||||
offset,
|
||||
uri));
|
||||
push(new NamedTypeBuilder.fromTypeDeclarationBuilder(
|
||||
new InvalidTypeDeclarationBuilder(
|
||||
name,
|
||||
message.withLocation(
|
||||
uri, offset, lengthOfSpan(beginToken, suffix))),
|
||||
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable),
|
||||
fileUri: uri,
|
||||
charOffset: offset,
|
||||
instanceTypeVariableAccess:
|
||||
InstanceTypeVariableAccessState.Unexpected));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -3808,7 +3800,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
unhandled(
|
||||
"${name.runtimeType}", "handleType", beginToken.charOffset, uri);
|
||||
}
|
||||
push(new UnresolvedType(result, beginToken.charOffset, uri));
|
||||
push(result);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -3842,7 +3834,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
reportErrorIfNullableType(questionMark);
|
||||
}
|
||||
FormalParameters formals = pop() as FormalParameters;
|
||||
UnresolvedType? returnType = pop() as UnresolvedType?;
|
||||
TypeBuilder? returnType = pop() as TypeBuilder?;
|
||||
List<TypeVariableBuilder>? typeVariables =
|
||||
pop() as List<TypeVariableBuilder>?;
|
||||
if (typeVariables != null) {
|
||||
@@ -3858,7 +3850,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
}
|
||||
}
|
||||
UnresolvedType type = formals.toFunctionType(
|
||||
TypeBuilder type = formals.toFunctionType(
|
||||
returnType,
|
||||
libraryBuilder.nullableBuilderIfTrue(questionMark != null),
|
||||
typeVariables);
|
||||
@@ -3871,17 +3863,14 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
debugEvent("VoidKeyword");
|
||||
int offset = offsetForToken(token);
|
||||
// "void" is always nullable.
|
||||
push(new UnresolvedType(
|
||||
new NamedTypeBuilder.fromTypeDeclarationBuilder(
|
||||
new VoidTypeDeclarationBuilder(
|
||||
const VoidType(), libraryBuilder, offset),
|
||||
const NullabilityBuilder.nullable(),
|
||||
fileUri: uri,
|
||||
charOffset: offset,
|
||||
instanceTypeVariableAccess:
|
||||
InstanceTypeVariableAccessState.Unexpected),
|
||||
offset,
|
||||
uri));
|
||||
push(new NamedTypeBuilder.fromTypeDeclarationBuilder(
|
||||
new VoidTypeDeclarationBuilder(
|
||||
const VoidType(), libraryBuilder, offset),
|
||||
const NullabilityBuilder.nullable(),
|
||||
fileUri: uri,
|
||||
charOffset: offset,
|
||||
instanceTypeVariableAccess:
|
||||
InstanceTypeVariableAccessState.Unexpected));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -3908,7 +3897,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
@override
|
||||
void handleAsOperator(Token operator) {
|
||||
debugEvent("AsOperator");
|
||||
DartType type = buildDartType(pop() as UnresolvedType,
|
||||
DartType type = buildDartType(pop() as TypeBuilder,
|
||||
allowPotentiallyConstantType: libraryBuilder.isNonNullableByDefault);
|
||||
libraryBuilder.checkBoundsInType(
|
||||
type, typeEnvironment, uri, operator.charOffset);
|
||||
@@ -3932,7 +3921,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
@override
|
||||
void handleIsOperator(Token isOperator, Token? not) {
|
||||
debugEvent("IsOperator");
|
||||
DartType type = buildDartType(pop() as UnresolvedType,
|
||||
DartType type = buildDartType(pop() as TypeBuilder,
|
||||
allowPotentiallyConstantType: libraryBuilder.isNonNullableByDefault);
|
||||
Expression operand = popForValue();
|
||||
Expression isExpression = forest.createIsExpression(
|
||||
@@ -4025,7 +4014,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
}
|
||||
Object? nameNode = pop();
|
||||
UnresolvedType? type = pop() as UnresolvedType?;
|
||||
TypeBuilder? type = pop() as TypeBuilder?;
|
||||
if (functionNestingLevel == 0 && type != null) {
|
||||
// TODO(ahe): The type we compute here may be different from what is
|
||||
// computed in the outline phase. We should make sure that the outline
|
||||
@@ -4059,7 +4048,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
parameter = new FormalParameterBuilder(null, modifiers, type?.builder,
|
||||
parameter = new FormalParameterBuilder(null, modifiers, type,
|
||||
name?.name ?? '', libraryBuilder, offsetForToken(nameToken),
|
||||
fileUri: uri)
|
||||
..hasDeclaredInitializer = (initializerStart != null);
|
||||
@@ -4134,13 +4123,13 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
exitLocalScope();
|
||||
}
|
||||
FormalParameters formals = pop() as FormalParameters;
|
||||
UnresolvedType? returnType = pop() as UnresolvedType?;
|
||||
TypeBuilder? returnType = pop() as TypeBuilder?;
|
||||
List<TypeVariableBuilder>? typeVariables =
|
||||
pop() as List<TypeVariableBuilder>?;
|
||||
if (!libraryBuilder.isNonNullableByDefault) {
|
||||
reportErrorIfNullableType(question);
|
||||
}
|
||||
UnresolvedType type = formals.toFunctionType(returnType,
|
||||
TypeBuilder type = formals.toFunctionType(returnType,
|
||||
libraryBuilder.nullableBuilderIfTrue(question != null), typeVariables);
|
||||
exitLocalScope();
|
||||
push(type);
|
||||
@@ -4237,8 +4226,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
FormalParameters? catchParameters =
|
||||
popIfNotNull(catchKeyword) as FormalParameters?;
|
||||
UnresolvedType? unresolvedExceptionType =
|
||||
popIfNotNull(onKeyword) as UnresolvedType?;
|
||||
TypeBuilder? unresolvedExceptionType =
|
||||
popIfNotNull(onKeyword) as TypeBuilder?;
|
||||
DartType exceptionType;
|
||||
if (unresolvedExceptionType != null) {
|
||||
exceptionType = buildDartType(unresolvedExceptionType,
|
||||
@@ -4498,7 +4487,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
|
||||
Identifier? identifier;
|
||||
List<UnresolvedType>? typeArguments = pop() as List<UnresolvedType>?;
|
||||
List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
|
||||
Object? type = pop();
|
||||
if (type is QualifiedName) {
|
||||
identifier = type;
|
||||
@@ -4888,7 +4877,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
Identifier? nameLastIdentifier = pop(NullValue.Identifier) as Identifier?;
|
||||
Token nameLastToken = nameLastIdentifier?.token ?? nameToken;
|
||||
String name = pop() as String;
|
||||
List<UnresolvedType>? typeArguments = pop() as List<UnresolvedType>?;
|
||||
List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
|
||||
if (inMetadata && typeArguments != null) {
|
||||
if (!libraryBuilder.enableGenericMetadataInLibrary) {
|
||||
handleRecoverableError(fasta.messageMetadataTypeArguments,
|
||||
@@ -4935,7 +4924,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
@override
|
||||
Expression createInstantiationAndInvocation(
|
||||
Expression Function() receiverFunction,
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String className,
|
||||
String constructorName,
|
||||
Arguments arguments,
|
||||
@@ -4985,7 +4974,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
Token nameLastToken,
|
||||
Arguments? arguments,
|
||||
String name,
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
int charOffset,
|
||||
Constness constness,
|
||||
{bool isTypeArgumentsInForest = false,
|
||||
@@ -5026,8 +5015,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
usedAsClassFileUri: uri);
|
||||
List<TypeBuilder> typeArgumentBuilders = [];
|
||||
if (typeArguments != null) {
|
||||
for (UnresolvedType unresolvedType in typeArguments) {
|
||||
typeArgumentBuilders.add(unresolvedType.builder);
|
||||
for (TypeBuilder typeBuilder in typeArguments) {
|
||||
typeArgumentBuilders.add(typeBuilder);
|
||||
}
|
||||
} else {
|
||||
if (aliasBuilder.typeVariablesCount > 0) {
|
||||
@@ -5397,8 +5386,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
@override
|
||||
void endTypeArguments(int count, Token beginToken, Token endToken) {
|
||||
debugEvent("TypeArguments");
|
||||
push(const FixedNullableList<UnresolvedType>()
|
||||
.popNonNullable(stack, count, dummyUnresolvedType) ??
|
||||
push(const FixedNullableList<TypeBuilder>()
|
||||
.popNonNullable(stack, count, dummyTypeBuilder) ??
|
||||
NullValue.TypeArguments);
|
||||
}
|
||||
|
||||
@@ -5562,7 +5551,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
exitLocalScope();
|
||||
FormalParameters formals = pop() as FormalParameters;
|
||||
Object? declaration = pop();
|
||||
UnresolvedType? returnType = pop() as UnresolvedType?;
|
||||
TypeBuilder? returnType = pop() as TypeBuilder?;
|
||||
bool hasImplicitReturnType = returnType == null;
|
||||
exitFunction();
|
||||
List<TypeVariableBuilder>? typeParameters =
|
||||
@@ -6475,13 +6464,13 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
void endTypeVariable(
|
||||
Token token, int index, Token? extendsOrSuper, Token? variance) {
|
||||
debugEvent("TypeVariable");
|
||||
UnresolvedType? bound = pop() as UnresolvedType?;
|
||||
TypeBuilder? bound = pop() as TypeBuilder?;
|
||||
// Peek to leave type parameters on top of stack.
|
||||
List<TypeVariableBuilder> typeVariables =
|
||||
peek() as List<TypeVariableBuilder>;
|
||||
|
||||
TypeVariableBuilder variable = typeVariables[index];
|
||||
variable.bound = bound?.builder;
|
||||
variable.bound = bound;
|
||||
if (variance != null) {
|
||||
if (!libraryBuilder.enableVarianceInLibrary) {
|
||||
reportVarianceModifierNotEnabled(variance);
|
||||
@@ -6845,8 +6834,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
ValueKinds.TypeArguments,
|
||||
unionOfKinds([ValueKinds.Generator, ValueKinds.Expression])
|
||||
]));
|
||||
List<UnresolvedType>? typeArguments =
|
||||
pop() as List<UnresolvedType>?; // typeArguments
|
||||
List<TypeBuilder>? typeArguments =
|
||||
pop() as List<TypeBuilder>?; // typeArguments
|
||||
if (libraryBuilder.enableConstructorTearOffsInLibrary) {
|
||||
Object? operand = pop();
|
||||
if (operand is Generator) {
|
||||
@@ -6877,18 +6866,16 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
|
||||
@override
|
||||
UnresolvedType validateTypeVariableUse(UnresolvedType unresolved,
|
||||
TypeBuilder validateTypeVariableUse(TypeBuilder typeBuilder,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
// ignore: unnecessary_null_comparison
|
||||
assert(allowPotentiallyConstantType != null);
|
||||
_validateTypeVariableUseInternal(
|
||||
unresolved.builder, unresolved.fileUri, unresolved.charOffset,
|
||||
_validateTypeVariableUseInternal(typeBuilder,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType);
|
||||
return unresolved;
|
||||
return typeBuilder;
|
||||
}
|
||||
|
||||
void _validateTypeVariableUseInternal(
|
||||
TypeBuilder? builder, Uri fileUri, int charOffset,
|
||||
void _validateTypeVariableUseInternal(TypeBuilder? builder,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
// ignore: unnecessary_null_comparison
|
||||
assert(allowPotentiallyConstantType != null);
|
||||
@@ -6906,7 +6893,9 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
!allowPotentiallyConstantType)) {
|
||||
LocatedMessage message =
|
||||
fasta.messageTypeVariableInConstantContext.withLocation(
|
||||
fileUri, charOffset, typeParameter.name!.length);
|
||||
builder.fileUri!,
|
||||
builder.charOffset!,
|
||||
typeParameter.name!.length);
|
||||
builder.bind(new InvalidTypeDeclarationBuilder(
|
||||
typeParameter.name!, message));
|
||||
addProblem(
|
||||
@@ -6921,9 +6910,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
// which seems like an odd prioritization.
|
||||
// TODO: Handle this case.
|
||||
LocatedMessage message = fasta.messageTypeVariableInStaticContext
|
||||
.withLocation(
|
||||
builder.fileUri ?? fileUri,
|
||||
builder.charOffset ?? charOffset,
|
||||
.withLocation(builder.fileUri!, builder.charOffset!,
|
||||
typeParameter.name!.length);
|
||||
builder.bind(new InvalidTypeDeclarationBuilder(
|
||||
typeParameter.name!, message));
|
||||
@@ -6941,21 +6928,17 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
if (builder.arguments != null) {
|
||||
for (TypeBuilder typeBuilder in builder.arguments!) {
|
||||
_validateTypeVariableUseInternal(
|
||||
typeBuilder,
|
||||
typeBuilder.fileUri ?? fileUri,
|
||||
typeBuilder.charOffset ?? charOffset,
|
||||
_validateTypeVariableUseInternal(typeBuilder,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType);
|
||||
}
|
||||
}
|
||||
} else if (builder is FunctionTypeBuilder) {
|
||||
_validateTypeVariableUseInternal(builder.returnType, fileUri, charOffset,
|
||||
_validateTypeVariableUseInternal(builder.returnType,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType);
|
||||
if (builder.formals != null) {
|
||||
for (FormalParameterBuilder formalParameterBuilder
|
||||
in builder.formals!) {
|
||||
_validateTypeVariableUseInternal(
|
||||
formalParameterBuilder.type, fileUri, charOffset,
|
||||
_validateTypeVariableUseInternal(formalParameterBuilder.type,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType);
|
||||
}
|
||||
}
|
||||
@@ -7117,25 +7100,23 @@ class BodyBuilder extends ScopeListener<JumpTarget>
|
||||
}
|
||||
|
||||
@override
|
||||
DartType buildDartType(UnresolvedType unresolvedType,
|
||||
DartType buildDartType(TypeBuilder typeBuilder,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
return validateTypeVariableUse(unresolvedType,
|
||||
return validateTypeVariableUse(typeBuilder,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType)
|
||||
.builder
|
||||
.build(libraryBuilder);
|
||||
}
|
||||
|
||||
@override
|
||||
DartType buildTypeLiteralDartType(UnresolvedType unresolvedType,
|
||||
DartType buildTypeLiteralDartType(TypeBuilder typeBuilder,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
return validateTypeVariableUse(unresolvedType,
|
||||
return validateTypeVariableUse(typeBuilder,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType)
|
||||
.builder
|
||||
.buildTypeLiteralType(libraryBuilder);
|
||||
}
|
||||
|
||||
@override
|
||||
List<DartType> buildDartTypeArguments(List<UnresolvedType>? unresolvedTypes,
|
||||
List<DartType> buildDartTypeArguments(List<TypeBuilder>? unresolvedTypes,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
if (unresolvedTypes == null) return <DartType>[];
|
||||
return new List<DartType>.generate(
|
||||
@@ -7363,14 +7344,13 @@ class FormalParameters {
|
||||
|
||||
FunctionNode buildFunctionNode(
|
||||
SourceLibraryBuilder library,
|
||||
UnresolvedType? returnType,
|
||||
TypeBuilder? returnType,
|
||||
List<TypeVariableBuilder>? typeParameters,
|
||||
AsyncMarker asyncModifier,
|
||||
Statement body,
|
||||
int fileEndOffset) {
|
||||
FunctionType type = toFunctionType(
|
||||
returnType, const NullabilityBuilder.omitted(), typeParameters)
|
||||
.builder
|
||||
.build(library) as FunctionType;
|
||||
List<VariableDeclaration> positionalParameters = <VariableDeclaration>[];
|
||||
List<VariableDeclaration> namedParameters = <VariableDeclaration>[];
|
||||
@@ -7397,14 +7377,11 @@ class FormalParameters {
|
||||
..fileEndOffset = fileEndOffset;
|
||||
}
|
||||
|
||||
UnresolvedType toFunctionType(
|
||||
UnresolvedType? returnType, NullabilityBuilder nullabilityBuilder,
|
||||
TypeBuilder toFunctionType(
|
||||
TypeBuilder? returnType, NullabilityBuilder nullabilityBuilder,
|
||||
[List<TypeVariableBuilder>? typeParameters]) {
|
||||
return new UnresolvedType(
|
||||
new FunctionTypeBuilder(returnType?.builder, typeParameters, parameters,
|
||||
nullabilityBuilder, uri, charOffset),
|
||||
charOffset,
|
||||
uri);
|
||||
return new FunctionTypeBuilder(returnType, typeParameters, parameters,
|
||||
nullabilityBuilder, uri, charOffset);
|
||||
}
|
||||
|
||||
Scope computeFormalParameterScope(
|
||||
|
||||
@@ -27,7 +27,6 @@ import '../builder/type_alias_builder.dart';
|
||||
import '../builder/type_builder.dart';
|
||||
import '../builder/type_declaration_builder.dart';
|
||||
import '../builder/type_variable_builder.dart';
|
||||
import '../builder/unresolved_type.dart';
|
||||
|
||||
import '../constant_context.dart' show ConstantContext;
|
||||
|
||||
@@ -217,7 +216,7 @@ abstract class Generator {
|
||||
/// If the invocation has explicit type arguments
|
||||
/// [buildTypeWithResolvedArguments] called instead.
|
||||
Expression_Generator_Initializer doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, ArgumentsImpl arguments,
|
||||
{bool isTypeArgumentsInForest = false});
|
||||
|
||||
Expression_Generator buildSelectorAccess(
|
||||
@@ -258,7 +257,7 @@ abstract class Generator {
|
||||
}
|
||||
|
||||
Expression_Generator applyTypeArguments(
|
||||
int fileOffset, List<UnresolvedType>? typeArguments) {
|
||||
int fileOffset, List<TypeBuilder>? typeArguments) {
|
||||
return new Instantiation(
|
||||
buildSimpleRead(),
|
||||
_helper.buildDartTypeArguments(typeArguments,
|
||||
@@ -272,7 +271,7 @@ abstract class Generator {
|
||||
/// The type arguments have not been resolved and should be resolved to
|
||||
/// create a [TypeBuilder] for a valid type.
|
||||
TypeBuilder buildTypeWithResolvedArguments(
|
||||
NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
|
||||
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
// TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
|
||||
NamedTypeBuilder result = new NamedTypeBuilder(
|
||||
@@ -295,7 +294,7 @@ abstract class Generator {
|
||||
}
|
||||
|
||||
Expression invokeConstructor(
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String name,
|
||||
Arguments arguments,
|
||||
Token nameToken,
|
||||
@@ -413,7 +412,7 @@ class VariableUseGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.forest.createExpressionInvocation(
|
||||
adjustForImplicitCall(_plainNameForRead, offset),
|
||||
@@ -475,7 +474,7 @@ class PropertyAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.buildMethodInvocation(receiver, name, arguments, offset);
|
||||
}
|
||||
@@ -705,7 +704,7 @@ class ThisPropertyAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.buildMethodInvocation(
|
||||
_forest.createThisExpression(fileOffset), name, arguments, offset);
|
||||
@@ -813,7 +812,7 @@ class NullAwarePropertyAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return unsupported("doInvocation", offset, _uri);
|
||||
}
|
||||
@@ -920,7 +919,7 @@ class SuperPropertyAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (_helper.constantContext != ConstantContext.none) {
|
||||
// TODO(brianwilkerson) Fix the length
|
||||
@@ -1083,7 +1082,7 @@ class IndexedAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.forest.createExpressionInvocation(
|
||||
arguments.fileOffset, buildSimpleRead(), arguments);
|
||||
@@ -1206,7 +1205,7 @@ class ThisIndexedAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.forest
|
||||
.createExpressionInvocation(offset, buildSimpleRead(), arguments);
|
||||
@@ -1311,7 +1310,7 @@ class SuperIndexedAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.forest
|
||||
.createExpressionInvocation(offset, buildSimpleRead(), arguments);
|
||||
@@ -1502,7 +1501,7 @@ class StaticAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (_helper.constantContext != ConstantContext.none &&
|
||||
!_helper.isIdentical(readTarget) &&
|
||||
@@ -1775,7 +1774,7 @@ class ExtensionInstanceAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, ArgumentsImpl arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (invokeTarget != null) {
|
||||
return _helper.buildExtensionMethodInvocation(
|
||||
@@ -2185,7 +2184,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
VariableDeclarationImpl? receiverVariable;
|
||||
Expression receiverExpression = receiver;
|
||||
@@ -2506,7 +2505,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.forest
|
||||
.createExpressionInvocation(offset, buildSimpleRead(), arguments);
|
||||
@@ -2678,7 +2677,7 @@ class ExplicitExtensionAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression_Generator_Initializer doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, ArgumentsImpl arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
Generator generator = _createInstanceAccess(token, callName);
|
||||
return generator.doInvocation(offset, typeArguments, arguments,
|
||||
@@ -2792,7 +2791,7 @@ class LoadLibraryGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (_forest.argumentsPositional(arguments).length > 0 ||
|
||||
_forest.argumentsNamed(arguments).length > 0) {
|
||||
@@ -2902,7 +2901,7 @@ class DeferredAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
TypeBuilder buildTypeWithResolvedArguments(
|
||||
NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
|
||||
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
String name = "${prefixGenerator._plainNameForRead}."
|
||||
"${suffixGenerator._plainNameForRead}";
|
||||
@@ -2919,7 +2918,7 @@ class DeferredAccessGenerator extends Generator {
|
||||
int charOffset = offsetForToken(prefixGenerator.token);
|
||||
message = templateDeferredTypeAnnotation
|
||||
.withArguments(
|
||||
_helper.buildDartType(new UnresolvedType(type, charOffset, _uri),
|
||||
_helper.buildDartType(type,
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType),
|
||||
prefixGenerator._plainNameForRead,
|
||||
_helper.libraryBuilder.isNonNullableByDefault)
|
||||
@@ -2938,7 +2937,7 @@ class DeferredAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression_Generator_Initializer doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, ArgumentsImpl arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
Object suffix = suffixGenerator.doInvocation(
|
||||
offset, typeArguments, arguments,
|
||||
@@ -2954,7 +2953,7 @@ class DeferredAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression invokeConstructor(
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String name,
|
||||
Arguments arguments,
|
||||
Token nameToken,
|
||||
@@ -3008,7 +3007,7 @@ class DeferredAccessGenerator extends Generator {
|
||||
///
|
||||
class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
final TypeDeclarationBuilder declaration;
|
||||
List<UnresolvedType>? typeArguments;
|
||||
List<TypeBuilder>? typeArguments;
|
||||
|
||||
@override
|
||||
final String targetName;
|
||||
@@ -3031,7 +3030,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
|
||||
@override
|
||||
TypeBuilder buildTypeWithResolvedArguments(
|
||||
NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
|
||||
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
if (declaration.isExtension && !_helper.enableExtensionTypesInLibrary) {
|
||||
// Extension declarations cannot be used as types.
|
||||
@@ -3058,10 +3057,8 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
if (arguments != null) {
|
||||
argumentBuilders =
|
||||
new List<TypeBuilder>.generate(arguments.length, (int i) {
|
||||
return _helper
|
||||
.validateTypeVariableUse(arguments![i],
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType)
|
||||
.builder;
|
||||
return _helper.validateTypeVariableUse(arguments![i],
|
||||
allowPotentiallyConstantType: allowPotentiallyConstantType);
|
||||
}, growable: false);
|
||||
}
|
||||
return new NamedTypeBuilder(
|
||||
@@ -3072,7 +3069,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
|
||||
@override
|
||||
Expression invokeConstructor(
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String name,
|
||||
Arguments arguments,
|
||||
Token nameToken,
|
||||
@@ -3111,13 +3108,9 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
_expression = _forest.createTypeLiteral(
|
||||
offsetForToken(token),
|
||||
_helper.buildTypeLiteralDartType(
|
||||
new UnresolvedType(
|
||||
buildTypeWithResolvedArguments(
|
||||
_helper.libraryBuilder.nonNullableBuilder,
|
||||
typeArguments,
|
||||
allowPotentiallyConstantType: true),
|
||||
fileOffset,
|
||||
_uri),
|
||||
buildTypeWithResolvedArguments(
|
||||
_helper.libraryBuilder.nonNullableBuilder, typeArguments,
|
||||
allowPotentiallyConstantType: true),
|
||||
allowPotentiallyConstantType:
|
||||
_helper.enableConstructorTearOffsInLibrary));
|
||||
}
|
||||
@@ -3147,10 +3140,8 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
_helper.enableConstructorTearOffsInLibrary &&
|
||||
declarationBuilder is ClassBuilder;
|
||||
List<TypeBuilder>? aliasedTypeArguments = typeArguments
|
||||
?.map((unknownType) => _helper
|
||||
.validateTypeVariableUse(unknownType,
|
||||
allowPotentiallyConstantType: isConstructorTearOff)
|
||||
.builder)
|
||||
?.map((unknownType) => _helper.validateTypeVariableUse(unknownType,
|
||||
allowPotentiallyConstantType: isConstructorTearOff))
|
||||
.toList();
|
||||
if (aliasedTypeArguments != null &&
|
||||
aliasedTypeArguments.length != aliasBuilder.typeVariablesCount) {
|
||||
@@ -3367,7 +3358,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
|
||||
@override
|
||||
Expression_Generator_Builder doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (declaration.isExtension) {
|
||||
ExtensionBuilder extensionBuilder = declaration as ExtensionBuilder;
|
||||
@@ -3404,7 +3395,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
|
||||
|
||||
@override
|
||||
Expression_Generator applyTypeArguments(
|
||||
int fileOffset, List<UnresolvedType>? typeArguments) {
|
||||
int fileOffset, List<TypeBuilder>? typeArguments) {
|
||||
return new TypeUseGenerator(_helper, token, declaration, targetName)
|
||||
..typeArguments = typeArguments;
|
||||
}
|
||||
@@ -3551,7 +3542,7 @@ abstract class AbstractReadOnlyAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression_Generator_Initializer doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.forest.createExpressionInvocation(
|
||||
adjustForImplicitCall(targetName, offset), _createRead(), arguments);
|
||||
@@ -3606,7 +3597,7 @@ abstract class ErroneousExpressionGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression_Generator_Initializer doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return buildError(arguments,
|
||||
charOffset: offset, kind: UnresolvedKind.Method);
|
||||
@@ -3682,7 +3673,7 @@ abstract class ErroneousExpressionGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression invokeConstructor(
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String name,
|
||||
Arguments arguments,
|
||||
Token nameToken,
|
||||
@@ -3734,7 +3725,7 @@ class UnresolvedNameGenerator extends ErroneousExpressionGenerator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int charOffset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int charOffset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return buildError(arguments,
|
||||
charOffset: charOffset, kind: UnresolvedKind.Method);
|
||||
@@ -3811,7 +3802,7 @@ abstract class ContextAwareGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Never doInvocation(
|
||||
int charOffset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int charOffset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return unhandled("${runtimeType}", "doInvocation", charOffset, _uri);
|
||||
}
|
||||
@@ -4057,7 +4048,7 @@ class PrefixUseGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.wrapInLocatedProblem(
|
||||
_helper.evaluateArgumentsBefore(
|
||||
@@ -4160,7 +4151,7 @@ class UnexpectedQualifiedUseGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return _helper.buildUnresolvedError(_forest.createNullLiteral(offset),
|
||||
_plainNameForRead, arguments, fileOffset,
|
||||
@@ -4169,7 +4160,7 @@ class UnexpectedQualifiedUseGenerator extends Generator {
|
||||
|
||||
@override
|
||||
TypeBuilder buildTypeWithResolvedArguments(
|
||||
NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
|
||||
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
Template<Message Function(String, String)> template = isUnresolved
|
||||
? templateUnresolvedPrefixInTypeAnnotation
|
||||
@@ -4282,7 +4273,7 @@ class ParserErrorGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
return buildProblem();
|
||||
}
|
||||
@@ -4295,7 +4286,7 @@ class ParserErrorGenerator extends Generator {
|
||||
|
||||
@override
|
||||
TypeBuilder buildTypeWithResolvedArguments(
|
||||
NullabilityBuilder nullabilityBuilder, List<UnresolvedType>? arguments,
|
||||
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments,
|
||||
{required bool allowPotentiallyConstantType}) {
|
||||
// TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
|
||||
NamedTypeBuilder result = new NamedTypeBuilder(
|
||||
@@ -4318,7 +4309,7 @@ class ParserErrorGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression invokeConstructor(
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String name,
|
||||
Arguments arguments,
|
||||
Token nameToken,
|
||||
@@ -4503,7 +4494,7 @@ class ThisAccessGenerator extends Generator {
|
||||
|
||||
@override
|
||||
Expression_Generator_Initializer doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) {
|
||||
if (isInitializer) {
|
||||
return buildConstructorInitializer(offset, new Name(""), arguments);
|
||||
@@ -4704,7 +4695,7 @@ class IncompleteErrorGenerator extends ErroneousExpressionGenerator {
|
||||
|
||||
@override
|
||||
Generator doInvocation(
|
||||
int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
|
||||
int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
|
||||
{bool isTypeArgumentsInForest = false}) =>
|
||||
this;
|
||||
|
||||
@@ -4820,7 +4811,7 @@ abstract class Selector {
|
||||
Expression_Generator withReceiver(Object? receiver, int operatorOffset,
|
||||
{bool isNullAware: false});
|
||||
|
||||
List<UnresolvedType>? get typeArguments => null;
|
||||
List<TypeBuilder>? get typeArguments => null;
|
||||
|
||||
bool get isTypeArgumentsInForest => true;
|
||||
|
||||
@@ -4857,7 +4848,7 @@ class InvocationSelector extends Selector {
|
||||
final Name name;
|
||||
|
||||
@override
|
||||
final List<UnresolvedType>? typeArguments;
|
||||
final List<TypeBuilder>? typeArguments;
|
||||
|
||||
@override
|
||||
final bool isTypeArgumentsInForest;
|
||||
|
||||
@@ -13,8 +13,8 @@ import '../builder/builder.dart';
|
||||
import '../builder/formal_parameter_builder.dart';
|
||||
import '../builder/named_type_builder.dart';
|
||||
import '../builder/prefix_builder.dart';
|
||||
import '../builder/type_builder.dart';
|
||||
import '../builder/type_declaration_builder.dart';
|
||||
import '../builder/unresolved_type.dart';
|
||||
|
||||
import '../constant_context.dart' show ConstantContext;
|
||||
import '../fasta_codes.dart' show LocatedMessage;
|
||||
@@ -70,7 +70,7 @@ abstract class ExpressionGeneratorHelper implements InferenceHelper {
|
||||
{bool isQualified: false, PrefixBuilder? prefix});
|
||||
|
||||
Expression_Generator_Initializer finishSend(Object receiver,
|
||||
List<UnresolvedType>? typeArguments, ArgumentsImpl arguments, int offset,
|
||||
List<TypeBuilder>? typeArguments, ArgumentsImpl arguments, int offset,
|
||||
{bool isTypeArgumentsInForest = false});
|
||||
|
||||
Initializer buildInvalidInitializer(Expression expression,
|
||||
@@ -126,14 +126,14 @@ abstract class ExpressionGeneratorHelper implements InferenceHelper {
|
||||
Token nameLastToken,
|
||||
Arguments? arguments,
|
||||
String name,
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
int charOffset,
|
||||
Constness constness,
|
||||
{bool isTypeArgumentsInForest = false,
|
||||
TypeDeclarationBuilder? typeAliasBuilder,
|
||||
required UnresolvedKind unresolvedKind});
|
||||
|
||||
UnresolvedType validateTypeVariableUse(UnresolvedType unresolved,
|
||||
TypeBuilder validateTypeVariableUse(TypeBuilder typeBuilder,
|
||||
{required bool allowPotentiallyConstantType});
|
||||
|
||||
void addProblemErrorIfConst(Message message, int charOffset, int length);
|
||||
@@ -156,13 +156,13 @@ abstract class ExpressionGeneratorHelper implements InferenceHelper {
|
||||
Expression evaluateArgumentsBefore(
|
||||
Arguments arguments, Expression expression);
|
||||
|
||||
DartType buildDartType(UnresolvedType unresolvedType,
|
||||
DartType buildDartType(TypeBuilder typeBuilder,
|
||||
{required bool allowPotentiallyConstantType});
|
||||
|
||||
DartType buildTypeLiteralDartType(UnresolvedType unresolvedType,
|
||||
DartType buildTypeLiteralDartType(TypeBuilder typeBuilder,
|
||||
{required bool allowPotentiallyConstantType});
|
||||
|
||||
List<DartType> buildDartTypeArguments(List<UnresolvedType>? unresolvedTypes,
|
||||
List<DartType> buildDartTypeArguments(List<TypeBuilder>? typeArguments,
|
||||
{required bool allowPotentiallyConstantType});
|
||||
|
||||
void reportDuplicatedDeclaration(
|
||||
@@ -205,7 +205,7 @@ abstract class ExpressionGeneratorHelper implements InferenceHelper {
|
||||
/// creating the instantiation and invocation.
|
||||
Expression createInstantiationAndInvocation(
|
||||
Expression Function() receiverFunction,
|
||||
List<UnresolvedType>? typeArguments,
|
||||
List<TypeBuilder>? typeArguments,
|
||||
String className,
|
||||
String constructorName,
|
||||
Arguments arguments,
|
||||
|
||||
@@ -20,7 +20,6 @@ import '../builder/formal_parameter_builder.dart';
|
||||
import '../builder/metadata_builder.dart';
|
||||
import '../builder/type_builder.dart';
|
||||
import '../builder/type_variable_builder.dart';
|
||||
import '../builder/unresolved_type.dart';
|
||||
import '../combinator.dart';
|
||||
import '../configuration.dart';
|
||||
import '../identifiers.dart';
|
||||
@@ -213,5 +212,3 @@ final TypeVariableBuilder dummyTypeVariableBuilder =
|
||||
final Label dummyLabel = new Label('', -1);
|
||||
final FieldInfo dummyFieldInfo = new FieldInfo('', -1, null, dummyToken, -1);
|
||||
final Configuration dummyConfiguration = new Configuration(-1, '', '', '');
|
||||
final UnresolvedType dummyUnresolvedType =
|
||||
new UnresolvedType(dummyTypeBuilder, -1, dummyUri);
|
||||
|
||||
@@ -41,7 +41,6 @@ import '../builder/named_type_builder.dart';
|
||||
import '../builder/nullability_builder.dart';
|
||||
import '../builder/type_builder.dart';
|
||||
import '../builder/type_variable_builder.dart';
|
||||
import '../builder/unresolved_type.dart';
|
||||
|
||||
import '../combinator.dart' show CombinatorBuilder;
|
||||
|
||||
@@ -856,7 +855,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
// Resolve unresolved types from the class header (i.e., superclass, mixins,
|
||||
// and implemented types) before adding members from the class body which
|
||||
// should not shadow these unresolved types.
|
||||
libraryBuilder.currentTypeParameterScopeBuilder.resolveTypes(
|
||||
libraryBuilder.currentTypeParameterScopeBuilder.resolveNamedTypes(
|
||||
libraryBuilder.currentTypeParameterScopeBuilder.typeVariables,
|
||||
libraryBuilder);
|
||||
}
|
||||
@@ -1016,7 +1015,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
libraryBuilder
|
||||
.endNestedDeclaration(
|
||||
TypeParameterScopeKind.classDeclaration, "<syntax-error>")
|
||||
.resolveTypes(typeVariables, libraryBuilder);
|
||||
.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
} else {
|
||||
final int startCharOffset =
|
||||
metadata == null ? beginToken.charOffset : metadata.first.charOffset;
|
||||
@@ -1105,7 +1104,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
libraryBuilder
|
||||
.endNestedDeclaration(
|
||||
TypeParameterScopeKind.mixinDeclaration, "<syntax-error>")
|
||||
.resolveTypes(typeVariables, libraryBuilder);
|
||||
.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
} else {
|
||||
int startOffset =
|
||||
metadata == null ? mixinToken.charOffset : metadata.first.charOffset;
|
||||
@@ -1345,7 +1344,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
checkEmpty(beginToken.charOffset);
|
||||
libraryBuilder
|
||||
.endNestedDeclaration(TypeParameterScopeKind.topLevelMethod, "#method")
|
||||
.resolveTypes(typeVariables, libraryBuilder);
|
||||
.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
if (name is! ParserRecovery) {
|
||||
final int startCharOffset =
|
||||
metadata == null ? beginToken.charOffset : metadata.first.charOffset;
|
||||
@@ -1676,7 +1675,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
if (name is ParserRecovery) {
|
||||
nativeMethodName = null;
|
||||
inConstructor = false;
|
||||
declarationBuilder.resolveTypes(typeVariables, libraryBuilder);
|
||||
declarationBuilder.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
} else {
|
||||
String? constructorName;
|
||||
switch (methodKind) {
|
||||
@@ -1725,14 +1724,13 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
List<FormalParameterBuilder> synthesizedFormals = [];
|
||||
TypeBuilder thisType = extension.extensionThisType;
|
||||
if (substitution != null) {
|
||||
List<TypeBuilder> unboundTypes = [];
|
||||
List<NamedTypeBuilder> unboundTypes = [];
|
||||
List<TypeVariableBuilder> unboundTypeVariables = [];
|
||||
thisType = substitute(thisType, substitution,
|
||||
unboundTypes: unboundTypes,
|
||||
unboundTypeVariables: unboundTypeVariables)!;
|
||||
for (TypeBuilder unboundType in unboundTypes) {
|
||||
extension.addType(new UnresolvedType(
|
||||
unboundType, thisType.charOffset!, thisType.fileUri!));
|
||||
for (NamedTypeBuilder unboundType in unboundTypes) {
|
||||
extension.registerUnresolvedNamedType(unboundType);
|
||||
}
|
||||
libraryBuilder.unboundTypeVariables.addAll(unboundTypeVariables);
|
||||
}
|
||||
@@ -1745,7 +1743,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
formals = synthesizedFormals;
|
||||
}
|
||||
|
||||
declarationBuilder.resolveTypes(typeVariables, libraryBuilder);
|
||||
declarationBuilder.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
if (constructorName != null) {
|
||||
if (isConst &&
|
||||
bodyKind != MethodBody.Abstract &&
|
||||
@@ -1842,7 +1840,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
libraryBuilder
|
||||
.endNestedDeclaration(
|
||||
TypeParameterScopeKind.namedMixinApplication, "<syntax-error>")
|
||||
.resolveTypes(typeVariables, libraryBuilder);
|
||||
.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
} else {
|
||||
if (libraryBuilder.isNonNullableByDefault) {
|
||||
String classNameForErrors = "${name}";
|
||||
@@ -2265,7 +2263,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
libraryBuilder
|
||||
.endNestedDeclaration(
|
||||
TypeParameterScopeKind.typedef, "<syntax-error>")
|
||||
.resolveTypes(typeVariables, libraryBuilder);
|
||||
.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
popDeclarationContext(DeclarationContext.Typedef);
|
||||
return;
|
||||
}
|
||||
@@ -2285,7 +2283,7 @@ class OutlineBuilder extends StackListenerImpl {
|
||||
libraryBuilder
|
||||
.endNestedDeclaration(
|
||||
TypeParameterScopeKind.functionType, "<syntax-error>")
|
||||
.resolveTypes(typeVariables, libraryBuilder);
|
||||
.resolveNamedTypes(typeVariables, libraryBuilder);
|
||||
popDeclarationContext(DeclarationContext.Typedef);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,6 @@ import '../builder/type_alias_builder.dart';
|
||||
import '../builder/type_builder.dart';
|
||||
import '../builder/type_declaration_builder.dart';
|
||||
import '../builder/type_variable_builder.dart';
|
||||
import '../builder/unresolved_type.dart';
|
||||
import '../builder/void_type_declaration_builder.dart';
|
||||
|
||||
import '../combinator.dart' show CombinatorBuilder;
|
||||
@@ -134,7 +133,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
@override
|
||||
final SourceLoader loader;
|
||||
|
||||
final TypeParameterScopeBuilder libraryDeclaration;
|
||||
final TypeParameterScopeBuilder _libraryTypeParameterScopeBuilder;
|
||||
|
||||
final List<ConstructorReferenceBuilder> constructorReferences =
|
||||
<ConstructorReferenceBuilder>[];
|
||||
@@ -284,18 +283,18 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
this.fileUri,
|
||||
this._packageUri,
|
||||
this.packageLanguageVersion,
|
||||
this.libraryDeclaration,
|
||||
this._libraryTypeParameterScopeBuilder,
|
||||
this.importScope,
|
||||
this.actualOrigin,
|
||||
this.library,
|
||||
this._nameOrigin,
|
||||
this.referencesFrom)
|
||||
: _languageVersion = packageLanguageVersion,
|
||||
currentTypeParameterScopeBuilder = libraryDeclaration,
|
||||
currentTypeParameterScopeBuilder = _libraryTypeParameterScopeBuilder,
|
||||
referencesFromIndexed =
|
||||
referencesFrom == null ? null : new IndexedLibrary(referencesFrom),
|
||||
super(
|
||||
fileUri, libraryDeclaration.toScope(importScope), new Scope.top()) {
|
||||
super(fileUri, _libraryTypeParameterScopeBuilder.toScope(importScope),
|
||||
new Scope.top()) {
|
||||
assert(
|
||||
_packageUri == null ||
|
||||
importUri.scheme != 'package' ||
|
||||
@@ -308,6 +307,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
"'${importUri}'.");
|
||||
}
|
||||
|
||||
TypeParameterScopeBuilder get libraryTypeParameterScopeBuilderForTesting =>
|
||||
_libraryTypeParameterScopeBuilder;
|
||||
|
||||
bool? _enableConstFunctionsInLibrary;
|
||||
bool? _enableVarianceInLibrary;
|
||||
bool? _enableNonfunctionTypeAliasesInLibrary;
|
||||
@@ -451,14 +453,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
@override
|
||||
bool get isPart => partOfName != null || partOfUri != null;
|
||||
|
||||
List<UnresolvedType> get types => libraryDeclaration.types;
|
||||
List<NamedTypeBuilder> get unresolvedNamedTypes =>
|
||||
_libraryTypeParameterScopeBuilder.unresolvedNamedTypes;
|
||||
|
||||
@override
|
||||
bool get isSynthetic => accessProblem != null;
|
||||
|
||||
T addType<T extends TypeBuilder>(T type, int charOffset) {
|
||||
currentTypeParameterScopeBuilder
|
||||
.addType(new UnresolvedType(type, charOffset, fileUri));
|
||||
NamedTypeBuilder registerUnresolvedNamedType(NamedTypeBuilder type) {
|
||||
currentTypeParameterScopeBuilder.registerUnresolvedNamedType(type);
|
||||
return type;
|
||||
}
|
||||
|
||||
@@ -812,7 +814,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
if (setterReference != null) {
|
||||
loader.buildersCreatedWithReferences[setterReference] = declaration;
|
||||
}
|
||||
if (currentTypeParameterScopeBuilder == libraryDeclaration) {
|
||||
if (currentTypeParameterScopeBuilder == _libraryTypeParameterScopeBuilder) {
|
||||
if (declaration is MemberBuilder) {
|
||||
declaration.parent = this;
|
||||
} else if (declaration is TypeDeclarationBuilder) {
|
||||
@@ -824,7 +826,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
"${declaration.runtimeType}", "addBuilder", charOffset, fileUri);
|
||||
}
|
||||
} else {
|
||||
assert(currentTypeParameterScopeBuilder.parent == libraryDeclaration);
|
||||
assert(currentTypeParameterScopeBuilder.parent ==
|
||||
_libraryTypeParameterScopeBuilder);
|
||||
}
|
||||
bool isConstructor = declaration is FunctionBuilder &&
|
||||
(declaration.isConstructor || declaration.isFactory);
|
||||
@@ -1237,7 +1240,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
addBuilder(name, declaration, declaration.charOffset);
|
||||
}
|
||||
}
|
||||
types.addAll(part.types);
|
||||
unresolvedNamedTypes.addAll(part.unresolvedNamedTypes);
|
||||
constructorReferences.addAll(part.constructorReferences);
|
||||
part.partOfLibrary = this;
|
||||
part.scope.becomePartOf(scope);
|
||||
@@ -1396,15 +1399,16 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
}
|
||||
}
|
||||
|
||||
/// Resolves all unresolved types in [types]. The list of types is cleared
|
||||
/// when done.
|
||||
/// Resolves all unresolved types in [unresolvedNamedTypes]. The list of types
|
||||
/// is cleared when done.
|
||||
int resolveTypes() {
|
||||
int typeCount = types.length;
|
||||
for (UnresolvedType t in types) {
|
||||
t.resolveIn(scope, this);
|
||||
t.checkType(this);
|
||||
int typeCount = unresolvedNamedTypes.length;
|
||||
for (NamedTypeBuilder namedType in unresolvedNamedTypes) {
|
||||
namedType.resolveIn(
|
||||
scope, namedType.charOffset!, namedType.fileUri!, this);
|
||||
namedType.check(this, namedType.charOffset!, namedType.fileUri!);
|
||||
}
|
||||
types.clear();
|
||||
unresolvedNamedTypes.clear();
|
||||
return typeCount;
|
||||
}
|
||||
|
||||
@@ -1486,18 +1490,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
TypeBuilder addNamedType(Object name, NullabilityBuilder nullabilityBuilder,
|
||||
List<TypeBuilder>? arguments, int charOffset,
|
||||
{required InstanceTypeVariableAccessState instanceTypeVariableAccess}) {
|
||||
return addType(
|
||||
new NamedTypeBuilder(
|
||||
name, nullabilityBuilder, arguments, fileUri, charOffset,
|
||||
instanceTypeVariableAccess: instanceTypeVariableAccess),
|
||||
charOffset);
|
||||
return registerUnresolvedNamedType(new NamedTypeBuilder(
|
||||
name, nullabilityBuilder, arguments, fileUri, charOffset,
|
||||
instanceTypeVariableAccess: instanceTypeVariableAccess));
|
||||
}
|
||||
|
||||
TypeBuilder addMixinApplication(
|
||||
TypeBuilder? supertype, List<TypeBuilder> mixins, int charOffset) {
|
||||
return addType(
|
||||
new MixinApplicationBuilder(supertype, mixins, fileUri, charOffset),
|
||||
charOffset);
|
||||
return new MixinApplicationBuilder(supertype, mixins, fileUri, charOffset);
|
||||
}
|
||||
|
||||
TypeBuilder addVoidType(int charOffset) {
|
||||
@@ -1665,8 +1665,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
// Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
|
||||
TypeParameterScopeBuilder declaration =
|
||||
endNestedDeclaration(kind, className)
|
||||
..resolveTypes(typeVariables, this);
|
||||
assert(declaration.parent == libraryDeclaration);
|
||||
..resolveNamedTypes(typeVariables, this);
|
||||
assert(declaration.parent == _libraryTypeParameterScopeBuilder);
|
||||
Map<String, Builder> members = declaration.members!;
|
||||
Map<String, MemberBuilder> constructors = declaration.constructors!;
|
||||
Map<String, MemberBuilder> setters = declaration.setters!;
|
||||
@@ -1895,8 +1895,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
// Nested declaration began in `OutlineBuilder.beginExtensionDeclaration`.
|
||||
TypeParameterScopeBuilder declaration = endNestedDeclaration(
|
||||
TypeParameterScopeKind.extensionDeclaration, extensionName)
|
||||
..resolveTypes(typeVariables, this);
|
||||
assert(declaration.parent == libraryDeclaration);
|
||||
..resolveNamedTypes(typeVariables, this);
|
||||
assert(declaration.parent == _libraryTypeParameterScopeBuilder);
|
||||
Map<String, Builder> members = declaration.members!;
|
||||
Map<String, MemberBuilder> constructors = declaration.constructors!;
|
||||
Map<String, MemberBuilder> setters = declaration.setters!;
|
||||
@@ -2111,7 +2111,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
applicationTypeVariables = copyTypeVariables(
|
||||
typeVariables!, currentTypeParameterScopeBuilder);
|
||||
|
||||
List<TypeBuilder> newTypes = <TypeBuilder>[];
|
||||
List<NamedTypeBuilder> newTypes = <NamedTypeBuilder>[];
|
||||
if (supertype is NamedTypeBuilder && supertype.arguments != null) {
|
||||
for (int i = 0; i < supertype.arguments!.length; ++i) {
|
||||
supertype.arguments![i] = supertype.arguments![i]
|
||||
@@ -2124,16 +2124,16 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
.clone(newTypes, this, currentTypeParameterScopeBuilder);
|
||||
}
|
||||
}
|
||||
for (TypeBuilder newType in newTypes) {
|
||||
currentTypeParameterScopeBuilder.addType(new UnresolvedType(
|
||||
newType, newType.charOffset!, newType.fileUri!));
|
||||
for (NamedTypeBuilder newType in newTypes) {
|
||||
currentTypeParameterScopeBuilder
|
||||
.registerUnresolvedNamedType(newType);
|
||||
}
|
||||
|
||||
TypeParameterScopeBuilder mixinDeclaration = this
|
||||
.endNestedDeclaration(
|
||||
TypeParameterScopeKind.unnamedMixinApplication,
|
||||
"mixin application");
|
||||
mixinDeclaration.resolveTypes(applicationTypeVariables, this);
|
||||
mixinDeclaration.resolveNamedTypes(applicationTypeVariables, this);
|
||||
|
||||
applicationTypeArguments = <TypeBuilder>[];
|
||||
for (TypeVariableBuilder typeVariable in typeVariables) {
|
||||
@@ -2219,7 +2219,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
int charEndOffset) {
|
||||
// Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
|
||||
endNestedDeclaration(TypeParameterScopeKind.namedMixinApplication, name)
|
||||
.resolveTypes(typeVariables, this);
|
||||
.resolveNamedTypes(typeVariables, this);
|
||||
TypeBuilder supertype = applyMixins(mixinApplication, startCharOffset,
|
||||
charOffset, charEndOffset, name, false,
|
||||
metadata: metadata,
|
||||
@@ -2637,7 +2637,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
}
|
||||
currentTypeParameterScopeBuilder = savedDeclaration;
|
||||
|
||||
factoryDeclaration.resolveTypes(procedureBuilder.typeVariables, this);
|
||||
factoryDeclaration.resolveNamedTypes(procedureBuilder.typeVariables, this);
|
||||
addBuilder(procedureName, procedureBuilder, charOffset,
|
||||
getterReference: constructorReference);
|
||||
if (nativeMethodName != null) {
|
||||
@@ -2688,7 +2688,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
checkTypeVariables(typeVariables, typedefBuilder);
|
||||
// Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`.
|
||||
endNestedDeclaration(TypeParameterScopeKind.typedef, "#typedef")
|
||||
.resolveTypes(typeVariables, this);
|
||||
.resolveNamedTypes(typeVariables, this);
|
||||
addBuilder(name, typedefBuilder, charOffset,
|
||||
getterReference: referenceFrom?.reference);
|
||||
}
|
||||
@@ -2716,8 +2716,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
// Nested declaration began in `OutlineBuilder.beginFunctionType` or
|
||||
// `OutlineBuilder.beginFunctionTypedFormalParameter`.
|
||||
endNestedDeclaration(TypeParameterScopeKind.functionType, "#function_type")
|
||||
.resolveTypes(typeVariables, this);
|
||||
return addType(builder, charOffset);
|
||||
.resolveNamedTypes(typeVariables, this);
|
||||
return builder;
|
||||
}
|
||||
|
||||
FormalParameterBuilder addFormalParameter(
|
||||
@@ -3054,7 +3054,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
List<TypeVariableBuilder> copyTypeVariables(
|
||||
List<TypeVariableBuilder> original, TypeParameterScopeBuilder declaration,
|
||||
{bool isExtensionTypeParameter: false}) {
|
||||
List<TypeBuilder> newTypes = <TypeBuilder>[];
|
||||
List<NamedTypeBuilder> newTypes = <NamedTypeBuilder>[];
|
||||
List<TypeVariableBuilder> copy = <TypeVariableBuilder>[];
|
||||
for (TypeVariableBuilder variable in original) {
|
||||
TypeVariableBuilder newVariable = new TypeVariableBuilder(
|
||||
@@ -3066,9 +3066,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
copy.add(newVariable);
|
||||
unboundTypeVariables.add(newVariable);
|
||||
}
|
||||
for (TypeBuilder newType in newTypes) {
|
||||
declaration.addType(
|
||||
new UnresolvedType(newType, newType.charOffset!, newType.fileUri!));
|
||||
for (NamedTypeBuilder newType in newTypes) {
|
||||
declaration.registerUnresolvedNamedType(newType);
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
@@ -3183,7 +3182,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
@override
|
||||
int computeVariances() {
|
||||
int count = 0;
|
||||
for (Builder? declaration in libraryDeclaration.members!.values) {
|
||||
for (Builder? declaration
|
||||
in _libraryTypeParameterScopeBuilder.members!.values) {
|
||||
while (declaration != null) {
|
||||
if (declaration is TypeAliasBuilder &&
|
||||
declaration.typeVariablesCount > 0) {
|
||||
@@ -3306,7 +3306,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
}
|
||||
|
||||
if (!haveErroneousBounds) {
|
||||
List<TypeBuilder> unboundTypes = [];
|
||||
List<NamedTypeBuilder> unboundTypes = [];
|
||||
List<TypeVariableBuilder> unboundTypeVariables = [];
|
||||
List<TypeBuilder> calculatedBounds = calculateBounds(
|
||||
variables,
|
||||
@@ -3315,9 +3315,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
objectClass,
|
||||
unboundTypes: unboundTypes,
|
||||
unboundTypeVariables: unboundTypeVariables);
|
||||
for (TypeBuilder unboundType in unboundTypes) {
|
||||
currentTypeParameterScopeBuilder.addType(new UnresolvedType(
|
||||
unboundType, unboundType.charOffset!, unboundType.fileUri!));
|
||||
for (NamedTypeBuilder unboundType in unboundTypes) {
|
||||
currentTypeParameterScopeBuilder
|
||||
.registerUnresolvedNamedType(unboundType);
|
||||
}
|
||||
this.unboundTypeVariables.addAll(unboundTypeVariables);
|
||||
for (int i = 0; i < variables.length; ++i) {
|
||||
@@ -3344,7 +3344,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
}
|
||||
}
|
||||
|
||||
for (Builder declaration in libraryDeclaration.members!.values) {
|
||||
for (Builder declaration
|
||||
in _libraryTypeParameterScopeBuilder.members!.values) {
|
||||
if (declaration is ClassBuilder) {
|
||||
{
|
||||
List<NonSimplicityIssue> issues =
|
||||
@@ -3493,7 +3494,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
"(${declaration.runtimeType}).");
|
||||
}
|
||||
}
|
||||
for (Builder declaration in libraryDeclaration.setters!.values) {
|
||||
for (Builder declaration
|
||||
in _libraryTypeParameterScopeBuilder.setters!.values) {
|
||||
assert(
|
||||
declaration is ProcedureBuilder,
|
||||
"Expected setter to be a ProcedureBuilder, "
|
||||
@@ -4584,7 +4586,7 @@ class TypeParameterScopeBuilder {
|
||||
|
||||
final Set<SourceExtensionBuilder>? extensions;
|
||||
|
||||
final List<UnresolvedType> types = <UnresolvedType>[];
|
||||
final List<NamedTypeBuilder> unresolvedNamedTypes = <NamedTypeBuilder>[];
|
||||
|
||||
// TODO(johnniwinther): Stop using [_name] for determining the declaration
|
||||
// kind.
|
||||
@@ -4743,15 +4745,17 @@ class TypeParameterScopeBuilder {
|
||||
|
||||
/// Adds the yet unresolved [type] to this scope builder.
|
||||
///
|
||||
/// Unresolved type will be resolved through [resolveTypes] when the scope
|
||||
/// is fully built. This allows for resolving self-referencing types, like
|
||||
/// type parameter used in their own bound, for instance `<T extends A<T>>`.
|
||||
void addType(UnresolvedType type) {
|
||||
types.add(type);
|
||||
/// Unresolved type will be resolved through [resolveNamedTypes] when the
|
||||
/// scope is fully built. This allows for resolving self-referencing types,
|
||||
/// like type parameter used in their own bound, for instance
|
||||
/// `<T extends A<T>>`.
|
||||
void registerUnresolvedNamedType(NamedTypeBuilder type) {
|
||||
unresolvedNamedTypes.add(type);
|
||||
}
|
||||
|
||||
/// Resolves type variables in [types] and propagate other types to [parent].
|
||||
void resolveTypes(
|
||||
/// Resolves type variables in [unresolvedNamedTypes] and propagate other
|
||||
/// types to [parent].
|
||||
void resolveNamedTypes(
|
||||
List<TypeVariableBuilder>? typeVariables, SourceLibraryBuilder library) {
|
||||
Map<String, TypeVariableBuilder>? map;
|
||||
if (typeVariables != null) {
|
||||
@@ -4761,8 +4765,8 @@ class TypeParameterScopeBuilder {
|
||||
}
|
||||
}
|
||||
Scope? scope;
|
||||
for (UnresolvedType type in types) {
|
||||
Object? nameOrQualified = type.builder.name;
|
||||
for (NamedTypeBuilder namedTypeBuilder in unresolvedNamedTypes) {
|
||||
Object? nameOrQualified = namedTypeBuilder.name;
|
||||
String? name = nameOrQualified is QualifiedName
|
||||
? nameOrQualified.qualifier as String
|
||||
: nameOrQualified as String?;
|
||||
@@ -4778,25 +4782,30 @@ class TypeParameterScopeBuilder {
|
||||
if (declaration == null) {
|
||||
// Since name didn't resolve in this scope, propagate it to the
|
||||
// parent declaration.
|
||||
parent!.addType(type);
|
||||
parent!.registerUnresolvedNamedType(namedTypeBuilder);
|
||||
} else if (nameOrQualified is QualifiedName) {
|
||||
NamedTypeBuilder builder = type.builder as NamedTypeBuilder;
|
||||
// Attempt to use a member or type variable as a prefix.
|
||||
Message message = templateNotAPrefixInTypeAnnotation.withArguments(
|
||||
flattenName(
|
||||
nameOrQualified.qualifier, type.charOffset, type.fileUri),
|
||||
flattenName(nameOrQualified.qualifier, namedTypeBuilder.charOffset!,
|
||||
namedTypeBuilder.fileUri!),
|
||||
nameOrQualified.name);
|
||||
library.addProblem(message, type.charOffset,
|
||||
nameOrQualified.endCharOffset - type.charOffset, type.fileUri);
|
||||
builder.bind(builder.buildInvalidTypeDeclarationBuilder(
|
||||
message.withLocation(type.fileUri, type.charOffset,
|
||||
nameOrQualified.endCharOffset - type.charOffset)));
|
||||
library.addProblem(
|
||||
message,
|
||||
namedTypeBuilder.charOffset!,
|
||||
nameOrQualified.endCharOffset - namedTypeBuilder.charOffset!,
|
||||
namedTypeBuilder.fileUri!);
|
||||
namedTypeBuilder.bind(namedTypeBuilder
|
||||
.buildInvalidTypeDeclarationBuilder(message.withLocation(
|
||||
namedTypeBuilder.fileUri!,
|
||||
namedTypeBuilder.charOffset!,
|
||||
nameOrQualified.endCharOffset - namedTypeBuilder.charOffset!)));
|
||||
} else {
|
||||
scope ??= toScope(null).withTypeVariables(typeVariables);
|
||||
type.resolveIn(scope, library);
|
||||
namedTypeBuilder.resolveIn(scope, namedTypeBuilder.charOffset!,
|
||||
namedTypeBuilder.fileUri!, library);
|
||||
}
|
||||
}
|
||||
types.clear();
|
||||
unresolvedNamedTypes.clear();
|
||||
}
|
||||
|
||||
Scope toScope(Scope? parent) {
|
||||
|
||||
@@ -18,7 +18,6 @@ import '../builder/formal_parameter_builder.dart' as type;
|
||||
import '../builder/metadata_builder.dart' as type;
|
||||
import '../builder/type_builder.dart' as type;
|
||||
import '../builder/type_variable_builder.dart' as type;
|
||||
import '../builder/unresolved_type.dart' as type;
|
||||
|
||||
import '../identifiers.dart' as type;
|
||||
|
||||
@@ -108,15 +107,15 @@ class ValueKinds {
|
||||
static const ValueKind TokenOrNull =
|
||||
const SingleValueKind<type.Token>(NullValue.Token);
|
||||
static const ValueKind TypeOrNull =
|
||||
const SingleValueKind<type.UnresolvedType>(NullValue.UnresolvedType);
|
||||
const SingleValueKind<type.TypeBuilder>(NullValue.TypeBuilder);
|
||||
static const ValueKind TypeArguments =
|
||||
const SingleValueKind<List<type.UnresolvedType>>();
|
||||
const SingleValueKind<List<type.TypeBuilder>>();
|
||||
static const ValueKind TypeArgumentsOrNull =
|
||||
const SingleValueKind<List<type.UnresolvedType>>(NullValue.TypeArguments);
|
||||
const SingleValueKind<List<type.TypeBuilder>>(NullValue.TypeArguments);
|
||||
static const ValueKind TypeBuilder =
|
||||
const SingleValueKind<type.TypeBuilder>();
|
||||
static const ValueKind TypeBuilderOrNull =
|
||||
const SingleValueKind<type.TypeBuilder>(NullValue.UnresolvedType);
|
||||
const SingleValueKind<type.TypeBuilder>(NullValue.TypeBuilder);
|
||||
static const ValueKind TypeBuilderListOrNull =
|
||||
const SingleValueKind<List<type.TypeBuilder>>(NullValue.TypeBuilderList);
|
||||
static const ValueKind TypeVariableListOrNull =
|
||||
|
||||
@@ -137,7 +137,7 @@ TypeParameterScopeBuilder lookupLibraryDeclarationBuilder(
|
||||
SourceLibraryBuilder builder =
|
||||
lookupLibraryBuilder(compilerResult, library, required: required)
|
||||
as SourceLibraryBuilder;
|
||||
return builder.libraryDeclaration;
|
||||
return builder.libraryTypeParameterScopeBuilderForTesting;
|
||||
}
|
||||
|
||||
ClassBuilder? lookupClassBuilder(
|
||||
|
||||
@@ -16,8 +16,8 @@ import 'package:front_end/src/compute_platform_binaries_location.dart'
|
||||
import 'package:front_end/src/fasta/builder/declaration_builder.dart';
|
||||
import 'package:front_end/src/fasta/builder/field_builder.dart';
|
||||
import 'package:front_end/src/fasta/builder/modifier_builder.dart';
|
||||
import 'package:front_end/src/fasta/builder/type_builder.dart';
|
||||
import 'package:front_end/src/fasta/builder/type_declaration_builder.dart';
|
||||
import 'package:front_end/src/fasta/builder/unresolved_type.dart';
|
||||
import 'package:front_end/src/fasta/compiler_context.dart';
|
||||
import 'package:front_end/src/fasta/constant_context.dart';
|
||||
import 'package:front_end/src/fasta/dill/dill_target.dart';
|
||||
@@ -235,7 +235,7 @@ class BodyBuilderTest extends BodyBuilder {
|
||||
Token nameLastToken,
|
||||
Arguments arguments,
|
||||
String name,
|
||||
List<UnresolvedType> typeArguments,
|
||||
List<TypeBuilder> typeArguments,
|
||||
int charOffset,
|
||||
Constness constness,
|
||||
{bool isTypeArgumentsInForest = false,
|
||||
|
||||
Reference in New Issue
Block a user