private TypeInfo getType(String name) { name = name.trim(); int dimensions = 0; while (name.endsWith("[]")) { dimensions++; name = name.substring(0, name.length() - 2); } TypeInfo result; switch (name) { case "boolean": result = context.TypeSystem.BooleanType; break; case "byte": result = context.TypeSystem.ByteType; break; case "char": result = context.TypeSystem.CharType; break; case "short": result = context.TypeSystem.ShortType; break; case "int": result = context.TypeSystem.IntType; break; case "long": result = context.TypeSystem.LongType; break; case "float": result = context.TypeSystem.FloatType; break; case "double": result = context.TypeSystem.DoubleType; break; default: int idx = name.indexOf("."); String prefix; if (idx == -1) { prefix = name; name = null; } else { prefix = name.substring(0, idx); name = name.substring(idx + 1); } var members = context.MemberResolver.resolveName(context.CurrentType, prefix, Query.empty<TypeInfo>()).toList(); if (!members.any()) { if (name == null) { return null; } var packageName = context.MemberResolver.getPackageFromAlias(prefix); if (packageName == null) { if (context.MemberResolver.TypeFinder.getSubPackages(prefix).any() || context.MemberResolver.TypeFinder.getClasses(prefix).any()) { packageName = prefix; } else { return null; } } var found = false; do { idx = name.indexOf('.'); if (idx == -1) { prefix = name; name = null; } else { prefix = name.substring(0, idx); name = name.substring(idx + 1); } foreach (var s in context.MemberResolver.TypeFinder.getSubPackages(packageName)) { if (s.equals(prefix)) { packageName = packageName + '/' + prefix; found = true; break; } } if (!found && !context.MemberResolver.TypeFinder.getClasses(packageName).contains(prefix)) { return null; } } while (name != null && found); result = context.TypeSystem.getType(packageName + '/' + prefix); } else if (members.count() > 1) { return null; } else { result = members.first().Type; } break; } while (dimensions-- > 0) { type = type.ArrayType; } return result; }