private TypeBuilder defineNestedType(TypeBuilder declaringClass, String className, String shortName, SyntaxNode node) {
     if (context.TypeSystem.typeExists(className)) {
         throw context.error(CompileErrorId.AlreadyDefinedType, node, className.replace('/', '.').replace('$', '.'));
     }
     var result = declaringClass.defineNestedType(shortName);
     context.TypeBuilders.add(result);
     return result;
 }
		private static void defineType(TypeInfo type, Library targetTypeSystem, TypeBuilder declaringType) {
			if (type.IsSynthetic) {
				return;
			}
			TypeBuilder clone;
			if (declaringType == null) {
				clone = targetTypeSystem.defineType(type.FullName);
			} else {
				clone = declaringType.defineNestedType(type.Name);
				
				clone.setNestedAbstract(type.IsNestedAbstract);
				clone.setNestedAnnotation(type.IsNestedAnnotation);
				clone.setNestedEnum(type.IsNestedEnum);
				clone.setNestedFinal(type.IsNestedFinal);
				clone.setNestedInterface(type.IsNestedInterface);
				clone.setNestedPrivate(type.IsNestedPrivate);
				clone.setNestedProtected(type.IsNestedProtected);
				clone.setNestedPublic(type.IsNestedPublic);
				clone.setNestedStatic(type.IsNestedStatic);
			}
			
			clone.setAbstract(type.IsAbstract);
			clone.setAnnotation(type.IsNestedAnnotation);
			clone.setEnum(type.IsEnum);
			clone.setFinal(type.IsFinal);
			clone.setInterface(type.IsInterface);
			clone.setPublic(type.IsPublic);
			clone.setSuper(type.IsSynthetic);
			
			foreach (var ga in type.GenericArguments) {
				clone.addGenericArgument(ga.FullName);
			}
	
			foreach (var nt in type.getNestedTypes()) {
				defineType(nt, targetTypeSystem, clone);
			}
		}