(source: Source, silent = false)
| 793 | } |
| 794 | |
| 795 | removeSource(source: Source, silent = false) { |
| 796 | const existing = this._sourceByReference.get(source.sourceReference()); |
| 797 | if (existing === undefined) { |
| 798 | return; // already removed |
| 799 | } |
| 800 | |
| 801 | this.logger.assert( |
| 802 | source === existing, |
| 803 | 'Expected source to be the same as the existing reference', |
| 804 | ); |
| 805 | this._sourceByReference.delete(source.sourceReference()); |
| 806 | if (source instanceof SourceFromMap) { |
| 807 | this._sourceMapSourcesByUrl.delete(source.url); |
| 808 | } |
| 809 | |
| 810 | this._sourceByAbsolutePath.delete(source.absolutePath()); |
| 811 | this._disabledSourceMaps.delete(source); |
| 812 | if (!silent) { |
| 813 | source.toDap().then(dap => this._dap.loadedSource({ reason: 'removed', source: dap })); |
| 814 | } |
| 815 | |
| 816 | if (!isSourceWithMap(source)) return; |
| 817 | |
| 818 | const sourceMap = this._sourceMaps.get(source.sourceMap.url); |
| 819 | if ( |
| 820 | !this.logger.assert( |
| 821 | sourceMap, |
| 822 | `Source map missing for ${source.sourceMap.url} in removeSource()`, |
| 823 | ) |
| 824 | ) { |
| 825 | return; |
| 826 | } |
| 827 | this.logger.assert( |
| 828 | sourceMap.compiled.has(source), |
| 829 | `Source map ${source.sourceMap.url} does not contain source ${source.url}`, |
| 830 | ); |
| 831 | |
| 832 | sourceMap.compiled.delete(source); |
| 833 | if (!sourceMap.compiled.size) { |
| 834 | if (sourceMap.map) sourceMap.map.destroy(); |
| 835 | this._sourceMaps.delete(source.sourceMap.url); |
| 836 | } |
| 837 | // Source map could still be loading, or failed to load. |
| 838 | if (sourceMap.map) { |
| 839 | this._removeSourceMapSources(source, sourceMap.map, silent); |
| 840 | } |
| 841 | } |
| 842 | |
| 843 | async _addSourceMapSources(compiled: ISourceWithMap, map: SourceMap) { |
| 844 | const todo: Promise<void>[] = []; |
no test coverage detected