package org.rubypeople.rdt.internal.ti.data; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.rubypeople.rdt.internal.ti.BasicTypeGuess; import org.rubypeople.rdt.internal.ti.ITypeGuess; /** * Holds a bunch of typical returns for methods on core classes * * @author Jason * @author cwilliams */ public abstract class TypicalMethodReturnNames { public static Collection<ITypeGuess> get(String method) { if (method.endsWith("?")) { return createSet("TrueClass", "FalseClass"); } Collection<ITypeGuess> result = TYPICAL_METHOD_RETURN_TYPE_NAMES.get(method); if (result == null) return Collections.emptySet(); return result; } private static final Map<String, Collection<ITypeGuess>> TYPICAL_METHOD_RETURN_TYPE_NAMES = new HashMap<String, Collection<ITypeGuess>>(); static { // TODO Read this in from some config file/property file rather than hardcode it! TYPICAL_METHOD_RETURN_TYPE_NAMES.put("capitalize", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("capitalize!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("ceil", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("center", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("chomp", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("chomp!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("chop", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("chop!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("concat", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("count", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("crypt", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("downcase", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("downcase!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("dump", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("floor", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("gets", createSet("String", "NilClass")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("gsub", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("gsub!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("hash", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("index", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("inspect", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("intern", createSet("Symbol")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("length", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("now", createSet("Time")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("round", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("size", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("slice", createSet("String", "Array", "NilClass", "Object", "Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("slice!", createSet("String", "Array", "NilClass", "Object", "Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("strip", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("strip!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("sub", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("sub!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("swapcase", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("swapcase!", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_a", createSet("Array")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_ary", createSet("Array")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_i", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_int", createSet("Fixnum")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_f", createSet("Float")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_proc", createSet("Proc")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_s", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_str", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_string", createSet("String")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("to_sym", createSet("Symbol")); TYPICAL_METHOD_RETURN_TYPE_NAMES.put("unpack", createSet("Array")); } private static Set<ITypeGuess> createSet(String... strings) { // TODO Allow for un-equal weighting of types! int weight = 100 / strings.length; Set<ITypeGuess> set = new HashSet<ITypeGuess>(); for (String string : strings) { set.add(new BasicTypeGuess(string, weight)); } return set; } }