| Index: pkg/compiler/lib/src/resolution/signatures.dart
|
| diff --git a/pkg/compiler/lib/src/resolution/signatures.dart b/pkg/compiler/lib/src/resolution/signatures.dart
|
| index 36ea970e008838fe9d2237f07eee05856c08998b..04db4ebf27859e31ca1112242ba6f680f7a07c96 100644
|
| --- a/pkg/compiler/lib/src/resolution/signatures.dart
|
| +++ b/pkg/compiler/lib/src/resolution/signatures.dart
|
| @@ -15,14 +15,15 @@ import '../elements/modelx.dart'
|
| FormalElementX,
|
| FunctionSignatureX,
|
| InitializingFormalElementX,
|
| - LocalParameterElementX;
|
| + LocalParameterElementX,
|
| + TypeVariableElementX;
|
| import '../tree/tree.dart';
|
| import '../universe/use.dart' show TypeUse;
|
| import '../util/util.dart' show Link, LinkBuilder;
|
| import 'members.dart' show ResolverVisitor;
|
| import 'registry.dart' show ResolutionRegistry;
|
| import 'resolution_common.dart' show MappingVisitor;
|
| -import 'scope.dart' show Scope;
|
| +import 'scope.dart' show Scope, TypeVariablesScope;
|
|
|
| /**
|
| * [SignatureResolver] resolves function signatures.
|
| @@ -40,12 +41,13 @@ class SignatureResolver extends MappingVisitor<FormalElementX> {
|
| VariableDefinitions currentDefinitions;
|
|
|
| SignatureResolver(Compiler compiler, FunctionTypedElement enclosingElement,
|
| + Scope scope,
|
| ResolutionRegistry registry,
|
| {this.defaultValuesError, this.createRealParameters})
|
| - : this.enclosingElement = enclosingElement,
|
| - this.scope = enclosingElement.buildScope(),
|
| - this.resolver =
|
| - new ResolverVisitor(compiler, enclosingElement, registry),
|
| + : this.scope = scope,
|
| + this.enclosingElement = enclosingElement,
|
| + this.resolver = new ResolverVisitor(
|
| + compiler, enclosingElement, registry, scope: scope),
|
| super(compiler, registry);
|
|
|
| bool get defaultValuesAllowed => defaultValuesError == null;
|
| @@ -110,6 +112,8 @@ class SignatureResolver extends MappingVisitor<FormalElementX> {
|
| void computeFunctionType(FunctionExpression functionExpression) {
|
| FunctionSignature functionSignature = SignatureResolver.analyze(
|
| compiler,
|
| + scope,
|
| + functionExpression.typeVariables,
|
| functionExpression.parameters,
|
| functionExpression.returnType,
|
| element,
|
| @@ -287,6 +291,8 @@ class SignatureResolver extends MappingVisitor<FormalElementX> {
|
| */
|
| static FunctionSignature analyze(
|
| Compiler compiler,
|
| + Scope scope,
|
| + NodeList typeVariables,
|
| NodeList formalParameters,
|
| Node returnNode,
|
| FunctionTypedElement element,
|
| @@ -296,8 +302,32 @@ class SignatureResolver extends MappingVisitor<FormalElementX> {
|
| bool isFunctionExpression: false}) {
|
| DiagnosticReporter reporter = compiler.reporter;
|
|
|
| + List<DartType> createTypeVariables(NodeList typeVariableNodes) {
|
| + if (typeVariableNodes == null) return const <DartType>[];
|
| +
|
| + // Create the types and elements corresponding to [typeVariableNodes].
|
| + Link<Node> nodes = typeVariableNodes.nodes;
|
| + List<DartType> arguments =
|
| + new List.generate(nodes.slowLength(), (int index) {
|
| + TypeVariable node = nodes.head;
|
| + String variableName = node.name.source;
|
| + nodes = nodes.tail;
|
| + TypeVariableElementX variableElement =
|
| + new TypeVariableElementX(variableName, element, index, node);
|
| + // TODO(eernst): When type variables are implemented fully we will need
|
| + // to resolve the actual bounds; currently we just claim [dynamic].
|
| + variableElement.boundCache = const DynamicType();
|
| + TypeVariableType variableType = new TypeVariableType(variableElement);
|
| + variableElement.typeCache = variableType;
|
| + return variableType;
|
| + }, growable: false);
|
| + return arguments;
|
| + }
|
| +
|
| + List<DartType> typeVariableTypes = createTypeVariables(typeVariables);
|
| + scope = new FunctionSignatureBuildingScope(scope, typeVariableTypes);
|
| SignatureResolver visitor = new SignatureResolver(
|
| - compiler, element, registry,
|
| + compiler, element, scope, registry,
|
| defaultValuesError: defaultValuesError,
|
| createRealParameters: createRealParameters);
|
| List<Element> parameters = const <Element>[];
|
| @@ -411,6 +441,7 @@ class SignatureResolver extends MappingVisitor<FormalElementX> {
|
| namedParameters,
|
| namedParameterTypes);
|
| return new FunctionSignatureX(
|
| + typeVariables: typeVariableTypes,
|
| requiredParameters: parameters,
|
| optionalParameters: visitor.optionalParameters,
|
| requiredParameterCount: requiredParameterCount,
|
| @@ -437,3 +468,15 @@ class SignatureResolver extends MappingVisitor<FormalElementX> {
|
| return result;
|
| }
|
| }
|
| +
|
| +/// Used during `SignatureResolver.analyze` to provide access to the type
|
| +/// variables of the function signature itself when its signature is analyzed.
|
| +class FunctionSignatureBuildingScope extends TypeVariablesScope {
|
| + @override
|
| + final List<DartType> typeVariables;
|
| +
|
| + FunctionSignatureBuildingScope(Scope parent, this.typeVariables)
|
| + : super(parent);
|
| +
|
| + String toString() => 'FunctionSignatureBuildingScope($typeVariables)';
|
| +}
|
|
|