| OLD | NEW |
| 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 analyzer.src.generated.error_verifier; | 5 library analyzer.src.generated.error_verifier; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 import "dart:math" as math; | 8 import "dart:math" as math; |
| 9 | 9 |
| 10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 _checkForExtendsDeferredClass(extendsClause); | 479 _checkForExtendsDeferredClass(extendsClause); |
| 480 _checkForImplementsDeferredClass(implementsClause); | 480 _checkForImplementsDeferredClass(implementsClause); |
| 481 _checkForNonAbstractClassInheritsAbstractMember(node.name); | 481 _checkForNonAbstractClassInheritsAbstractMember(node.name); |
| 482 _checkForInconsistentMethodInheritance(); | 482 _checkForInconsistentMethodInheritance(); |
| 483 _checkForRecursiveInterfaceInheritance(_enclosingClass); | 483 _checkForRecursiveInterfaceInheritance(_enclosingClass); |
| 484 _checkForConflictingGetterAndMethod(); | 484 _checkForConflictingGetterAndMethod(); |
| 485 _checkForConflictingInstanceGetterAndSuperclassMember(); | 485 _checkForConflictingInstanceGetterAndSuperclassMember(); |
| 486 _checkImplementsSuperClass(node); | 486 _checkImplementsSuperClass(node); |
| 487 _checkImplementsFunctionWithoutCall(node); | 487 _checkImplementsFunctionWithoutCall(node); |
| 488 _checkForMixinHasNoConstructors(node); | 488 _checkForMixinHasNoConstructors(node); |
| 489 _checkForMixinWithConflictingPrivateMember(node); |
| 489 } | 490 } |
| 490 } | 491 } |
| 491 visitClassDeclarationIncrementally(node); | 492 visitClassDeclarationIncrementally(node); |
| 492 _checkForFinalNotInitializedInClass(node); | 493 _checkForFinalNotInitializedInClass(node); |
| 493 _checkForDuplicateDefinitionInheritance(); | 494 _checkForDuplicateDefinitionInheritance(); |
| 494 _checkForConflictingInstanceMethodSetter(node); | 495 _checkForConflictingInstanceMethodSetter(node); |
| 495 _checkForBadFunctionUse(node); | 496 _checkForBadFunctionUse(node); |
| 496 return super.visitClassDeclaration(node); | 497 return super.visitClassDeclaration(node); |
| 497 } finally { | 498 } finally { |
| 498 _isInNativeClass = false; | 499 _isInNativeClass = false; |
| (...skipping 4384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4883 if (!enableSuperMixins && mixinElement.hasReferenceToSuper) { | 4884 if (!enableSuperMixins && mixinElement.hasReferenceToSuper) { |
| 4884 _errorReporter.reportErrorForNode( | 4885 _errorReporter.reportErrorForNode( |
| 4885 CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, | 4886 CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, |
| 4886 mixinName, | 4887 mixinName, |
| 4887 [mixinElement.name]); | 4888 [mixinElement.name]); |
| 4888 } | 4889 } |
| 4889 return false; | 4890 return false; |
| 4890 } | 4891 } |
| 4891 | 4892 |
| 4892 /** | 4893 /** |
| 4894 * Check for the declaration of a mixin from a library other than the current |
| 4895 * library that defines a private member that conflicts with a private name |
| 4896 * from the same library but from a superclass or a different mixin. |
| 4897 */ |
| 4898 void _checkForMixinWithConflictingPrivateMember(ClassDeclaration node) { |
| 4899 WithClause withClause = node.withClause; |
| 4900 if (withClause == null) { |
| 4901 return; |
| 4902 } |
| 4903 DartType declaredSupertype = node.extendsClause?.superclass?.type; |
| 4904 if (declaredSupertype is! InterfaceType) { |
| 4905 return; |
| 4906 } |
| 4907 InterfaceType superclass = declaredSupertype; |
| 4908 Map<LibraryElement, Map<String, String>> mixedInNames = |
| 4909 <LibraryElement, Map<String, String>>{}; |
| 4910 |
| 4911 /** |
| 4912 * Report an error and return `true` if the given [name] is a private name |
| 4913 * (which is defined in the given [library]) and it conflicts with another |
| 4914 * definition of that name inherited from the superclass. |
| 4915 */ |
| 4916 bool isConflictingName( |
| 4917 String name, LibraryElement library, TypeName typeName) { |
| 4918 if (Identifier.isPrivateName(name)) { |
| 4919 Map<String, String> names = |
| 4920 mixedInNames.putIfAbsent(library, () => <String, String>{}); |
| 4921 if (names.containsKey(name)) { |
| 4922 _errorReporter.reportErrorForNode( |
| 4923 CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, |
| 4924 typeName, |
| 4925 [name, typeName.name.name, names[name]]); |
| 4926 return true; |
| 4927 } |
| 4928 names[name] = typeName.name.name; |
| 4929 ExecutableElement inheritedMember = |
| 4930 superclass.lookUpMethod(name, library) ?? |
| 4931 superclass.lookUpGetter(name, library) ?? |
| 4932 superclass.lookUpSetter(name, library); |
| 4933 if (inheritedMember != null) { |
| 4934 _errorReporter.reportErrorForNode( |
| 4935 CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, |
| 4936 typeName, [ |
| 4937 name, |
| 4938 typeName.name.name, |
| 4939 inheritedMember.enclosingElement.name |
| 4940 ]); |
| 4941 return true; |
| 4942 } |
| 4943 } |
| 4944 return false; |
| 4945 } |
| 4946 |
| 4947 for (TypeName mixinType in withClause.mixinTypes) { |
| 4948 DartType type = mixinType.type; |
| 4949 if (type is InterfaceType) { |
| 4950 LibraryElement library = type.element.library; |
| 4951 if (library != _currentLibrary) { |
| 4952 for (PropertyAccessorElement accessor in type.accessors) { |
| 4953 if (isConflictingName(accessor.name, library, mixinType)) { |
| 4954 return; |
| 4955 } |
| 4956 } |
| 4957 for (MethodElement method in type.methods) { |
| 4958 if (isConflictingName(method.name, library, mixinType)) { |
| 4959 return; |
| 4960 } |
| 4961 } |
| 4962 } |
| 4963 } |
| 4964 } |
| 4965 } |
| 4966 |
| 4967 /** |
| 4893 * Verify that the given [constructor] has at most one 'super' initializer. | 4968 * Verify that the given [constructor] has at most one 'super' initializer. |
| 4894 * | 4969 * |
| 4895 * See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]. | 4970 * See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]. |
| 4896 */ | 4971 */ |
| 4897 void _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) { | 4972 void _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) { |
| 4898 bool hasSuperInitializer = false; | 4973 bool hasSuperInitializer = false; |
| 4899 for (ConstructorInitializer initializer in constructor.initializers) { | 4974 for (ConstructorInitializer initializer in constructor.initializers) { |
| 4900 if (initializer is SuperConstructorInvocation) { | 4975 if (initializer is SuperConstructorInvocation) { |
| 4901 if (hasSuperInitializer) { | 4976 if (hasSuperInitializer) { |
| 4902 _errorReporter.reportErrorForNode( | 4977 _errorReporter.reportErrorForNode( |
| (...skipping 2178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7081 class _InvocationCollector extends RecursiveAstVisitor { | 7156 class _InvocationCollector extends RecursiveAstVisitor { |
| 7082 final List<String> superCalls = <String>[]; | 7157 final List<String> superCalls = <String>[]; |
| 7083 | 7158 |
| 7084 @override | 7159 @override |
| 7085 visitMethodInvocation(MethodInvocation node) { | 7160 visitMethodInvocation(MethodInvocation node) { |
| 7086 if (node.target is SuperExpression) { | 7161 if (node.target is SuperExpression) { |
| 7087 superCalls.add(node.methodName.name); | 7162 superCalls.add(node.methodName.name); |
| 7088 } | 7163 } |
| 7089 } | 7164 } |
| 7090 } | 7165 } |
| OLD | NEW |