diff --git a/plugins/org.eclipse.dltk.python.core/src/org/eclipse/dltk/python/internal/core/parser/visitors/PythonSourceElementRequestor.java b/plugins/org.eclipse.dltk.python.core/src/org/eclipse/dltk/python/internal/core/parser/visitors/PythonSourceElementRequestor.java
index 6a17222..9f5b669 100644
--- a/plugins/org.eclipse.dltk.python.core/src/org/eclipse/dltk/python/internal/core/parser/visitors/PythonSourceElementRequestor.java
+++ b/plugins/org.eclipse.dltk.python.core/src/org/eclipse/dltk/python/internal/core/parser/visitors/PythonSourceElementRequestor.java
@@ -52,7 +52,8 @@
 		private ASTNode fToNode;
 
 		private ASTNode declaredIn; // The node where the declaration was found
-									// (should be either class or method node)
+
+		// (should be either class or method node)
 		TypeField(String name, String initValue, PositionInformation pos,
 				Expression expression, ASTNode toNode, ASTNode declaredIn) {
 
@@ -113,7 +114,7 @@
 	private static String ANONYMOUS_LAMBDA_FORM_MARKER = "<anonymous>";
 	// Used to prehold fields if adding in methods.
 	private List fNotAddedFields = new ArrayList();
-	
+
 	private String lastLambdaFormName = ANONYMOUS_LAMBDA_FORM_MARKER;
 
 	/**
@@ -144,8 +145,8 @@
 		return outValue;
 	}
 
-	private void onVisitLambdaAssignnment(String ref, PythonLambdaExpression lambdaExpression)
-	{
+	private void onVisitLambdaAssignnment(String ref,
+			PythonLambdaExpression lambdaExpression) {
 		// Declare new Method.
 		List/* < Argument > */args = lambdaExpression.getArguments();
 
@@ -167,15 +168,17 @@
 		mi.declarationStart = lambdaExpression.sourceStart();
 
 		this.fRequestor.enterMethod(mi);
-//FIXME		Expression body = lambdaExpression.getBodyExpression();
-//FIXME		if (body instanceof PythonLambdaExpression)
-//FIXME			onVisitLambdaAssignnment(ANONYMOUS_LAMBDA_FORM_MARKER,(PythonLambdaExpression)body);
+		// FIXME Expression body = lambdaExpression.getBodyExpression();
+		// FIXME if (body instanceof PythonLambdaExpression)
+		// FIXME
+		// onVisitLambdaAssignnment(ANONYMOUS_LAMBDA_FORM_MARKER,(PythonLambdaExpression)body);
 		this.fRequestor.exitMethod(lambdaExpression.sourceEnd());
 	}
-	private void onVisitStaticVariableAssignment(SimpleReference var, Statement val)
-	{
+
+	private void onVisitStaticVariableAssignment(SimpleReference var,
+			Statement val) {
 		// for module static of class static variables.
-		
+
 		if (canAddVariables((ASTNode) this.fNodes.peek(), var.getName())) {
 			ISourceElementRequestor.FieldInfo info = new ISourceElementRequestor.FieldInfo();
 			info.modifiers = Modifiers.AccStatic;
@@ -191,21 +194,21 @@
 			}
 		}
 	}
-	private void onVisitInstanceVariableAssignment(ExtendedVariableReference extendedVariable, Statement right)
-	{
+
+	private void onVisitInstanceVariableAssignment(
+			ExtendedVariableReference extendedVariable, Statement right) {
 		List varParts = extendedVariable.getExpressions();
 		if (extendedVariable.isDot(0)) {
 			Expression first = (Expression) varParts.get(0);
 			Expression second = (Expression) varParts.get(1);
 
-			if (first instanceof VariableReference && second instanceof VariableReference) {
+			if (first instanceof VariableReference
+					&& second instanceof VariableReference) {
 				String varName = ((VariableReference) first).getName();
-				MethodDeclaration currentMethod = this
-						.getCurrentMethod();
+				MethodDeclaration currentMethod = this.getCurrentMethod();
 				List arguments = currentMethod.getArguments();
 				if (arguments != null && arguments.size() > 0) {
-					Argument firstArgument = (Argument) arguments
-							.get(0);
+					Argument firstArgument = (Argument) arguments.get(0);
 					String argumentName = firstArgument.getName();
 					if (argumentName.equals(varName)) {
 						VariableReference var = (VariableReference) second;
@@ -215,19 +218,21 @@
 							initialValueStart = right.sourceStart();
 							initialValueEnd = right.sourceEnd();
 						}
-						PositionInformation pos = new PositionInformation(
-								var.sourceStart(), var.sourceEnd(),
+						PositionInformation pos = new PositionInformation(var
+								.sourceStart(), var.sourceEnd(),
 								initialValueStart, initialValueEnd);
 						String initialString = this.makeValue(right);
 						ASTNode method = (ASTNode) this.fNodes.pop();
 						ASTNode toClass = (ASTNode) this.fNodes.peek();
 						this.fNodes.push(method);
-						if (toClass instanceof TypeDeclaration) 
-						{
-							List decorators = ((MethodDeclaration)method).getDecorators();
-							if (null == decorators || null != decorators && decorators.size() == 0)
-							{
-								TypeField field = new TypeField(var.getName(), initialString, pos, extendedVariable, toClass, method);
+						if (toClass instanceof TypeDeclaration) {
+							List decorators = ((MethodDeclaration) method)
+									.getDecorators();
+							if (null == decorators || null != decorators
+									&& decorators.size() == 0) {
+								TypeField field = new TypeField(var.getName(),
+										initialString, pos, extendedVariable,
+										toClass, method);
 								this.fNotAddedFields.add(field);
 							}
 						}
@@ -236,49 +241,49 @@
 			}
 		}
 	}
-	private void onVisitTestListAssignment(ExpressionList left, Statement right)
-	{
+
+	private void onVisitTestListAssignment(ExpressionList left, Statement right) {
 		Iterator iter = left.getChilds().iterator();
-		if (right instanceof ExpressionList)
-		{
-			ExpressionList exprs = (ExpressionList)right;
+		if (right instanceof ExpressionList) {
+			ExpressionList exprs = (ExpressionList) right;
 			Iterator j = exprs.getChilds().iterator();
-			while (iter.hasNext() && j.hasNext())
-			{
-				Expression expr = (Expression)iter.next();
-				processAssignment(expr, (Expression)j.next());
+			while (iter.hasNext() && j.hasNext()) {
+				Expression expr = (Expression) iter.next();
+				processAssignment(expr, (Expression) j.next());
 			}
-			
-		}
-		else
-		{
-			while (iter.hasNext())
-			{
-				Expression expr = (Expression)iter.next();
+
+		} else {
+			while (iter.hasNext()) {
+				Expression expr = (Expression) iter.next();
 				processAssignment(expr, right);
 			}
 		}
 	}
-	private void processAssignment(Statement left, Statement right)
-	{
-		if (left instanceof Assignment)
-		{
+
+	private void processAssignment(Statement left, Statement right) {
+		if (left instanceof Assignment) {
 			Assignment assignment = (Assignment) left;
 			processAssignment(assignment.getLeft(), right);
 			processAssignment(assignment.getRight(), right);
-		}
-		else if (left instanceof SimpleReference && right instanceof PythonLambdaExpression)
-			onVisitLambdaAssignnment(((SimpleReference)left).getName(), (PythonLambdaExpression)right);
-		else if (left instanceof VariableReference && !this.fInMethod)							// Handle static variables
-			onVisitStaticVariableAssignment((VariableReference)left, right);
-		else if (left instanceof ExtendedVariableReference && this.fInClass && this.fInMethod) 	// This is for in class and in method.
-			onVisitInstanceVariableAssignment((ExtendedVariableReference)left, right);
+		} else if (left instanceof SimpleReference
+				&& right instanceof PythonLambdaExpression)
+			onVisitLambdaAssignnment(((SimpleReference) left).getName(),
+					(PythonLambdaExpression) right);
+		else if (left instanceof VariableReference && !this.fInMethod) // Handle
+																		// static
+																		// variables
+			onVisitStaticVariableAssignment((VariableReference) left, right);
+		else if (left instanceof ExtendedVariableReference && this.fInClass
+				&& this.fInMethod) // This is for in class and in method.
+			onVisitInstanceVariableAssignment((ExtendedVariableReference) left,
+					right);
 		else if (left instanceof ExpressionList)
-			onVisitTestListAssignment((ExpressionList)left, right);
+			onVisitTestListAssignment((ExpressionList) left, right);
 		else {// TODO: dynamic variable handling not yet
-				// supported.
+			// supported.
 		}
 	}
+
 	public boolean visit(Expression expression) throws Exception {
 
 		if (expression instanceof Assignment) {
@@ -293,13 +298,12 @@
 			}
 			processAssignment(left, right);
 			return false;
-		}
-		else if (expression instanceof ExtendedVariableReference) {
+		} else if (expression instanceof ExtendedVariableReference) {
 			ExtendedVariableReference ref = (ExtendedVariableReference) expression;
 			int expressionCount = ref.getExpressionCount();
 			for (int i = 0; i < expressionCount; i++) {
 				Expression e = ref.getExpression(i);
-				if (ref.isCall(i) && e instanceof VariableReference ) {
+				if (ref.isCall(i) && e instanceof VariableReference) {
 					this.fRequestor.acceptMethodReference(
 							((VariableReference) e).getName().toCharArray(), 0,
 							e.sourceStart(), e.sourceEnd());
@@ -323,18 +327,16 @@
 
 	protected void onEndVisitMethod(MethodDeclaration method) {
 
-		if (fNotAddedFields.size() >= 1)
-		{	
+		if (fNotAddedFields.size() >= 1) {
 			TypeField typeField = (TypeField) fNotAddedFields.get(0);
-			if (null != typeField && typeField.getDeclaredIn().equals(method))
-			{
+			if (null != typeField && typeField.getDeclaredIn().equals(method)) {
 				Iterator i = this.fNotAddedFields.iterator();
 				while (i.hasNext()) {
 					TypeField field = (TypeField) i.next();
 					if (canAddVariables(field.getToNode(), field.getName())) {
-		
+
 						PositionInformation pos = field.getPos();
-		
+
 						ISourceElementRequestor.FieldInfo info = new ISourceElementRequestor.FieldInfo();
 						info.modifiers = Modifiers.AccStatic;
 						info.name = field.getName();
@@ -343,7 +345,7 @@
 						info.declarationStart = pos.sourceStart;
 						this.fRequestor.enterField(info);
 						this.fRequestor.exitField(pos.sourceEnd);
-		
+
 					}
 				}
 				this.fNotAddedFields.clear();
@@ -446,7 +448,7 @@
 		mi.nameSourceEnd = method.getNameEnd() - 1;
 		mi.declarationStart = method.sourceStart();
 
-		this.fRequestor.enterMethodRemoveSame(mi);
+		((ISourceElementRequestor) this.fRequestor).enterMethodRemoveSame(mi);
 
 		this.fInMethod = true;
 		this.fCurrentMethod = method;
