in src/SourcemapToolkit.SourcemapParser/MappingListParser.cs [202:238]
internal List<MappingEntry> ParseMappings(string mappingString, IReadOnlyList<string> names, IReadOnlyList<string> sources)
{
List<MappingEntry> mappingEntries = new List<MappingEntry>();
MappingsParserState currentMappingsParserState = new MappingsParserState();
// The V3 source map format calls for all Base64 VLQ segments to be seperated by commas.
// Each line of generated code is separated using semicolons. The count of semicolons encountered gives the current line number.
string[] lines = mappingString.SplitFast(';');
for (int lineNumber = 0; lineNumber < lines.Length; lineNumber++)
{
// The only value that resets when encountering a semicolon is the starting column.
currentMappingsParserState = new MappingsParserState(
currentMappingsParserState,
newGeneratedLineNumber: lineNumber,
newGeneratedColumnBase: 0);
string[] segmentsForLine = lines[lineNumber].Split(LineDelimiter, StringSplitOptions.RemoveEmptyEntries);
foreach (string segment in segmentsForLine)
{
// Reuse the numericMappingEntry to ease GC allocations.
NumericMappingEntry numericMappingEntry = ParseSingleMappingSegment(Base64VlqDecoder.Decode(segment), currentMappingsParserState);
mappingEntries.Add(numericMappingEntry.ToMappingEntry(names, sources));
// Update the current MappingParserState based on the generated MappingEntry
currentMappingsParserState = new MappingsParserState(
currentMappingsParserState,
newGeneratedColumnBase: numericMappingEntry.GeneratedColumnNumber,
newSourcesListIndexBase: numericMappingEntry.OriginalSourceFileIndex,
newOriginalSourceStartingLineBase: numericMappingEntry.OriginalLineNumber,
newOriginalSourceStartingColumnBase: numericMappingEntry.OriginalColumnNumber,
newNamesListIndexBase: numericMappingEntry.OriginalNameIndex);
}
}
return mappingEntries;
}