| Index: compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| index fd33c390320dd6e01ac3558816926dceae22bfe6..4c3d27a17003c2c738bf24440a9b0c3b6c20b7d9 100644
|
| --- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| +++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| @@ -206,7 +206,7 @@ public class Resolver {
|
| ResolutionContext getContext() {
|
| return context;
|
| }
|
| -
|
| +
|
| @Override
|
| protected EnclosingElement getEnclosingElement() {
|
| return enclosingElement;
|
| @@ -231,11 +231,11 @@ public class Resolver {
|
| if (parameter.getQualifier() instanceof DartThisExpression) {
|
| onError(parameter.getName(), ResolverErrorCode.PARAMETER_INIT_OUTSIDE_CONSTRUCTOR);
|
| } else {
|
| - if (parameter.getModifiers().isNamed()
|
| + if (parameter.getModifiers().isNamed()
|
| && DartIdentifier.isPrivateName(parameter.getElement().getName())) {
|
| - onError(parameter.getName(),
|
| - ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER);
|
| - }
|
| + onError(parameter.getName(),
|
| + ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER);
|
| + }
|
| getContext().declare(
|
| parameter.getElement(),
|
| ResolverErrorCode.DUPLICATE_PARAMETER,
|
| @@ -621,11 +621,11 @@ public class Resolver {
|
|
|
| DartBlock body = functionNode.getBody();
|
| boolean isInterface = false;
|
| - if (ElementKind.of(member.getEnclosingElement()).equals(ElementKind.CLASS)
|
| + if (ElementKind.of(member.getEnclosingElement()).equals(ElementKind.CLASS)
|
| && ((ClassElement) member.getEnclosingElement()).isInterface()) {
|
| isInterface =true;
|
| }
|
| - if (body == null
|
| + if (body == null
|
| && !Elements.isNonFactoryConstructor(member)
|
| && !member.getModifiers().isAbstract()
|
| && !isInterface) {
|
| @@ -633,7 +633,7 @@ public class Resolver {
|
| }
|
| resolve(functionNode.getBody());
|
|
|
| - if (Elements.isNonFactoryConstructor(member)
|
| + if (Elements.isNonFactoryConstructor(member)
|
| && !(body instanceof DartNativeBlock)) {
|
| resolveInitializers(node, initializedFields);
|
| // Test for missing final initialized fields
|
| @@ -676,7 +676,7 @@ public class Resolver {
|
| } else if (isStatic) {
|
| onError(node, ResolverErrorCode.STATIC_FINAL_REQUIRES_VALUE);
|
| } else if (isTopLevel) {
|
| - onError(node, ResolverErrorCode.TOPLEVEL_FINAL_REQUIRES_VALUE);
|
| + onError(node, ResolverErrorCode.TOPLEVEL_FINAL_REQUIRES_VALUE);
|
| } else {
|
| // If a final instance field wasn't initialized at declaration, we must check
|
| // at construction time.
|
| @@ -1092,8 +1092,8 @@ public class Resolver {
|
| if (field.getSetter() == null && field.getGetter() != null) {
|
| onError(x.getName(), ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER);
|
| }
|
| - }
|
| -
|
| + }
|
| +
|
| break;
|
|
|
| case NONE:
|
| @@ -1442,17 +1442,17 @@ public class Resolver {
|
| case NONE:
|
| switch (ElementKind.of(classOrLibrary)) {
|
| case CLASS:
|
| - onError(errorNode, ResolverErrorCode.CANNOT_RESOLVE_METHOD_IN_CLASS, name,
|
| + onError(errorNode, ResolverErrorCode.CANNOT_RESOLVE_METHOD_IN_CLASS, name,
|
| classOrLibrary.getName());
|
| break;
|
| case LIBRARY:
|
| - onError(errorNode, ResolverErrorCode.CANNOT_RESOLVE_METHOD_IN_LIBRARY, name,
|
| + onError(errorNode, ResolverErrorCode.CANNOT_RESOLVE_METHOD_IN_LIBRARY, name,
|
| classOrLibrary.getName());
|
| - break;
|
| + break;
|
| default:
|
| onError(errorNode, ResolverErrorCode.CANNOT_RESOLVE_METHOD, name);
|
| }
|
| -
|
| +
|
| break;
|
|
|
| case CONSTRUCTOR:
|
| @@ -1506,11 +1506,11 @@ public class Resolver {
|
| case FUNCTION_TYPE_ALIAS:
|
| onError(node, ResolverErrorCode.CANNOT_CALL_FUNCTION_TYPE_ALIAS);
|
| break;
|
| -
|
| +
|
| case LIBRARY_PREFIX:
|
| onError(node, ResolverErrorCode.CANNOT_CALL_LIBRARY_PREFIX);
|
| break;
|
| -
|
| +
|
| default:
|
| throw context.internalError(node, "Unexpected kind of element: %s", kind);
|
| }
|
| @@ -1591,6 +1591,7 @@ public class Resolver {
|
|
|
| @Override
|
| public Element visitRedirectConstructorInvocation(DartRedirectConstructorInvocation x) {
|
| +
|
| visit(x.getArguments());
|
| String name = x.getName() != null ? x.getName().getName() : "";
|
| ConstructorElement element = Elements.lookupConstructor((ClassElement) currentHolder, name);
|
| @@ -1795,15 +1796,30 @@ public class Resolver {
|
| private void checkInvocationTarget(DartInvocation node,
|
| MethodElement callSite,
|
| Element target) {
|
| - if (callSite != null
|
| - && callSite.isStatic()
|
| - && ElementKind.of(target).equals(ElementKind.METHOD)) {
|
| - if (!target.getModifiers().isStatic() && !Elements.isTopLevel(target)) {
|
| - onError(node, ResolverErrorCode.INSTANCE_METHOD_FROM_STATIC);
|
| +
|
| + if (ElementKind.of(target).equals(ElementKind.METHOD)) {
|
| + if (callSite != null && callSite.isStatic())
|
| + if (!target.getModifiers().isStatic() && !Elements.isTopLevel(target)) {
|
| + onError(node, ResolverErrorCode.INSTANCE_METHOD_FROM_STATIC);
|
| + }
|
| + if (calledFromRedirectConstructor(node)) {
|
| + if (!target.getModifiers().isStatic() && !Elements.isTopLevel(target)) {
|
| + onError(node, ResolverErrorCode.INSTANCE_METHOD_FROM_REDIRECT);
|
| + }
|
| }
|
| }
|
| }
|
|
|
| + private boolean calledFromRedirectConstructor(DartNode node) {
|
| + do {
|
| + if (node instanceof DartRedirectConstructorInvocation) {
|
| + return true;
|
| + }
|
| + node = node.getParent();
|
| + } while (node != null);
|
| + return false;
|
| + }
|
| +
|
| private void checkVariableStatement(DartVariableStatement node,
|
| DartVariable variable,
|
| boolean isImplicitlyInitialized) {
|
| @@ -1923,12 +1939,12 @@ public class Resolver {
|
| }
|
| return false;
|
| }
|
| -
|
| +
|
| private ConstructorNodeElement getNextConstructorInvocation(ConstructorNodeElement constructor) {
|
| List<DartInitializer> inits = ((DartMethodDefinition) constructor.getNode()).getInitializers();
|
| // Parser ensures that redirected constructors can be the only item in the initialization list.
|
| if (inits.size() == 1) {
|
| - Element element = (Element) inits.get(0).getValue().getElement();
|
| + Element element = inits.get(0).getValue().getElement();
|
| if (ElementKind.of(element).equals(ElementKind.CONSTRUCTOR)) {
|
| ConstructorElement nextConstructorElement = (ConstructorElement) element;
|
| ClassElement nextClass = (ClassElement) nextConstructorElement.getEnclosingElement();
|
|
|