diff options
author | Jose <pepone@users.noreply.github.com> | 2019-11-14 21:35:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-14 21:35:00 +0100 |
commit | 45491f0f2b0deaa956f1bbd0d6d433e884e287f1 (patch) | |
tree | fc6adfeed2babc6481352e6c2c78aeb86b1a3f23 /cpp/src | |
parent | Make build system fixes (diff) | |
download | ice-45491f0f2b0deaa956f1bbd0d6d433e884e287f1.tar.bz2 ice-45491f0f2b0deaa956f1bbd0d6d433e884e287f1.tar.xz ice-45491f0f2b0deaa956f1bbd0d6d433e884e287f1.zip |
Forward defined types not properly defined in TypeScript - Close 633 (#634)
* Forward defined types not properly defined in TypeScript - Close 633
* Add assert for constructing the definedIn path
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/slice2js/Gen.cpp | 23 | ||||
-rw-r--r-- | cpp/src/slice2js/JsUtil.cpp | 56 | ||||
-rw-r--r-- | cpp/src/slice2js/JsUtil.h | 4 |
3 files changed, 75 insertions, 8 deletions
diff --git a/cpp/src/slice2js/Gen.cpp b/cpp/src/slice2js/Gen.cpp index f59050a784e..fa878d44a62 100644 --- a/cpp/src/slice2js/Gen.cpp +++ b/cpp/src/slice2js/Gen.cpp @@ -2293,12 +2293,31 @@ Slice::Gen::TypeScriptRequireVisitor::addImport(const TypePtr& definition, const { if(!BuiltinPtr::dynamicCast(definition)) { - const string m1 = getModuleMetadata(definition); + string m1 = getModuleMetadata(definition); const string m2 = getModuleMetadata(toplevel); - const string p1 = definition->definitionContext()->filename(); + string p1 = definition->definitionContext()->filename(); const string p2 = toplevel->definitionContext()->filename(); + ProxyPtr p = ProxyPtr::dynamicCast(definition); + ClassDeclPtr c = p ? p->_class() : ClassDeclPtr::dynamicCast(definition); + + if(c) + { + if(c->definition() == 0) + { + string definedIn = getDefinedIn(c); + if(!definedIn.empty()) + { + p1 = definedIn; + } + } + else + { + m1 = getModuleMetadata(ContainedPtr::dynamicCast(c->definition())); + p1 = c->definition()->definitionContext()->filename(); + } + } addImport(m1, m2, p1, p2); } } diff --git a/cpp/src/slice2js/JsUtil.cpp b/cpp/src/slice2js/JsUtil.cpp index d8f8dfb70a7..4463682a609 100644 --- a/cpp/src/slice2js/JsUtil.cpp +++ b/cpp/src/slice2js/JsUtil.cpp @@ -165,6 +165,22 @@ fixIds(const StringList& ids) } string +Slice::JsGenerator::getDefinedIn(const ContainedPtr& p) +{ + static const string prefix = "js:defined-in:"; + string definedIn; + if(findMetaData(prefix, p->getMetaData(), definedIn)) + { + string base = p->definitionContext()->filename(); + string::size_type pos = base.find_last_of("/\\"); + assert(pos != string::npos); + base = base.erase(pos); + return fullPath(base + "/" + definedIn); + } + return ""; +} + +string Slice::JsGenerator::getModuleMetadata(const TypePtr& type) { static const char* builtinModuleTable[] = @@ -267,7 +283,14 @@ Slice::JsGenerator::importPrefix(const TypePtr& type, else if(ProxyPtr::dynamicCast(type)) { ProxyPtr proxy = ProxyPtr::dynamicCast(type); - return importPrefix(ContainedPtr::dynamicCast(proxy->_class()), toplevel, imports); + if(proxy->_class()->definition()) + { + return importPrefix(ContainedPtr::dynamicCast(proxy->_class()->definition()), toplevel, imports); + } + else + { + return importPrefix(proxy->_class(), toplevel, imports, getDefinedIn(proxy->_class())); + } } else if(ContainedPtr::dynamicCast(type)) { @@ -289,6 +312,17 @@ Slice::JsGenerator::importPrefix(const TypePtr& type, { return "iceNS0."; } + else if(cl) + { + if(cl->definition()) + { + return importPrefix(ContainedPtr::dynamicCast(cl->definition()), toplevel, imports); + } + else + { + return importPrefix(ContainedPtr::dynamicCast(cl), toplevel, imports, getDefinedIn(cl)); + } + } else { return importPrefix(ContainedPtr::dynamicCast(type), toplevel, imports); @@ -300,7 +334,8 @@ Slice::JsGenerator::importPrefix(const TypePtr& type, string Slice::JsGenerator::importPrefix(const ContainedPtr& contained, const ContainedPtr& toplevel, - const vector<pair<string, string> >& imports) + const vector<pair<string, string> >& imports, + const string& definedIn) { string m1 = getModuleMetadata(contained); string m2 = getModuleMetadata(toplevel); @@ -309,7 +344,7 @@ Slice::JsGenerator::importPrefix(const ContainedPtr& contained, if(m1.empty()) { - string p1 = contained->definitionContext()->filename(); + string p1 = definedIn.empty() ? contained->definitionContext()->filename() : definedIn; string p2 = toplevel->definitionContext()->filename(); p = relativePath(p1, p2); @@ -471,9 +506,13 @@ Slice::JsGenerator::typeToString(const TypePtr& type, { prefix = importPrefix("Ice.Value", toplevel); } + else if(cl->definition()) + { + prefix = importPrefix(ContainedPtr::dynamicCast(cl->definition()), toplevel, imports); + } else { - prefix = importPrefix(ContainedPtr::dynamicCast(cl), toplevel, imports); + prefix = importPrefix(ContainedPtr::dynamicCast(cl), toplevel, imports, getDefinedIn(cl)); } } os << prefix; @@ -505,7 +544,14 @@ Slice::JsGenerator::typeToString(const TypePtr& type, string prefix; if(typescript) { - prefix = importPrefix(ContainedPtr::dynamicCast(proxy->_class()), toplevel, imports); + if(def) + { + prefix = importPrefix(ContainedPtr::dynamicCast(def), toplevel, imports); + } + else + { + prefix = importPrefix(proxy->_class(), toplevel, imports, getDefinedIn(proxy->_class())); + } os << prefix; } diff --git a/cpp/src/slice2js/JsUtil.h b/cpp/src/slice2js/JsUtil.h index 6486ba111c6..f943c471cc1 100644 --- a/cpp/src/slice2js/JsUtil.h +++ b/cpp/src/slice2js/JsUtil.h @@ -20,6 +20,7 @@ public: virtual ~JsGenerator() {}; static bool isClassType(const TypePtr&); + static std::string getDefinedIn(const ContainedPtr&); static std::string getModuleMetadata(const TypePtr&); static std::string getModuleMetadata(const ContainedPtr&); static std::string fixId(const std::string&); @@ -31,7 +32,8 @@ public: static std::string importPrefix(const ContainedPtr&, const ContainedPtr&, - const std::vector<std::pair<std::string, std::string> >&); + const std::vector<std::pair<std::string, std::string> >&, + const std::string& definedIn = ""); static std::string importPrefix(const std::string&, const ContainedPtr&); static std::string getUnqualified(const std::string&, const std::string&, const std::string&); |