| Index: compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
|
| diff --git a/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java b/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
|
| index f0a5feeab51b2787f7d39bd7be6111ebf4c7dabe..3d08526b444d084d124cc4611857a8151a040da0 100644
|
| --- a/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
|
| +++ b/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
|
| @@ -8,6 +8,7 @@ import com.google.common.annotations.VisibleForTesting;
|
| import com.google.dart.compiler.DartCompilerContext;
|
| 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;
|
| @@ -297,6 +298,7 @@ public class MemberBuilder {
|
| */
|
| private FieldElement buildAbstractField(DartField fieldNode) {
|
| assert fieldNode.getModifiers().isAbstractField();
|
| + boolean topLevelDefinition = fieldNode.getParent().getParent() instanceof DartUnit;
|
| DartMethodDefinition accessorNode = fieldNode.getAccessor();
|
| MethodElement accessorElement = Elements.methodFromMethodNode(accessorNode, currentHolder);
|
| recordElement(accessorNode, accessorElement);
|
| @@ -324,20 +326,20 @@ public class MemberBuilder {
|
|
|
| if (accessorNode.getModifiers().isGetter()) {
|
| if (fieldElement.getGetter() != null) {
|
| - int conflictLine = fieldElement.getNode().getSourceLine();
|
| - int conflictColumn = fieldElement.getNode().getSourceColumn();
|
| - resolutionError(fieldNode, ResolverErrorCode.FIELD_CONFLICTS, name, "getter",
|
| - conflictLine, conflictColumn);
|
| + if (!topLevelDefinition) {
|
| + reportDuplicateDeclaration(ResolverErrorCode.DUPLICATE_MEMBER, fieldElement.getGetter());
|
| + reportDuplicateDeclaration(ResolverErrorCode.DUPLICATE_MEMBER, accessorElement);
|
| + }
|
| } else {
|
| fieldElement.setGetter(accessorElement);
|
| fieldElement.setType(accessorElement.getReturnType());
|
| }
|
| } else if (accessorNode.getModifiers().isSetter()) {
|
| if (fieldElement.getSetter() != null) {
|
| - int conflictLine = fieldElement.getNode().getSourceLine();
|
| - int conflictColumn = fieldElement.getNode().getSourceColumn();
|
| - resolutionError(fieldNode, ResolverErrorCode.FIELD_CONFLICTS, name, "setter",
|
| - conflictLine, conflictColumn);
|
| + if (!topLevelDefinition) {
|
| + reportDuplicateDeclaration(ResolverErrorCode.DUPLICATE_MEMBER, fieldElement.getSetter());
|
| + reportDuplicateDeclaration(ResolverErrorCode.DUPLICATE_MEMBER, accessorElement);
|
| + }
|
| } else {
|
| fieldElement.setSetter(accessorElement);
|
| List<VariableElement> parameters = accessorElement.getParameters();
|
| @@ -484,18 +486,9 @@ public class MemberBuilder {
|
| return;
|
| }
|
|
|
| -
|
| - // Message has no space between source and line number so that if we can't
|
| - // find the name, it won't show funny formatting.
|
| - String source = "";
|
| - DartNode otherNode = other.getNode();
|
| - if (e.getNode() != otherNode && otherNode.getSource() != null
|
| - && otherNode.getSource().getUri() != null) {
|
| - source = otherNode.getSource().getUri().toString() + " ";
|
| - }
|
| -
|
| - resolutionError(e.getNode(), ResolverErrorCode.NAME_CLASHES_EXISTING_MEMBER,
|
| - source, other.getNode().getSourceLine(), other.getNode().getSourceColumn());
|
| + // Report initial declaration and current declaration.
|
| + reportDuplicateDeclaration(ResolverErrorCode.DUPLICATE_MEMBER, other);
|
| + reportDuplicateDeclaration(ResolverErrorCode.DUPLICATE_MEMBER, e);
|
| }
|
| }
|
|
|
| @@ -516,5 +509,17 @@ public class MemberBuilder {
|
| void resolutionError(DartNode node, ErrorCode errorCode, Object... arguments) {
|
| topLevelContext.onError(node, errorCode, arguments);
|
| }
|
| +
|
| + /**
|
| + * Reports duplicate declaration for given named element.
|
| + */
|
| + @SuppressWarnings("unchecked")
|
| + private void reportDuplicateDeclaration(ErrorCode errorCode, Element element) {
|
| + DartNode node = element.getNode();
|
| + if (node instanceof DartDeclaration) {
|
| + DartNode nameNode = ((DartDeclaration<DartExpression>) node).getName();
|
| + resolutionError(nameNode, errorCode, nameNode);
|
| + }
|
| + }
|
| }
|
| }
|
|
|