THRIFT-3697 Dart generator does not name imports
Client: Dart
Patch: Mark Erickson
diff --git a/compiler/cpp/src/generate/t_dart_generator.cc b/compiler/cpp/src/generate/t_dart_generator.cc
index 7bae327..3d7f597 100644
--- a/compiler/cpp/src/generate/t_dart_generator.cc
+++ b/compiler/cpp/src/generate/t_dart_generator.cc
@@ -81,7 +81,7 @@
       } else if( iter->first.compare("pubspec_lib") == 0) {
         pubspec_lib_ = (iter->second);
       } else {
-        throw "unknown option dart:" + iter->first; 
+        throw "unknown option dart:" + iter->first;
       }
     }
 
@@ -241,7 +241,7 @@
   std::string function_signature(t_function* tfunction);
   std::string argument_list(t_struct* tstruct);
   std::string type_to_enum(t_type* ttype);
-  std::string get_enum_class_name(t_type* type);
+  std::string get_ttype_class_name(t_type* ttype);
 
   bool type_can_be_null(t_type* ttype) {
     ttype = get_true_type(ttype);
@@ -359,10 +359,11 @@
   const vector<t_program*>& includes = program_->get_includes();
   for (size_t i = 0; i < includes.size(); ++i) {
     string include_name = find_library_name(includes[i]);
+    string named_import = "t_" + include_name;
     if (package_prefix_.empty()) {
-      imports += "import 'package:" + include_name + "/" + include_name + ".dart';" + endl;
+      imports += "import 'package:" + include_name + "/" + include_name + ".dart' as " + named_import + ";" + endl;
     } else {
-      imports += "import 'package:" + package_prefix_ + include_name + ".dart';" + endl;
+      imports += "import 'package:" + package_prefix_ + include_name + ".dart' as " + named_import + ";" + endl;
     }
   }
 
@@ -977,7 +978,7 @@
     // if field is an enum, check that its value is valid
     if (type->is_enum()) {
       string field_name = get_field_name(field->get_name());
-      indent(out) << "if (" << generate_isset_check(field) << " && !" << get_enum_class_name(type)
+      indent(out) << "if (" << generate_isset_check(field) << " && !" << get_ttype_class_name(type)
                   << ".VALID_VALUES.contains(" << field_name << "))";
       scope_up(out);
       indent(out) << "throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"The field '"
@@ -1293,7 +1294,7 @@
       indent(out) << "ret.write(\"BINARY\");" << endl;
     } else if (field->get_type()->is_enum()) {
       indent(out) << "String " << field_name << "_name = "
-                  << get_enum_class_name(field->get_type())
+                  << get_ttype_class_name(field->get_type())
                   << ".VALUES_TO_NAMES[this." << field_name << "];" << endl;
       indent(out) << "if (" << field_name << "_name != null)";
       scope_up(out);
@@ -1407,7 +1408,7 @@
 void t_dart_generator::generate_service_interface(t_service* tservice) {
   string extends_iface = "";
   if (tservice->get_extends() != NULL) {
-    extends_iface = " extends " + tservice->get_extends()->get_name();
+    extends_iface = " extends " + get_ttype_class_name(tservice->get_extends());
   }
 
   generate_dart_doc(f_service_, tservice);
@@ -1452,7 +1453,7 @@
   string extends = "";
   string extends_client = "";
   if (tservice->get_extends() != NULL) {
-    extends = tservice->get_extends()->get_name();
+    extends = get_ttype_class_name(tservice->get_extends());
     extends_client = " extends " + extends + "Client";
   }
 
@@ -1587,7 +1588,7 @@
   string extends = "";
   string extends_processor = "";
   if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
+    extends = get_ttype_class_name(tservice->get_extends());
     extends_processor = " extends " + extends + "Processor";
   }
 
@@ -2148,7 +2149,7 @@
     return "List<" + type_name(tlist->get_elem_type()) + ">";
   }
 
-  return ttype->get_name();
+  return get_ttype_class_name(ttype);
 }
 
 /**
@@ -2427,8 +2428,13 @@
   }
 }
 
-std::string t_dart_generator::get_enum_class_name(t_type* type) {
-  return type->get_name();
+std::string t_dart_generator::get_ttype_class_name(t_type* ttype) {
+  if (program_ == ttype->get_program()) {
+    return ttype->get_name();
+  } else {
+    string named_import = "t_" + find_library_name(ttype->get_program());
+    return named_import + "." + ttype->get_name();
+  }
 }
 
 THRIFT_REGISTER_GENERATOR(