| Index: compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
|
| diff --git a/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java b/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
|
| index 526131c0b657aa6ee21a7440223beac3cc3f8803..122c74dea7ba53e6aea45edf743fbad9dbdf3e3b 100644
|
| --- a/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
|
| +++ b/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
|
| @@ -10,6 +10,8 @@ import com.google.dart.compiler.DartCompilerContext;
|
| import com.google.dart.compiler.DartCompilerListener;
|
| import com.google.dart.compiler.ErrorCode;
|
| import com.google.dart.compiler.ast.DartClass;
|
| +import com.google.dart.compiler.ast.DartDeclaration;
|
| +import com.google.dart.compiler.ast.DartExpression;
|
| import com.google.dart.compiler.ast.DartField;
|
| import com.google.dart.compiler.ast.DartFieldDefinition;
|
| import com.google.dart.compiler.ast.DartFunctionTypeAlias;
|
| @@ -94,16 +96,39 @@ public class TopLevelElementBuilder {
|
| listener.onError(error);
|
| }
|
|
|
| - private void declare(Element element, DartCompilerListener listener, Scope scope) {
|
| - Element originalElement = scope.declareElement(element.getName(), element);
|
| - if (originalElement != null) {
|
| - DartNode originalNode = originalElement.getNode();
|
| - if (originalNode != null) {
|
| - compilationError(listener, originalNode, ResolverErrorCode.DUPLICATE_DEFINITION,
|
| - originalElement.getName());
|
| + private void declare(Element newElement, DartCompilerListener listener, Scope scope) {
|
| + Element oldElement = scope.declareElement(newElement.getName(), newElement);
|
| + // We had already node with such name, report duplicate.
|
| + if (oldElement != null) {
|
| + // Getter/setter can shared same name, but not setter/setter and getter/getter.
|
| + if (newElement.getModifiers().isAbstractField()
|
| + && oldElement.getModifiers().isAbstractField()) {
|
| + if (newElement.getModifiers().isGetter() && !oldElement.getModifiers().isGetter()) {
|
| + return;
|
| + }
|
| + if (newElement.getModifiers().isSetter() && !oldElement.getModifiers().isSetter()) {
|
| + return;
|
| + }
|
| }
|
| - compilationError(listener, element.getNode(), ResolverErrorCode.DUPLICATE_DEFINITION,
|
| - originalElement.getName());
|
| + // Report two duplicate for both old/new nodes.
|
| + reportDuplicateDeclaration(listener, oldElement);
|
| + reportDuplicateDeclaration(listener, newElement);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Reports {@link ResolverErrorCode#DUPLICATE_TOP_LEVEL_DEFINITION} for given named element.
|
| + */
|
| + @SuppressWarnings("unchecked")
|
| + private void reportDuplicateDeclaration(DartCompilerListener listener, Element element) {
|
| + DartNode node = element.getNode();
|
| + if (node instanceof DartDeclaration) {
|
| + DartNode nameNode = ((DartDeclaration<DartExpression>) node).getName();
|
| + compilationError(
|
| + listener,
|
| + nameNode,
|
| + ResolverErrorCode.DUPLICATE_TOP_LEVEL_DEFINITION,
|
| + nameNode);
|
| }
|
| }
|
|
|
|
|