public TypeBuilder[] getDependencies() {
            checkCreated();
			var dependencies = new HashSet<TypeBuilder>();
			addType(dependencies, baseType);
			foreach (var t in interfaces) {
				addType(dependencies, t);
			}
            foreach (var a in annotations) {
				addType(dependencies, a.Type);
			}
            foreach (var nt in nestedTypes) {
				foreach (var t in ((TypeBuilder)nt).getDependencies()) {
					dependencies.add((TypeBuilder)t);
				}
			}
			foreach (var f in fields) {
				foreach (var a in f.Annotations) {
					addType(dependencies, a.Type);
				}
				addType(dependencies, f.Type);
			}
            foreach (var m in methods) {
                if (!m.IsExcludedFromCompilation) {
					foreach (var a in m.Annotations) {
						addType(dependencies, a.Type);
					}
					addType(dependencies, m.ReturnType);
					foreach (var p in m.Parameters) {
						foreach (var a in p.Annotations) {
							addType(dependencies, a.Type);
						}
						addType(dependencies, p.Type);
					}
					foreach (var e in m.Exceptions) {
						addType(dependencies, e);
					}
					foreach (var instruction in ((MethodBuilder)m).CodeGenerator.Instructions) {
						switch (instruction.Opcode) {
						case Getfield:
						case Getstatic:
						case Putfield:
						case Putstatic:
							addType(dependencies, instruction.Field.DeclaringType);
							break;
							
						case Invokedynamic:
						case Invokeinterface:
						case Invokespecial:
						case Invokestatic:
						case Invokevirtual:
							addType(dependencies, instruction.Method.DeclaringType);
							break;
						case Anewarray:
						case Checkcast:
						case Instanceof:
						case New:
							addType(dependencies, instruction.Type);
							break;
						}
					}
				}
			}
			return dependencies.toArray(new TypeBuilder[dependencies.size()]);
		}