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/slice2js/JsUtil.cpp | |
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/slice2js/JsUtil.cpp')
-rw-r--r-- | cpp/src/slice2js/JsUtil.cpp | 56 |
1 files changed, 51 insertions, 5 deletions
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; } |