| 1183 | } |
| 1184 | |
| 1185 | std::vector<const SyntaxDefinition*> |
| 1186 | SyntaxDefinitionManager::languagesThatSupportExtension( std::string extension ) const { |
| 1187 | std::unordered_set<const SyntaxDefinition*> langs; |
| 1188 | if ( extension.empty() ) |
| 1189 | return {}; |
| 1190 | |
| 1191 | if ( extension[0] != '.' ) |
| 1192 | extension = '.' + extension; |
| 1193 | |
| 1194 | { |
| 1195 | Lock l( mMutex ); |
| 1196 | for ( const auto& definition : mDefinitions ) { |
| 1197 | for ( const auto& ext : definition->getFiles() ) { |
| 1198 | if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || |
| 1199 | String::endsWith( ext, "$" ) ) { |
| 1200 | LuaPattern words( ext ); |
| 1201 | int start, end; |
| 1202 | if ( words.find( extension, start, end ) ) { |
| 1203 | langs.insert( definition.get() ); |
| 1204 | break; |
| 1205 | } |
| 1206 | } else if ( extension == ext ) { |
| 1207 | langs.insert( definition.get() ); |
| 1208 | break; |
| 1209 | } |
| 1210 | } |
| 1211 | } |
| 1212 | } |
| 1213 | |
| 1214 | { |
| 1215 | Lock l( mMutex ); |
| 1216 | for ( const auto& preDefinition : mPreDefinitions ) { |
| 1217 | for ( const auto& ext : preDefinition.getFiles() ) { |
| 1218 | if ( std::find_if( langs.begin(), langs.end(), |
| 1219 | [&preDefinition]( const SyntaxDefinition* sdf ) { |
| 1220 | return preDefinition.getLanguageName() == |
| 1221 | sdf->getLanguageName(); |
| 1222 | } ) != langs.end() ) |
| 1223 | continue; |
| 1224 | |
| 1225 | if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || |
| 1226 | String::endsWith( ext, "$" ) ) { |
| 1227 | LuaPattern words( ext ); |
| 1228 | int start, end; |
| 1229 | if ( words.find( extension, start, end ) ) { |
| 1230 | langs.insert( &preDefinition.load() ); |
| 1231 | break; |
| 1232 | } |
| 1233 | } else if ( extension == ext ) { |
| 1234 | langs.insert( &preDefinition.load() ); |
| 1235 | break; |
| 1236 | } |
| 1237 | } |
| 1238 | } |
| 1239 | } |
| 1240 | |
| 1241 | std::vector<const SyntaxDefinition*> vlangs; |
| 1242 | vlangs.reserve( langs.size() ); |