@@ -608,83 +608,96 @@ namespace das {
608608 return it != callThis.end () ? &it->second : nullptr ;
609609 }
610610
611+ static bool appendBuiltinModuleContent ( Module * target, ProgramPtr program, const string & modName ) {
612+ if ( !program ) {
613+ DAS_FATAL_ERROR (" builtin module did not parse %s\n " , modName.c_str ());
614+ return false ;
615+ }
616+ if (program->failed ()) {
617+ TextWriter issues;
618+ for (auto & err : program->errors ) {
619+ issues << reportError (err.at , err.what , err.extra , err.fixme , err.cerr );
620+ }
621+ DAS_FATAL_ERROR (" %s\n builtin module did not compile %s\n " , issues.str ().c_str (), modName.c_str ());
622+ return false ;
623+ }
624+ // append content into target module
625+ program->thisModule ->aliasTypes .foreach ([&](auto aliasTypePtr){
626+ target->addAlias (aliasTypePtr);
627+ });
628+ program->thisModule ->enumerations .foreach ([&](auto penum){
629+ target->addEnumeration (penum);
630+ });
631+ program->thisModule ->structures .foreach ([&](auto pst){
632+ target->addStructure (pst);
633+ });
634+ program->thisModule ->generics .foreach ([&](auto fn){
635+ target->addGeneric (fn);
636+ });
637+ program->thisModule ->globals .foreach ([&](auto gvar){
638+ target->addVariable (gvar);
639+ });
640+ program->thisModule ->functions .foreach ([&](auto fn){
641+ target->addFunction (fn);
642+ });
643+ for (auto & rqm : program->thisModule ->requireModule ) {
644+ if ( rqm.first != target ) {
645+ target->requireModule [rqm.first ] |= rqm.second ;
646+ }
647+ }
648+ // macros
649+ auto ptm = program->thisModule .get ();
650+ if ( ptm->macroContext ) {
651+ swap ( target->macroContext , ptm->macroContext );
652+ ptm->handleTypes .foreach ([&](auto fna){
653+ target->addAnnotation (fna);
654+ });
655+ }
656+ target->simulateMacros .insert (target->simulateMacros .end (), ptm->simulateMacros .begin (), ptm->simulateMacros .end ());
657+ target->captureMacros .insert (target->captureMacros .end (), ptm->captureMacros .begin (), ptm->captureMacros .end ());
658+ target->forLoopMacros .insert (target->forLoopMacros .end (), ptm->forLoopMacros .begin (), ptm->forLoopMacros .end ());
659+ target->variantMacros .insert (target->variantMacros .end (), ptm->variantMacros .begin (), ptm->variantMacros .end ());
660+ target->macros .insert (target->macros .end (), ptm->macros .begin (), ptm->macros .end ());
661+ target->inferMacros .insert (target->inferMacros .end (), ptm->inferMacros .begin (), ptm->inferMacros .end ());
662+ target->optimizationMacros .insert (target->optimizationMacros .end (), ptm->optimizationMacros .begin (), ptm->optimizationMacros .end ());
663+ target->lintMacros .insert (target->lintMacros .end (), ptm->lintMacros .begin (), ptm->lintMacros .end ());
664+ target->globalLintMacros .insert (target->globalLintMacros .end (), ptm->globalLintMacros .begin (), ptm->globalLintMacros .end ());
665+ for ( auto & rm : ptm->readMacros ) {
666+ target->addReaderMacro (rm.second );
667+ }
668+ for ( auto & tm : ptm->typeMacros ) {
669+ target->addTypeMacro (tm.second );
670+ }
671+ target->commentReader = ptm->commentReader ;
672+ for ( auto & op : ptm->options ) {
673+ DAS_ASSERTF (target->options .find (op.first )==target->options .end ()," duplicate option %s" , op.first .c_str ());
674+ target->options [op.first ] = op.second ;
675+ }
676+ SubstituteBuiltinModuleRefs ( program, program->thisModule .get (), target );
677+ return true ;
678+ }
679+
611680 bool Module::compileBuiltinModule ( const string & modName, const unsigned char * const str, unsigned int str_len ) {
612681 TextWriter issues;
613682 auto access = make_smart<FileAccess>();
614683 auto fileInfo = make_unique<TextFileInfo>((char *) str, uint32_t (str_len), false );
615684 access->setFileInfo (modName, das::move (fileInfo));
616685 ModuleGroup dummyLibGroup;
617- CodeOfPolicies builtinPolicies;
618- builtinPolicies.version_2_syntax = false ; // NOTE: no version 2 syntax in builtin modules (yet)
619686 auto program = parseDaScript (modName, " " , access, issues, dummyLibGroup, true );
620687 ownFileInfo = access->letGoOfFileInfo (modName);
621688 DAS_ASSERTF (ownFileInfo," something went wrong and FileInfo for builtin module can not be obtained" );
622- if ( program ) {
623- if (program->failed ()) {
624- for (auto & err : program->errors ) {
625- issues << reportError (err.at , err.what , err.extra , err.fixme , err.cerr );
626- }
627- DAS_FATAL_ERROR (" %s\n builtin module did not compile %s\n " , issues.str ().c_str (), modName.c_str ());
628- return false ;
629- }
630- // ok, now let's rip content
631- program->thisModule ->aliasTypes .foreach ([&](auto aliasTypePtr){
632- addAlias (aliasTypePtr);
633- });
634- program->thisModule ->enumerations .foreach ([&](auto penum){
635- addEnumeration (penum);
636- });
637- program->thisModule ->structures .foreach ([&](auto pst){
638- addStructure (pst);
639- });
640- program->thisModule ->generics .foreach ([&](auto fn){
641- addGeneric (fn);
642- });
643- program->thisModule ->globals .foreach ([&](auto gvar){
644- addVariable (gvar);
645- });
646- program->thisModule ->functions .foreach ([&](auto fn){
647- addFunction (fn);
648- });
649- for (auto & rqm : program->thisModule ->requireModule ) {
650- if ( rqm.first != this ) {
651- requireModule[rqm.first ] |= rqm.second ;
652- }
653- }
654- // macros
655- auto ptm = program->thisModule .get ();
656- if ( ptm->macroContext ) {
657- swap ( macroContext, ptm->macroContext );
658- ptm->handleTypes .foreach ([&](auto fna){
659- addAnnotation (fna);
660- });
661- }
662- simulateMacros.insert (simulateMacros.end (), ptm->simulateMacros .begin (), ptm->simulateMacros .end ());
663- captureMacros.insert (captureMacros.end (), ptm->captureMacros .begin (), ptm->captureMacros .end ());
664- forLoopMacros.insert (forLoopMacros.end (), ptm->forLoopMacros .begin (), ptm->forLoopMacros .end ());
665- variantMacros.insert (variantMacros.end (), ptm->variantMacros .begin (), ptm->variantMacros .end ());
666- macros.insert (macros.end (), ptm->macros .begin (), ptm->macros .end ());
667- inferMacros.insert (inferMacros.end (), ptm->inferMacros .begin (), ptm->inferMacros .end ());
668- optimizationMacros.insert (optimizationMacros.end (), ptm->optimizationMacros .begin (), ptm->optimizationMacros .end ());
669- lintMacros.insert (lintMacros.end (), ptm->lintMacros .begin (), ptm->lintMacros .end ());
670- globalLintMacros.insert (globalLintMacros.end (), ptm->globalLintMacros .begin (), ptm->globalLintMacros .end ());
671- for ( auto & rm : ptm->readMacros ) {
672- addReaderMacro (rm.second );
673- }
674- for ( auto & tm : ptm->typeMacros ) {
675- addTypeMacro (tm.second );
676- }
677- commentReader = ptm->commentReader ;
678- for ( auto & op : ptm->options ) {
679- DAS_ASSERTF (options.find (op.first )==options.end ()," duplicate option %s" , op.first .c_str ());
680- options[op.first ] = op.second ;
681- }
682- SubstituteBuiltinModuleRefs ( program, program->thisModule .get (), this );
683- return true ;
684- } else {
685- DAS_FATAL_ERROR (" builtin module did not parse %s\n " , modName.c_str ());
686- return false ;
687- }
689+ return appendBuiltinModuleContent (this , program, modName);
690+ }
691+
692+ bool Module::compileBuiltinModule ( const string & modName, const string & filePath, const FileAccessPtr & access ) {
693+ TextWriter issues;
694+ ModuleGroup dummyLibGroup;
695+ auto program = parseDaScript (filePath, modName, access, issues, dummyLibGroup, true );
696+ const char *src; uint32_t length;
697+ access->getFileInfo (filePath)->getSourceAndLength (src, length);
698+ ownFileInfo = make_unique<TextFileInfo>((char *) src, uint32_t (length), false );
699+ DAS_ASSERTF (ownFileInfo," something went wrong and FileInfo for builtin module can not be obtained" );
700+ return appendBuiltinModuleContent (this , program, modName);
688701 }
689702
690703 bool isValidBuiltinName ( const string & name, bool canPunkt ) {
0 commit comments