| Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| index 93a052dac8a9036fc70d4f8a97a65b73c4626701..e9229d3d9a75d61e865967a4dddf51084cea2800 100644
|
| --- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| +++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| @@ -164,7 +164,6 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| NOT_INIT,
|
| INIT_IN_DECLARATION,
|
| INIT_IN_FIELD_FORMAL,
|
| - INIT_IN_DEFAULT_VALUE,
|
| INIT_IN_INITIALIZERS
|
| }
|
|
|
| @@ -236,6 +235,12 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| private boolean isInConstInstanceCreation;
|
|
|
| /**
|
| + * This is set to {@code true} iff the visitor is currently visiting children nodes of a native
|
| + * {@link ClassDeclaration}.
|
| + */
|
| + private boolean isInNativeClass;
|
| +
|
| + /**
|
| * This is set to {@code true} iff the visitor is currently visiting a static variable
|
| * declaration.
|
| */
|
| @@ -398,6 +403,7 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| public Void visitClassDeclaration(ClassDeclaration node) {
|
| ClassElement outerClass = enclosingClass;
|
| try {
|
| + isInNativeClass = node.getNativeClause() != null;
|
| enclosingClass = node.getElement();
|
| WithClause withClause = node.getWithClause();
|
| ImplementsClause implementsClause = node.getImplementsClause();
|
| @@ -434,6 +440,7 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| checkImplementsSuperClass(node);
|
| return super.visitClassDeclaration(node);
|
| } finally {
|
| + isInNativeClass = false;
|
| initialFieldElementsMap = null;
|
| enclosingClass = outerClass;
|
| }
|
| @@ -899,6 +906,12 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| || node.getExternalKeyword() != null) {
|
| return false;
|
| }
|
| +
|
| + // Ignore if native class.
|
| + if (isInNativeClass) {
|
| + return false;
|
| + }
|
| +
|
| boolean foundError = false;
|
| HashMap<FieldElement, INIT_STATE> fieldElementsMap = new HashMap<FieldElement, INIT_STATE>(
|
| initialFieldElementsMap);
|
| @@ -938,6 +951,9 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| // Visit all of the initializers
|
| NodeList<ConstructorInitializer> initializers = node.getInitializers();
|
| for (ConstructorInitializer constructorInitializer : initializers) {
|
| + if (constructorInitializer instanceof RedirectingConstructorInvocation) {
|
| + return false;
|
| + }
|
| if (constructorInitializer instanceof ConstructorFieldInitializer) {
|
| ConstructorFieldInitializer constructorFieldInitializer = (ConstructorFieldInitializer) constructorInitializer;
|
| SimpleIdentifier fieldName = constructorFieldInitializer.getFieldName();
|
| @@ -966,48 +982,24 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| fieldElement.getDisplayName());
|
| foundError = true;
|
| }
|
| -// else if (variableElement instanceof TopLevelVariableElement) {
|
| - // TODO(jwren) Report error, constructor initializer variable is a top level element
|
| - // (Either here or in ElementResolver#visitFieldFormalParameter)
|
| -// }
|
| }
|
| -// else {
|
| - // TODO(jwren) Do we need to consider this branch?
|
| -// }
|
| }
|
| }
|
|
|
| - // Before we do the final check for FINAL_NOT_INITIALIZED, first we loop through all of the
|
| - // parameters that have default values to set INIT_IN_DEFAULT_VALUE onto the FieldElement in our
|
| - // fieldElementsMap.
|
| -// for (FormalParameter formalParameter : formalParameters) {
|
| -// if (formalParameter instanceof DefaultFormalParameter) {
|
| -// DefaultFormalParameter defaultFormalParameter = (DefaultFormalParameter) formalParameter;
|
| -// if (defaultFormalParameter.getDefaultValue() != null) {
|
| -// // TODO(jwren) Need associated field element:
|
| -// //fieldElementsMap.put(??, INIT_STATE.INIT_IN_DEFAULT_VALUE);
|
| -// }
|
| -// }
|
| -// }
|
| -
|
| - // Visit all of the states in the map to ensure that none were never initialized
|
| - // TODO(jwren) revisit this block- lots of false positives are generated by the SDK Analysis test
|
| - // Specifically, need Dart language question answered concerning formal function parameters
|
| - // i.e., code like "(..., int this.f(..), ...)".
|
| - // See test at CompileTimeErrorCodeTest.test_finalNotInitialized_inConstructor()
|
| -// Set<Entry<FieldElement, INIT_STATE>> set = fieldElementsMap.entrySet();
|
| -// for (Entry<FieldElement, INIT_STATE> entry : set) {
|
| -// if (entry.getValue() == INIT_STATE.NOT_INIT) {
|
| -// FieldElement fieldElement = entry.getKey();
|
| -// if (fieldElement.isFinal() || fieldElement.isConst()) {
|
| -// errorReporter.reportError(
|
| -// StaticWarningCode.FINAL_NOT_INITIALIZED,
|
| -// node.getReturnType(),
|
| -// fieldElement.getName());
|
| -// foundError = true;
|
| -// }
|
| -// }
|
| -// }
|
| + // Visit all of the states in the map to ensure that none were never initialized.
|
| + Set<Entry<FieldElement, INIT_STATE>> set = fieldElementsMap.entrySet();
|
| + for (Entry<FieldElement, INIT_STATE> entry : set) {
|
| + if (entry.getValue() == INIT_STATE.NOT_INIT) {
|
| + FieldElement fieldElement = entry.getKey();
|
| + if (fieldElement.isFinal() || fieldElement.isConst()) {
|
| + errorReporter.reportError(
|
| + StaticWarningCode.FINAL_NOT_INITIALIZED,
|
| + node.getReturnType(),
|
| + fieldElement.getName());
|
| + foundError = true;
|
| + }
|
| + }
|
| + }
|
| return foundError;
|
| }
|
|
|
| @@ -2661,6 +2653,9 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
|
| */
|
| private boolean checkForFinalNotInitialized(VariableDeclarationList node) {
|
| + if (isInNativeClass) {
|
| + return false;
|
| + }
|
| boolean foundError = false;
|
| if (!node.isSynthetic() && (node.isConst() || node.isFinal())) {
|
| NodeList<VariableDeclaration> variables = node.getVariables();
|
| @@ -2668,7 +2663,7 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| if (variable.getInitializer() == null) {
|
| errorReporter.reportError(
|
| StaticWarningCode.FINAL_NOT_INITIALIZED,
|
| - variable,
|
| + variable.getName(),
|
| variable.getName().getName());
|
| foundError = true;
|
| }
|
|
|