db9e6cd
### Eclipse Workspace Patch 1.0
db9e6cd
#P org.eclipse.jdt.core
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java,v
db9e6cd
retrieving revision 1.57
db9e6cd
diff -u -r1.57 FlowContext.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java	2 Apr 2007 11:05:51 -0000	1.57
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java	29 Jan 2009 17:06:52 -0000
db9e6cd
@@ -18,6 +18,7 @@
db9e6cd
 import org.eclipse.jdt.internal.compiler.ast.Reference;
db9e6cd
 import org.eclipse.jdt.internal.compiler.ast.SubRoutineStatement;
db9e6cd
 import org.eclipse.jdt.internal.compiler.ast.TryStatement;
db9e6cd
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
db9e6cd
 import org.eclipse.jdt.internal.compiler.codegen.BranchLabel;
db9e6cd
 import org.eclipse.jdt.internal.compiler.lookup.Binding;
db9e6cd
 import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
db9e6cd
@@ -44,6 +45,25 @@
db9e6cd
 		
db9e6cd
 boolean deferNullDiagnostic, preemptNullDiagnostic;
db9e6cd
 
db9e6cd
+public static final int 
db9e6cd
+  CAN_ONLY_NULL_NON_NULL = 0x0000, 
db9e6cd
+  	// check against null and non null, with definite values -- comparisons
db9e6cd
+  CAN_ONLY_NULL = 0x0001,
db9e6cd
+  	// check against null, with definite values -- comparisons
db9e6cd
+  CAN_ONLY_NON_NULL = 0x0002,
db9e6cd
+	// check against non null, with definite values -- comparisons
db9e6cd
+  MAY_NULL = 0x0003,
db9e6cd
+	// check against null, with potential values -- NPE guard
db9e6cd
+  CHECK_MASK = 0x00FF,
db9e6cd
+  IN_COMPARISON_NULL = 0x0100,
db9e6cd
+  IN_COMPARISON_NON_NULL = 0x0200,
db9e6cd
+    // check happened in a comparison
db9e6cd
+  IN_ASSIGNMENT = 0x0300,
db9e6cd
+    // check happened in an assignment
db9e6cd
+  IN_INSTANCEOF = 0x0400,
db9e6cd
+    // check happened in an instanceof expression
db9e6cd
+  CONTEXT_MASK = ~CHECK_MASK;
db9e6cd
+
db9e6cd
 public FlowContext(FlowContext parent, ASTNode associatedNode) {
db9e6cd
 	this.parent = parent;
db9e6cd
 	this.associatedNode = associatedNode;
db9e6cd
@@ -287,6 +307,28 @@
db9e6cd
 	return null;
db9e6cd
 }
db9e6cd
 
db9e6cd
+public FlowInfo getInitsForFinalBlankInitializationCheck(TypeBinding declaringType, FlowInfo flowInfo) {
db9e6cd
+	FlowContext current = this;
db9e6cd
+	FlowInfo inits = flowInfo;
db9e6cd
+	do {
db9e6cd
+		if (current instanceof InitializationFlowContext) {
db9e6cd
+			InitializationFlowContext initializationContext = (InitializationFlowContext) current;
db9e6cd
+			if (((TypeDeclaration)initializationContext.associatedNode).binding == declaringType) {
db9e6cd
+				return inits;
db9e6cd
+			}
db9e6cd
+			inits = initializationContext.initsBeforeContext;
db9e6cd
+			current = initializationContext.initializationParent;
db9e6cd
+		} else if (current instanceof ExceptionHandlingFlowContext) {
db9e6cd
+			ExceptionHandlingFlowContext exceptionContext = (ExceptionHandlingFlowContext) current;
db9e6cd
+			current = exceptionContext.initializationParent == null ? exceptionContext.parent : exceptionContext.initializationParent;
db9e6cd
+		} else {
db9e6cd
+			current = current.parent;
db9e6cd
+		}
db9e6cd
+	} while (current != null);
db9e6cd
+	// not found
db9e6cd
+	return null;
db9e6cd
+}
db9e6cd
+
db9e6cd
 /*
db9e6cd
  * lookup through break labels
db9e6cd
  */
db9e6cd
@@ -468,25 +510,6 @@
db9e6cd
 	}
db9e6cd
 }
db9e6cd
 
db9e6cd
-public static final int 
db9e6cd
-  CAN_ONLY_NULL_NON_NULL = 0x0000, 
db9e6cd
-  	// check against null and non null, with definite values -- comparisons
db9e6cd
-  CAN_ONLY_NULL = 0x0001,
db9e6cd
-  	// check against null, with definite values -- comparisons
db9e6cd
-  CAN_ONLY_NON_NULL = 0x0002,
db9e6cd
-	// check against non null, with definite values -- comparisons
db9e6cd
-  MAY_NULL = 0x0003,
db9e6cd
-	// check against null, with potential values -- NPE guard
db9e6cd
-  CHECK_MASK = 0x00FF,
db9e6cd
-  IN_COMPARISON_NULL = 0x0100,
db9e6cd
-  IN_COMPARISON_NON_NULL = 0x0200,
db9e6cd
-    // check happened in a comparison
db9e6cd
-  IN_ASSIGNMENT = 0x0300,
db9e6cd
-    // check happened in an assignment
db9e6cd
-  IN_INSTANCEOF = 0x0400,
db9e6cd
-    // check happened in an instanceof expression
db9e6cd
-  CONTEXT_MASK = ~CHECK_MASK;
db9e6cd
-
db9e6cd
 /**
db9e6cd
  * Record a null reference for use by deferred checks. Only looping or 
db9e6cd
  * finally contexts really record that information. The context may
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.java,v
db9e6cd
retrieving revision 1.16
db9e6cd
diff -u -r1.16 InitializationFlowContext.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.java	28 Mar 2006 20:32:37 -0000	1.16
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.java	29 Jan 2009 17:06:52 -0000
db9e6cd
@@ -26,17 +26,17 @@
db9e6cd
 	public TypeBinding[] thrownExceptions = new TypeBinding[5];
db9e6cd
 	public ASTNode[] exceptionThrowers = new ASTNode[5];
db9e6cd
 	public FlowInfo[] exceptionThrowerFlowInfos = new FlowInfo[5];
db9e6cd
+	public FlowInfo	initsBeforeContext;
db9e6cd
 	
db9e6cd
-	public InitializationFlowContext(
db9e6cd
-		FlowContext parent,
db9e6cd
-		ASTNode associatedNode,
db9e6cd
-		BlockScope scope) {
db9e6cd
+	public InitializationFlowContext(FlowContext parent, ASTNode associatedNode, FlowInfo initsBeforeContext, FlowContext initializationParent, BlockScope scope) {
db9e6cd
 		super(
db9e6cd
 			parent,
db9e6cd
 			associatedNode,
db9e6cd
 			Binding.NO_EXCEPTIONS, // no exception allowed by default
db9e6cd
+			initializationParent,
db9e6cd
 			scope, 
db9e6cd
 			FlowInfo.DEAD_END);
db9e6cd
+		this.initsBeforeContext = initsBeforeContext;
db9e6cd
 	}
db9e6cd
 
db9e6cd
 	public void checkInitializerExceptions(
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java,v
db9e6cd
retrieving revision 1.42
db9e6cd
diff -u -r1.42 ExceptionHandlingFlowContext.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java	5 Mar 2008 07:57:20 -0000	1.42
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java	29 Jan 2009 17:06:52 -0000
db9e6cd
@@ -41,7 +41,8 @@
db9e6cd
 	boolean isMethodContext;
db9e6cd
 
db9e6cd
 	public UnconditionalFlowInfo initsOnReturn;
db9e6cd
-
db9e6cd
+	public FlowContext initializationParent; // special parent relationship only for initialization purpose
db9e6cd
+	
db9e6cd
 	// for dealing with anonymous constructor thrown exceptions
db9e6cd
 	public ArrayList extendedExceptions;
db9e6cd
 	
db9e6cd
@@ -49,6 +50,7 @@
db9e6cd
 		FlowContext parent,
db9e6cd
 		ASTNode associatedNode,
db9e6cd
 		ReferenceBinding[] handledExceptions,
db9e6cd
+		FlowContext initializationParent,
db9e6cd
 		BlockScope scope,
db9e6cd
 		UnconditionalFlowInfo flowInfo) {
db9e6cd
 
db9e6cd
@@ -79,6 +81,7 @@
db9e6cd
 		System.arraycopy(this.isReached, 0, this.isNeeded, 0, cacheSize);
db9e6cd
 	}
db9e6cd
 	this.initsOnReturn = FlowInfo.DEAD_END;	
db9e6cd
+	this.	initializationParent = initializationParent;	
db9e6cd
 }
db9e6cd
 
db9e6cd
 public void complainIfUnusedExceptionHandlers(AbstractMethodDeclaration method) {
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java,v
db9e6cd
retrieving revision 1.148
db9e6cd
diff -u -r1.148 TypeDeclaration.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java	27 May 2008 22:21:13 -0000	1.148
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java	29 Jan 2009 17:06:52 -0000
db9e6cd
@@ -594,8 +594,8 @@
db9e6cd
 			this.scope.problemReporter().unusedPrivateType(this);
db9e6cd
 		}
db9e6cd
 	}
db9e6cd
-	InitializationFlowContext initializerContext = new InitializationFlowContext(null, this, this.initializerScope);
db9e6cd
-	InitializationFlowContext staticInitializerContext = new InitializationFlowContext(null, this, this.staticInitializerScope);
db9e6cd
+	InitializationFlowContext initializerContext = new InitializationFlowContext(null, this, flowInfo, flowContext, this.initializerScope);
db9e6cd
+	InitializationFlowContext staticInitializerContext = new InitializationFlowContext(null, this, flowInfo, flowContext, this.staticInitializerScope);
db9e6cd
 	FlowInfo nonStaticFieldInfo = flowInfo.unconditionalFieldLessCopy();
db9e6cd
 	FlowInfo staticFieldInfo = flowInfo.unconditionalFieldLessCopy();
db9e6cd
 	if (this.fields != null) {
db9e6cd
@@ -610,11 +610,7 @@
db9e6cd
 				} else {*/
db9e6cd
 				staticInitializerContext.handledExceptions = Binding.ANY_EXCEPTION; // tolerate them all, and record them
db9e6cd
 				/*}*/
db9e6cd
-				staticFieldInfo =
db9e6cd
-					field.analyseCode(
db9e6cd
-						this.staticInitializerScope,
db9e6cd
-						staticInitializerContext,
db9e6cd
-						staticFieldInfo);
db9e6cd
+				staticFieldInfo = field.analyseCode(this.staticInitializerScope, staticInitializerContext, staticFieldInfo);
db9e6cd
 				// in case the initializer is not reachable, use a reinitialized flowInfo and enter a fake reachable
db9e6cd
 				// branch, since the previous initializer already got the blame.
db9e6cd
 				if (staticFieldInfo == FlowInfo.DEAD_END) {
db9e6cd
@@ -630,8 +626,7 @@
db9e6cd
 				} else {*/
db9e6cd
 					initializerContext.handledExceptions = Binding.ANY_EXCEPTION; // tolerate them all, and record them
db9e6cd
 				/*}*/
db9e6cd
-				nonStaticFieldInfo =
db9e6cd
-					field.analyseCode(this.initializerScope, initializerContext, nonStaticFieldInfo);
db9e6cd
+				nonStaticFieldInfo = field.analyseCode(this.initializerScope, initializerContext, nonStaticFieldInfo);
db9e6cd
 				// in case the initializer is not reachable, use a reinitialized flowInfo and enter a fake reachable
db9e6cd
 				// branch, since the previous initializer already got the blame.
db9e6cd
 				if (nonStaticFieldInfo == FlowInfo.DEAD_END) {
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java,v
db9e6cd
retrieving revision 1.51.2.1
db9e6cd
diff -u -r1.51.2.1 Clinit.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java	1 Jul 2008 11:24:16 -0000	1.51.2.1
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java	29 Jan 2009 17:06:49 -0000
db9e6cd
@@ -53,6 +53,7 @@
db9e6cd
 					staticInitializerFlowContext.parent,
db9e6cd
 					this,
db9e6cd
 					Binding.NO_EXCEPTIONS,
db9e6cd
+					staticInitializerFlowContext,
db9e6cd
 					scope,
db9e6cd
 					FlowInfo.DEAD_END);
db9e6cd
 
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java,v
db9e6cd
retrieving revision 1.108
db9e6cd
diff -u -r1.108 TryStatement.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java	31 Aug 2007 19:41:31 -0000	1.108
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java	29 Jan 2009 17:06:51 -0000
db9e6cd
@@ -87,6 +87,7 @@
db9e6cd
 				flowContext,
db9e6cd
 				this,
db9e6cd
 				this.caughtExceptionTypes,
db9e6cd
+				null,
db9e6cd
 				this.scope,
db9e6cd
 				flowInfo.unconditionalInits());
db9e6cd
 		handlingContext.initsOnFinally =
db9e6cd
@@ -198,6 +199,7 @@
db9e6cd
 				insideSubContext,
db9e6cd
 				this,
db9e6cd
 				this.caughtExceptionTypes,
db9e6cd
+				null,
db9e6cd
 				this.scope,
db9e6cd
 				flowInfo.unconditionalInits());
db9e6cd
 		handlingContext.initsOnFinally =
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java,v
db9e6cd
retrieving revision 1.92.2.2
db9e6cd
diff -u -r1.92.2.2 ConstructorDeclaration.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java	8 Jul 2008 13:22:06 -0000	1.92.2.2
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java	29 Jan 2009 17:06:50 -0000
db9e6cd
@@ -77,6 +77,7 @@
db9e6cd
 				initializerFlowContext.parent,
db9e6cd
 				this,
db9e6cd
 				this.binding.thrownExceptions,
db9e6cd
+				initializerFlowContext,
db9e6cd
 				this.scope,
db9e6cd
 				FlowInfo.DEAD_END);
db9e6cd
 		initializerFlowContext.checkInitializerExceptions(
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java,v
db9e6cd
retrieving revision 1.103.2.3
db9e6cd
diff -u -r1.103.2.3 SingleNameReference.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java	27 Nov 2008 10:13:10 -0000	1.103.2.3
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java	29 Jan 2009 17:06:51 -0000
db9e6cd
@@ -62,7 +62,8 @@
db9e6cd
 				FieldBinding fieldBinding;
db9e6cd
 				if ((fieldBinding = (FieldBinding) this.binding).isBlankFinal() 
db9e6cd
 						&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
db9e6cd
-					if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
+					FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(fieldBinding.declaringClass.original(), flowInfo);
db9e6cd
+					if (!fieldInits.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
 						currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
db9e6cd
 					}
db9e6cd
 				}
db9e6cd
@@ -148,7 +149,8 @@
db9e6cd
 			// check if reading a final blank field
db9e6cd
 			FieldBinding fieldBinding = (FieldBinding) this.binding;
db9e6cd
 			if (fieldBinding.isBlankFinal() && currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
db9e6cd
-				if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
+				FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(fieldBinding.declaringClass.original(), flowInfo);
db9e6cd
+				if (!fieldInits.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
 					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
db9e6cd
 				}
db9e6cd
 			}
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java,v
db9e6cd
retrieving revision 1.116.2.2
db9e6cd
diff -u -r1.116.2.2 FieldReference.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java	2 Oct 2008 15:29:33 -0000	1.116.2.2
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java	29 Jan 2009 17:06:50 -0000
db9e6cd
@@ -57,15 +57,17 @@
db9e6cd
 
db9e6cd
 }
db9e6cd
 
db9e6cd
-public FlowInfo analyseAssignment(BlockScope currentScope, 	FlowContext flowContext, 	FlowInfo flowInfo, Assignment assignment, boolean isCompound) {
db9e6cd
+public FlowInfo analyseAssignment(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo, Assignment assignment, boolean isCompound) {
db9e6cd
 	// compound assignment extra work
db9e6cd
 	if (isCompound) { // check the variable part is initialized if blank final
db9e6cd
 		if (this.binding.isBlankFinal()
db9e6cd
 			&& this.receiver.isThis()
db9e6cd
-			&& currentScope.needBlankFinalFieldInitializationCheck(this.binding)
db9e6cd
-			&& (!flowInfo.isDefinitelyAssigned(this.binding))) {
db9e6cd
-			currentScope.problemReporter().uninitializedBlankFinalField(this.binding, this);
db9e6cd
-			// we could improve error msg here telling "cannot use compound assignment on final blank field"
db9e6cd
+			&& currentScope.needBlankFinalFieldInitializationCheck(this.binding)) {
db9e6cd
+			FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(this.binding.declaringClass.original(), flowInfo);
db9e6cd
+			if (!fieldInits.isDefinitelyAssigned(this.binding)) {
db9e6cd
+				currentScope.problemReporter().uninitializedBlankFinalField(this.binding, this);
db9e6cd
+				// we could improve error msg here telling "cannot use compound assignment on final blank field"
db9e6cd
+			}
db9e6cd
 		}
db9e6cd
 		manageSyntheticAccessIfNecessary(currentScope, flowInfo, true /*read-access*/);
db9e6cd
 	}
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java,v
db9e6cd
retrieving revision 1.125.2.3
db9e6cd
diff -u -r1.125.2.3 QualifiedNameReference.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java	27 Nov 2008 10:13:10 -0000	1.125.2.3
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java	29 Jan 2009 17:06:50 -0000
db9e6cd
@@ -74,10 +74,9 @@
db9e6cd
 			if (lastFieldBinding.isBlankFinal()
db9e6cd
 				    && this.otherBindings != null // the last field binding is only assigned
db9e6cd
 	 				&& currentScope.needBlankFinalFieldInitializationCheck(lastFieldBinding)) {
db9e6cd
-				if (!flowInfo.isDefinitelyAssigned(lastFieldBinding)) {
db9e6cd
-					currentScope.problemReporter().uninitializedBlankFinalField(
db9e6cd
-						lastFieldBinding,
db9e6cd
-						this);
db9e6cd
+				FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(lastFieldBinding.declaringClass.original(), flowInfo);
db9e6cd
+				if (!fieldInits.isDefinitelyAssigned(lastFieldBinding)) {
db9e6cd
+					currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
db9e6cd
 				}
db9e6cd
 			}
db9e6cd
 			break;
db9e6cd
@@ -122,9 +121,11 @@
db9e6cd
 	if (isCompound) {
db9e6cd
 		if (otherBindingsCount == 0
db9e6cd
 				&& lastFieldBinding.isBlankFinal()
db9e6cd
-				&& currentScope.needBlankFinalFieldInitializationCheck(lastFieldBinding)
db9e6cd
-				&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
db9e6cd
-			currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
db9e6cd
+				&& currentScope.needBlankFinalFieldInitializationCheck(lastFieldBinding)) {
db9e6cd
+			FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(lastFieldBinding.declaringClass.original(), flowInfo);
db9e6cd
+			if (!fieldInits.isDefinitelyAssigned(lastFieldBinding)) {
db9e6cd
+				currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
db9e6cd
+			}
db9e6cd
 		}
db9e6cd
 		TypeBinding lastReceiverType;
db9e6cd
 		switch (otherBindingsCount) {
db9e6cd
@@ -212,9 +213,11 @@
db9e6cd
 				FieldBinding fieldBinding = (FieldBinding) this.binding;
db9e6cd
 				// check if reading a final blank field
db9e6cd
 				if (fieldBinding.isBlankFinal()
db9e6cd
-						&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)
db9e6cd
-						&& !flowInfo.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
-					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
db9e6cd
+						&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
db9e6cd
+					FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(fieldBinding.declaringClass.original(), flowInfo);
db9e6cd
+					if (!fieldInits.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
+						currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
db9e6cd
+					}
db9e6cd
 				}
db9e6cd
 			}
db9e6cd
 			break;
db9e6cd
Index: compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java,v
db9e6cd
retrieving revision 1.65
db9e6cd
diff -u -r1.65 MethodDeclaration.java
db9e6cd
--- compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java	27 May 2008 22:21:13 -0000	1.65
db9e6cd
+++ compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java	29 Jan 2009 17:06:50 -0000
db9e6cd
@@ -72,6 +72,7 @@
db9e6cd
 					initializationContext,
db9e6cd
 					this,
db9e6cd
 					this.binding.thrownExceptions,
db9e6cd
+					null,
db9e6cd
 					this.scope,
db9e6cd
 					FlowInfo.DEAD_END);
db9e6cd
 
db9e6cd
Index: eval/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java
db9e6cd
===================================================================
db9e6cd
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java,v
db9e6cd
retrieving revision 1.52
db9e6cd
diff -u -r1.52 CodeSnippetSingleNameReference.java
db9e6cd
--- eval/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java	27 May 2008 22:27:12 -0000	1.52
db9e6cd
+++ eval/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java	29 Jan 2009 17:06:52 -0000
db9e6cd
@@ -45,7 +45,8 @@
db9e6cd
 			FieldBinding fieldBinding;
db9e6cd
 			if ((fieldBinding = (FieldBinding) this.binding).isBlankFinal() 
db9e6cd
 					&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
db9e6cd
-				if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
+				FlowInfo fieldInits = flowContext.getInitsForFinalBlankInitializationCheck(fieldBinding.declaringClass.original(), flowInfo);
db9e6cd
+				if (!fieldInits.isDefinitelyAssigned(fieldBinding)) {
db9e6cd
 					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
db9e6cd
 				}
db9e6cd
 			}
db9e6cd