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

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

Issue 2123073003: remove dependency on compiler from resolution (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: fix tests Created 4 years, 5 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 '../common/resolution.dart';
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,
(...skipping 14 matching lines...) Expand all
33 final FunctionTypedElement enclosingElement; 33 final FunctionTypedElement enclosingElement;
34 final Scope scope; 34 final Scope scope;
35 final MessageKind defaultValuesError; 35 final MessageKind defaultValuesError;
36 final bool createRealParameters; 36 final bool createRealParameters;
37 List<Element> optionalParameters = const <Element>[]; 37 List<Element> optionalParameters = const <Element>[];
38 int optionalParameterCount = 0; 38 int optionalParameterCount = 0;
39 bool isOptionalParameter = false; 39 bool isOptionalParameter = false;
40 bool optionalParametersAreNamed = false; 40 bool optionalParametersAreNamed = false;
41 VariableDefinitions currentDefinitions; 41 VariableDefinitions currentDefinitions;
42 42
43 SignatureResolver(Compiler compiler, FunctionTypedElement enclosingElement, 43 SignatureResolver(
44 Scope scope, ResolutionRegistry registry, 44 Resolution resolution,
45 {this.defaultValuesError, this.createRealParameters}) 45 FunctionTypedElement enclosingElement,
46 Scope scope,
47 ResolutionRegistry registry,
48 {this.defaultValuesError,
49 this.createRealParameters})
46 : this.scope = scope, 50 : this.scope = scope,
47 this.enclosingElement = enclosingElement, 51 this.enclosingElement = enclosingElement,
48 this.resolver = new ResolverVisitor( 52 this.resolver = new ResolverVisitor(
49 compiler, enclosingElement, registry, 53 resolution, enclosingElement, registry,
50 scope: scope), 54 scope: scope),
51 super(compiler, registry); 55 super(resolution, registry);
52 56
53 bool get defaultValuesAllowed => defaultValuesError == null; 57 bool get defaultValuesAllowed => defaultValuesError == null;
54 58
55 visitNodeList(NodeList node) { 59 visitNodeList(NodeList node) {
56 // This must be a list of optional arguments. 60 // This must be a list of optional arguments.
57 String value = node.beginToken.stringValue; 61 String value = node.beginToken.stringValue;
58 if ((!identical(value, '[')) && (!identical(value, '{'))) { 62 if ((!identical(value, '[')) && (!identical(value, '{'))) {
59 reporter.internalError(node, "expected optional parameters"); 63 reporter.internalError(node, "expected optional parameters");
60 } 64 }
61 optionalParametersAreNamed = (identical(value, '{')); 65 optionalParametersAreNamed = (identical(value, '{'));
(...skipping 24 matching lines...) Expand all
86 reporter.reportErrorMessage(node, MessageKind.FORMAL_DECLARED_STATIC); 90 reporter.reportErrorMessage(node, MessageKind.FORMAL_DECLARED_STATIC);
87 } 91 }
88 92
89 if (currentDefinitions != null) { 93 if (currentDefinitions != null) {
90 reporter.internalError(node, 'function type parameters not supported'); 94 reporter.internalError(node, 'function type parameters not supported');
91 } 95 }
92 currentDefinitions = node; 96 currentDefinitions = node;
93 FormalElementX element = definition.accept(this); 97 FormalElementX element = definition.accept(this);
94 if (currentDefinitions.metadata != null) { 98 if (currentDefinitions.metadata != null) {
95 element.metadataInternal = 99 element.metadataInternal =
96 compiler.resolver.resolveMetadata(element, node); 100 resolution.resolver.resolveMetadata(element, node);
97 } 101 }
98 currentDefinitions = null; 102 currentDefinitions = null;
99 return element; 103 return element;
100 } 104 }
101 105
102 void validateName(Identifier node) { 106 void validateName(Identifier node) {
103 if (isOptionalParameter && 107 if (isOptionalParameter &&
104 optionalParametersAreNamed && 108 optionalParametersAreNamed &&
105 Name.isPrivateName(node.source)) { 109 Name.isPrivateName(node.source)) {
106 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER); 110 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER);
107 } 111 }
108 } 112 }
109 113
110 void computeParameterType(FormalElementX element, 114 void computeParameterType(FormalElementX element,
111 [VariableElement fieldElement]) { 115 [VariableElement fieldElement]) {
112 void computeFunctionType(FunctionExpression functionExpression) { 116 void computeFunctionType(FunctionExpression functionExpression) {
113 FunctionSignature functionSignature = SignatureResolver.analyze( 117 FunctionSignature functionSignature = SignatureResolver.analyze(
114 compiler, 118 resolution,
115 scope, 119 scope,
116 functionExpression.typeVariables, 120 functionExpression.typeVariables,
117 functionExpression.parameters, 121 functionExpression.parameters,
118 functionExpression.returnType, 122 functionExpression.returnType,
119 element, 123 element,
120 registry, 124 registry,
121 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT); 125 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT);
122 element.functionSignature = functionSignature; 126 element.functionSignature = functionSignature;
123 } 127 }
124 128
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 287
284 /** 288 /**
285 * Resolves formal parameters and return type of a [FunctionExpression] 289 * Resolves formal parameters and return type of a [FunctionExpression]
286 * to a [FunctionSignature]. 290 * to a [FunctionSignature].
287 * 291 *
288 * If [createRealParameters] is `true`, the parameters will be 292 * If [createRealParameters] is `true`, the parameters will be
289 * real parameters implementing the [ParameterElement] interface. Otherwise, 293 * real parameters implementing the [ParameterElement] interface. Otherwise,
290 * the parameters will only implement [FormalElement]. 294 * the parameters will only implement [FormalElement].
291 */ 295 */
292 static FunctionSignature analyze( 296 static FunctionSignature analyze(
293 Compiler compiler, 297 Resolution resolution,
294 Scope scope, 298 Scope scope,
295 NodeList typeVariables, 299 NodeList typeVariables,
296 NodeList formalParameters, 300 NodeList formalParameters,
297 Node returnNode, 301 Node returnNode,
298 FunctionTypedElement element, 302 FunctionTypedElement element,
299 ResolutionRegistry registry, 303 ResolutionRegistry registry,
300 {MessageKind defaultValuesError, 304 {MessageKind defaultValuesError,
301 bool createRealParameters: false, 305 bool createRealParameters: false,
302 bool isFunctionExpression: false}) { 306 bool isFunctionExpression: false}) {
303 DiagnosticReporter reporter = compiler.reporter; 307 DiagnosticReporter reporter = resolution.reporter;
304 308
305 List<DartType> createTypeVariables(NodeList typeVariableNodes) { 309 List<DartType> createTypeVariables(NodeList typeVariableNodes) {
306 if (typeVariableNodes == null) return const <DartType>[]; 310 if (typeVariableNodes == null) return const <DartType>[];
307 311
308 // Create the types and elements corresponding to [typeVariableNodes]. 312 // Create the types and elements corresponding to [typeVariableNodes].
309 Link<Node> nodes = typeVariableNodes.nodes; 313 Link<Node> nodes = typeVariableNodes.nodes;
310 List<DartType> arguments = 314 List<DartType> arguments =
311 new List.generate(nodes.slowLength(), (int index) { 315 new List.generate(nodes.slowLength(), (int index) {
312 TypeVariable node = nodes.head; 316 TypeVariable node = nodes.head;
313 String variableName = node.name.source; 317 String variableName = node.name.source;
314 nodes = nodes.tail; 318 nodes = nodes.tail;
315 TypeVariableElementX variableElement = 319 TypeVariableElementX variableElement =
316 new TypeVariableElementX(variableName, element, index, node); 320 new TypeVariableElementX(variableName, element, index, node);
317 // GENERIC_METHODS: When method type variables are implemented fully we 321 // GENERIC_METHODS: When method type variables are implemented fully we
318 // must resolve the actual bounds; currently we just claim that 322 // must resolve the actual bounds; currently we just claim that
319 // every method type variable has upper bound [dynamic]. 323 // every method type variable has upper bound [dynamic].
320 variableElement.boundCache = const DynamicType(); 324 variableElement.boundCache = const DynamicType();
321 TypeVariableType variableType = 325 TypeVariableType variableType =
322 new MethodTypeVariableType(variableElement); 326 new MethodTypeVariableType(variableElement);
323 variableElement.typeCache = variableType; 327 variableElement.typeCache = variableType;
324 return variableType; 328 return variableType;
325 }, growable: false); 329 }, growable: false);
326 return arguments; 330 return arguments;
327 } 331 }
328 332
329 List<DartType> typeVariableTypes = createTypeVariables(typeVariables); 333 List<DartType> typeVariableTypes = createTypeVariables(typeVariables);
330 scope = new FunctionSignatureBuildingScope(scope, typeVariableTypes); 334 scope = new FunctionSignatureBuildingScope(scope, typeVariableTypes);
331 SignatureResolver visitor = new SignatureResolver( 335 SignatureResolver visitor = new SignatureResolver(
332 compiler, element, scope, registry, 336 resolution, element, scope, registry,
333 defaultValuesError: defaultValuesError, 337 defaultValuesError: defaultValuesError,
334 createRealParameters: createRealParameters); 338 createRealParameters: createRealParameters);
335 List<Element> parameters = const <Element>[]; 339 List<Element> parameters = const <Element>[];
336 int requiredParameterCount = 0; 340 int requiredParameterCount = 0;
337 if (formalParameters == null) { 341 if (formalParameters == null) {
338 if (!element.isGetter) { 342 if (!element.isGetter) {
339 if (element.isMalformed) { 343 if (element.isMalformed) {
340 // If the element is erroneous, an error should already have been 344 // If the element is erroneous, an error should already have been
341 // reported. In the case of parse errors, it is possible that there 345 // reported. In the case of parse errors, it is possible that there
342 // are formal parameters, but something else in the method failed to 346 // are formal parameters, but something else in the method failed to
343 // parse. So we suppress the message about missing formals. 347 // parse. So we suppress the message about missing formals.
344 assert(invariant(element, compiler.compilationFailed)); 348 assert(invariant(element, reporter.hasReportedError));
345 } else { 349 } else {
346 reporter.reportErrorMessage(element, MessageKind.MISSING_FORMALS); 350 reporter.reportErrorMessage(element, MessageKind.MISSING_FORMALS);
347 } 351 }
348 } 352 }
349 } else { 353 } else {
350 if (element.isGetter) { 354 if (element.isGetter) {
351 if (!identical( 355 if (!identical(
352 formalParameters.endToken.next.stringValue, 356 formalParameters.endToken.next.stringValue,
353 // TODO(ahe): Remove the check for native keyword. 357 // TODO(ahe): Remove the check for native keyword.
354 'native')) { 358 'native')) {
355 reporter.reportErrorMessage( 359 reporter.reportErrorMessage(
356 formalParameters, MessageKind.EXTRA_FORMALS); 360 formalParameters, MessageKind.EXTRA_FORMALS);
357 } 361 }
358 } 362 }
359 LinkBuilder<Element> parametersBuilder = 363 LinkBuilder<Element> parametersBuilder =
360 visitor.analyzeNodes(formalParameters.nodes); 364 visitor.analyzeNodes(formalParameters.nodes);
361 requiredParameterCount = parametersBuilder.length; 365 requiredParameterCount = parametersBuilder.length;
362 parameters = parametersBuilder.toList(); 366 parameters = parametersBuilder.toList();
363 } 367 }
364 DartType returnType; 368 DartType returnType;
365 if (element.isFactoryConstructor) { 369 if (element.isFactoryConstructor) {
366 returnType = element.enclosingClass.thisType; 370 returnType = element.enclosingClass.thisType;
367 // Because there is no type annotation for the return type of 371 // Because there is no type annotation for the return type of
368 // this element, we explicitly add one. 372 // this element, we explicitly add one.
369 if (compiler.options.enableTypeAssertions) { 373 if (resolution.options.enableTypeAssertions) {
370 registry.registerTypeUse(new TypeUse.checkedModeCheck(returnType)); 374 registry.registerTypeUse(new TypeUse.checkedModeCheck(returnType));
371 } 375 }
372 } else { 376 } else {
373 AsyncMarker asyncMarker = AsyncMarker.SYNC; 377 AsyncMarker asyncMarker = AsyncMarker.SYNC;
374 if (isFunctionExpression) { 378 if (isFunctionExpression) {
375 // Use async marker to determine the return type of function 379 // Use async marker to determine the return type of function
376 // expressions. 380 // expressions.
377 FunctionElement function = element; 381 FunctionElement function = element;
378 asyncMarker = function.asyncMarker; 382 asyncMarker = function.asyncMarker;
379 } 383 }
380 switch (asyncMarker) { 384 switch (asyncMarker) {
381 case AsyncMarker.SYNC: 385 case AsyncMarker.SYNC:
382 returnType = visitor.resolveReturnType(returnNode); 386 returnType = visitor.resolveReturnType(returnNode);
383 break; 387 break;
384 case AsyncMarker.SYNC_STAR: 388 case AsyncMarker.SYNC_STAR:
385 returnType = compiler.coreTypes.iterableType(); 389 returnType = resolution.coreTypes.iterableType();
386 break; 390 break;
387 case AsyncMarker.ASYNC: 391 case AsyncMarker.ASYNC:
388 returnType = compiler.coreTypes.futureType(); 392 returnType = resolution.coreTypes.futureType();
389 break; 393 break;
390 case AsyncMarker.ASYNC_STAR: 394 case AsyncMarker.ASYNC_STAR:
391 returnType = compiler.coreTypes.streamType(); 395 returnType = resolution.coreTypes.streamType();
392 break; 396 break;
393 } 397 }
394 } 398 }
395 399
396 if (element.isSetter && 400 if (element.isSetter &&
397 (requiredParameterCount != 1 || visitor.optionalParameterCount != 0)) { 401 (requiredParameterCount != 1 || visitor.optionalParameterCount != 0)) {
398 // If there are no formal parameters, we already reported an error above. 402 // If there are no formal parameters, we already reported an error above.
399 if (formalParameters != null) { 403 if (formalParameters != null) {
400 reporter.reportErrorMessage( 404 reporter.reportErrorMessage(
401 formalParameters, MessageKind.ILLEGAL_SETTER_FORMALS); 405 formalParameters, MessageKind.ILLEGAL_SETTER_FORMALS);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 /// variables of the function signature itself when its signature is analyzed. 479 /// variables of the function signature itself when its signature is analyzed.
476 class FunctionSignatureBuildingScope extends TypeVariablesScope { 480 class FunctionSignatureBuildingScope extends TypeVariablesScope {
477 @override 481 @override
478 final List<DartType> typeVariables; 482 final List<DartType> typeVariables;
479 483
480 FunctionSignatureBuildingScope(Scope parent, this.typeVariables) 484 FunctionSignatureBuildingScope(Scope parent, this.typeVariables)
481 : super(parent); 485 : super(parent);
482 486
483 String toString() => 'FunctionSignatureBuildingScope($typeVariables)'; 487 String toString() => 'FunctionSignatureBuildingScope($typeVariables)';
484 } 488 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698