Generify o.e.dltk.ruby.core.

Module src only. Haven't touched jruby at all.

Change-Id: I608499116d21f2b3dd3630bf60e41aa273fd9301
Signed-off-by: Alexander Kurtakov <akurtako@redhat.com>
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyArrayExpression.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyArrayExpression.java
index 99588b6..b963128 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyArrayExpression.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyArrayExpression.java
@@ -45,9 +45,9 @@
 	public void traverse(ASTVisitor visitor) throws Exception {
 		if (visitor.visit(this)) {
 			if (this.getChilds() != null) {
-				for (Iterator iter = this.getChilds().iterator(); iter
+				for (Iterator<ASTNode> iter = this.getChilds().iterator(); iter
 						.hasNext();) {
-					ASTNode s = (ASTNode) iter.next();
+					ASTNode s = iter.next();
 					s.traverse(visitor);
 				}
 			}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyBlock.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyBlock.java
index bc8aaac..f64ce2f 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyBlock.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyBlock.java
@@ -18,7 +18,7 @@
 
 public class RubyBlock extends ASTNode {
 
-	private Map vars = new HashMap();
+	private Map<ASTNode, ASTNode> vars = new HashMap<ASTNode, ASTNode>();
 	private ASTNode asterixParameter = null;
 	private ASTNode body;
 
@@ -39,7 +39,7 @@
 		super(start, end);
 	}
 
-	public Set getVars() {
+	public Set<ASTNode> getVars() {
 		return vars.keySet();
 	}
 
@@ -67,15 +67,15 @@
 	@Override
 	public void traverse(ASTVisitor visitor) throws Exception {
 		if (visitor.visit(this)) {
-			for (Iterator iterator = vars.keySet().iterator(); iterator
+			for (Iterator<ASTNode> iterator = vars.keySet().iterator(); iterator
 					.hasNext();) {
-				ASTNode var = (ASTNode) iterator.next();
+				ASTNode var = iterator.next();
 				if (var != null)
 					var.traverse(visitor);
 			}
-			for (Iterator iterator = vars.values().iterator(); iterator
+			for (Iterator<ASTNode> iterator = vars.values().iterator(); iterator
 					.hasNext();) {
-				ASTNode var = (ASTNode) iterator.next();
+				ASTNode var = iterator.next();
 				if (var != null)
 					var.traverse(visitor);
 			}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCallArgumentsList.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCallArgumentsList.java
index 51f81f3..a4a45c7 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCallArgumentsList.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCallArgumentsList.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ast;
 
@@ -23,11 +22,11 @@
 	}
 	
 	public void autosetOffsets() {
-		final List expressions = this.getChilds();
+		final List<ASTNode> expressions = this.getChilds();
 		final int size = expressions.size();
 		if (size > 0) {
-			final ASTNode first = (ASTNode) expressions.get(0);
-			final ASTNode last = (ASTNode) expressions.get(size - 1);
+			final ASTNode first = expressions.get(0);
+			final ASTNode last = expressions.get(size - 1);
 			this.setStart(first.sourceStart());
 			this.setEnd(last.sourceEnd());
 		}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCaseStatement.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCaseStatement.java
index 08b04fc..ebe0603 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCaseStatement.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyCaseStatement.java
@@ -17,7 +17,7 @@
 public class RubyCaseStatement extends ASTNode {
 
 	private ASTNode target;
-	private List whens;
+	private List<RubyWhenStatement> whens;
 	private ASTNode elseWhen;
 
 	public RubyCaseStatement(int start, int end) {
@@ -32,11 +32,11 @@
 		this.target = target;
 	}
 
-	public List getWhens() {
+	public List<RubyWhenStatement> getWhens() {
 		return whens;
 	}
 
-	public void setWhens(List whens) {
+	public void setWhens(List<RubyWhenStatement> whens) {
 		this.whens = whens;
 	}
 
@@ -58,9 +58,9 @@
 				this.elseWhen.traverse( visitor );
 			}			
 			if (this.whens != null) {
-				for (Iterator iterator = this.whens.iterator(); iterator
+				for (Iterator<RubyWhenStatement> iterator = this.whens.iterator(); iterator
 						.hasNext();) {
-					ASTNode node = (ASTNode) iterator.next();
+					ASTNode node = iterator.next();
 					if (node != null)
 						node.traverse(visitor);					
 				}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyClassDeclaration.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyClassDeclaration.java
index 413f089..62b5558 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyClassDeclaration.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyClassDeclaration.java
@@ -18,7 +18,7 @@
 public class RubyClassDeclaration extends RubyModuleDeclaration {
 
 	private static final String OBJECT = "Object"; //$NON-NLS-1$
-	private static final List OBJECT_SUPER_CLASS = Collections
+	private static final List<String> OBJECT_SUPER_CLASS = Collections
 			.singletonList(OBJECT);
 
 	public RubyClassDeclaration(ASTNode superClass, ASTNode name, Block body,
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyDynamicBackquoteStringExpression.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyDynamicBackquoteStringExpression.java
index f778e3d..e6a85a7 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyDynamicBackquoteStringExpression.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyDynamicBackquoteStringExpression.java
@@ -1,22 +1,22 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ast;
 
 import java.util.ArrayList;
 
 import org.eclipse.dltk.ast.ASTListNode;
+import org.eclipse.dltk.ast.ASTNode;
 
 public class RubyDynamicBackquoteStringExpression extends ASTListNode {
 
 	public RubyDynamicBackquoteStringExpression(int start, int end) {
-		super(start, end, new ArrayList());
+		super(start, end, new ArrayList<ASTNode>());
 	}
 	
 }
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyExceptionList.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyExceptionList.java
index fa66a6f..93ae6ba 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyExceptionList.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyExceptionList.java
@@ -18,7 +18,7 @@
 
 public class RubyExceptionList extends ASTNode {
 	
-	private final List args = new ArrayList ();
+	private final List<ASTNode> args = new ArrayList<ASTNode> ();
 	private VariableReference var;
 	
 	public RubyExceptionList(int start, int end, VariableReference var) {
@@ -30,7 +30,7 @@
 		args.add(e);
 	}
 	
-	public List getArgs () {
+	public List<ASTNode> getArgs () {
 		return args;
 	}
 	
@@ -53,8 +53,9 @@
 			if (var != null)
 				var.traverse(visitor);
 			if (args != null) {
-				for (Iterator iterator = args.iterator(); iterator
-						.hasNext();) { ASTNode a = (ASTNode) iterator.next();
+				for (Iterator<ASTNode> iterator = args.iterator(); iterator
+						.hasNext();) {
+					ASTNode a = iterator.next();
 					if (a != null)
 						a.traverse(visitor);
 				}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyMultipleAssignmentStatement.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyMultipleAssignmentStatement.java
index f8009d6..685318e 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyMultipleAssignmentStatement.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyMultipleAssignmentStatement.java
@@ -18,8 +18,8 @@
 
 public class RubyMultipleAssignmentStatement extends ASTNode {
 
-	private List lhs = new ArrayList();
-	private List rhs = new ArrayList();
+	private List<ASTNode> lhs = new ArrayList<ASTNode>();
+	private List<ASTNode> rhs = new ArrayList<ASTNode>();
 
 	private ASTNode leftAsterix;
 	private ASTNode rightAsterix;
@@ -44,11 +44,11 @@
 		rhs.add(s);
 	}
 
-	public List getLhs() {
+	public List<ASTNode> getLhs() {
 		return lhs;
 	}
 
-	public List getRhs() {
+	public List<ASTNode> getRhs() {
 		return rhs;
 	}
 
@@ -91,14 +91,14 @@
 			if (this.rightAsterix != null)
 				rightAsterix.traverse(visitor);
 			if (this.lhs != null)
-				for (Iterator iterator = this.lhs.iterator(); iterator
-						.hasNext();) { ASTNode v = (ASTNode) iterator.next();
+				for (Iterator<ASTNode> iterator = this.lhs.iterator(); iterator
+						.hasNext();) { ASTNode v = iterator.next();
 					if (v != null)
 						v.traverse(visitor);
 				}
 			if (this.rhs != null)
-				for (Iterator iterator = this.rhs.iterator(); iterator
-						.hasNext();) { ASTNode v = (ASTNode) iterator.next();
+				for (Iterator<ASTNode> iterator = this.rhs.iterator(); iterator
+						.hasNext();) { ASTNode v = iterator.next();
 					if (v != null)
 						v.traverse(visitor);
 				}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubySingletonMethodDeclaration.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubySingletonMethodDeclaration.java
index e825666..408c954 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubySingletonMethodDeclaration.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubySingletonMethodDeclaration.java
@@ -39,9 +39,9 @@
 				receiver.traverse(visitor);
 
 			// Arguments
-			Iterator it = arguments.iterator();
+			Iterator<Argument> it = arguments.iterator();
 			while (it.hasNext()) {
-				Argument arg = (Argument) it.next();
+				Argument arg = it.next();
 				arg.traverse(visitor);
 			}
 
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyUndefStatement.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyUndefStatement.java
index 781bf73..aa531cd 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyUndefStatement.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyUndefStatement.java
@@ -17,9 +17,9 @@
 
 public class RubyUndefStatement extends ASTNode {
 
-	private final List parameters = new ArrayList ();
+	private final List<String> parameters = new ArrayList<String> ();
 
-	public List getParameters() {
+	public List<String> getParameters() {
 		return parameters;
 	}
 
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyWhenStatement.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyWhenStatement.java
index ca246cb..71617f2 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyWhenStatement.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/ast/RubyWhenStatement.java
@@ -17,18 +17,18 @@
 
 public class RubyWhenStatement extends ASTNode {
 	
-	private List expressions;
+	private List<ASTNode> expressions;
 	private ASTNode body;
 	
 	public RubyWhenStatement(int start, int end) {
 		super(start, end);
 	}
 
-	public List getExpressions() {
+	public List<ASTNode> getExpressions() {
 		return expressions;
 	}
 
-	public void setExpressions(List expressions) {
+	public void setExpressions(List<ASTNode> expressions) {
 		this.expressions = expressions;
 	}
 
@@ -52,9 +52,9 @@
 	public void traverse(ASTVisitor visitor) throws Exception {
 		if (visitor.visit(this)) {
 			if (expressions != null) {
-				for (Iterator iterator = expressions.iterator(); iterator
+				for (Iterator<ASTNode> iterator = expressions.iterator(); iterator
 						.hasNext();) {
-					ASTNode node = (ASTNode) iterator.next();
+					ASTNode node = iterator.next();
 					node.traverse(visitor);					
 				}
 			}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/ParentshipBuildingVisitor.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/ParentshipBuildingVisitor.java
index 0acaa62..4a5b7c2 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/ParentshipBuildingVisitor.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/ParentshipBuildingVisitor.java
@@ -18,16 +18,16 @@
 
 public class ParentshipBuildingVisitor extends ASTVisitor {
 
-	private final Map parents = new HashMap();
+	private final Map<ASTNode, ASTNode> parents = new HashMap<ASTNode, ASTNode>();
 	
-	private final ArrayList stack = new ArrayList();
+	private final ArrayList<ASTNode> stack = new ArrayList<ASTNode>();
 	
 	private void push(ASTNode node) {
 		stack.add(node);
 	}
 	
 	private ASTNode peek() {
-		return (ASTNode) stack.get(stack.size() - 1);
+		return stack.get(stack.size() - 1);
 	}
 	
 	private void pop() {
@@ -48,7 +48,7 @@
 		pop();
 	}
 
-	public Map getParents() {
+	public Map<ASTNode, ASTNode> getParents() {
 		return parents;
 	}
 	
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/PredefinedVariables.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/PredefinedVariables.java
index af0d11c..8765b9f 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/PredefinedVariables.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/PredefinedVariables.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.core;
 
@@ -30,8 +29,8 @@
 
 	private static final String DOC = "doc"; //$NON-NLS-1$
 
-	static Map parseProperties(Properties props, String[] postfixes) {
-		Map entries = new HashMap();
+	static Map<String, Map<String, String>> parseProperties(Properties props, String[] postfixes) {
+		Map<String, Map<String, String>> entries = new HashMap<String, Map<String, String>>();
 
 		Iterator it = props.keySet().iterator();
 		while (it.hasNext()) {
@@ -44,14 +43,14 @@
 				if (index != -1) {
 					String name = key.substring(0, index);
 
-					Map entry = (Map) entries.get(name);
+					Map<String, String> entry = entries.get(name);
 
 					if (entry == null) {
-						entry = new HashMap();
+						entry = new HashMap<String, String>();
 						entries.put(name, entry);
 					}
 
-					entry.put(postfix, props.get(key));
+					entry.put(postfix, (String) props.get(key));
 				}
 			}
 		}
@@ -59,15 +58,15 @@
 		return entries;
 	}
 
-	private static Map nameToTypeMap = new HashMap();
-	private static Map nameToDocMap = new HashMap();
+	private static Map<String, String> nameToTypeMap = new HashMap<String, String>();
+	private static Map<String, String> nameToDocMap = new HashMap<String, String>();
 
 	public static String getTypeOf(String name) {
-		return (String) nameToDocMap.get(name);
+		return nameToDocMap.get(name);
 	}
 
 	public static String getDocOf(String name) {
-		return (String) nameToDocMap.get(name);
+		return nameToDocMap.get(name);
 	}
 
 	static {
@@ -80,17 +79,17 @@
 				Properties props = new Properties();
 				props.load(input);
 
-				Map parsedProps = parseProperties(props, new String[] { NAME,
+				Map<String, Map<String, String>> parsedProps = parseProperties(props, new String[] { NAME,
 						TYPE, DOC });
 
-				Iterator it = parsedProps.keySet().iterator();
+				Iterator<String> it = parsedProps.keySet().iterator();
 				while (it.hasNext()) {
-					Object key = it.next();
-					Map entry = (Map) parsedProps.get(key);
+					String key = it.next();
+					Map<String, String> entry = parsedProps.get(key);
 
-					String name = (String) entry.get(NAME);
-					String type = (String) entry.get(TYPE);
-					String doc = (String) entry.get(DOC);
+					String name = entry.get(NAME);
+					String type = entry.get(TYPE);
+					String doc = entry.get(DOC);
 
 					nameToTypeMap.put(name, type);
 					nameToDocMap.put(name, doc);
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementCriteria.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementCriteria.java
index 053e315..bf893e5 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementCriteria.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementCriteria.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.core.model;
 
@@ -26,7 +25,7 @@
 			return kind;
 		}
 		
-		protected static final Map elementKindsToCriterias = new HashMap();
+		protected static final Map<IElementKind, ByKind> elementKindsToCriterias = new HashMap<IElementKind, ByKind>();
 		
 		private static void add(IElementKind kind) {
 			elementKindsToCriterias.put(kind, new ByKind(kind));
@@ -47,7 +46,7 @@
 		}
 		
 		public static ByKind byElementKind(IElementKind kind) {
-			return (ByKind) elementKindsToCriterias.get(kind);
+			return elementKindsToCriterias.get(kind);
 		}
 		
 		public static final IElementCriteria MODEL = byElementKind(IElementKind.MODEL);
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementKind.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementKind.java
index 458f593..a339a06 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementKind.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/IElementKind.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.core.model;
 
@@ -116,7 +115,7 @@
 			return kind.getId();
 		}
 		
-		protected static final Map variableKindsToElementKinds = new HashMap();
+		protected static final Map<VariableKind, Variable> variableKindsToElementKinds = new HashMap<VariableKind, Variable>();
 		
 		static {
 			variableKindsToElementKinds.put(VariableKind.LOCAL, new Variable(VariableKind.LOCAL));
@@ -128,7 +127,7 @@
 		}
 		
 		public static Variable byVariableKind(VariableKind kind) {
-			return (Variable) variableKindsToElementKinds.get(kind);
+			return variableKindsToElementKinds.get(kind);
 		}
 		
 	}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/internal/Model.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/internal/Model.java
index 8c4f7b0..3318762 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/internal/Model.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/core/model/internal/Model.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.core.model.internal;
 
@@ -73,12 +72,12 @@
 		return sourceModules.toArray(new ISourceModule[sourceModules.size()]);
 	}
 
-	private void addModules(Collection sourceModules, IModelElement[] children)
+	private void addModules(Collection<ISourceModule> sourceModules, IModelElement[] children)
 			throws ModelException {
 		for (int i = 0; i < children.length; i++) {
 			IModelElement element = children[i];
 			if (element instanceof ISourceModule)
-				sourceModules.add(element);
+				sourceModules.add((ISourceModule) element);
 			else if (element instanceof IParent)
 				addModules(sourceModules, ((IParent) element).getChildren());
 		}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCallProcessor.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCallProcessor.java
index f70134c..3fbfb74 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCallProcessor.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCallProcessor.java
@@ -30,9 +30,9 @@
 
 	private SearchEngine searchEngine = new SearchEngine();
 
-	public Map process(final IModelElement parent, IModelElement element,
+	public Map<SimpleReference, IModelElement> process(final IModelElement parent, IModelElement element,
 			IDLTKSearchScope scope, IProgressMonitor monitor) {
-		final Map elements = new HashMap();
+		final Map<SimpleReference, IModelElement> elements = new HashMap<SimpleReference, IModelElement>();
 		SearchRequestor requestor = new SearchRequestor() {
 
 			@Override
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCalleeProcessor.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCalleeProcessor.java
index 2579f2a..1f4e400 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCalleeProcessor.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/callhierarchy/RubyCalleeProcessor.java
@@ -36,7 +36,7 @@
 	protected static int EXACT_RULE = SearchPattern.R_EXACT_MATCH
 			| SearchPattern.R_CASE_SENSITIVE;
 
-	private Map fSearchResults = new HashMap();
+	private Map<SimpleReference, IMethod[]> fSearchResults = new HashMap<SimpleReference, IMethod[]>();
 
 	private IMethod method;
 
@@ -69,7 +69,7 @@
 
 	}
 
-	public Map doOperation() {
+	public Map<SimpleReference, IMethod[]> doOperation() {
 		CaleeSourceElementRequestor requestor = new CaleeSourceElementRequestor();
 		ISourceElementParser parser = null;
 
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/ProjectTypeComparator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/ProjectTypeComparator.java
index 324728f..8eeedf9 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/ProjectTypeComparator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/ProjectTypeComparator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 xored software, Inc.
+ * Copyright (c) 2008, 2016 xored software, Inc.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -25,7 +25,7 @@
  * <li>all other types should go last
  * </ol>
  */
-public class ProjectTypeComparator implements Comparator {
+public class ProjectTypeComparator implements Comparator<IType> {
 
 	private final ISourceModule module;
 
@@ -36,9 +36,7 @@
 		this.module = module;
 	}
 
-	public int compare(Object o1, Object o2) {
-		final IType type1 = (IType) o1;
-		final IType type2 = (IType) o2;
+	public int compare(IType type1, IType type2) {
 		if (type1.getParent() instanceof ISourceModule
 				&& type2.getParent() instanceof ISourceModule) {
 			final ISourceModule module1 = (ISourceModule) type1.getParent();
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubyCompletionEngine.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubyCompletionEngine.java
index ddf8c00..ad65d86 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubyCompletionEngine.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubyCompletionEngine.java
@@ -105,7 +105,7 @@
 	private DLTKTypeInferenceEngine inferencer;
 	private ISourceParser parser = null;
 	private RubyMixinModel mixinModel;
-	private HashSet completedNames = new HashSet();
+	private HashSet<String> completedNames = new HashSet<String>();
 	private WeakHashSet intresting = new WeakHashSet();
 
 	private ASTNode completionNode;
@@ -500,7 +500,7 @@
 		public void flush() {
 			if (group.size() > 0) {
 				RubyMixinMethod[] mixinMethods = group.toArray(new RubyMixinMethod[group.size()]);
-				final List methods = RubyModelUtils.getAllSourceMethods(
+				final List<IMethod> methods = RubyModelUtils.getAllSourceMethods(
 						mixinMethods, klass);
 				int skew = 0;
 				if (klass.getKey().equals(lastParent)) {
@@ -510,8 +510,7 @@
 					skew = 1;
 				}
 				for (int j = 0, size = methods.size(); j < size; j++) {
-					reportMethod((IMethod) methods.get(j), RELEVANCE_METHODS
-							+ skew);
+					reportMethod(methods.get(j), RELEVANCE_METHODS + skew);
 				}
 				group.clear();
 			}
@@ -597,9 +596,9 @@
 		for (int i = wayToNode.length - 1; i > 0; i--) {
 			if (wayToNode[i] instanceof RubyBlock) {
 				RubyBlock rubyBlock = (RubyBlock) wayToNode[i];
-				Set vars = rubyBlock.getVars();
-				for (Iterator iterator = vars.iterator(); iterator.hasNext();) {
-					ASTNode n = (ASTNode) iterator.next();
+				Set<ASTNode> vars = rubyBlock.getVars();
+				for (Iterator<ASTNode> iterator = vars.iterator(); iterator.hasNext();) {
+					ASTNode n = iterator.next();
 					if (n instanceof RubyDAssgnExpression) {
 						RubyDAssgnExpression rd = (RubyDAssgnExpression) n;
 						if (rd.getName().startsWith(prefix)) {
@@ -633,9 +632,9 @@
 		if (mixinElement == null) {
 			return;
 		}
-		List types = new ArrayList();
-		List methods = new ArrayList();
-		List fields = new ArrayList();
+		List<IType> types = new ArrayList<IType>();
+		List<IMethod> methods = new ArrayList<IMethod>();
+		List<IField> fields = new ArrayList<IField>();
 		IMixinElement[] children = mixinElement.getChildren();
 		for (int i = 0; i < children.length; i++) {
 			Object[] infos = children[i].getAllObjects();
@@ -671,18 +670,18 @@
 			}
 		}
 
-		for (Iterator iterator = fields.iterator(); iterator.hasNext();) {
-			IField t = (IField) iterator.next();
+		for (Iterator<IField> iterator = fields.iterator(); iterator.hasNext();) {
+			IField t = iterator.next();
 			reportField(t, RELEVANCE_VARIABLES);
 		}
 
-		for (Iterator iterator = types.iterator(); iterator.hasNext();) {
-			IType t = (IType) iterator.next();
+		for (Iterator<IType> iterator = types.iterator(); iterator.hasNext();) {
+			IType t = iterator.next();
 			reportType(t, RELEVANCE_TYPE);
 		}
 
-		for (Iterator iterator = methods.iterator(); iterator.hasNext();) {
-			IMethod t = (IMethod) iterator.next();
+		for (Iterator<IMethod> iterator = methods.iterator(); iterator.hasNext();) {
+			IMethod t = iterator.next();
 			reportMethod(t, RELEVANCE_METHODS);
 		}
 
@@ -726,7 +725,7 @@
 		IType[] types = RubyTypeInferencingUtils.getAllTypes(currentModule,
 				prefix);
 		Arrays.sort(types, new ProjectTypeComparator(currentModule));
-		final Set names = new HashSet();
+		final Set<String> names = new HashSet<String>();
 		for (int i = 0; i < types.length; i++) {
 			final String elementName = types[i].getElementName();
 			if (names.add(elementName)) {
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubySelectionEngine.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubySelectionEngine.java
index e43d77e..3da874e 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubySelectionEngine.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/core/codeassist/RubySelectionEngine.java
@@ -455,7 +455,7 @@
 		String methodName = parentCall.getName();
 		ASTNode receiver = parentCall.getReceiver();
 
-		final List availableMethods = new ArrayList();
+		final List<IModelElement> availableMethods = new ArrayList<IModelElement>();
 
 		if (receiver == null) {
 			IEvaluatedType type = RubyTypeInferencingUtils.determineSelfClass(
@@ -504,7 +504,7 @@
 	}
 
 	private static void searchMethodDeclarations(IScriptProject project,
-			String methodName, final List availableMethods) {
+			String methodName, final List<IModelElement> availableMethods) {
 		final SearchRequestor requestor = new SearchRequestor() {
 
 			@Override
@@ -541,7 +541,7 @@
 	 * @param src
 	 * @param dest
 	 */
-	private static void addArrayToCollection(IMember[] src, Collection dest) {
+	private static void addArrayToCollection(IMember[] src, Collection<IModelElement> dest) {
 		if (src != null) {
 			for (int i = 0, size = src.length; i < size; ++i) {
 				dest.add(src[i]);
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/RubySourceFixer.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/RubySourceFixer.java
index 9868587..2f1686a 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/RubySourceFixer.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/RubySourceFixer.java
@@ -120,9 +120,9 @@
 			int en = 0;
 			int n_st = 0;
 			int n_en = 0;
-			for (Iterator iterator = fixPositions.iterator(); iterator
+			for (Iterator<Integer> iterator = fixPositions.iterator(); iterator
 					.hasNext();) {
-				Integer pos = (Integer) iterator.next();
+				Integer pos = iterator.next();
 				int fixPos = pos.intValue();
 				// starts
 				if (node.sourceStart() > fixPos) {
@@ -158,7 +158,7 @@
 		}
 	}
 
-	public static Set FIXUP_NAMES = new HashSet();
+	public static Set<String> FIXUP_NAMES = new HashSet<String>();
 	{
 		FIXUP_NAMES.add(missingKey);
 		FIXUP_NAMES.add(missingValue);
@@ -169,7 +169,7 @@
 		FIXUP_NAMES.add(missingName4a);
 	}
 
-	private final List fixPositions = new ArrayList();
+	private final List<Integer> fixPositions = new ArrayList<Integer>();
 
 	private String fixBrokenThings(Pattern pattern, String content,
 			String replacement, int delta) {
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinBuildVisitor.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinBuildVisitor.java
index 1125639..f164ca4 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinBuildVisitor.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinBuildVisitor.java
@@ -62,7 +62,7 @@
 	private final ISourceModule sourceModule;
 	private final boolean moduleAvailable;
 	private final IMixinRequestor requestor;
-	private final HashSet allReportedKeys = new HashSet();
+	private final HashSet<String> allReportedKeys = new HashSet<String>();
 
 	private abstract class Scope {
 		private final ASTNode node;
@@ -373,7 +373,7 @@
 
 	}
 
-	private Stack scopes = new Stack();
+	private Stack<Scope> scopes = new Stack<Scope>();
 	private final ModuleDeclaration module;
 
 	public RubyMixinBuildVisitor(ModuleDeclaration module,
@@ -387,7 +387,7 @@
 	}
 
 	private Scope peekScope() {
-		return (Scope) scopes.peek();
+		return scopes.peek();
 	}
 
 	@Override
@@ -556,9 +556,9 @@
 				metaScope = null;
 			}
 			RubyAttributeHandler info = new RubyAttributeHandler(call);
-			List readers = info.getReaders();
-			for (Iterator iterator = readers.iterator(); iterator.hasNext();) {
-				ASTNode n = (ASTNode) iterator.next();
+			List<ASTNode> readers = info.getReaders();
+			for (Iterator<ASTNode> iterator = readers.iterator(); iterator.hasNext();) {
+				ASTNode n = iterator.next();
 				String attr = RubyAttributeHandler.getText(n);
 				if (attr == null)
 					continue;
@@ -573,8 +573,8 @@
 					scopes.pop();
 				}
 			}
-			List writers = info.getWriters();
-			for (Iterator iterator = writers.iterator(); iterator.hasNext();) {
+			List<?> writers = info.getWriters();
+			for (Iterator<?> iterator = writers.iterator(); iterator.hasNext();) {
 				ASTNode n = (ASTNode) iterator.next();
 				String attr = RubyAttributeHandler.getText(n);
 				if (attr == null)
@@ -600,7 +600,7 @@
 				&& call.getArgs().getChilds().size() > 0) {
 			RubyCallArgument argNode;
 			String name;
-			for (Iterator iterator = call.getArgs().getChilds().iterator(); iterator
+			for (Iterator<?> iterator = call.getArgs().getChilds().iterator(); iterator
 					.hasNext();) {
 				argNode = (RubyCallArgument) iterator.next();
 				name = null;
@@ -740,7 +740,7 @@
 			for (int i = size - 1; i >= 0; i--) {
 				String possibleKey = ""; //$NON-NLS-1$
 				if (i > 0) {
-					Scope s = (Scope) this.scopes.get(i);
+					Scope s = this.scopes.get(i);
 					possibleKey = s.getKey() + SEPARATOR
 							+ constantReference.getName();
 				} else
@@ -756,7 +756,7 @@
 
 	@Override
 	public void endvisitGeneral(ASTNode node) throws Exception {
-		Scope scope = (Scope) scopes.peek();
+		Scope scope = scopes.peek();
 		if (scope.getNode() == node) {
 			scopes.pop();
 		}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinClass.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinClass.java
index 27b12a9..6265771 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinClass.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/mixin/RubyMixinClass.java
@@ -141,7 +141,7 @@
 			}
 		}
 		String key;
-		Set includeSet = new HashSet();
+		Set<String> includeSet = new HashSet<String>();
 		RubyMixinClass[] includedClasses = model.createRubyClass(
 				new RubyClassType("Object%")).getIncluded(); //$NON-NLS-1$
 		for (int cnt = 0, max = includedClasses.length; cnt < max; cnt++) {
@@ -173,7 +173,7 @@
 		if (mixinElement == null)
 			return new RubyMixinClass[0];
 		List<RubyMixinClass> result = new ArrayList<RubyMixinClass>();
-		HashSet names = new HashSet();
+		HashSet<String> names = new HashSet<String>();
 		Object[] allObjects = mixinElement.getAllObjects();
 		for (int i = 0; i < allObjects.length; i++) {
 			RubyMixinElementInfo info = (RubyMixinElementInfo) allObjects[i];
@@ -208,7 +208,7 @@
 		if (mixinElement == null)
 			return new RubyMixinClass[0];
 		List<RubyMixinClass> result = new ArrayList<RubyMixinClass>();
-		HashSet names = new HashSet();
+		HashSet<String> names = new HashSet<String>();
 		Object[] allObjects = mixinElement.getAllObjects();
 		for (int i = 0; i < allObjects.length; i++) {
 			RubyMixinElementInfo info = (RubyMixinElementInfo) allObjects[i];
@@ -232,11 +232,11 @@
 
 	public void findMethods(IMixinSearchPattern pattern,
 			IMixinSearchRequestor requestor) {
-		findMethods(pattern, requestor, new HashSet());
+		findMethods(pattern, requestor, new HashSet<String>());
 	}
 
 	protected void findMethods(IMixinSearchPattern pattern,
-			IMixinSearchRequestor requestor, Set processedKeys) {
+			IMixinSearchRequestor requestor, Set<String> processedKeys) {
 		if (!processedKeys.add(key)) {
 			return;
 		}
@@ -295,7 +295,7 @@
 	public RubyMixinMethod[] findMethods(IMixinSearchPattern pattern) {
 		final List<RubyMixinMethod> result = new ArrayList<RubyMixinMethod>();
 		this.findMethods(pattern, new IMixinSearchRequestor() {
-			final Set names = new HashSet();
+			final Set<String> names = new HashSet<String>();
 
 			public void acceptResult(IRubyMixinElement element) {
 				if (element instanceof RubyMixinMethod) {
@@ -306,15 +306,15 @@
 				}
 			}
 
-		}, new HashSet());
+		}, new HashSet<String>());
 		return result.toArray(new RubyMixinMethod[result.size()]);
 	}
 
 	public RubyMixinMethod getMethod(String name) {
-		return getMethod(name, new HashSet());
+		return getMethod(name, new HashSet<String>());
 	}
 
-	protected RubyMixinMethod getMethod(String name, Set processedKeys) {
+	protected RubyMixinMethod getMethod(String name, Set<String> processedKeys) {
 		if (!processedKeys.add(key)) {
 			return null;
 		}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubyAttributeHandler.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubyAttributeHandler.java
index f0ab09a..f59eb46 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubyAttributeHandler.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubyAttributeHandler.java
@@ -37,11 +37,11 @@
 	private static final String CLASS_INHERITABLE_READER = "class_inheritable_reader"; //$NON-NLS-1$
 	private static final String CLASS_INHERITABLE_WRITER = "class_inheritable_writer"; //$NON-NLS-1$
 
-	private static final Set/*<String>*/ ATTRIBUTE_CREATION_NAMES = new HashSet();
-	private static final Set/*<String>*/ ATTRIBUTE_ACCESSOR_NAMES = new HashSet();
-	private static final Set/*<String>*/ ATTRIBUTE_READER_NAMES = new HashSet();
-	private static final Set/*<String>*/ ATTRIBUTE_WRITER_NAMES = new HashSet();
-	private static final Set/*<String>*/ META_ATTRIBUTE_CREATION_NAMES = new HashSet();
+	private static final Set<String> ATTRIBUTE_CREATION_NAMES = new HashSet<String>();
+	private static final Set<String> ATTRIBUTE_ACCESSOR_NAMES = new HashSet<String>();
+	private static final Set<String> ATTRIBUTE_READER_NAMES = new HashSet<String>();
+	private static final Set<String> ATTRIBUTE_WRITER_NAMES = new HashSet<String>();
+	private static final Set<String> META_ATTRIBUTE_CREATION_NAMES = new HashSet<String>();
 	static {
 		ATTRIBUTE_CREATION_NAMES.add(ATTR);
 		ATTRIBUTE_CREATION_NAMES.add(ATTR_ACCESSOR);
@@ -94,8 +94,8 @@
 	}
 
 	private final CallExpression call;
-	private List readers;
-	private List writers;
+	private List<ASTNode> readers;
+	private List<ASTNode> writers;
 
 	public RubyAttributeHandler(CallExpression call) {
 		super();
@@ -103,16 +103,16 @@
 			throw new IllegalArgumentException();
 		}
 		this.call = call;
-		readers = new ArrayList();
-		writers = new ArrayList();
+		readers = new ArrayList<ASTNode>();
+		writers = new ArrayList<ASTNode>();
 		init();
 	}
 
 	private void init() {
 		String name = call.getName();
 		CallArgumentsList list = call.getArgs();
-		List expr = list.getChilds();
-		Iterator it = expr.iterator();
+		List<ASTNode> expr = list.getChilds();
+		Iterator<ASTNode> it = expr.iterator();
 		boolean create_reader = false;
 		boolean create_writer = false;
 		if (ATTRIBUTE_READER_NAMES.contains(name)) {
@@ -125,7 +125,7 @@
 		} else if (name.equals(ATTR)) {
 			create_reader = true;
 			if (expr.size() > 0) {
-				ASTNode node = (ASTNode) expr.get(expr.size() - 1);
+				ASTNode node = expr.get(expr.size() - 1);
 				if (node instanceof RubyCallArgument) {
 					node = ((RubyCallArgument) node).getValue();
 				}
@@ -137,7 +137,7 @@
 
 		}
 		while (it.hasNext()) {
-			ASTNode sr = (ASTNode) it.next();
+			ASTNode sr = it.next();
 			if (!(sr instanceof RubyCallArgument)) {
 				continue;
 			}
@@ -155,11 +155,11 @@
 		}
 	}
 
-	public List getReaders() {
+	public List<ASTNode> getReaders() {
 		return readers;
 	}
 
-	public List getWriters() {
+	public List<ASTNode> getWriters() {
 		return writers;
 	}
 
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubySourceElementRequestor.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubySourceElementRequestor.java
index 86fc109..0e2597a 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubySourceElementRequestor.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parser/visitors/RubySourceElementRequestor.java
@@ -114,23 +114,23 @@
 		}
 	}
 
-	private List fNotAddedFields = new ArrayList(); // Used to prehold fields if
+	private List<TypeField> fNotAddedFields = new ArrayList<TypeField>(); // Used to prehold fields if
 	// adding in methods.
-	private Map fTypeVariables = new HashMap(); // Used to depermine duplicate
+	private Map<ASTNode, List<String>> fTypeVariables = new HashMap<ASTNode, List<String>>(); // Used to depermine duplicate
 
 	// names, ASTNode -> List of
 	// variables
 
 	private boolean canAddVariables(ASTNode type, String name) {
 		if (fTypeVariables.containsKey(type)) {
-			List variables = (List) fTypeVariables.get(type);
+			List<String> variables = fTypeVariables.get(type);
 			if (variables.contains(name)) {
 				return false;
 			}
 			variables.add(name);
 			return true;
 		} else {
-			List variables = new ArrayList();
+			List<String> variables = new ArrayList<String>();
 			variables.add(name);
 			fTypeVariables.put(type, variables);
 			return true;
@@ -197,10 +197,10 @@
 			System.out.println("==> Method: " + method.getName()); //$NON-NLS-1$
 		}
 
-		Iterator it = fNotAddedFields.iterator();
+		Iterator<TypeField> it = fNotAddedFields.iterator();
 
 		while (it.hasNext()) {
-			TypeField field = (TypeField) it.next();
+			TypeField field = it.next();
 
 			if (canAddVariables(field.getASTNode(), field.getName())) {
 				PositionInformation pos = field.getPosition();
@@ -264,9 +264,9 @@
 			if (RubyAttributeHandler.isAttributeCreationCall(callExpression)) {
 				RubyAttributeHandler info = new RubyAttributeHandler(
 						callExpression);
-				List readers = info.getReaders();
-				for (Iterator iterator = readers.iterator(); iterator.hasNext();) {
-					ASTNode n = (ASTNode) iterator.next();
+				List<ASTNode> readers = info.getReaders();
+				for (Iterator<ASTNode> iterator = readers.iterator(); iterator.hasNext();) {
+					ASTNode n = iterator.next();
 					String attr = RubyAttributeHandler.getText(n);
 					ISourceElementRequestor.MethodInfo mi = new ISourceElementRequestor.MethodInfo();
 					mi.name = attr;
@@ -278,9 +278,9 @@
 					fRequestor.enterMethod(mi);
 					fRequestor.exitMethod(n.sourceEnd());
 				}
-				List writers = info.getWriters();
-				for (Iterator iterator = writers.iterator(); iterator.hasNext();) {
-					ASTNode n = (ASTNode) iterator.next();
+				List<ASTNode> writers = info.getWriters();
+				for (Iterator<ASTNode> iterator = writers.iterator(); iterator.hasNext();) {
+					ASTNode n = iterator.next();
 					String attr = RubyAttributeHandler.getText(n);
 					ISourceElementRequestor.MethodInfo mi = new ISourceElementRequestor.MethodInfo();
 					mi.parameterNames = new String[] { VALUE };
@@ -298,11 +298,11 @@
 				RubyHashPairExpression hashNode;
 				String oldName = ""; //$NON-NLS-1$
 				String dName;
-				for (Iterator iterator = callExpression.getArgs().getChilds()
+				for (Iterator<ASTNode> iterator = callExpression.getArgs().getChilds()
 						.iterator(); iterator.hasNext();) {
 					argNode = (RubyCallArgument) iterator.next();
 					if (argNode.getValue() instanceof RubyHashExpression) {
-						for (Iterator iterator2 = argNode.getValue()
+						for (Iterator<ASTNode> iterator2 = argNode.getValue()
 								.getChilds().iterator(); iterator2.hasNext();) {
 							hashNode = (RubyHashPairExpression) iterator2
 									.next();
@@ -316,7 +316,7 @@
 						}
 					}
 				}
-				for (Iterator iterator = callExpression.getArgs().getChilds()
+				for (Iterator<ASTNode> iterator = callExpression.getArgs().getChilds()
 						.iterator(); iterator.hasNext();) {
 					argNode = (RubyCallArgument) iterator.next();
 					dName = null;
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parsers/jruby/RubyASTBuildVisitor.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parsers/jruby/RubyASTBuildVisitor.java
index f4c477f..d4745b4 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parsers/jruby/RubyASTBuildVisitor.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/internal/parsers/jruby/RubyASTBuildVisitor.java
@@ -229,17 +229,17 @@
 	}
 
 	protected static class CollectingState implements IState {
-		private final ArrayList list;
+		private final ArrayList<ASTNode> list;
 
 		public CollectingState() {
-			list = new ArrayList();
+			list = new ArrayList<ASTNode>();
 		}
 
 		public void add(ASTNode s) {
 			list.add(s);
 		}
 
-		public ArrayList getList() {
+		public ArrayList<ASTNode> getList() {
 			return list;
 		}
 
@@ -363,10 +363,10 @@
 	}
 
 	private static class StateManager {
-		private LinkedList states = new LinkedList();
+		private LinkedList<IState> states = new LinkedList<IState>();
 
 		public IState peek() {
-			return (IState) states.getLast();
+			return states.getLast();
 		}
 
 		public void pop() {
@@ -382,9 +382,9 @@
 			if (state instanceof ClassLikeState) {
 				return true;
 			} else if (states.size() > 1) {
-				ListIterator i = states.listIterator(states.size());
+				ListIterator<IState> i = states.listIterator(states.size());
 				while (i.hasPrevious()) {
-					Object s = i.previous();
+					IState s = i.previous();
 					if (s instanceof ClassLikeState) {
 						return true;
 					}
@@ -398,9 +398,9 @@
 			if (state instanceof ClassLikeState) {
 				return (ClassLikeState) state;
 			} else if (states.size() > 1) {
-				final ListIterator i = states.listIterator(states.size());
+				final ListIterator<IState> i = states.listIterator(states.size());
 				while (i.hasPrevious()) {
-					final Object s = i.previous();
+					final IState s = i.previous();
 					if (s instanceof ClassLikeState) {
 						return (ClassLikeState) s;
 					}
@@ -468,9 +468,9 @@
 		node.accept(this);
 		states.pop();
 
-		ArrayList list = state.getList();
+		ArrayList<ASTNode> list = state.getList();
 		if (list.size() == 1)
-			return (ASTNode) list.iterator().next();
+			return list.iterator().next();
 
 		if (node instanceof NewlineNode) {
 			NewlineNode newlineNode = (NewlineNode) node;
@@ -478,16 +478,14 @@
 		}
 		if (list.size() > 1) {
 			throw new RuntimeException(
-					NLS
-							.bind(
+					NLS.bind(
 									Messages.RubyASTBuildVisitor_jrubyNodeHasntBeenConvertedIntoAnyDltkAstNode,
 									node.getClass().getName()));
 		}
 		if (allowZero)
 			return null;
 		throw new RuntimeException(
-				NLS
-						.bind(
+				NLS.bind(
 								Messages.RubyASTBuildVisitor_jrubyNodeHasntBeenConvertedIntoAnyDltkAstNode,
 								node.getClass().getName()));
 	}
@@ -543,13 +541,13 @@
 		return null;
 	}
 
-	private List processListNode(ListNode node) { // done
+	private List<ASTNode> processListNode(ListNode node) { // done
 		CollectingState coll = new CollectingState();
 
 		states.push(coll);
-		Iterator iterator = node.childNodes().iterator();
+		Iterator<Node> iterator = node.childNodes().iterator();
 		while (iterator.hasNext()) {
-			((Node) iterator.next()).accept(this);
+			iterator.next().accept(this);
 		}
 		states.pop();
 
@@ -557,7 +555,7 @@
 	}
 
 	public Instruction visitArrayNode(ArrayNode iVisited) { // done
-		List exprs = processListNode(iVisited);
+		List<ASTNode> exprs = processListNode(iVisited);
 
 		ISourcePosition position = iVisited.getPosition();
 		RubyArrayExpression arr = new RubyArrayExpression();
@@ -595,9 +593,9 @@
 		ISourcePosition pos = iVisited.getPosition();
 		Block block = new Block(pos.getStartOffset(), pos.getEndOffset());
 		states.push(new BlockState(block));
-		Iterator iterator = iVisited.childNodes().iterator();
+		Iterator<Node> iterator = iVisited.childNodes().iterator();
 		while (iterator.hasNext()) {
-			((Node) iterator.next()).accept(this);
+			iterator.next().accept(this);
 		}
 		states.pop();
 		states.peek().add(block);
@@ -803,7 +801,7 @@
 			recv.setStart(iVisited.getPosition().getStartOffset());
 			recv.setEnd(iVisited.getPosition().getEndOffset() + 1);
 		} else
-			recv = (ASTNode) collector.getList().get(0);
+			recv = collector.getList().get(0);
 
 		collector.reset();
 
@@ -817,9 +815,9 @@
 			states.push(new ArgumentsState(argList));
 			if (argsNode instanceof ListNode) {
 				ListNode arrayNode = (ListNode) argsNode;
-				List list = arrayNode.childNodes();
-				for (Iterator iter = list.iterator(); iter.hasNext();) {
-					Node node = (Node) iter.next();
+				List<Node> list = arrayNode.childNodes();
+				for (Iterator<Node> iter = list.iterator(); iter.hasNext();) {
+					Node node = iter.next();
 					node.accept(this);
 				}
 			} else {
@@ -830,17 +828,17 @@
 				argsNode.accept(this);
 			}
 			states.pop();
-			List children = argsNode.childNodes();
+			List<Node> children = argsNode.childNodes();
 			if (children.size() > 0) {
-				argsStart = ((Node) children.get(0)).getPosition()
+				argsStart = children.get(0).getPosition()
 						.getStartOffset();
-				argsEnd = ((Node) children.get(children.size() - 1))
+				argsEnd = children.get(children.size() - 1)
 						.getPosition().getEndOffset();
 				// correction for nodes with incorrect positions
-				List argListExprs = argList.getChilds();
+				List<ASTNode> argListExprs = argList.getChilds();
 				if (!argListExprs.isEmpty())
-					argsEnd = Math.max(argsEnd, ((ASTNode) argListExprs
-							.get(argListExprs.size() - 1)).sourceEnd());
+					argsEnd = Math.max(argsEnd, argListExprs
+							.get(argListExprs.size() - 1).sourceEnd());
 			}
 		}
 		if (iVisited.getIterNode() != null) {
@@ -981,9 +979,9 @@
 			type.setBody(bl);
 
 			if (bodyNode instanceof BlockNode) {
-				for (Iterator iterator = bodyNode.childNodes().iterator(); iterator
+				for (Iterator<Node> iterator = bodyNode.childNodes().iterator(); iterator
 						.hasNext();) {
-					Node n = (Node) iterator.next();
+					Node n = iterator.next();
 					n.accept(this);
 				}
 			} else
@@ -1008,7 +1006,7 @@
 		ASTNode left = null;
 		if (collector.list.size() == 1) {
 
-			left = (ASTNode) collector.list.get(0);
+			left = collector.list.get(0);
 
 		}
 
@@ -1061,7 +1059,7 @@
 
 	public Instruction visitDRegxNode(DRegexpNode iVisited) { // done
 		ISourcePosition pos = iVisited.getPosition();
-		List list = processListNode(iVisited);
+		List<ASTNode> list = processListNode(iVisited);
 		RubyDRegexpExpression ex = new RubyDRegexpExpression(pos
 				.getStartOffset(), pos.getEndOffset());
 		ex.setChilds(list);
@@ -1071,7 +1069,7 @@
 
 	public Instruction visitDStrNode(DStrNode iVisited) { // done
 		ISourcePosition pos = iVisited.getPosition();
-		List list = processListNode(iVisited);
+		List<ASTNode> list = processListNode(iVisited);
 		RubyDynamicStringExpression ex = new RubyDynamicStringExpression(pos
 				.getStartOffset(), pos.getEndOffset());
 		ex.setChilds(list);
@@ -1084,7 +1082,7 @@
 	 */
 	public Instruction visitDSymbolNode(DSymbolNode iVisited) { // done
 		ISourcePosition pos = iVisited.getPosition();
-		List list = processListNode(iVisited);
+		List<ASTNode> list = processListNode(iVisited);
 		RubyDSymbolExpression ex = new RubyDSymbolExpression(pos
 				.getStartOffset(), pos.getEndOffset());
 		ex.setChilds(list);
@@ -1103,7 +1101,7 @@
 
 	public Instruction visitDXStrNode(DXStrNode iVisited) { // done
 		ISourcePosition pos = iVisited.getPosition();
-		List list = processListNode(iVisited);
+		List<ASTNode> list = processListNode(iVisited);
 		RubyDynamicBackquoteStringExpression ex = new RubyDynamicBackquoteStringExpression(
 				pos.getStartOffset(), pos.getEndOffset());
 		ex.setChilds(list);
@@ -1120,16 +1118,16 @@
 		return null;
 	}
 
-	private List processMethodArguments(ArgsNode args) {
-		List arguments = new ArrayList();
+	private List<Argument> processMethodArguments(ArgsNode args) {
+		List<Argument> arguments = new ArrayList<Argument>();
 		Arity arity = args.getArity();
 		int endPos = args.getPosition().getStartOffset() - 1;
 		if (arity.getValue() != 0) { // BIG XXX, PLEASE CHECK IT
 			ListNode argsList = args.getArgs();
 			if (argsList != null) {
-				Iterator i = argsList.childNodes().iterator();
+				Iterator<Node> i = argsList.childNodes().iterator();
 				while (i.hasNext()) {
-					Node nde = (Node) i.next();
+					Node nde = i.next();
 					if (nde instanceof ArgumentNode) {
 						ArgumentNode a = (ArgumentNode) nde;
 						Argument aa = new RubyMethodArgument();
@@ -1148,7 +1146,7 @@
 			}
 			ListNode optArgs = args.getOptArgs();
 			if (optArgs != null) {
-				Iterator iterator = optArgs.childNodes().iterator();
+				Iterator<?> iterator = optArgs.childNodes().iterator();
 				while (iterator.hasNext()) {
 					Object obj = iterator.next();
 					if (obj instanceof LocalAsgnNode) {
@@ -1275,9 +1273,9 @@
 			method.getBody().setStart(bodyPos.getStartOffset());
 			method.getBody().setEnd(bodyPos.getEndOffset());
 			if (bodyNode instanceof BlockNode) {
-				for (Iterator iterator = bodyNode.childNodes().iterator(); iterator
+				for (Iterator<Node> iterator = bodyNode.childNodes().iterator(); iterator
 						.hasNext();) {
-					Node n = (Node) iterator.next();
+					Node n = iterator.next();
 					n.accept(this);
 				}
 			} else
@@ -1285,7 +1283,7 @@
 		}
 		ArgsNode args = iVisited.getArgsNode();
 		if (args != null) {
-			List arguments = processMethodArguments(args);
+			List<Argument> arguments = processMethodArguments(args);
 			method.acceptArguments(arguments);
 		}
 		states.pop();
@@ -1531,7 +1529,7 @@
 
 	public Instruction visitHashNode(HashNode iVisited) { // done
 		ListNode listNode = iVisited.getListNode();
-		List exprs = processListNode(listNode);
+		List<ASTNode> exprs = processListNode(listNode);
 
 		ISourcePosition position = iVisited.getPosition();
 		RubyHashExpression arr = new RubyHashExpression();
@@ -1543,13 +1541,13 @@
 			arr.setEnd(listNode.getPosition().getEndOffset());
 		}
 
-		List hashPairs = new ArrayList();
+		List<ASTNode> hashPairs = new ArrayList<ASTNode>();
 
 		if (exprs.size() % 2 == 0) {
-			Iterator i = exprs.iterator();
+			Iterator<ASTNode> i = exprs.iterator();
 			while (i.hasNext()) {
-				ASTNode key = (ASTNode) i.next();
-				ASTNode value = (ASTNode) i.next();
+				ASTNode key = i.next();
+				ASTNode value = i.next();
 				RubyHashPairExpression e = new RubyHashPairExpression(key
 						.sourceStart(), value.sourceEnd(), key, value);
 				hashPairs.add(e);
@@ -1649,9 +1647,9 @@
 				pos.getStartOffset(), pos.getEndOffset());
 		ListNode headNode = iVisited.getHeadNode();
 		if (headNode != null) {
-			for (Iterator iterator = headNode.childNodes().iterator(); iterator
+			for (Iterator<Node> iterator = headNode.childNodes().iterator(); iterator
 					.hasNext();) {
-				Node n = (Node) iterator.next();
+				Node n = iterator.next();
 				if (n instanceof LocalAsgnNode
 						&& ((LocalAsgnNode) n).getValueNode() == null) {
 					String name = ((LocalAsgnNode) n).getName();
@@ -1675,9 +1673,9 @@
 			Node firstNode = argsCatNode.getFirstNode();
 			if (firstNode instanceof ListNode) {
 				ListNode list = (ListNode) firstNode;
-				for (Iterator iterator = list.childNodes().iterator(); iterator
+				for (Iterator<Node> iterator = list.childNodes().iterator(); iterator
 						.hasNext();) {
-					Node nd = (Node) iterator.next();
+					Node nd = iterator.next();
 					s.addRhs(collectSingleNodeSafe(nd));
 				}
 			} else if (firstNode != null)
@@ -1687,9 +1685,9 @@
 				s.setRightAsterix(collectSingleNodeSafe(secondNode));
 		} else if (valueNode instanceof ListNode) {
 			ListNode list = (ListNode) valueNode;
-			for (Iterator iterator = list.childNodes().iterator(); iterator
+			for (Iterator<Node> iterator = list.childNodes().iterator(); iterator
 					.hasNext();) {
-				Node nd = (Node) iterator.next();
+				Node nd = iterator.next();
 				s.addRhs(collectSingleNodeSafe(nd));
 			}
 		} else if (valueNode != null) {
@@ -1984,9 +1982,9 @@
 	}
 
 	public Instruction visitSplatNode(SplatNode iVisited) {
-		Iterator iterator = iVisited.childNodes().iterator();
+		Iterator<Node> iterator = iVisited.childNodes().iterator();
 		while (iterator.hasNext()) {
-			((Node) iterator.next()).accept(this);
+			iterator.next().accept(this);
 		}
 
 		return null;
@@ -2040,9 +2038,9 @@
 	}
 
 	public Instruction visitSValueNode(SValueNode iVisited) {
-		Iterator iterator = iVisited.childNodes().iterator();
+		Iterator<Node> iterator = iVisited.childNodes().iterator();
 		while (iterator.hasNext()) {
-			((Node) iterator.next()).accept(this);
+			iterator.next().accept(this);
 		}
 		return null;
 	}
@@ -2053,9 +2051,9 @@
 
 		if (argsNode instanceof ListNode) {
 			ListNode arrayNode = (ListNode) argsNode;
-			List list = arrayNode.childNodes();
-			for (Iterator iter = list.iterator(); iter.hasNext();) {
-				Node node = (Node) iter.next();
+			List<Node> list = arrayNode.childNodes();
+			for (Iterator<Node> iter = list.iterator(); iter.hasNext();) {
+				Node node = iter.next();
 				node.accept(this);
 			}
 		} else if (argsNode instanceof ArgsCatNode) {
@@ -2064,14 +2062,14 @@
 					.getFirstNode());
 			CallArgumentsList second = processCallArguments(argsCatNode
 					.getSecondNode());
-			for (Iterator iterator = first.getChilds().iterator(); iterator
+			for (Iterator<ASTNode> iterator = first.getChilds().iterator(); iterator
 					.hasNext();) {
-				ASTNode e = (ASTNode) iterator.next();
+				ASTNode e = iterator.next();
 				argList.addNode(e);
 			}
-			for (Iterator iterator = second.getChilds().iterator(); iterator
+			for (Iterator<ASTNode> iterator = second.getChilds().iterator(); iterator
 					.hasNext();) {
-				ASTNode e = (ASTNode) iterator.next();
+				ASTNode e = iterator.next();
 				argList.addNode(e);
 			}
 		} else if (argsNode != null) {
@@ -2101,9 +2099,9 @@
 	}
 
 	public Instruction visitToAryNode(ToAryNode iVisited) {
-		Iterator iterator = iVisited.childNodes().iterator();
+		Iterator<Node> iterator = iVisited.childNodes().iterator();
 		while (iterator.hasNext()) {
-			((Node) iterator.next()).accept(this);
+			iterator.next().accept(this);
 		}
 		return null;
 	}
@@ -2180,7 +2178,7 @@
 			org.eclipse.dltk.ast.ASTListNode list = (org.eclipse.dltk.ast.ASTListNode) expressionsStatement;
 			statement.setExpressions(list.getChilds());
 		} else {
-			List list = new ArrayList(1);
+			List<ASTNode> list = new ArrayList<ASTNode>(1);
 			list.add(expressionsStatement);
 			statement.setExpressions(list);
 		}
@@ -2343,9 +2341,9 @@
 		Node bodyNode = arg0.getBodyNode();
 		if (bodyNode instanceof BlockNode) {
 			BlockNode blockNode = (BlockNode) bodyNode;
-			Iterator iterator = blockNode.childNodes().iterator();
+			Iterator<Node> iterator = blockNode.childNodes().iterator();
 			while (iterator.hasNext()) {
-				((Node) iterator.next()).accept(this);
+				iterator.next().accept(this);
 			}
 		} else if (bodyNode != null)
 			bodyNode.accept(this);
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethods.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethods.java
index afff3ce..feadec4 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethods.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethods.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.typeinference;
 
@@ -55,7 +54,7 @@
 					return new RubyClassType(key + "%"); //$NON-NLS-1$
 				return null;
 			} else if (receiver instanceof AmbiguousType) {
-				Set possibleReturns = new HashSet();
+				Set<IEvaluatedType> possibleReturns = new HashSet<IEvaluatedType>();
 				AmbiguousType ambiguousType = (AmbiguousType) receiver;
 				IEvaluatedType[] possibleTypes = ambiguousType.getPossibleTypes();
 				for (int i = 0; i < possibleTypes.length; i++) {
@@ -152,7 +151,7 @@
 			this.name = name;
 		}
 
-		private Map methods = new HashMap();
+		private Map<String, IntrinsicMethod> methods = new HashMap<String, IntrinsicMethod>();
 
 		public void addMethod(String name, IntrinsicMethod method) {
 			methods.put(name, method);
@@ -163,16 +162,16 @@
 		}
 
 		IntrinsicMethod getMethod(String name) {
-			return (IntrinsicMethod) methods.get(name);
+			return methods.get(name);
 		}
 		
-		public Collection getMethods(){
+		public Collection<IntrinsicMethod> getMethods(){
 			return methods.values();
 		}
 
 	}
 
-	private static Map builtinClasses = new HashMap();
+	private static Map<String, BuiltinClass> builtinClasses = new HashMap<String, BuiltinClass>();
 
 	private static BuiltinClass addClass(BuiltinClass klass) {
 		builtinClasses.put(klass.getName(), klass);
@@ -219,7 +218,7 @@
 		if (receiver instanceof IClassType)
 			return getIntrinsicMethodReturnType((IClassType) receiver, methodName, arguments);
 		else if (receiver instanceof AmbiguousType) {
-			Set possibleReturns = new HashSet();
+			Set<IEvaluatedType> possibleReturns = new HashSet<IEvaluatedType>();
 			AmbiguousType ambiguousType = (AmbiguousType) receiver;
 			IEvaluatedType[] possibleTypes = ambiguousType.getPossibleTypes();
 			for (int i = 0; i < possibleTypes.length; i++) {
@@ -236,7 +235,7 @@
 	public static IEvaluatedType getIntrinsicMethodReturnType(IClassType receiver,
 			String methodName, IEvaluatedType[] arguments) {
 		String className = getPossibleIntrinsicClassName(receiver);
-		BuiltinClass klass = (BuiltinClass) builtinClasses.get(className);
+		BuiltinClass klass = builtinClasses.get(className);
 		if (klass != null) {
 			IntrinsicMethod method = klass.getMethod(methodName);
 			if (method != null) {
@@ -246,21 +245,21 @@
 		return null;
 	}
 	
-	public static Collection getIntrinsicMethods(IEvaluatedType receiver) {
+	public static Collection<IntrinsicMethod> getIntrinsicMethods(IEvaluatedType receiver) {
 		if (receiver instanceof IClassType) {
 			String className = getPossibleIntrinsicClassName((IClassType) receiver);
-			BuiltinClass klass = (BuiltinClass) builtinClasses.get(className);
+			BuiltinClass klass = builtinClasses.get(className);
 			if (klass != null)
 				return klass.getMethods();
 			else
 				return null;
 		} else if (receiver instanceof AmbiguousType) {
-			Set methods = new HashSet();
+			Set<IntrinsicMethod> methods = new HashSet<IntrinsicMethod>();
 			AmbiguousType ambiguousType = (AmbiguousType) receiver;
 			IEvaluatedType[] possibleTypes = ambiguousType.getPossibleTypes();
 			for (int i = 0; i < possibleTypes.length; i++) {
 				IEvaluatedType type = possibleTypes[i];
-				Collection typeMethods = getIntrinsicMethods(type);
+				Collection<IntrinsicMethod> typeMethods = getIntrinsicMethods(type);
 				methods.addAll(typeMethods);
 			}
 			return methods;
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethodsDatabase.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethodsDatabase.java
index 03eec74..06d766d 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethodsDatabase.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/BuiltinMethodsDatabase.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.typeinference;
 
@@ -140,7 +139,7 @@
 
 	}
 
-	private final static Map metaclasses = new HashMap();
+	private final static Map<String, Metaclass> metaclasses = new HashMap<String, Metaclass>();
 
 	private static Metaclass add(Metaclass metaclass) {
 		metaclasses.put(metaclass.getName(), metaclass);
@@ -148,7 +147,7 @@
 	}
 
 	public static Metaclass get(String name) {
-		return (Metaclass) metaclasses.get(name);
+		return metaclasses.get(name);
 	}
 
 	static {
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyModelUtils.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyModelUtils.java
index 74aded9..32aa591 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyModelUtils.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyModelUtils.java
@@ -254,7 +254,7 @@
 	 * @param selfKlass
 	 * @return
 	 */
-	private static List handleSpecialMethod(RubyMixinMethod method,
+	private static List<IMethod> handleSpecialMethod(RubyMixinMethod method,
 			RubyMixinClass selfKlass) {
 		if (method.getKey().equals("Class%{new")) { //$NON-NLS-1$
 			RubyMixinMethod init = selfKlass.getInstanceClass() != null ? selfKlass
@@ -262,7 +262,7 @@
 					: null;
 			if (init != null) {
 				IMethod[] initMethods = init.getSourceMethods();
-				List result = new ArrayList();
+				List<IMethod> result = new ArrayList<IMethod>();
 				for (int i = 0; i < initMethods.length; i++) {
 					try {
 						IParameter[] parameters = initMethods[i]
@@ -297,12 +297,12 @@
 		return null;
 	}
 
-	public static List getAllSourceMethods(RubyMixinMethod[] methods,
+	public static List<IMethod> getAllSourceMethods(RubyMixinMethod[] methods,
 			RubyMixinClass selfKlass) {
-		List result = new ArrayList();
+		List<IMethod> result = new ArrayList<IMethod>();
 		for (int i = 0; i < methods.length; i++) {
 			if (selfKlass != null) {
-				List m = handleSpecialMethod(methods[i], selfKlass);
+				List<IMethod> m = handleSpecialMethod(methods[i], selfKlass);
 				if (m != null) {
 					result.addAll(m);
 					continue;
@@ -382,7 +382,7 @@
 	}
 
 	private static void addVariablesFrom(RubyMixinVariable[] fields2,
-			String prefix, List resultList) {
+			String prefix, List<IField> resultList) {
 		for (int i = 0; i < fields2.length; i++) {
 			IField[] sourceFields = fields2[i].getSourceFields();
 			if (sourceFields != null) {
@@ -484,7 +484,7 @@
 	}
 
 	private static void addFakeMethods(ModelElement parent,
-			Metaclass metaclass, List fakeMethods) {
+			Metaclass metaclass, List<FakeMethod> fakeMethods) {
 		// process included modules first, to allow the class to override
 		// some of the methods
 		ModuleMetaclass[] includedModules = metaclass.getIncludedModules();
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyTypeInferencingUtils.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyTypeInferencingUtils.java
index 546c5f9..513654e 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyTypeInferencingUtils.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/RubyTypeInferencingUtils.java
@@ -258,7 +258,7 @@
 				|| node instanceof MethodDeclaration;
 	}
 
-	public static IEvaluatedType combineTypes(Collection evaluaedTypes) {
+	public static IEvaluatedType combineTypes(Collection<IEvaluatedType> evaluaedTypes) {
 		Set<IEvaluatedType> types = new HashSet<IEvaluatedType>(evaluaedTypes);
 		types.remove(null);
 		if (types.size() > 1 && types.contains(RecursionTypeCall.INSTANCE))
@@ -284,7 +284,7 @@
 
 	public static IEvaluatedType getAmbiguousMetaType(IEvaluatedType receiver) {
 		if (receiver instanceof AmbiguousType) {
-			Set possibleReturns = new HashSet();
+			Set<IEvaluatedType> possibleReturns = new HashSet<IEvaluatedType>();
 			AmbiguousType ambiguousType = (AmbiguousType) receiver;
 			IEvaluatedType[] possibleTypes = ambiguousType.getPossibleTypes();
 			for (int i = 0; i < possibleTypes.length; i++) {
@@ -337,7 +337,7 @@
 		}
 
 		private List<VariableAssignment> assignements;
-		private Stack level = new Stack();
+		private Stack<ASTNode> level = new Stack<ASTNode>();
 		private int maxLevel;
 
 		private final String name;
@@ -407,11 +407,11 @@
 			return null;
 		}
 
-		public List getConditionals() {
+		public List<RubyAssignment> getConditionals() {
 			RubyAssignment unconditionalAssignment = getUnconditionalAssignment();
-			List result = new ArrayList();
-			for (Iterator iter = assignements.iterator(); iter.hasNext();) {
-				VariableAssignment assign = (VariableAssignment) iter.next();
+			List<RubyAssignment> result = new ArrayList<RubyAssignment>();
+			for (Iterator<VariableAssignment> iter = assignements.iterator(); iter.hasNext();) {
+				VariableAssignment assign = iter.next();
 				if (unconditionalAssignment == null
 						|| assign.assignment.sourceStart() > unconditionalAssignment
 								.sourceStart())
@@ -425,7 +425,7 @@
 	}
 
 	private static RubyAssignment findAssignments(String variableName,
-			ASTNode scopeNode, int tillOffset, List conditionals) {
+			ASTNode scopeNode, int tillOffset, List<RubyAssignment> conditionals) {
 		LocalVariablesSearchVisitor visitor = new LocalVariablesSearchVisitor(
 				variableName, scopeNode, tillOffset);
 		try {
@@ -448,7 +448,7 @@
 			ASTNode scope = scopes[i];
 			if (scope instanceof TypeDeclaration) {
 				info.setDeclaringScope(scope);
-				List conditionals = new ArrayList();
+				List<RubyAssignment> conditionals = new ArrayList<RubyAssignment>();
 				RubyAssignment last = findAssignments(name, scope, offset,
 						conditionals);
 				info.setLastAssignment(last);
@@ -458,11 +458,10 @@
 			} else if (scope instanceof MethodDeclaration) {
 				MethodDeclaration method = (MethodDeclaration) scope;
 				boolean isArgument = false;
-				List arguments = method.getArguments();
-				for (Iterator iterator = arguments.iterator(); iterator
+				List<RubyMethodArgument> arguments = method.getArguments();
+				for (Iterator<RubyMethodArgument> iterator = arguments.iterator(); iterator
 						.hasNext();) {
-					RubyMethodArgument arg = (RubyMethodArgument) iterator
-							.next();
+					RubyMethodArgument arg = iterator.next();
 					String argName = arg.getName();
 					if (argName.equals(name)) {
 						isArgument = true;
@@ -472,7 +471,7 @@
 				if (isArgument
 						&& (info.getKind() == LocalVariableInfo.KIND_DEFAULT))
 					info.setKind(LocalVariableInfo.KIND_METHOD_ARG);
-				List conditionals = new ArrayList();
+				List<RubyAssignment> conditionals = new ArrayList<RubyAssignment>();
 				RubyAssignment last = findAssignments(name, scope, offset,
 						conditionals);
 				info.setLastAssignment(last);
@@ -482,9 +481,9 @@
 			} else if (scope instanceof RubyBlock) {
 				boolean isArgument = false;
 				RubyBlock block = (RubyBlock) scope;
-				Set vars = block.getVars();
-				for (Iterator iterator = vars.iterator(); iterator.hasNext();) {
-					ASTNode vnode = (ASTNode) iterator.next();
+				Set<ASTNode> vars = block.getVars();
+				for (Iterator<ASTNode> iterator = vars.iterator(); iterator.hasNext();) {
+					ASTNode vnode = iterator.next();
 					if (vnode instanceof RubyDAssgnExpression) {
 						RubyDAssgnExpression v = (RubyDAssgnExpression) vnode;
 						if (v.getName().equals(name)) {
@@ -535,7 +534,7 @@
 		}
 		if (i < 0) {
 			// consider the whole module
-			List conditionals = new ArrayList();
+			List<RubyAssignment> conditionals = new ArrayList<RubyAssignment>();
 			RubyAssignment last = findAssignments(name, module, offset,
 					conditionals);
 			info.setLastAssignment(last);
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/UniqueNamesList.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/UniqueNamesList.java
index 42b3c2b..a5de6b9 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/UniqueNamesList.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/UniqueNamesList.java
@@ -13,14 +13,14 @@
 
 import org.eclipse.dltk.core.IModelElement;
 
-class UniqueNamesList extends ArrayList {
+class UniqueNamesList<T> extends ArrayList<T> {
 
 	private static final long serialVersionUID = 4866432224140371654L;
 	
-	HashSet names = new HashSet ();
+	HashSet<String> names = new HashSet<String> ();
 	
 	@Override
-	public boolean add(Object elem) {
+	public boolean add(T elem) {
 		if (elem instanceof IModelElement) {
 			IModelElement modelElement = (IModelElement) elem;
 			if (names.contains(modelElement.getElementName()))
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/BlockEvaluator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/BlockEvaluator.java
index 2326d94..f4f7f8c 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/BlockEvaluator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/BlockEvaluator.java
@@ -40,10 +40,9 @@
 	public IGoal[] init() {
 		ExpressionTypeGoal typedGoal = getTypedGoal();
 		Block block = (Block) typedGoal.getExpression();
-		List statements = block.getStatements();
+		List<ASTNode> statements = block.getStatements();
 		if (statements.size() > 0) {
-			this.lastStatement = (ASTNode) statements
-					.get(statements.size() - 1);
+			this.lastStatement = statements.get(statements.size() - 1);
 			ExpressionTypeGoal subgoal = new ExpressionTypeGoal(goal
 					.getContext(), this.lastStatement);
 			return new IGoal[] { subgoal };
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/CaseStatementTypeEvaluator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/CaseStatementTypeEvaluator.java
index 899b143..5c48177 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/CaseStatementTypeEvaluator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/CaseStatementTypeEvaluator.java
@@ -41,9 +41,9 @@
 			return IGoal.NO_GOALS;
 		RubyCaseStatement caseSt = (RubyCaseStatement) expression;
 		List<IGoal> subgoals = new ArrayList<IGoal>();
-		List whens = caseSt.getWhens();
-		for (Iterator iterator = whens.iterator(); iterator.hasNext();) {
-			RubyWhenStatement when = (RubyWhenStatement) iterator.next();
+		List<RubyWhenStatement> whens = caseSt.getWhens();
+		for (Iterator<RubyWhenStatement> iterator = whens.iterator(); iterator.hasNext();) {
+			RubyWhenStatement when = iterator.next();
 			ASTNode body = when.getBody();
 			subgoals.add(new ExpressionTypeGoal(this.goal.getContext(), body));
 		}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodCallTypeEvaluator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodCallTypeEvaluator.java
index 85ebac1..75ae982 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodCallTypeEvaluator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodCallTypeEvaluator.java
@@ -116,7 +116,7 @@
 			ExpressionTypeGoal typedGoal = (ExpressionTypeGoal) goal;
 			CallExpression expression = (CallExpression) typedGoal
 					.getExpression();
-			List arguments = expression.getArgs().getChilds();
+			List<ASTNode> arguments = expression.getArgs().getChilds();
 			this.arguments = new IEvaluatedType[arguments.size()];
 		}
 		if (state >= STATE_WAITING_ARGUMENT_0
@@ -130,11 +130,11 @@
 			ExpressionTypeGoal typedGoal = (ExpressionTypeGoal) goal;
 			CallExpression expression = (CallExpression) typedGoal
 					.getExpression();
-			List arguments = expression.getArgs().getChilds();
+			List<ASTNode> arguments = expression.getArgs().getChilds();
 			if (nextArg < arguments.size()) {
 				state = STATE_WAITING_ARGUMENT_0 + nextArg;
 				return new ExpressionTypeGoal(goal.getContext(),
-						(ASTNode) arguments.get(nextArg));
+						arguments.get(nextArg));
 			} else {
 				state = STATE_ARGS_DONE;
 			}
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodReturnTypeEvaluator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodReturnTypeEvaluator.java
index f26c811..ea7b1f8 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodReturnTypeEvaluator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/MethodReturnTypeEvaluator.java
@@ -43,7 +43,7 @@
 
 public class MethodReturnTypeEvaluator extends RubyMixinGoalEvaluator {
 
-	private final List possibilities = new ArrayList();
+	private final List<ASTNode> possibilities = new ArrayList<ASTNode>();
 	private final List evaluated = new ArrayList();
 
 	private IEvaluatedType rdocResult = null;
@@ -92,7 +92,7 @@
 		}
 
 		MethodDeclaration decl = null;
-		List methods = new ArrayList();
+		List<IMethod> methods = new ArrayList<IMethod>();
 		if (instanceType == null) {
 			instanceType = new RubyClassType("Object"); //$NON-NLS-1$			
 		}
@@ -120,8 +120,8 @@
 		IMethod resultMethod = null;
 		// in case of ambiguity, prefer methods from the same module
 		IMethod resultMethodFromSameModule = null;
-		for (Iterator iterator = methods.iterator(); iterator.hasNext();) {
-			IMethod method = (IMethod) iterator.next();
+		for (Iterator<IMethod> iterator = methods.iterator(); iterator.hasNext();) {
+			IMethod method = iterator.next();
 			if (method instanceof FakeMethod || method == null)
 				continue;
 			String elementName = method.getElementName();
@@ -189,10 +189,9 @@
 
 		IGoal[] newGoals = new IGoal[possibilities.size()];
 		int i = 0;
-		for (Iterator iterator = possibilities.iterator(); iterator.hasNext();) {
-			ASTNode st = (ASTNode) iterator.next();
-			ExpressionTypeGoal subgoal = new ExpressionTypeGoal(innerContext,
-					st);
+		for (Iterator<ASTNode> iterator = possibilities.iterator(); iterator.hasNext();) {
+			ASTNode st = iterator.next();
+			ExpressionTypeGoal subgoal = new ExpressionTypeGoal(innerContext, st);
 			newGoals[i++] = subgoal;
 		}
 		return newGoals;
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/NonTypeConstantTypeEvaluator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/NonTypeConstantTypeEvaluator.java
index 39523f9..5b4a809 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/NonTypeConstantTypeEvaluator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/NonTypeConstantTypeEvaluator.java
@@ -21,7 +21,7 @@
 
 public class NonTypeConstantTypeEvaluator extends GoalEvaluator {
 
-	private HashMap hardcoredTypes = new HashMap();
+	private HashMap<String, RubyClassType> hardcoredTypes = new HashMap<String, RubyClassType>();
 	private Object result;
 
 	public NonTypeConstantTypeEvaluator(IGoal goal) {
diff --git a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/VariableReferenceEvaluator.java b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/VariableReferenceEvaluator.java
index 6876da0..07bb9bf 100644
--- a/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/VariableReferenceEvaluator.java
+++ b/plugins/org.eclipse.dltk.ruby.core/src/org/eclipse/dltk/ruby/typeinference/evaluators/VariableReferenceEvaluator.java
@@ -182,8 +182,8 @@
 
 		int pos = 0;
 		int argPos = -1;
-		for (Iterator iterator = methodArgs.iterator(); iterator.hasNext();) {
-			ASTNode marg = (ASTNode) iterator.next();
+		for (Iterator<ASTNode> iterator = methodArgs.iterator(); iterator.hasNext();) {
+			ASTNode marg = iterator.next();
 			if (marg instanceof RubyMethodArgument) {
 				RubyMethodArgument rubyMethodArgument = (RubyMethodArgument) marg;
 				if (rubyMethodArgument.getName().equals(varName)) {
@@ -221,9 +221,9 @@
 
 			CallArgumentsList args = expr.getArgs();
 			if (args != null) {
-				List list = args.getChilds();
+				List<ASTNode> list = args.getChilds();
 				if (argPos < list.size()) {
-					ASTNode st = (ASTNode) list.get(argPos);
+					ASTNode st = list.get(argPos);
 					if (st instanceof RubyCallArgument) {
 						RubyCallArgument rubyCallArgument = (RubyCallArgument) st;
 						st = rubyCallArgument.getValue();