OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of resolution; | 5 part of resolution; |
6 | 6 |
7 abstract class TreeElements { | 7 abstract class TreeElements { |
8 Element get currentElement; | 8 Element get currentElement; |
9 Setlet<Node> get superUses; | 9 Setlet<Node> get superUses; |
10 | 10 |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 if (originParameterText != patchParameterText | 350 if (originParameterText != patchParameterText |
351 // We special case the list constructor because of the | 351 // We special case the list constructor because of the |
352 // optional parameter. | 352 // optional parameter. |
353 && origin != compiler.unnamedListConstructor) { | 353 && origin != compiler.unnamedListConstructor) { |
354 compiler.reportError( | 354 compiler.reportError( |
355 originParameter.parseNode(compiler), | 355 originParameter.parseNode(compiler), |
356 MessageKind.PATCH_PARAMETER_MISMATCH, | 356 MessageKind.PATCH_PARAMETER_MISMATCH, |
357 {'methodName': origin.name, | 357 {'methodName': origin.name, |
358 'originParameter': originParameterText, | 358 'originParameter': originParameterText, |
359 'patchParameter': patchParameterText}); | 359 'patchParameter': patchParameterText}); |
360 compiler.reportMessage( | 360 compiler.reportInfo(patchParameter, |
361 compiler.spanFromSpannable(patchParameter), | 361 MessageKind.PATCH_POINT_TO_PARAMETER, |
362 MessageKind.PATCH_POINT_TO_PARAMETER.error( | 362 {'parameterName': patchParameter.name}); |
363 {'parameterName': patchParameter.name}), | |
364 Diagnostic.INFO); | |
365 } | 363 } |
366 DartType originParameterType = originParameter.computeType(compiler); | 364 DartType originParameterType = originParameter.computeType(compiler); |
367 DartType patchParameterType = patchParameter.computeType(compiler); | 365 DartType patchParameterType = patchParameter.computeType(compiler); |
368 if (originParameterType != patchParameterType) { | 366 if (originParameterType != patchParameterType) { |
369 compiler.reportError( | 367 compiler.reportError( |
370 originParameter.parseNode(compiler), | 368 originParameter.parseNode(compiler), |
371 MessageKind.PATCH_PARAMETER_TYPE_MISMATCH, | 369 MessageKind.PATCH_PARAMETER_TYPE_MISMATCH, |
372 {'methodName': origin.name, | 370 {'methodName': origin.name, |
373 'parameterName': originParameter.name, | 371 'parameterName': originParameter.name, |
374 'originParameterType': originParameterType, | 372 'originParameterType': originParameterType, |
375 'patchParameterType': patchParameterType}); | 373 'patchParameterType': patchParameterType}); |
376 compiler.reportMessage( | 374 compiler.reportInfo(patchParameter, |
377 compiler.spanFromSpannable(patchParameter), | 375 MessageKind.PATCH_POINT_TO_PARAMETER, |
378 MessageKind.PATCH_POINT_TO_PARAMETER.error( | 376 {'parameterName': patchParameter.name}); |
379 {'parameterName': patchParameter.name}), | |
380 Diagnostic.INFO); | |
381 } | 377 } |
382 | 378 |
383 originParameters = originParameters.tail; | 379 originParameters = originParameters.tail; |
384 patchParameters = patchParameters.tail; | 380 patchParameters = patchParameters.tail; |
385 } | 381 } |
386 } | 382 } |
387 | 383 |
388 void checkMatchingPatchSignatures(FunctionElement origin, | 384 void checkMatchingPatchSignatures(FunctionElement origin, |
389 FunctionElement patch) { | 385 FunctionElement patch) { |
390 // TODO(johnniwinther): Show both origin and patch locations on errors. | 386 // TODO(johnniwinther): Show both origin and patch locations on errors. |
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1545 | 1541 |
1546 R visitEmptyStatement(Node node) => null; | 1542 R visitEmptyStatement(Node node) => null; |
1547 | 1543 |
1548 /** Convenience method for visiting nodes that may be null. */ | 1544 /** Convenience method for visiting nodes that may be null. */ |
1549 R visit(Node node) => (node == null) ? null : node.accept(this); | 1545 R visit(Node node) => (node == null) ? null : node.accept(this); |
1550 | 1546 |
1551 void error(Spannable node, MessageKind kind, [Map arguments = const {}]) { | 1547 void error(Spannable node, MessageKind kind, [Map arguments = const {}]) { |
1552 compiler.reportFatalError(node, kind, arguments); | 1548 compiler.reportFatalError(node, kind, arguments); |
1553 } | 1549 } |
1554 | 1550 |
1555 void warning(Node node, MessageKind kind, [Map arguments = const {}]) { | 1551 void warning(Spannable node, MessageKind kind, [Map arguments = const {}]) { |
1556 ResolutionWarning message = | 1552 compiler.reportWarning(node, kind, arguments); |
1557 new ResolutionWarning(kind, arguments, compiler.terseDiagnostics); | |
1558 compiler.reportWarning(node, message); | |
1559 } | 1553 } |
1560 | 1554 |
1561 void cancel(Node node, String message) { | 1555 void cancel(Node node, String message) { |
1562 compiler.cancel(message, node: node); | 1556 compiler.cancel(message, node: node); |
1563 } | 1557 } |
1564 | 1558 |
1565 void internalError(Node node, String message) { | 1559 void internalError(Node node, String message) { |
1566 compiler.internalError(message, node: node); | 1560 compiler.internalError(message, node: node); |
1567 } | 1561 } |
1568 | 1562 |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1836 } | 1830 } |
1837 | 1831 |
1838 /// Checks the type arguments of [type] against the type variable bounds. | 1832 /// Checks the type arguments of [type] against the type variable bounds. |
1839 void checkTypeVariableBounds(TreeElements elements, | 1833 void checkTypeVariableBounds(TreeElements elements, |
1840 TypeAnnotation node, GenericType type) { | 1834 TypeAnnotation node, GenericType type) { |
1841 void checkTypeVariableBound(_, DartType typeArgument, | 1835 void checkTypeVariableBound(_, DartType typeArgument, |
1842 TypeVariableType typeVariable, | 1836 TypeVariableType typeVariable, |
1843 DartType bound) { | 1837 DartType bound) { |
1844 compiler.backend.registerTypeVariableBoundCheck(elements); | 1838 compiler.backend.registerTypeVariableBoundCheck(elements); |
1845 if (!compiler.types.isSubtype(typeArgument, bound)) { | 1839 if (!compiler.types.isSubtype(typeArgument, bound)) { |
1846 compiler.reportWarningCode(node, | 1840 compiler.reportWarning(node, |
1847 MessageKind.INVALID_TYPE_VARIABLE_BOUND, | 1841 MessageKind.INVALID_TYPE_VARIABLE_BOUND, |
1848 {'typeVariable': typeVariable, | 1842 {'typeVariable': typeVariable, |
1849 'bound': bound, | 1843 'bound': bound, |
1850 'typeArgument': typeArgument, | 1844 'typeArgument': typeArgument, |
1851 'thisType': type.element.thisType}); | 1845 'thisType': type.element.thisType}); |
1852 } | 1846 } |
1853 }; | 1847 }; |
1854 | 1848 |
1855 compiler.types.checkTypeVariableBounds(type, checkTypeVariableBound); | 1849 compiler.types.checkTypeVariableBounds(type, checkTypeVariableBound); |
1856 } | 1850 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1931 if (existing != element) { | 1925 if (existing != element) { |
1932 reportDuplicateDefinition(node, element, existing); | 1926 reportDuplicateDefinition(node, element, existing); |
1933 } | 1927 } |
1934 } | 1928 } |
1935 return element; | 1929 return element; |
1936 } | 1930 } |
1937 | 1931 |
1938 void reportDuplicateDefinition(/*Node|String*/ name, | 1932 void reportDuplicateDefinition(/*Node|String*/ name, |
1939 Spannable definition, | 1933 Spannable definition, |
1940 Spannable existing) { | 1934 Spannable existing) { |
1941 compiler.reportError( | 1935 compiler.reportError(definition, |
1942 definition, | |
1943 MessageKind.DUPLICATE_DEFINITION, {'name': name}); | 1936 MessageKind.DUPLICATE_DEFINITION, {'name': name}); |
1944 compiler.reportMessage( | 1937 compiler.reportInfo(existing, |
1945 compiler.spanFromSpannable(existing), | 1938 MessageKind.EXISTING_DEFINITION, {'name': name}); |
1946 MessageKind.EXISTING_DEFINITION.error({'name': name}), | |
1947 Diagnostic.INFO); | |
1948 } | 1939 } |
1949 } | 1940 } |
1950 | 1941 |
1951 /** | 1942 /** |
1952 * Core implementation of resolution. | 1943 * Core implementation of resolution. |
1953 * | 1944 * |
1954 * Do not subclass or instantiate this class outside this library | 1945 * Do not subclass or instantiate this class outside this library |
1955 * except for testing. | 1946 * except for testing. |
1956 */ | 1947 */ |
1957 class ResolverVisitor extends MappingVisitor<Element> { | 1948 class ResolverVisitor extends MappingVisitor<Element> { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2099 } | 2090 } |
2100 | 2091 |
2101 visitInStaticContext(Node node) { | 2092 visitInStaticContext(Node node) { |
2102 inStaticContext(() => visit(node)); | 2093 inStaticContext(() => visit(node)); |
2103 } | 2094 } |
2104 | 2095 |
2105 ErroneousElement warnAndCreateErroneousElement(Node node, | 2096 ErroneousElement warnAndCreateErroneousElement(Node node, |
2106 String name, | 2097 String name, |
2107 DualKind kind, | 2098 DualKind kind, |
2108 [Map arguments = const {}]) { | 2099 [Map arguments = const {}]) { |
2109 ResolutionWarning warning = new ResolutionWarning( | 2100 compiler.reportWarning(node, kind.warning, arguments); |
2110 kind.warning, arguments, compiler.terseDiagnostics); | |
2111 compiler.reportWarning(node, warning); | |
2112 return new ErroneousElementX(kind.error, arguments, name, enclosingElement); | 2101 return new ErroneousElementX(kind.error, arguments, name, enclosingElement); |
2113 } | 2102 } |
2114 | 2103 |
2115 Element visitIdentifier(Identifier node) { | 2104 Element visitIdentifier(Identifier node) { |
2116 if (node.isThis()) { | 2105 if (node.isThis()) { |
2117 if (!inInstanceContext) { | 2106 if (!inInstanceContext) { |
2118 error(node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': node}); | 2107 error(node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': node}); |
2119 } | 2108 } |
2120 return null; | 2109 return null; |
2121 } else if (node.isSuper()) { | 2110 } else if (node.isSuper()) { |
(...skipping 1355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3477 compiler.reportError( | 3466 compiler.reportError( |
3478 label, | 3467 label, |
3479 MessageKind.DUPLICATE_LABEL.error, {'labelName': labelName}); | 3468 MessageKind.DUPLICATE_LABEL.error, {'labelName': labelName}); |
3480 compiler.reportInfo( | 3469 compiler.reportInfo( |
3481 existingElement.label, | 3470 existingElement.label, |
3482 MessageKind.EXISTING_LABEL, {'labelName': labelName}); | 3471 MessageKind.EXISTING_LABEL, {'labelName': labelName}); |
3483 } else { | 3472 } else { |
3484 // It's only a warning if it shadows another label. | 3473 // It's only a warning if it shadows another label. |
3485 existingElement = statementScope.lookupLabel(labelName); | 3474 existingElement = statementScope.lookupLabel(labelName); |
3486 if (existingElement != null) { | 3475 if (existingElement != null) { |
3487 compiler.reportWarningCode( | 3476 compiler.reportWarning( |
3488 label, | 3477 label, |
3489 MessageKind.DUPLICATE_LABEL.warning, {'labelName': labelName}); | 3478 MessageKind.DUPLICATE_LABEL.warning, {'labelName': labelName}); |
3490 compiler.reportInfo( | 3479 compiler.reportInfo( |
3491 existingElement.label, | 3480 existingElement.label, |
3492 MessageKind.EXISTING_LABEL, {'labelName': labelName}); | 3481 MessageKind.EXISTING_LABEL, {'labelName': labelName}); |
3493 } | 3482 } |
3494 } | 3483 } |
3495 | 3484 |
3496 TargetElement targetElement = getOrCreateTargetElement(switchCase); | 3485 TargetElement targetElement = getOrCreateTargetElement(switchCase); |
3497 LabelElement labelElement = targetElement.addLabel(label, labelName); | 3486 LabelElement labelElement = targetElement.addLabel(label, labelName); |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3921 } | 3910 } |
3922 | 3911 |
3923 DartType visitNamedMixinApplication(NamedMixinApplication node) { | 3912 DartType visitNamedMixinApplication(NamedMixinApplication node) { |
3924 invariant(node, element != null); | 3913 invariant(node, element != null); |
3925 invariant(element, element.resolutionState == STATE_STARTED, | 3914 invariant(element, element.resolutionState == STATE_STARTED, |
3926 message: () => 'cyclic resolution of class $element'); | 3915 message: () => 'cyclic resolution of class $element'); |
3927 | 3916 |
3928 if (identical(node.classKeyword.stringValue, 'typedef')) { | 3917 if (identical(node.classKeyword.stringValue, 'typedef')) { |
3929 // TODO(aprelev@gmail.com): Remove this deprecation diagnostic | 3918 // TODO(aprelev@gmail.com): Remove this deprecation diagnostic |
3930 // together with corresponding TODO in parser.dart. | 3919 // together with corresponding TODO in parser.dart. |
3931 compiler.reportWarningCode(node.classKeyword, | 3920 compiler.reportWarning(node.classKeyword, |
3932 MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX); | 3921 MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX); |
3933 } | 3922 } |
3934 | 3923 |
3935 InterfaceType type = element.computeType(compiler); | 3924 InterfaceType type = element.computeType(compiler); |
3936 scope = new TypeDeclarationScope(scope, element); | 3925 scope = new TypeDeclarationScope(scope, element); |
3937 resolveTypeVariableBounds(node.typeParameters); | 3926 resolveTypeVariableBounds(node.typeParameters); |
3938 | 3927 |
3939 // Generate anonymous mixin application elements for the | 3928 // Generate anonymous mixin application elements for the |
3940 // intermediate mixin applications (excluding the last). | 3929 // intermediate mixin applications (excluding the last). |
3941 DartType supertype = resolveSupertype(element, node.superclass); | 3930 DartType supertype = resolveSupertype(element, node.superclass); |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4380 String targetName, DualKind kind, | 4369 String targetName, DualKind kind, |
4381 Map arguments) { | 4370 Map arguments) { |
4382 if (kind == MessageKind.CANNOT_FIND_CONSTRUCTOR) { | 4371 if (kind == MessageKind.CANNOT_FIND_CONSTRUCTOR) { |
4383 compiler.backend.registerThrowNoSuchMethod(resolver.mapping); | 4372 compiler.backend.registerThrowNoSuchMethod(resolver.mapping); |
4384 } else { | 4373 } else { |
4385 compiler.backend.registerThrowRuntimeError(resolver.mapping); | 4374 compiler.backend.registerThrowRuntimeError(resolver.mapping); |
4386 } | 4375 } |
4387 if (inConstContext) { | 4376 if (inConstContext) { |
4388 compiler.reportError(diagnosticNode, kind.error, arguments); | 4377 compiler.reportError(diagnosticNode, kind.error, arguments); |
4389 } else { | 4378 } else { |
4390 ResolutionWarning warning = | 4379 compiler.reportWarning(diagnosticNode, kind.warning, arguments); |
4391 new ResolutionWarning( | |
4392 kind.warning, arguments, compiler.terseDiagnostics); | |
4393 compiler.reportWarning(diagnosticNode, warning); | |
4394 } | 4380 } |
4395 return new ErroneousElementX( | 4381 return new ErroneousElementX( |
4396 kind.error, arguments, targetName, enclosing); | 4382 kind.error, arguments, targetName, enclosing); |
4397 } | 4383 } |
4398 | 4384 |
4399 Selector createConstructorSelector(String constructorName) { | 4385 Selector createConstructorSelector(String constructorName) { |
4400 return constructorName == '' | 4386 return constructorName == '' |
4401 ? new Selector.callDefaultConstructor( | 4387 ? new Selector.callDefaultConstructor( |
4402 resolver.enclosingElement.getLibrary()) | 4388 resolver.enclosingElement.getLibrary()) |
4403 : new Selector.callConstructor( | 4389 : new Selector.callConstructor( |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4537 return finishConstructorReference(visit(expression), | 4523 return finishConstructorReference(visit(expression), |
4538 expression, expression); | 4524 expression, expression); |
4539 } | 4525 } |
4540 } | 4526 } |
4541 | 4527 |
4542 /// Looks up [name] in [scope] and unwraps the result. | 4528 /// Looks up [name] in [scope] and unwraps the result. |
4543 Element lookupInScope(Compiler compiler, Node node, | 4529 Element lookupInScope(Compiler compiler, Node node, |
4544 Scope scope, String name) { | 4530 Scope scope, String name) { |
4545 return Elements.unwrap(scope.lookup(name), compiler, node); | 4531 return Elements.unwrap(scope.lookup(name), compiler, node); |
4546 } | 4532 } |
OLD | NEW |