summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorJose <pepone@users.noreply.github.com>2019-11-14 21:35:00 +0100
committerGitHub <noreply@github.com>2019-11-14 21:35:00 +0100
commit45491f0f2b0deaa956f1bbd0d6d433e884e287f1 (patch)
treefc6adfeed2babc6481352e6c2c78aeb86b1a3f23 /cpp
parentMake build system fixes (diff)
downloadice-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')
-rw-r--r--cpp/src/slice2js/Gen.cpp23
-rw-r--r--cpp/src/slice2js/JsUtil.cpp56
-rw-r--r--cpp/src/slice2js/JsUtil.h4
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&);