/*
Copyright (C) 2014-2019 de4dot@gmail.com
This file is part of dnSpy
dnSpy is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
dnSpy is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with dnSpy. If not, see .
*/
using System;
using System.ComponentModel.Composition;
using dnSpy.Contracts.Debugger.Breakpoints.Code;
using dnSpy.Contracts.Debugger.DotNet.Code;
using dnSpy.Contracts.Debugger.DotNet.CorDebug.Code;
using dnSpy.Contracts.Debugger.DotNet.Metadata;
using dnSpy.Contracts.Decompiler;
using dnSpy.Contracts.Metadata;
namespace dnSpy.Debugger.DotNet.CorDebug.Code {
abstract class BreakpointFormatterService {
public abstract DbgBreakpointLocationFormatterImpl Create(DbgDotNetNativeCodeLocation location);
}
[Export(typeof(BreakpointFormatterService))]
sealed class BreakpointFormatterServiceImpl : BreakpointFormatterService {
readonly DbgDotNetDecompilerService dbgDotNetDecompilerService;
readonly Lazy dbgCodeBreakpointsService;
readonly Lazy dbgMetadataService;
internal IDecompiler MethodDecompiler => dbgDotNetDecompilerService.Decompiler;
[ImportingConstructor]
BreakpointFormatterServiceImpl(DbgDotNetDecompilerService dbgDotNetDecompilerService, Lazy dbgCodeBreakpointsService, Lazy dbgMetadataService) {
this.dbgDotNetDecompilerService = dbgDotNetDecompilerService;
this.dbgCodeBreakpointsService = dbgCodeBreakpointsService;
this.dbgMetadataService = dbgMetadataService;
dbgDotNetDecompilerService.DecompilerChanged += DbgDotNetDecompilerService_DecompilerChanged;
}
void DbgDotNetDecompilerService_DecompilerChanged(object? sender, EventArgs e) {
foreach (var bp in dbgCodeBreakpointsService.Value.Breakpoints) {
if (bp.IsHidden)
continue;
var formatter = (bp.Location as DbgDotNetNativeCodeLocationImpl)?.Formatter;
formatter?.RefreshName();
}
}
public override DbgBreakpointLocationFormatterImpl Create(DbgDotNetNativeCodeLocation location) =>
new DbgBreakpointLocationFormatterImpl(this, (DbgDotNetNativeCodeLocationImpl)location);
internal TDef? GetDefinition(ModuleId module, uint token) where TDef : class {
var md = dbgMetadataService.Value.TryGetMetadata(module, DbgLoadModuleOptions.AutoLoaded);
return md?.ResolveToken(token) as TDef;
}
}
}