From 0a030e8a90650c8839a6b4db8ab2ea73d7203fd5 Mon Sep 17 00:00:00 2001 From: Jose Date: Fri, 7 Dec 2018 19:18:13 +0100 Subject: JavaScript: import external modules as JS modules When using the JavaScript es6 module mapping, Slice compilation units using js:module that correspond to a external js:module are now imported as a single module, rather than importing the JavaScript generated files. --- cpp/src/slice2js/Gen.cpp | 104 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 25 deletions(-) (limited to 'cpp/src/slice2js/Gen.cpp') diff --git a/cpp/src/slice2js/Gen.cpp b/cpp/src/slice2js/Gen.cpp index a59ced63bc9..4cb4ddda166 100644 --- a/cpp/src/slice2js/Gen.cpp +++ b/cpp/src/slice2js/Gen.cpp @@ -1025,58 +1025,111 @@ Slice::Gen::RequireVisitor::writeRequires(const UnitPtr& p) StringList includes = p->includeFiles(); if(_es6modules) { - _out << nl << "import { Ice } from \"ice\";"; - _out << nl << "const _ModuleRegistry = Ice._ModuleRegistry;"; + const string prefix = "js:module:"; + DefinitionContextPtr dc = p->findDefinitionContext(p->topLevelFile()); + string m1 = dc->findMetaData(prefix); + if(!m1.empty()) + { + m1 = m1.substr(prefix.size()); + } seenModules.push_back("Ice"); + map> imports; + set mImports; + { + mImports.insert("Ice"); + imports["ice"] = mImports; + } + for(StringList::const_iterator i = includes.begin(); i != includes.end(); ++i) { set modules = p->getTopLevelModules(*i); - vector newModules; - bool externals = false; // is there any external modules? - for(set::const_iterator j = modules.begin(); j != modules.end(); ++j) + + dc = p->findDefinitionContext(*i); + + string m2 = dc->findMetaData(prefix); + if(!m2.empty()) { - if(find(seenModules.begin(), seenModules.end(), *j) == seenModules.end()) + m2 = m2.substr(prefix.size()); + } + + if(m1 != m2 && !m2.empty()) + { + for(set::const_iterator j = modules.begin(); j != modules.end(); ++j) { - seenModules.push_back(*j); - if(!_icejs && iceBuiltinModule(*j)) + if(imports.find(m2) == imports.end()) { - _out << nl << "import { " << *j << " } from \"ice\";"; + set mImports; + mImports.insert(*j); + imports[m2] = mImports; } else { - newModules.push_back(*j); - externals = true; + imports[m2].insert(*j); + } + } + } + else + { + set newModules; + for(set::const_iterator j = modules.begin(); j != modules.end(); ++j) + { + if(find(seenModules.begin(), seenModules.end(), *j) == seenModules.end()) + { + seenModules.push_back(*j); + newModules.insert(*j); } } + + string f = relativePath(*i, p->topLevelFile()); + string::size_type pos; + if((pos = f.rfind('.')) != string::npos) + { + f.erase(pos); + } + + imports[f] = newModules; } + } - if(externals) + // + // We first import the Ice runtime + // + _out << nl << "import { "; + mImports = imports["ice"]; + for(set::const_iterator i = mImports.begin(); i != mImports.end();) + { + _out << (*i); + if(++i != mImports.end()) { + _out << ", "; + } + } + _out << " } from \"ice\";"; + + _out << nl << "const _ModuleRegistry = Ice._ModuleRegistry;"; + + for(map>::const_iterator i = imports.begin(); i != imports.end(); ++i) + { + if(i->first != "ice") + { + mImports = i->second; _out << nl << "import "; - if(!newModules.empty()) + if(!mImports.empty()) { _out << "{ "; - for(vector::const_iterator j = newModules.begin(); j != newModules.end();) + for(set::const_iterator i = mImports.begin(); i != mImports.end();) { - _out << *j; - ++j; - if(j != newModules.end()) + _out << (*i); + if(++i != mImports.end()) { _out << ", "; } } _out << " } from "; } - - string result = relativePath(*i, p->topLevelFile()); - string::size_type pos; - if((pos = result.rfind('.')) != string::npos) - { - result.erase(pos); - } - _out << "\"" << result << "\";"; + _out << "\"" << i->first << "\";"; } } _out << nl << "const Slice = Ice.Slice;"; @@ -1106,6 +1159,7 @@ Slice::Gen::RequireVisitor::writeRequires(const UnitPtr& p) } } } + if(_icejs) { _out.zeroIndent(); -- cgit v1.2.3