@@ -1865,19 +1865,37 @@ static void linkDependenciesAtInitializeParsing (parserDefinition *const parser)
18651865 unsigned int i ;
18661866 parserDependency * d ;
18671867 langType upper ;
1868+ parserDefinition * lowerParser ;
18681869 parserObject * upperParser ;
18691870
18701871 for (i = 0 ; i < parser -> dependencyCount ; i ++ )
18711872 {
18721873 d = parser -> dependencies + i ;
1873- upper = getNamedLanguage (d -> upperParser , 0 );
1874+
1875+ if (d -> type == DEPTYPE_FOREIGNER )
1876+ {
1877+ upper = parser -> id ;
1878+ langType lower = getNamedLanguage (d -> upperParser , 0 );
1879+ if (lower == LANG_IGNORE )
1880+ error (FATAL ,
1881+ "Unknown language: \"%s\" as a foreigner for %s" ,
1882+ d -> upperParser , parser -> name );
1883+
1884+ lowerParser = LanguageTable [lower ].def ;
1885+ }
1886+ else
1887+ {
1888+ upper = getNamedLanguage (d -> upperParser , 0 );
1889+ lowerParser = parser ;
1890+ }
1891+
18741892 upperParser = LanguageTable + upper ;
18751893
18761894 linkDependencyAtInitializeParsing (d -> type , upperParser -> def ,
18771895 upperParser -> slaveControlBlock ,
18781896 upperParser -> kindControlBlock ,
1879- parser ,
1880- (LanguageTable + parser -> id )-> kindControlBlock ,
1897+ lowerParser ,
1898+ (LanguageTable + lowerParser -> id )-> kindControlBlock ,
18811899 d -> data );
18821900 }
18831901}
@@ -3743,11 +3761,39 @@ static rescanReason createTagsForFile (const langType language,
37433761
37443762extern void notifyLanguageRegexInputStart (langType language )
37453763{
3746- notifyRegexInputStart ((LanguageTable + language )-> lregexControlBlock );
3764+ parserObject * pobj = LanguageTable + language ;
3765+ parserDefinition * pdef = pobj -> def ;
3766+
3767+ notifyRegexInputStart (pobj -> lregexControlBlock );
3768+ for (unsigned int i = 0 ; i < pdef -> dependencyCount ; i ++ )
3769+ {
3770+ parserDependency * d = pdef -> dependencies + i ;
3771+ if (d -> type != DEPTYPE_FOREIGNER )
3772+ continue ;
3773+ langType foreigner = getNamedLanguage (d -> upperParser , 0 );
3774+ if (foreigner == LANG_IGNORE )
3775+ continue ;
3776+
3777+ notifyLanguageRegexInputStart (foreigner );
3778+ }
37473779}
37483780
37493781extern void notifyLanguageRegexInputEnd (langType language )
37503782{
3783+ parserObject * pobj = LanguageTable + language ;
3784+ parserDefinition * pdef = pobj -> def ;
3785+
3786+ for (unsigned int i = 0 ; i < pdef -> dependencyCount ; i ++ )
3787+ {
3788+ parserDependency * d = pdef -> dependencies + i ;
3789+ if (d -> type != DEPTYPE_FOREIGNER )
3790+ continue ;
3791+ langType foreigner = getNamedLanguage (d -> upperParser , 0 );
3792+ if (foreigner == LANG_IGNORE )
3793+ continue ;
3794+
3795+ notifyLanguageRegexInputEnd (foreigner );
3796+ }
37513797 notifyRegexInputEnd ((LanguageTable + language )-> lregexControlBlock );
37523798}
37533799
0 commit comments