Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: pkg/compiler/lib/src/resolution/signatures.dart

Issue 1915123008: Implements support for ignoring method type arguments in resolution. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Rebased again Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.resolution.signatures; 5 library dart2js.resolution.signatures;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../compiler.dart' show Compiler; 8 import '../compiler.dart' show Compiler;
9 import '../dart_types.dart'; 9 import '../dart_types.dart';
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
11 import '../elements/modelx.dart' 11 import '../elements/modelx.dart'
12 show 12 show
13 ErroneousFieldElementX, 13 ErroneousFieldElementX,
14 ErroneousInitializingFormalElementX, 14 ErroneousInitializingFormalElementX,
15 FormalElementX, 15 FormalElementX,
16 FunctionSignatureX, 16 FunctionSignatureX,
17 InitializingFormalElementX, 17 InitializingFormalElementX,
18 LocalParameterElementX; 18 LocalParameterElementX,
19 TypeVariableElementX;
19 import '../tree/tree.dart'; 20 import '../tree/tree.dart';
20 import '../universe/use.dart' show TypeUse; 21 import '../universe/use.dart' show TypeUse;
21 import '../util/util.dart' show Link, LinkBuilder; 22 import '../util/util.dart' show Link, LinkBuilder;
22 import 'members.dart' show ResolverVisitor; 23 import 'members.dart' show ResolverVisitor;
23 import 'registry.dart' show ResolutionRegistry; 24 import 'registry.dart' show ResolutionRegistry;
24 import 'resolution_common.dart' show MappingVisitor; 25 import 'resolution_common.dart' show MappingVisitor;
25 import 'scope.dart' show Scope; 26 import 'scope.dart' show Scope, TypeVariablesScope;
26 27
27 /** 28 /**
28 * [SignatureResolver] resolves function signatures. 29 * [SignatureResolver] resolves function signatures.
29 */ 30 */
30 class SignatureResolver extends MappingVisitor<FormalElementX> { 31 class SignatureResolver extends MappingVisitor<FormalElementX> {
31 final ResolverVisitor resolver; 32 final ResolverVisitor resolver;
32 final FunctionTypedElement enclosingElement; 33 final FunctionTypedElement enclosingElement;
33 final Scope scope; 34 final Scope scope;
34 final MessageKind defaultValuesError; 35 final MessageKind defaultValuesError;
35 final bool createRealParameters; 36 final bool createRealParameters;
36 List<Element> optionalParameters = const <Element>[]; 37 List<Element> optionalParameters = const <Element>[];
37 int optionalParameterCount = 0; 38 int optionalParameterCount = 0;
38 bool isOptionalParameter = false; 39 bool isOptionalParameter = false;
39 bool optionalParametersAreNamed = false; 40 bool optionalParametersAreNamed = false;
40 VariableDefinitions currentDefinitions; 41 VariableDefinitions currentDefinitions;
41 42
42 SignatureResolver(Compiler compiler, FunctionTypedElement enclosingElement, 43 SignatureResolver(Compiler compiler, FunctionTypedElement enclosingElement,
44 Scope scope,
43 ResolutionRegistry registry, 45 ResolutionRegistry registry,
44 {this.defaultValuesError, this.createRealParameters}) 46 {this.defaultValuesError, this.createRealParameters})
45 : this.enclosingElement = enclosingElement, 47 : this.scope = scope,
46 this.scope = enclosingElement.buildScope(), 48 this.enclosingElement = enclosingElement,
47 this.resolver = 49 this.resolver = new ResolverVisitor(
48 new ResolverVisitor(compiler, enclosingElement, registry), 50 compiler, enclosingElement, registry, scope: scope),
49 super(compiler, registry); 51 super(compiler, registry);
50 52
51 bool get defaultValuesAllowed => defaultValuesError == null; 53 bool get defaultValuesAllowed => defaultValuesError == null;
52 54
53 visitNodeList(NodeList node) { 55 visitNodeList(NodeList node) {
54 // This must be a list of optional arguments. 56 // This must be a list of optional arguments.
55 String value = node.beginToken.stringValue; 57 String value = node.beginToken.stringValue;
56 if ((!identical(value, '[')) && (!identical(value, '{'))) { 58 if ((!identical(value, '[')) && (!identical(value, '{'))) {
57 reporter.internalError(node, "expected optional parameters"); 59 reporter.internalError(node, "expected optional parameters");
58 } 60 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 Name.isPrivateName(node.source)) { 105 Name.isPrivateName(node.source)) {
104 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER); 106 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER);
105 } 107 }
106 } 108 }
107 109
108 void computeParameterType(FormalElementX element, 110 void computeParameterType(FormalElementX element,
109 [VariableElement fieldElement]) { 111 [VariableElement fieldElement]) {
110 void computeFunctionType(FunctionExpression functionExpression) { 112 void computeFunctionType(FunctionExpression functionExpression) {
111 FunctionSignature functionSignature = SignatureResolver.analyze( 113 FunctionSignature functionSignature = SignatureResolver.analyze(
112 compiler, 114 compiler,
115 scope,
116 functionExpression.typeVariables,
113 functionExpression.parameters, 117 functionExpression.parameters,
114 functionExpression.returnType, 118 functionExpression.returnType,
115 element, 119 element,
116 registry, 120 registry,
117 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT); 121 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT);
118 element.functionSignature = functionSignature; 122 element.functionSignature = functionSignature;
119 } 123 }
120 124
121 if (currentDefinitions.type != null) { 125 if (currentDefinitions.type != null) {
122 element.typeCache = resolveTypeAnnotation(currentDefinitions.type); 126 element.typeCache = resolveTypeAnnotation(currentDefinitions.type);
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 /** 284 /**
281 * Resolves formal parameters and return type of a [FunctionExpression] 285 * Resolves formal parameters and return type of a [FunctionExpression]
282 * to a [FunctionSignature]. 286 * to a [FunctionSignature].
283 * 287 *
284 * If [createRealParameters] is `true`, the parameters will be 288 * If [createRealParameters] is `true`, the parameters will be
285 * real parameters implementing the [ParameterElement] interface. Otherwise, 289 * real parameters implementing the [ParameterElement] interface. Otherwise,
286 * the parameters will only implement [FormalElement]. 290 * the parameters will only implement [FormalElement].
287 */ 291 */
288 static FunctionSignature analyze( 292 static FunctionSignature analyze(
289 Compiler compiler, 293 Compiler compiler,
294 Scope scope,
295 NodeList typeVariables,
290 NodeList formalParameters, 296 NodeList formalParameters,
291 Node returnNode, 297 Node returnNode,
292 FunctionTypedElement element, 298 FunctionTypedElement element,
293 ResolutionRegistry registry, 299 ResolutionRegistry registry,
294 {MessageKind defaultValuesError, 300 {MessageKind defaultValuesError,
295 bool createRealParameters: false, 301 bool createRealParameters: false,
296 bool isFunctionExpression: false}) { 302 bool isFunctionExpression: false}) {
297 DiagnosticReporter reporter = compiler.reporter; 303 DiagnosticReporter reporter = compiler.reporter;
298 304
305 List<DartType> createTypeVariables(NodeList typeVariableNodes) {
306 if (typeVariableNodes == null) return const <DartType>[];
307
308 // Create the types and elements corresponding to [typeVariableNodes].
309 Link<Node> nodes = typeVariableNodes.nodes;
310 List<DartType> arguments =
311 new List.generate(nodes.slowLength(), (int index) {
312 TypeVariable node = nodes.head;
313 String variableName = node.name.source;
314 nodes = nodes.tail;
315 TypeVariableElementX variableElement =
316 new TypeVariableElementX(variableName, element, index, node);
317 // TODO(eernst): When type variables are implemented fully we will need
318 // to resolve the actual bounds; currently we just claim [dynamic].
319 variableElement.boundCache = const DynamicType();
320 TypeVariableType variableType = new TypeVariableType(variableElement);
321 variableElement.typeCache = variableType;
322 return variableType;
323 }, growable: false);
324 return arguments;
325 }
326
327 List<DartType> typeVariableTypes = createTypeVariables(typeVariables);
328 scope = new FunctionSignatureBuildingScope(scope, typeVariableTypes);
299 SignatureResolver visitor = new SignatureResolver( 329 SignatureResolver visitor = new SignatureResolver(
300 compiler, element, registry, 330 compiler, element, scope, registry,
301 defaultValuesError: defaultValuesError, 331 defaultValuesError: defaultValuesError,
302 createRealParameters: createRealParameters); 332 createRealParameters: createRealParameters);
303 List<Element> parameters = const <Element>[]; 333 List<Element> parameters = const <Element>[];
304 int requiredParameterCount = 0; 334 int requiredParameterCount = 0;
305 if (formalParameters == null) { 335 if (formalParameters == null) {
306 if (!element.isGetter) { 336 if (!element.isGetter) {
307 if (element.isMalformed) { 337 if (element.isMalformed) {
308 // If the element is erroneous, an error should already have been 338 // If the element is erroneous, an error should already have been
309 // reported. In the case of parse errors, it is possible that there 339 // reported. In the case of parse errors, it is possible that there
310 // are formal parameters, but something else in the method failed to 340 // are formal parameters, but something else in the method failed to
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 optionalParameterTypesBuilder.toLink().toList(growable: false); 434 optionalParameterTypesBuilder.toLink().toList(growable: false);
405 } 435 }
406 FunctionType type = new FunctionType( 436 FunctionType type = new FunctionType(
407 element.declaration, 437 element.declaration,
408 returnType, 438 returnType,
409 parameterTypes.toLink().toList(growable: false), 439 parameterTypes.toLink().toList(growable: false),
410 optionalParameterTypes, 440 optionalParameterTypes,
411 namedParameters, 441 namedParameters,
412 namedParameterTypes); 442 namedParameterTypes);
413 return new FunctionSignatureX( 443 return new FunctionSignatureX(
444 typeVariables: typeVariableTypes,
414 requiredParameters: parameters, 445 requiredParameters: parameters,
415 optionalParameters: visitor.optionalParameters, 446 optionalParameters: visitor.optionalParameters,
416 requiredParameterCount: requiredParameterCount, 447 requiredParameterCount: requiredParameterCount,
417 optionalParameterCount: visitor.optionalParameterCount, 448 optionalParameterCount: visitor.optionalParameterCount,
418 optionalParametersAreNamed: visitor.optionalParametersAreNamed, 449 optionalParametersAreNamed: visitor.optionalParametersAreNamed,
419 orderedOptionalParameters: orderedOptionalParameters, 450 orderedOptionalParameters: orderedOptionalParameters,
420 type: type); 451 type: type);
421 } 452 }
422 453
423 DartType resolveTypeAnnotation(TypeAnnotation annotation) { 454 DartType resolveTypeAnnotation(TypeAnnotation annotation) {
424 DartType type = resolveReturnType(annotation); 455 DartType type = resolveReturnType(annotation);
425 if (type.isVoid) { 456 if (type.isVoid) {
426 reporter.reportErrorMessage(annotation, MessageKind.VOID_NOT_ALLOWED); 457 reporter.reportErrorMessage(annotation, MessageKind.VOID_NOT_ALLOWED);
427 } 458 }
428 return type; 459 return type;
429 } 460 }
430 461
431 DartType resolveReturnType(TypeAnnotation annotation) { 462 DartType resolveReturnType(TypeAnnotation annotation) {
432 if (annotation == null) return const DynamicType(); 463 if (annotation == null) return const DynamicType();
433 DartType result = resolver.resolveTypeAnnotation(annotation); 464 DartType result = resolver.resolveTypeAnnotation(annotation);
434 if (result == null) { 465 if (result == null) {
435 return const DynamicType(); 466 return const DynamicType();
436 } 467 }
437 return result; 468 return result;
438 } 469 }
439 } 470 }
471
472 /// Used during `SignatureResolver.analyze` to provide access to the type
473 /// variables of the function signature itself when its signature is analyzed.
474 class FunctionSignatureBuildingScope extends TypeVariablesScope {
475 @override
476 final List<DartType> typeVariables;
477
478 FunctionSignatureBuildingScope(Scope parent, this.typeVariables)
479 : super(parent);
480
481 String toString() => 'FunctionSignatureBuildingScope($typeVariables)';
482 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/scope.dart ('k') | pkg/compiler/lib/src/resolution/type_resolver.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698