Composantes internes de SourceMap
Les cartographies de sources étant une sorte de boîte noire pour tous les mainteneurs de LibSass, il ont voulu essayer de documenter leurs découvertes concernant les cartographies de sources dans LibSass, au fur et à mesure. Ce document expliquera également brièvement comment LibSass analyse le code source et génère le résultat.
Le principal entreposage des cartographies SourceMap est le vecteur de cartographies :
- # dans source_map.hpp
- vector<Mapping> mappings
- # dans mappings.hpp
- struct Mapping ...
- Position original_position;
- Position generated_position;
Chaque jeton analysé est associé à sa source.
LibSass utilise un analyseur lexical. Dès qu'il trouve un jeton pertinent, LibSass crée un AST_Node spécifique, contenant une référence à la source d'entrée avec les informations de ligne/colonne. AST_Node est la classe de base de tous les éléments analysés. Ils sont déclarés dans ast.hpp et utilisés dans parser.hpp. Voici un exemple simple :
Comment la position source est-elle calculée ?
Ceci est effectué automatiquement avec lex dans parser.hpp. Chaque fois qu'un élément est analysé lexiquement, la position source est mise à jour. Cependant, sachez que la position source pointe vers le début du texte analysé. Si vous avez besoin d'une cartographie pour la position où l'analyse s'est terminée, vous devez ajouter un autre appel à lex (pour ne rien faire correspondre) !
- lex< exactly < empty_str > >();
- end = new (ctx.mem) String_Constant(path, source_position, lexed);
Comment sont créés les cartographies pour la sortie ?
Ils avons déjà collecté toutes les données nécessaires pour tous les jetons du flux d'entrée. Nous pouvons maintenant utiliser ces informations pour créer des cartographies lorsque nous intégrons des éléments au flux de sortie. Les cartographies sont créés via la méthode add_mappings :
- # dans source_map.hpp
- void add_mapping(AST_Node* node);
Cette méthode est appelée à deux endroits :
- Inspect::append_to_buffer
- Output_[Nested|Compressed]::append_to_buffer
Les cartographies ne peuvent être créés que pour les éléments analysés dans un AST_Node. Sinon, nous ne disposons pas des informations nécessaires pour les créer, c'est pourquoi LibSass ne cartographie actuellement que les jetons les plus importants dans les cartographies sources.