Browse Source

more nullable error cleanups

pull/3287/head
apmoskevitz 11 months ago
parent
commit
73a79213b0
  1. 1
      .editorconfig
  2. 12
      ICSharpCode.Decompiler/CSharp/CallBuilder.cs
  3. 2
      ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs
  4. 4
      ICSharpCode.Decompiler/CSharp/Resolver/MethodGroupResolveResult.cs
  5. 2
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/InterpolatedStringExpression.cs
  6. 4
      ICSharpCode.Decompiler/CSharp/Syntax/Statements/Statement.cs
  7. 2
      ICSharpCode.Decompiler/CSharp/Syntax/TypeMembers/Accessor.cs
  8. 2
      ICSharpCode.Decompiler/CSharp/Syntax/TypeMembers/EnumMemberDeclaration.cs
  9. 2
      ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs
  10. 2
      ICSharpCode.Decompiler/CSharp/Transforms/FixNameCollisions.cs
  11. 6
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs
  12. 2
      ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs
  13. 18
      ICSharpCode.Decompiler/DecompilerException.cs
  14. 2
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  15. 44
      ICSharpCode.Decompiler/IL/ControlFlow/AsyncAwaitDecompiler.cs
  16. 14
      ICSharpCode.Decompiler/IL/ControlFlow/DetectPinnedRegions.cs
  17. 2
      ICSharpCode.Decompiler/IL/Transforms/EarlyExpressionTransforms.cs
  18. 6
      ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs
  19. 4
      ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs
  20. 2
      ICSharpCode.Decompiler/TypeSystem/ApplyAttributeTypeVisitor.cs
  21. 4
      ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs
  22. 2
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataEvent.cs
  23. 2
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataProperty.cs
  24. 2
      ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs
  25. 2
      ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs
  26. 2
      ICSharpCode.ILSpyX/Abstractions/ILanguage.cs
  27. 2
      ILSpy.ReadyToRun/ReadyToRunLanguage.cs
  28. 4
      ILSpy/Analyzers/AnalyzerEntityTreeNode.cs
  29. 2
      ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs
  30. 2
      ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs
  31. 2
      ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs
  32. 2
      ILSpy/Analyzers/TreeNodes/AnalyzedPropertyTreeNode.cs
  33. 2
      ILSpy/Analyzers/TreeNodes/AnalyzedTypeTreeNode.cs
  34. 11
      ILSpy/App.xaml.cs
  35. 4
      ILSpy/AvalonEdit/TextMarkerService.cs
  36. 2
      ILSpy/Commands/CommandWrapper.cs
  37. 4
      ILSpy/Commands/DelegateCommand.cs
  38. 2
      ILSpy/Commands/IProtocolHandler.cs
  39. 6
      ILSpy/Commands/SimpleCommand.cs
  40. 2
      ILSpy/Controls/SearchBox.cs
  41. 2
      ILSpy/Controls/TreeView/SharpTreeNodeView.cs
  42. 2
      ILSpy/Controls/TreeView/SharpTreeView.cs
  43. 14
      ILSpy/Controls/TreeView/SharpTreeViewItemAutomationPeer.cs
  44. 4
      ILSpy/Docking/DockWorkspace.cs
  45. 2
      ILSpy/Docking/PaneCollection.cs
  46. 4
      ILSpy/LanguageSettings.cs
  47. 2
      ILSpy/Languages/Language.cs
  48. 10
      ILSpy/MainWindow.xaml.cs
  49. 4
      ILSpy/Metadata/Helpers.cs
  50. 4
      ILSpy/Metadata/MetaDataGrid.cs
  51. 2
      ILSpy/Options/DecompilerSettingsViewModel.cs
  52. 4
      ILSpy/Options/DisplaySettings.cs
  53. 4
      ILSpy/Options/MiscSettingsViewModel.cs
  54. 2
      ILSpy/Search/SearchPane.xaml.cs
  55. 4
      ILSpy/SessionSettings.cs
  56. 2
      ILSpy/TextView/BracketHighlightRenderer.cs
  57. 6
      ILSpy/Themes/WindowStyleManagerBehavior.cs
  58. 4
      ILSpy/TreeNodes/AssemblyListTreeNode.cs
  59. 4
      ILSpy/TreeNodes/ILSpyTreeNode.cs
  60. 2
      ILSpy/Updates/NotifyOfUpdatesStrategy.cs
  61. 4
      ILSpy/Updates/UpdateSettings.cs
  62. 4
      ILSpy/ViewModels/PaneModel.cs
  63. 4
      ILSpy/ViewModels/ViewModelBase.cs

1
.editorconfig

@ -153,6 +153,7 @@ dotnet_diagnostic.IDE2003.severity = silent
#cleared null error types #cleared null error types
dotnet_diagnostic.CS8612.severity = error dotnet_diagnostic.CS8612.severity = error
dotnet_diagnostic.CS8622.severity = error
dotnet_diagnostic.CS8714.severity = error dotnet_diagnostic.CS8714.severity = error
dotnet_diagnostic.CS8762.severity = error dotnet_diagnostic.CS8762.severity = error
dotnet_diagnostic.CS8765.severity = error dotnet_diagnostic.CS8765.severity = error

12
ICSharpCode.Decompiler/CSharp/CallBuilder.cs

@ -777,7 +777,7 @@ namespace ICSharpCode.Decompiler.CSharp
ArgumentWithAlignmentAndFormat, ArgumentWithAlignmentAndFormat,
} }
private IEnumerable<(TokenKind, string)> TokenizeFormatString(string value) private IEnumerable<(TokenKind, string?)> TokenizeFormatString(string value)
{ {
int pos = -1; int pos = -1;
@ -1395,7 +1395,7 @@ namespace ICSharpCode.Decompiler.CSharp
} }
OverloadResolutionErrors IsUnambiguousCall(ExpectedTargetDetails expectedTargetDetails, IMethod method, OverloadResolutionErrors IsUnambiguousCall(ExpectedTargetDetails expectedTargetDetails, IMethod method,
ResolveResult target, IType[] typeArguments, ResolveResult[] arguments, ResolveResult? target, IType[] typeArguments, ResolveResult[] arguments,
string[]? argumentNames, int firstOptionalArgumentIndex, string[]? argumentNames, int firstOptionalArgumentIndex,
out IParameterizedMember? foundMember, out bool bestCandidateIsExpandedForm) out IParameterizedMember? foundMember, out bool bestCandidateIsExpandedForm)
{ {
@ -1676,7 +1676,7 @@ namespace ICSharpCode.Decompiler.CSharp
return false; return false;
} }
ExpressionWithResolveResult HandleConstructorCall(ExpectedTargetDetails expectedTargetDetails, ResolveResult target, IMethod method, ArgumentList argumentList) ExpressionWithResolveResult HandleConstructorCall(ExpectedTargetDetails expectedTargetDetails, ResolveResult? target, IMethod method, ArgumentList argumentList)
{ {
if (settings.AnonymousTypes && method.DeclaringType.IsAnonymousType()) if (settings.AnonymousTypes && method.DeclaringType.IsAnonymousType())
{ {
@ -1823,7 +1823,7 @@ namespace ICSharpCode.Decompiler.CSharp
return expr.Expression.WithRR(new MemberResolveResult(null, method)); return expr.Expression.WithRR(new MemberResolveResult(null, method));
} }
ExpressionWithResolveResult BuildDelegateReference(IMethod method, IMethod? invokeMethod, ExpectedTargetDetails expectedTargetDetails, ILInstruction thisArg) ExpressionWithResolveResult BuildDelegateReference(IMethod method, IMethod? invokeMethod, ExpectedTargetDetails expectedTargetDetails, ILInstruction? thisArg)
{ {
ExpressionBuilder expressionBuilder = this.expressionBuilder; ExpressionBuilder expressionBuilder = this.expressionBuilder;
ExpressionWithResolveResult targetExpression; ExpressionWithResolveResult targetExpression;
@ -1850,11 +1850,11 @@ namespace ICSharpCode.Decompiler.CSharp
} }
(TranslatedExpression target, bool addTypeArguments, string methodName, ResolveResult result) DisambiguateDelegateReference(IMethod method, IMethod invokeMethod, ExpectedTargetDetails expectedTargetDetails, ILInstruction thisArg) (TranslatedExpression target, bool addTypeArguments, string? methodName, ResolveResult result) DisambiguateDelegateReference(IMethod method, IMethod invokeMethod, ExpectedTargetDetails expectedTargetDetails, ILInstruction? thisArg)
{ {
if (method.IsLocalFunction) if (method.IsLocalFunction)
{ {
ILFunction localFunction = expressionBuilder.ResolveLocalFunction(method); ILFunction? localFunction = expressionBuilder.ResolveLocalFunction(method);
Debug.Assert(localFunction != null); Debug.Assert(localFunction != null);
return (default, addTypeArguments: true, localFunction.Name, ToMethodGroup(method, localFunction)); return (default, addTypeArguments: true, localFunction.Name, ToMethodGroup(method, localFunction));
} }

2
ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs

@ -267,7 +267,7 @@ namespace ICSharpCode.Decompiler.CSharp
/// <summary> /// <summary>
/// Gets the detected primary constructor. Returns null, if there was no primary constructor detected. /// Gets the detected primary constructor. Returns null, if there was no primary constructor detected.
/// </summary> /// </summary>
public IMethod PrimaryConstructor => primaryCtor; public IMethod? PrimaryConstructor => primaryCtor;
public bool IsInheritedRecord => isInheritedRecord; public bool IsInheritedRecord => isInheritedRecord;

4
ICSharpCode.Decompiler/CSharp/Resolver/MethodGroupResolveResult.cs

@ -79,10 +79,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
{ {
readonly IReadOnlyList<MethodListWithDeclaringType> methodLists; readonly IReadOnlyList<MethodListWithDeclaringType> methodLists;
readonly IReadOnlyList<IType> typeArguments; readonly IReadOnlyList<IType> typeArguments;
readonly ResolveResult targetResult; readonly ResolveResult? targetResult;
readonly string methodName; readonly string methodName;
public MethodGroupResolveResult(ResolveResult targetResult, string methodName, public MethodGroupResolveResult(ResolveResult? targetResult, string methodName,
IReadOnlyList<MethodListWithDeclaringType> methods, IReadOnlyList<IType> typeArguments) IReadOnlyList<MethodListWithDeclaringType> methods, IReadOnlyList<IType> typeArguments)
: base(SpecialType.NoType) : base(SpecialType.NoType)
{ {

2
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/InterpolatedStringExpression.cs

@ -106,7 +106,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
public int Alignment { get; } public int Alignment { get; }
public string Suffix { get; } public string? Suffix { get; }
public CSharpTokenNode RBraceToken { public CSharpTokenNode RBraceToken {
get { return GetChildByRole(RBrace); } get { return GetChildByRole(RBrace); }

4
ICSharpCode.Decompiler/CSharp/Syntax/Statements/Statement.cs

@ -86,12 +86,12 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
visitor.VisitPatternPlaceholder(this, child); visitor.VisitPatternPlaceholder(this, child);
} }
public override T? AcceptVisitor<T>(IAstVisitor<T> visitor) public override T AcceptVisitor<T>(IAstVisitor<T> visitor)
{ {
return visitor.VisitPatternPlaceholder(this, child); return visitor.VisitPatternPlaceholder(this, child);
} }
public override S? AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data)
{ {
return visitor.VisitPatternPlaceholder(this, child, data); return visitor.VisitPatternPlaceholder(this, child, data);
} }

2
ICSharpCode.Decompiler/CSharp/Syntax/TypeMembers/Accessor.cs

@ -89,7 +89,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
} }
} }
public BlockStatement Body { public BlockStatement? Body {
get { return GetChildByRole(Roles.Body); } get { return GetChildByRole(Roles.Body); }
set { SetChildByRole(Roles.Body, value); } set { SetChildByRole(Roles.Body, value); }
} }

2
ICSharpCode.Decompiler/CSharp/Syntax/TypeMembers/EnumMemberDeclaration.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
get { return GetChildByRole(Roles.Assign); } get { return GetChildByRole(Roles.Assign); }
} }
public Expression Initializer { public Expression? Initializer {
get { return GetChildByRole(InitializerRole); } get { return GetChildByRole(InitializerRole); }
set { SetChildByRole(InitializerRole, value); } set { SetChildByRole(InitializerRole, value); }
} }

2
ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs

@ -766,7 +766,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
{ {
foreach (var node in rootNode.Descendants) foreach (var node in rootNode.Descendants)
{ {
ILVariable ilVar; ILVariable? ilVar;
switch (node) switch (node)
{ {
case IdentifierExpression id: case IdentifierExpression id:

2
ICSharpCode.Decompiler/CSharp/Transforms/FixNameCollisions.cs

@ -50,7 +50,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
if (fieldDecl.Variables.Count != 1) if (fieldDecl.Variables.Count != 1)
continue; continue;
string oldName = fieldDecl.Variables.Single().Name; string oldName = fieldDecl.Variables.Single().Name;
ISymbol symbol = fieldDecl.GetSymbol(); ISymbol? symbol = fieldDecl.GetSymbol();
if (memberNames.Contains(oldName) && ((IField)symbol).Accessibility == Accessibility.Private) if (memberNames.Contains(oldName) && ((IField)symbol).Accessibility == Accessibility.Private)
{ {
string newName = PickNewName(memberNames, oldName); string newName = PickNewName(memberNames, oldName);

6
ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs

@ -80,7 +80,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
void DecompileQueries(AstNode node) void DecompileQueries(AstNode node)
{ {
Expression query = DecompileQuery(node as InvocationExpression); Expression? query = DecompileQuery(node as InvocationExpression);
if (query != null) if (query != null)
{ {
if (node.Parent is ExpressionStatement && CanUseDiscardAssignment()) if (node.Parent is ExpressionStatement && CanUseDiscardAssignment())
@ -351,13 +351,13 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
/// <summary> /// <summary>
/// Ensure that all ThenBy's are correct, and that the list of ThenBy's is terminated by an 'OrderBy' invocation. /// Ensure that all ThenBy's are correct, and that the list of ThenBy's is terminated by an 'OrderBy' invocation.
/// </summary> /// </summary>
bool ValidateThenByChain(InvocationExpression invocation, string expectedParameterName) bool ValidateThenByChain(InvocationExpression? invocation, string expectedParameterName)
{ {
if (invocation == null || invocation.Arguments.Count != 1) if (invocation == null || invocation.Arguments.Count != 1)
return false; return false;
if (!(invocation.Target is MemberReferenceExpression mre)) if (!(invocation.Target is MemberReferenceExpression mre))
return false; return false;
if (!MatchSimpleLambda(invocation.Arguments.Single(), out ParameterDeclaration parameter, out _)) if (!MatchSimpleLambda(invocation.Arguments.Single(), out ParameterDeclaration? parameter, out _))
return false; return false;
if (parameter.Name != expectedParameterName) if (parameter.Name != expectedParameterName)
return false; return false;

2
ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

@ -184,7 +184,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
if (instanceCtorsNotChainingWithThis.Length > 0) if (instanceCtorsNotChainingWithThis.Length > 0)
{ {
var ctorMethodDef = instanceCtorsNotChainingWithThis[0].GetSymbol() as IMethod; var ctorMethodDef = instanceCtorsNotChainingWithThis[0].GetSymbol() as IMethod;
ITypeDefinition declaringTypeDefinition = ctorMethodDef?.DeclaringTypeDefinition; ITypeDefinition? declaringTypeDefinition = ctorMethodDef?.DeclaringTypeDefinition;
if (ctorMethodDef != null && declaringTypeDefinition?.IsReferenceType == false && !declaringTypeDefinition.IsRecord) if (ctorMethodDef != null && declaringTypeDefinition?.IsReferenceType == false && !declaringTypeDefinition.IsRecord)
return; return;

18
ICSharpCode.Decompiler/DecompilerException.cs

@ -36,15 +36,15 @@ namespace ICSharpCode.Decompiler
/// </summary> /// </summary>
public class DecompilerException : Exception, ISerializable public class DecompilerException : Exception, ISerializable
{ {
public string AssemblyName => File.Name; public string? AssemblyName => File?.Name;
public string FileName => File.FileName; public string? FileName => File?.FileName;
public IEntity DecompiledEntity { get; } public IEntity? DecompiledEntity { get; }
public IModule Module { get; } public IModule? Module { get; }
public MetadataFile File { get; } public MetadataFile? File { get; }
public DecompilerException(MetadataModule module, IEntity decompiledEntity, public DecompilerException(MetadataModule module, IEntity? decompiledEntity,
Exception innerException, string? message = null) Exception innerException, string? message = null)
: base(message ?? GetDefaultMessage(decompiledEntity), innerException) : base(message ?? GetDefaultMessage(decompiledEntity), innerException)
{ {
@ -115,7 +115,7 @@ namespace ICSharpCode.Decompiler
for (int i = 0; i < stackTrace.FrameCount; i++) for (int i = 0; i < stackTrace.FrameCount; i++)
{ {
StackFrame? frame = stackTrace.GetFrame(i); StackFrame? frame = stackTrace.GetFrame(i);
MethodBase? method = frame.GetMethod(); MethodBase? method = frame?.GetMethod();
if (method == null) if (method == null)
continue; continue;
@ -126,7 +126,7 @@ namespace ICSharpCode.Decompiler
Type? declaringType = method.DeclaringType; Type? declaringType = method.DeclaringType;
if (declaringType != null) if (declaringType != null)
{ {
b.Append(declaringType.FullName.Replace('+', '.')); b.Append(declaringType.FullName?.Replace('+', '.'));
b.Append('.'); b.Append('.');
} }
b.Append(method.Name); b.Append(method.Name);
@ -168,7 +168,7 @@ namespace ICSharpCode.Decompiler
b.Append(')'); b.Append(')');
// source location // source location
if (frame.GetILOffset() >= 0) if (frame?.GetILOffset() >= 0)
{ {
string? filename = null; string? filename = null;
try try

2
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1188,7 +1188,7 @@ namespace ICSharpCode.Decompiler.Disassembler
break; break;
default: default:
var blob = metadata.GetBlobReader(constant.Value); var blob = metadata.GetBlobReader(constant.Value);
object value; object? value;
try try
{ {
value = blob.ReadConstant(constant.TypeCode); value = blob.ReadConstant(constant.TypeCode);

44
ICSharpCode.Decompiler/IL/ControlFlow/AsyncAwaitDecompiler.cs

@ -74,29 +74,29 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
ILTransformContext context; ILTransformContext context;
// These fields are set by MatchTaskCreationPattern() or MatchEnumeratorCreationNewObj() // These fields are set by MatchTaskCreationPattern() or MatchEnumeratorCreationNewObj()
IType taskType; // return type of the async method; or IAsyncEnumerable{T}/IAsyncEnumerator{T} IType? taskType; // return type of the async method; or IAsyncEnumerable{T}/IAsyncEnumerator{T}
IType underlyingReturnType; // return type of the method (only the "T" for Task{T}), for async enumerators this is the type being yielded IType? underlyingReturnType; // return type of the method (only the "T" for Task{T}), for async enumerators this is the type being yielded
AsyncMethodType methodType; AsyncMethodType methodType;
ITypeDefinition stateMachineType; ITypeDefinition? stateMachineType;
IType builderType; IType? builderType;
IField builderField; IField? builderField;
IField stateField; IField? stateField;
int initialState; int initialState;
Dictionary<IField, ILVariable> fieldToParameterMap = new Dictionary<IField, ILVariable>(); Dictionary<IField, ILVariable> fieldToParameterMap = new Dictionary<IField, ILVariable>();
Dictionary<ILVariable, ILVariable> cachedFieldToParameterMap = new Dictionary<ILVariable, ILVariable>(); Dictionary<ILVariable, ILVariable> cachedFieldToParameterMap = new Dictionary<ILVariable, ILVariable>();
IField disposeModeField; // 'disposeMode' field (IAsyncEnumerable/IAsyncEnumerator only) IField? disposeModeField; // 'disposeMode' field (IAsyncEnumerable/IAsyncEnumerator only)
// These fields are set by AnalyzeMoveNext(): // These fields are set by AnalyzeMoveNext():
ILFunction moveNextFunction; ILFunction? moveNextFunction;
ILVariable cachedStateVar; // variable in MoveNext that caches the stateField. ILVariable? cachedStateVar; // variable in MoveNext that caches the stateField.
TryCatch mainTryCatch; TryCatch? mainTryCatch;
Block setResultReturnBlock; // block that is jumped to for return statements Block? setResultReturnBlock; // block that is jumped to for return statements
// Note: for async enumerators, a jump to setResultReturnBlock is a 'yield break;' // Note: for async enumerators, a jump to setResultReturnBlock is a 'yield break;'
int finalState; // final state after the setResultAndExitBlock int finalState; // final state after the setResultAndExitBlock
bool finalStateKnown; bool finalStateKnown;
ILVariable resultVar; // the variable that gets returned by the setResultAndExitBlock ILVariable? resultVar; // the variable that gets returned by the setResultAndExitBlock
Block setResultYieldBlock; // block that is jumped to for 'yield return' statements Block? setResultYieldBlock; // block that is jumped to for 'yield return' statements
ILVariable doFinallyBodies; ILVariable? doFinallyBodies;
// These fields are set by AnalyzeStateMachine(): // These fields are set by AnalyzeStateMachine():
int smallestAwaiterVarIndex; int smallestAwaiterVarIndex;
@ -295,15 +295,15 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
} }
if (startCall.Arguments.Count != 2) if (startCall.Arguments.Count != 2)
return false; return false;
ILInstruction loadBuilderExpr = startCall.Arguments[0]; ILInstruction? loadBuilderExpr = startCall.Arguments[0];
if (!startCall.Arguments[1].MatchLdLoca(out ILVariable stateMachineVar)) if (!startCall.Arguments[1].MatchLdLoca(out ILVariable? stateMachineVar))
return false; return false;
stateMachineType = stateMachineVar.Type.GetDefinition(); stateMachineType = stateMachineVar.Type.GetDefinition();
if (stateMachineType == null) if (stateMachineType == null)
return false; return false;
pos--; pos--;
if (loadBuilderExpr.MatchLdLocRef(out ILVariable builderVar)) if (loadBuilderExpr.MatchLdLocRef(out ILVariable? builderVar))
{ {
// Check third-to-last instruction (copy of builder) // Check third-to-last instruction (copy of builder)
// stloc builder(ldfld StateMachine::<>t__builder(ldloc stateMachine)) // stloc builder(ldfld StateMachine::<>t__builder(ldloc stateMachine))
@ -340,8 +340,8 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
return false; return false;
if (!MatchCall(returnValue, "get_Task", out var getTaskArgs) || getTaskArgs.Count != 1) if (!MatchCall(returnValue, "get_Task", out var getTaskArgs) || getTaskArgs.Count != 1)
return false; return false;
ILInstruction target; ILInstruction? target;
IField builderField2; IField? builderField2;
if (builderType.IsReferenceType == true) if (builderType.IsReferenceType == true)
{ {
if (!getTaskArgs[0].MatchLdFld(out target, out builderField2)) if (!getTaskArgs[0].MatchLdFld(out target, out builderField2))
@ -804,7 +804,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
return block.Instructions[1].MatchLeave(blockContainer); return block.Instructions[1].MatchLeave(blockContainer);
} }
private Block CheckSetResultReturnBlock(BlockContainer blockContainer, int setResultReturnBlockIndex, bool[] blocksAnalyzed) private Block? CheckSetResultReturnBlock(BlockContainer blockContainer, int setResultReturnBlockIndex, bool[] blocksAnalyzed)
{ {
if (setResultReturnBlockIndex >= blockContainer.Blocks.Count) if (setResultReturnBlockIndex >= blockContainer.Blocks.Count)
{ {
@ -1931,7 +1931,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
context.StepEndGroup(keepIfEmpty: true); context.StepEndGroup(keepIfEmpty: true);
} }
internal static Block GetBodyEntryPoint(BlockContainer body) internal static Block? GetBodyEntryPoint(BlockContainer? body)
{ {
if (body == null) if (body == null)
return null; return null;

14
ICSharpCode.Decompiler/IL/ControlFlow/DetectPinnedRegions.cs

@ -163,7 +163,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
for (int i = 0; i < container.Blocks.Count; i++) for (int i = 0; i < container.Blocks.Count; i++)
{ {
var block = container.Blocks[i]; var block = container.Blocks[i];
if (IsNullSafeArrayToPointerPattern(block, out ILVariable v, out ILVariable p, out Block targetBlock)) if (IsNullSafeArrayToPointerPattern(block, out ILVariable? v, out ILVariable? p, out Block? targetBlock))
{ {
context.Step("NullSafeArrayToPointerPattern", block); context.Step("NullSafeArrayToPointerPattern", block);
ILInstruction arrayToPointer = new GetPinnableReference(new LdLoc(v), null); ILInstruction arrayToPointer = new GetPinnableReference(new LdLoc(v), null);
@ -176,7 +176,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
((Branch)block.Instructions.Last()).TargetBlock = targetBlock; ((Branch)block.Instructions.Last()).TargetBlock = targetBlock;
modified = true; modified = true;
} }
else if (IsCustomRefPinPattern(block, out ILInstruction ldlocMem, out var callGPR, out v, out var stlocPtr, else if (IsCustomRefPinPattern(block, out ILInstruction? ldlocMem, out var callGPR, out v, out var stlocPtr,
out targetBlock, out var nullBlock, out var notNullBlock)) out targetBlock, out var nullBlock, out var notNullBlock))
{ {
context.Step("CustomRefPinPattern", block); context.Step("CustomRefPinPattern", block);
@ -432,7 +432,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
} }
} }
condition = condition.UnwrapConv(ConversionKind.Truncate); condition = condition.UnwrapConv(ConversionKind.Truncate);
if (condition.MatchLdLen(StackType.I, out ILInstruction array)) if (condition.MatchLdLen(StackType.I, out ILInstruction? array))
{ {
// OK // OK
} }
@ -451,7 +451,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
} }
if (!array.MatchLdLoc(v)) if (!array.MatchLdLoc(v))
return false; return false;
if (!trueInst.MatchBranch(out Block notNullAndNotEmptyBlock)) if (!trueInst.MatchBranch(out Block? notNullAndNotEmptyBlock))
return false; return false;
if (notNullAndNotEmptyBlock.Parent != block.Parent) if (notNullAndNotEmptyBlock.Parent != block.Parent)
return false; return false;
@ -468,7 +468,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
// } // }
if (block.Instructions.Count != 2) if (block.Instructions.Count != 2)
return false; return false;
if (!block.Instructions[0].MatchStLoc(out var p2, out ILInstruction value)) if (!block.Instructions[0].MatchStLoc(out var p2, out ILInstruction? value))
return false; return false;
if (p != p2) if (p != p2)
{ {
@ -950,8 +950,8 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
} }
pinnedRegion.Init = new GetPinnableReference(pinnedRegion.Init, null); pinnedRegion.Init = new GetPinnableReference(pinnedRegion.Init, null);
ILVariable otherVar; ILVariable? otherVar;
ILInstruction otherVarInit; ILInstruction? otherVarInit;
// In optimized builds, the 'nativeVar' may end up being a stack slot, // In optimized builds, the 'nativeVar' may end up being a stack slot,
// and only gets assigned to a real variable after the offset adjustment. // and only gets assigned to a real variable after the offset adjustment.
if (nativeVar.Kind == VariableKind.StackSlot && nativeVar.LoadCount == 1 if (nativeVar.Kind == VariableKind.StackSlot && nativeVar.LoadCount == 1

2
ICSharpCode.Decompiler/IL/Transforms/EarlyExpressionTransforms.cs

@ -132,7 +132,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
internal static bool LdObjToLdLoc(LdObj inst, ILTransformContext context) internal static bool LdObjToLdLoc(LdObj inst, ILTransformContext context)
{ {
if (inst.Target.MatchLdLoca(out ILVariable v) if (inst.Target.MatchLdLoca(out ILVariable? v)
&& TypeUtils.IsCompatibleTypeForMemoryAccess(v.Type, inst.Type) && TypeUtils.IsCompatibleTypeForMemoryAccess(v.Type, inst.Type)
&& inst.UnalignedPrefix == 0 && inst.UnalignedPrefix == 0
&& !inst.IsVolatile) && !inst.IsVolatile)

6
ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs

@ -275,8 +275,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms
void TransformSlicing(bool sliceLengthWasMisdetectedAsStartOffset = false) void TransformSlicing(bool sliceLengthWasMisdetectedAsStartOffset = false)
{ {
ILVariable sliceLengthVar; ILVariable? sliceLengthVar;
ILInstruction sliceLengthVarInit; ILInstruction? sliceLengthVarInit;
if (sliceLengthWasMisdetectedAsStartOffset) if (sliceLengthWasMisdetectedAsStartOffset)
{ {
// Special case: when slicing without a start point, the slice length calculation is mis-detected as the start offset, // Special case: when slicing without a start point, the slice length calculation is mis-detected as the start offset,
@ -303,7 +303,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
if (!(sliceLengthVar.IsSingleDefinition && sliceLengthVar.LoadCount == 1)) if (!(sliceLengthVar.IsSingleDefinition && sliceLengthVar.LoadCount == 1))
return; return;
if (!MatchSliceLength(sliceLengthVarInit, out IndexKind endIndexKind, out ILInstruction endIndexLoad, containerLengthVar, ref containerVar, startOffsetVar)) if (!MatchSliceLength(sliceLengthVarInit, out IndexKind endIndexKind, out ILInstruction? endIndexLoad, containerLengthVar, ref containerVar, startOffsetVar))
return; return;
if (!CheckContainerLengthVariableUseCount(containerLengthVar, startIndexKind, endIndexKind)) if (!CheckContainerLengthVariableUseCount(containerLengthVar, startIndexKind, endIndexKind))
{ {

4
ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs

@ -262,7 +262,7 @@ namespace ICSharpCode.Decompiler.Metadata
return version.ToString(); return version.ToString();
} }
internal static (Version version, DirectoryInfo directory) ConvertToVersion(DirectoryInfo directory) internal static (Version? version, DirectoryInfo? directory) ConvertToVersion(DirectoryInfo directory)
{ {
string RemoveTrailingVersionInfo() string RemoveTrailingVersionInfo()
{ {
@ -289,7 +289,7 @@ namespace ICSharpCode.Decompiler.Metadata
public static string? FindDotNetExeDirectory() public static string? FindDotNetExeDirectory()
{ {
string dotnetExeName = (Environment.OSVersion.Platform == PlatformID.Unix) ? "dotnet" : "dotnet.exe"; string dotnetExeName = (Environment.OSVersion.Platform == PlatformID.Unix) ? "dotnet" : "dotnet.exe";
foreach (var item in Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator)) foreach (var item in Environment.GetEnvironmentVariable("PATH")!.Split(Path.PathSeparator))
{ {
try try
{ {

2
ICSharpCode.Decompiler/TypeSystem/ApplyAttributeTypeVisitor.cs

@ -48,7 +48,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
bool[]? dynamicAttributeData = null; bool[]? dynamicAttributeData = null;
bool hasNativeIntegersAttribute = (options & TypeSystemOptions.NativeIntegersWithoutAttribute) != 0; bool hasNativeIntegersAttribute = (options & TypeSystemOptions.NativeIntegersWithoutAttribute) != 0;
bool[]? nativeIntegersAttributeData = null; bool[]? nativeIntegersAttributeData = null;
string[]? tupleElementNames = null; string?[]? tupleElementNames = null;
Nullability nullability; Nullability nullability;
Nullability[]? nullableAttributeData = null; Nullability[]? nullableAttributeData = null;
if ((options & TypeSystemOptions.NullabilityAnnotations) != 0) if ((options & TypeSystemOptions.NullabilityAnnotations) != 0)

4
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

@ -245,7 +245,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
// Load referenced assemblies and type-forwarder references. // Load referenced assemblies and type-forwarder references.
// This is necessary to make .NET Core/PCL binaries work better. // This is necessary to make .NET Core/PCL binaries work better.
var referencedAssemblies = new List<MetadataFile>(); var referencedAssemblies = new List<MetadataFile>();
var assemblyReferenceQueue = new Queue<(bool IsAssembly, MetadataFile MainModule, object Reference, Task<MetadataFile> ResolveTask)>(); var assemblyReferenceQueue = new Queue<(bool IsAssembly, MetadataFile MainModule, object Reference, Task<MetadataFile?> ResolveTask)>();
var comparer = KeyComparer.Create(((bool IsAssembly, MetadataFile MainModule, object Reference) reference) => var comparer = KeyComparer.Create(((bool IsAssembly, MetadataFile MainModule, object Reference) reference) =>
reference.IsAssembly ? "A:" + ((IAssemblyReference)reference.Reference).FullName : reference.IsAssembly ? "A:" + ((IAssemblyReference)reference.Reference).FullName :
"M:" + reference.Reference); "M:" + reference.Reference);
@ -348,7 +348,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{ {
// Immediately start loading the referenced module as we add the entry to the queue. // Immediately start loading the referenced module as we add the entry to the queue.
// This allows loading multiple modules in parallel. // This allows loading multiple modules in parallel.
Task<MetadataFile> asm; Task<MetadataFile?> asm;
if (isAssembly) if (isAssembly)
{ {
asm = assemblyResolver.ResolveAsync((IAssemblyReference)reference); asm = assemblyResolver.ResolveAsync((IAssemblyReference)reference);

2
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataEvent.cs

@ -99,7 +99,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
{ {
if (method == null) if (method == null)
return EmptyList<IMember>.Instance; return EmptyList<IMember>.Instance;
return method.ExplicitlyImplementedInterfaceMembers.Select(m => ((IMethod)m).AccessorOwner).Where(m => m != null); return method.ExplicitlyImplementedInterfaceMembers.Select(m => ((IMethod)m).AccessorOwner).OfType<IMember>();
} }
public ITypeDefinition DeclaringTypeDefinition => AnyAccessor?.DeclaringTypeDefinition; public ITypeDefinition DeclaringTypeDefinition => AnyAccessor?.DeclaringTypeDefinition;

2
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataProperty.cs

@ -188,7 +188,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
{ {
if (method == null) if (method == null)
return EmptyList<IMember>.Instance; return EmptyList<IMember>.Instance;
return method.ExplicitlyImplementedInterfaceMembers.Select(m => ((IMethod)m).AccessorOwner).Where(m => m != null); return method.ExplicitlyImplementedInterfaceMembers.Select(m => ((IMethod)m).AccessorOwner).OfType<IMember>();
} }
public ITypeDefinition DeclaringTypeDefinition => AnyAccessor?.DeclaringTypeDefinition; public ITypeDefinition DeclaringTypeDefinition => AnyAccessor?.DeclaringTypeDefinition;

2
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

@ -160,7 +160,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
return type ?? new UnknownType(fullTypeName, IsReferenceType(reader, handle, rawTypeKind)); return type ?? new UnknownType(fullTypeName, IsReferenceType(reader, handle, rawTypeKind));
} }
public IType? GetTypeFromSerializedName(string name) public IType GetTypeFromSerializedName(string name)
{ {
if (name == null) if (name == null)
{ {

2
ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

@ -83,7 +83,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
if (type == null) if (type == null)
throw new ArgumentNullException(nameof(type)); throw new ArgumentNullException(nameof(type));
return type.GetAllBaseTypes().Select(t => t.GetDefinition()).Where(d => d != null).Distinct(); return type.GetAllBaseTypes().Select(t => t.GetDefinition()).OfType<ITypeDefinition>().Distinct();
} }
/// <summary> /// <summary>

2
ICSharpCode.ILSpyX/Abstractions/ILanguage.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.ILSpyX.Abstractions
{ {
bool ShowMember(IEntity member); bool ShowMember(IEntity member);
CodeMappingInfo GetCodeMappingInfo(MetadataFile module, EntityHandle member); CodeMappingInfo GetCodeMappingInfo(MetadataFile module, EntityHandle member);
string GetEntityName(MetadataFile module, System.Reflection.Metadata.EntityHandle handle, bool fullName, bool omitGenerics); string? GetEntityName(MetadataFile module, System.Reflection.Metadata.EntityHandle handle, bool fullName, bool omitGenerics);
string GetTooltip(IEntity entity); string GetTooltip(IEntity entity);
string TypeToString(IType type, bool includeNamespace); string TypeToString(IType type, bool includeNamespace);

2
ILSpy.ReadyToRun/ReadyToRunLanguage.cs

@ -216,7 +216,7 @@ namespace ICSharpCode.ILSpy.ReadyToRun
} }
} }
public override RichText GetRichTextTooltip(IEntity entity) public override RichText? GetRichTextTooltip(IEntity entity)
{ {
return Languages.ILLanguage.GetRichTextTooltip(entity); return Languages.ILLanguage.GetRichTextTooltip(entity);
} }

4
ILSpy/Analyzers/AnalyzerEntityTreeNode.cs

@ -22,8 +22,8 @@ using System.Windows;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TreeNodes; using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
namespace ICSharpCode.ILSpy.Analyzers namespace ICSharpCode.ILSpy.Analyzers
{ {
@ -32,7 +32,7 @@ namespace ICSharpCode.ILSpy.Analyzers
/// </summary> /// </summary>
public abstract class AnalyzerEntityTreeNode : AnalyzerTreeNode, IMemberTreeNode public abstract class AnalyzerEntityTreeNode : AnalyzerTreeNode, IMemberTreeNode
{ {
public abstract IEntity Member { get; } public abstract IEntity? Member { get; }
public override void ActivateItem(IPlatformRoutedEventArgs e) public override void ActivateItem(IPlatformRoutedEventArgs e)
{ {

2
ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
this.LazyLoading = true; this.LazyLoading = true;
} }
public override IEntity Member => analyzedEvent; public override IEntity? Member => analyzedEvent;
public override object Icon => EventTreeNode.GetIcon(analyzedEvent); public override object Icon => EventTreeNode.GetIcon(analyzedEvent);

2
ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs

@ -52,6 +52,6 @@ namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
} }
} }
public override IEntity Member => analyzedField; public override IEntity? Member => analyzedField;
} }
} }

2
ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs

@ -54,6 +54,6 @@ namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
} }
} }
public override IEntity Member => analyzedMethod; public override IEntity? Member => analyzedMethod;
} }
} }

2
ILSpy/Analyzers/TreeNodes/AnalyzedPropertyTreeNode.cs

@ -62,6 +62,6 @@ namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
} }
} }
public override IEntity Member => analyzedProperty; public override IEntity? Member => analyzedProperty;
} }
} }

2
ILSpy/Analyzers/TreeNodes/AnalyzedTypeTreeNode.cs

@ -52,6 +52,6 @@ namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
} }
} }
public override IEntity Member => analyzedType; public override IEntity? Member => analyzedType;
} }
} }

11
ILSpy/App.xaml.cs

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -34,17 +35,15 @@ using ICSharpCode.ILSpy.AppEnv;
using ICSharpCode.ILSpy.Options; using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpyX.Analyzers; using ICSharpCode.ILSpyX.Analyzers;
using ICSharpCode.ILSpyX.Settings; using ICSharpCode.ILSpyX.Settings;
using ICSharpCode.ILSpyX.TreeView;
using Medo.Application; using Medo.Application;
using Microsoft.VisualStudio.Composition; using Microsoft.VisualStudio.Composition;
using TomsToolbox.Wpf.Styles;
using ICSharpCode.ILSpyX.TreeView;
using TomsToolbox.Composition; using TomsToolbox.Composition;
using TomsToolbox.Wpf.Composition; using TomsToolbox.Wpf.Composition;
using System.ComponentModel.Composition.Hosting; using TomsToolbox.Wpf.Styles;
namespace ICSharpCode.ILSpy namespace ICSharpCode.ILSpy
{ {
@ -115,7 +114,7 @@ namespace ICSharpCode.ILSpy
} }
} }
private static void SingleInstance_NewInstanceDetected(object sender, NewInstanceEventArgs e) private static void SingleInstance_NewInstanceDetected(object? sender, NewInstanceEventArgs e)
{ {
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed #pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
ICSharpCode.ILSpy.MainWindow.Instance.HandleSingleInstanceCommandLineArguments(e.Args); ICSharpCode.ILSpy.MainWindow.Instance.HandleSingleInstanceCommandLineArguments(e.Args);
@ -210,7 +209,7 @@ namespace ICSharpCode.ILSpy
base.OnStartup(e); base.OnStartup(e);
} }
void DotNet40_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) void DotNet40_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
{ {
// On .NET 4.0, an unobserved exception in a task terminates the process unless we mark it as observed // On .NET 4.0, an unobserved exception in a task terminates the process unless we mark it as observed
e.SetObserved(); e.SetObserved();

4
ILSpy/AvalonEdit/TextMarkerService.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit
/// </summary> /// </summary>
sealed class TextMarkerService : DocumentColorizingTransformer, IBackgroundRenderer, ITextMarkerService sealed class TextMarkerService : DocumentColorizingTransformer, IBackgroundRenderer, ITextMarkerService
{ {
TextSegmentCollection<TextMarker> markers; TextSegmentCollection<TextMarker>? markers;
TextView textView; TextView textView;
public TextMarkerService(TextView textView) public TextMarkerService(TextView textView)
@ -46,7 +46,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit
OnDocumentChanged(null, null); OnDocumentChanged(null, null);
} }
void OnDocumentChanged(object sender, EventArgs e) void OnDocumentChanged(object? sender, EventArgs? e)
{ {
if (textView.Document != null) if (textView.Document != null)
markers = new TextSegmentCollection<TextMarker>(textView.Document); markers = new TextSegmentCollection<TextMarker>(textView.Document);

2
ILSpy/Commands/CommandWrapper.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.ILSpy
return command; return command;
} }
public event EventHandler CanExecuteChanged { public event EventHandler? CanExecuteChanged {
add { wrappedCommand.CanExecuteChanged += value; } add { wrappedCommand.CanExecuteChanged += value; }
remove { wrappedCommand.CanExecuteChanged -= value; } remove { wrappedCommand.CanExecuteChanged -= value; }
} }

4
ILSpy/Commands/DelegateCommand.cs

@ -12,7 +12,7 @@ namespace ICSharpCode.ILSpy.Commands
private readonly Action action; private readonly Action action;
private readonly Func<bool> canExecute; private readonly Func<bool> canExecute;
public event EventHandler CanExecuteChanged { public event EventHandler? CanExecuteChanged {
add { CommandManager.RequerySuggested += value; } add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; } remove { CommandManager.RequerySuggested -= value; }
} }
@ -44,7 +44,7 @@ namespace ICSharpCode.ILSpy.Commands
private readonly Action<T> action; private readonly Action<T> action;
private readonly Func<T, bool> canExecute; private readonly Func<T, bool> canExecute;
public event EventHandler CanExecuteChanged { public event EventHandler? CanExecuteChanged {
add { CommandManager.RequerySuggested += value; } add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; } remove { CommandManager.RequerySuggested -= value; }
} }

2
ILSpy/Commands/IProtocolHandler.cs

@ -25,6 +25,6 @@ namespace ICSharpCode.ILSpy
{ {
public interface IProtocolHandler public interface IProtocolHandler
{ {
ILSpyTreeNode Resolve(string protocol, MetadataFile module, Handle handle, out bool newTabPage); ILSpyTreeNode? Resolve(string protocol, MetadataFile module, Handle handle, out bool newTabPage);
} }
} }

6
ILSpy/Commands/SimpleCommand.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.ILSpy
{ {
public abstract class SimpleCommand : ICommand public abstract class SimpleCommand : ICommand
{ {
public event EventHandler CanExecuteChanged { public event EventHandler? CanExecuteChanged {
add { CommandManager.RequerySuggested += value; } add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; } remove { CommandManager.RequerySuggested -= value; }
} }
@ -41,12 +41,12 @@ namespace ICSharpCode.ILSpy
{ {
private bool isChecked; private bool isChecked;
public event EventHandler CanExecuteChanged { public event EventHandler? CanExecuteChanged {
add { CommandManager.RequerySuggested += value; } add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; } remove { CommandManager.RequerySuggested -= value; }
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
void ICommand.Execute(object? parameter) void ICommand.Execute(object? parameter)
{ {

2
ILSpy/Controls/SearchBox.cs

@ -110,7 +110,7 @@ namespace ICSharpCode.ILSpy.Controls
wl.Visibility = HasText ? Visibility.Hidden : Visibility.Visible; wl.Visibility = HasText ? Visibility.Hidden : Visibility.Visible;
} }
void timer_Tick(object sender, EventArgs e) void timer_Tick(object? sender, EventArgs e)
{ {
timer.Stop(); timer.Stop();
timer = null; timer = null;

2
ILSpy/Controls/TreeView/SharpTreeNodeView.cs

@ -103,7 +103,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
} }
void Node_PropertyChanged(object sender, PropertyChangedEventArgs e) void Node_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "IsEditing") if (e.PropertyName == "IsEditing")
{ {

2
ILSpy/Controls/TreeView/SharpTreeView.cs

@ -171,7 +171,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
} }
void flattener_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) void flattener_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{ {
// Deselect nodes that are being hidden, if any remain in the tree // Deselect nodes that are being hidden, if any remain in the tree
if (e.Action == NotifyCollectionChangedAction.Remove && Items.Count > 0) if (e.Action == NotifyCollectionChangedAction.Remove && Items.Count > 0)

14
ILSpy/Controls/TreeView/SharpTreeViewItemAutomationPeer.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
: base(owner) : base(owner)
{ {
SharpTreeViewItem.DataContextChanged += OnDataContextChanged; SharpTreeViewItem.DataContextChanged += OnDataContextChanged;
SharpTreeNode node = SharpTreeViewItem.DataContext as SharpTreeNode; SharpTreeNode? node = SharpTreeViewItem.DataContext as SharpTreeNode;
if (node == null) if (node == null)
return; return;
@ -61,18 +61,18 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
public ExpandCollapseState ExpandCollapseState { public ExpandCollapseState ExpandCollapseState {
get { get {
SharpTreeNode node = SharpTreeViewItem.DataContext as SharpTreeNode; SharpTreeNode? node = SharpTreeViewItem.DataContext as SharpTreeNode;
if (node == null || !node.ShowExpander) if (node == null || !node.ShowExpander)
return ExpandCollapseState.LeafNode; return ExpandCollapseState.LeafNode;
return node.IsExpanded ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed; return node.IsExpanded ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed;
} }
} }
private void OnPropertyChanged(object sender, PropertyChangedEventArgs e) private void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName != "IsExpanded") if (e.PropertyName != "IsExpanded")
return; return;
SharpTreeNode node = sender as SharpTreeNode; SharpTreeNode? node = sender as SharpTreeNode;
if (node == null || node.Children.Count == 0) if (node == null || node.Children.Count == 0)
return; return;
bool newValue = node.IsExpanded; bool newValue = node.IsExpanded;
@ -83,12 +83,12 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
newValue ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed); newValue ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed);
} }
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) private void OnDataContextChanged(object? sender, DependencyPropertyChangedEventArgs e)
{ {
SharpTreeNode oldNode = e.OldValue as SharpTreeNode; SharpTreeNode? oldNode = e.OldValue as SharpTreeNode;
if (oldNode != null) if (oldNode != null)
oldNode.PropertyChanged -= OnPropertyChanged; oldNode.PropertyChanged -= OnPropertyChanged;
SharpTreeNode newNode = e.NewValue as SharpTreeNode; SharpTreeNode? newNode = e.NewValue as SharpTreeNode;
if (newNode != null) if (newNode != null)
newNode.PropertyChanged += OnPropertyChanged; newNode.PropertyChanged += OnPropertyChanged;
} }

4
ILSpy/Docking/DockWorkspace.cs

@ -52,7 +52,7 @@ namespace ICSharpCode.ILSpy.Docking
MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => CurrentAssemblyList_Changed(sender, e); MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => CurrentAssemblyList_Changed(sender, e);
} }
private void CurrentAssemblyList_Changed(object sender, NotifyCollectionChangedEventArgs e) private void CurrentAssemblyList_Changed(object? sender, NotifyCollectionChangedEventArgs e)
{ {
if (e.OldItems == null) if (e.OldItems == null)
{ {
@ -163,7 +163,7 @@ namespace ICSharpCode.ILSpy.Docking
} }
} }
void LayoutSerializationCallback(object sender, LayoutSerializationCallbackEventArgs e) void LayoutSerializationCallback(object? sender, LayoutSerializationCallbackEventArgs e)
{ {
switch (e.Model) switch (e.Model)
{ {

2
ILSpy/Docking/PaneCollection.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.ILSpy.Docking
{ {
private ObservableCollection<T> observableCollection = new ObservableCollection<T>(); private ObservableCollection<T> observableCollection = new ObservableCollection<T>();
public event NotifyCollectionChangedEventHandler CollectionChanged; public event NotifyCollectionChangedEventHandler? CollectionChanged;
public PaneCollection() public PaneCollection()
{ {

4
ILSpy/LanguageSettings.cs

@ -173,9 +173,9 @@ namespace ICSharpCode.ILSpy
} }
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{ {
if (PropertyChanged != null) if (PropertyChanged != null)
{ {

2
ILSpy/Languages/Language.cs

@ -364,7 +364,7 @@ namespace ICSharpCode.ILSpy
/// Converts a member signature to a string. /// Converts a member signature to a string.
/// This is used for displaying the tooltip on a member reference. /// This is used for displaying the tooltip on a member reference.
/// </summary> /// </summary>
public virtual RichText GetRichTextTooltip(IEntity entity) public virtual RichText? GetRichTextTooltip(IEntity entity)
{ {
return GetTooltip(entity); return GetTooltip(entity);
} }

10
ILSpy/MainWindow.xaml.cs

@ -132,7 +132,7 @@ namespace ICSharpCode.ILSpy
this.Loaded += MainWindow_Loaded; this.Loaded += MainWindow_Loaded;
} }
private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e) private void DockWorkspace_ActiveTabPageChanged(object? sender, EventArgs e)
{ {
DockWorkspace dock = DockWorkspace.Instance; DockWorkspace dock = DockWorkspace.Instance;
@ -350,7 +350,7 @@ namespace ICSharpCode.ILSpy
ToolsChanged(dock.ToolPanes, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); ToolsChanged(dock.ToolPanes, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
TabsChanged(dock.TabPages, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); TabsChanged(dock.TabPages, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
void ToolsChanged(object sender, NotifyCollectionChangedEventArgs e) void ToolsChanged(object? sender, NotifyCollectionChangedEventArgs e)
{ {
int endIndex = windowMenuItem.Items.IndexOf(separatorBeforeDocuments); int endIndex = windowMenuItem.Items.IndexOf(separatorBeforeDocuments);
int startIndex = windowMenuItem.Items.IndexOf(separatorBeforeTools) + 1; int startIndex = windowMenuItem.Items.IndexOf(separatorBeforeTools) + 1;
@ -429,7 +429,7 @@ namespace ICSharpCode.ILSpy
} }
} }
void TabsChanged(object sender, NotifyCollectionChangedEventArgs e) void TabsChanged(object? sender, NotifyCollectionChangedEventArgs e)
{ {
int endIndex = windowMenuItem.Items.Count; int endIndex = windowMenuItem.Items.Count;
int startIndex = windowMenuItem.Items.IndexOf(separatorBeforeDocuments) + 1; int startIndex = windowMenuItem.Items.IndexOf(separatorBeforeDocuments) + 1;
@ -498,7 +498,7 @@ namespace ICSharpCode.ILSpy
} }
} }
static void TabPageChanged(object sender, PropertyChangedEventArgs e) static void TabPageChanged(object? sender, PropertyChangedEventArgs e)
{ {
var windowMenuItem = Instance.mainMenu.Items.OfType<MenuItem>().First(m => (string)m.Tag == nameof(Properties.Resources._Window)); var windowMenuItem = Instance.mainMenu.Items.OfType<MenuItem>().First(m => (string)m.Tag == nameof(Properties.Resources._Window));
foreach (MenuItem menuItem in windowMenuItem.Items.OfType<MenuItem>()) foreach (MenuItem menuItem in windowMenuItem.Items.OfType<MenuItem>())
@ -965,7 +965,7 @@ namespace ICSharpCode.ILSpy
#endif #endif
} }
void assemblyList_Assemblies_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) void assemblyList_Assemblies_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{ {
if (e.Action == NotifyCollectionChangedAction.Reset) if (e.Action == NotifyCollectionChangedAction.Reset)
{ {

4
ILSpy/Metadata/Helpers.cs

@ -89,13 +89,13 @@ namespace ICSharpCode.ILSpy.Metadata
return view; return view;
} }
internal static void View_AutoGeneratedColumns(object sender, EventArgs e) internal static void View_AutoGeneratedColumns(object? sender, EventArgs e)
{ {
((DataGrid)sender).AutoGeneratedColumns -= View_AutoGeneratedColumns; ((DataGrid)sender).AutoGeneratedColumns -= View_AutoGeneratedColumns;
((DataGrid)sender).AutoGeneratingColumn -= View_AutoGeneratingColumn; ((DataGrid)sender).AutoGeneratingColumn -= View_AutoGeneratingColumn;
} }
internal static void View_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) internal static void View_AutoGeneratingColumn(object? sender, DataGridAutoGeneratingColumnEventArgs e)
{ {
var binding = new Binding(e.PropertyName) { Mode = BindingMode.OneWay }; var binding = new Binding(e.PropertyName) { Mode = BindingMode.OneWay };
e.Column = GetColumn(); e.Column = GetColumn();

4
ILSpy/Metadata/MetaDataGrid.cs

@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy.Metadata
this.hoverLogic.MouseHoverStopped += HoverLogic_MouseHoverStopped; this.hoverLogic.MouseHoverStopped += HoverLogic_MouseHoverStopped;
} }
private void HoverLogic_MouseHoverStopped(object sender, System.Windows.Input.MouseEventArgs e) private void HoverLogic_MouseHoverStopped(object? sender, System.Windows.Input.MouseEventArgs e)
{ {
// Non-popup tooltips get closed as soon as the mouse starts moving again // Non-popup tooltips get closed as soon as the mouse starts moving again
if (toolTip != null) if (toolTip != null)
@ -53,7 +53,7 @@ namespace ICSharpCode.ILSpy.Metadata
} }
} }
private void HoverLogic_MouseHover(object sender, System.Windows.Input.MouseEventArgs e) private void HoverLogic_MouseHover(object? sender, System.Windows.Input.MouseEventArgs e)
{ {
var position = e.GetPosition(this); var position = e.GetPosition(this);
var hit = VisualTreeHelper.HitTest(this, position); var hit = VisualTreeHelper.HitTest(this, position);

2
ILSpy/Options/DecompilerSettingsViewModel.cs

@ -92,7 +92,7 @@ namespace ICSharpCode.ILSpy.Options
public DecompilerSettingsItemViewModel[] Settings { get; } public DecompilerSettingsItemViewModel[] Settings { get; }
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) private void Item_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName == nameof(DecompilerSettingsItemViewModel.IsEnabled)) if (e.PropertyName == nameof(DecompilerSettingsItemViewModel.IsEnabled))
{ {

4
ILSpy/Options/DisplaySettings.cs

@ -42,14 +42,14 @@ namespace ICSharpCode.ILSpy.Options
} }
#region INotifyPropertyChanged implementation #region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{ {
PropertyChanged?.Invoke(this, e); PropertyChanged?.Invoke(this, e);
} }
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{ {
OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
} }

4
ILSpy/Options/MiscSettingsViewModel.cs

@ -119,14 +119,14 @@ namespace ICSharpCode.ILSpy.Options
#region INotifyPropertyChanged Implementation #region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{ {
PropertyChanged?.Invoke(this, e); PropertyChanged?.Invoke(this, e);
} }
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{ {
OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
} }

2
ILSpy/Search/SearchPane.xaml.cs

@ -203,7 +203,7 @@ namespace ICSharpCode.ILSpy.Search
listBox.SelectedIndex = 0; listBox.SelectedIndex = 0;
} }
void UpdateResults(object sender, EventArgs e) void UpdateResults(object? sender, EventArgs e)
{ {
if (currentSearch == null) if (currentSearch == null)
return; return;

4
ILSpy/SessionSettings.cs

@ -69,9 +69,9 @@ namespace ICSharpCode.ILSpy
this.DockLayout = new DockLayoutSettings(doc.Element("DockLayout")); this.DockLayout = new DockLayoutSettings(doc.Element("DockLayout"));
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null) void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{ {
var args = new PropertyChangedEventArgs(propertyName); var args = new PropertyChangedEventArgs(propertyName);

2
ILSpy/TextView/BracketHighlightRenderer.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.ILSpy.TextView
/// Searches for a matching bracket from the given offset to the start of the document. /// Searches for a matching bracket from the given offset to the start of the document.
/// </summary> /// </summary>
/// <returns>A BracketSearchResult that contains the positions and lengths of the brackets. Return null if there is nothing to highlight.</returns> /// <returns>A BracketSearchResult that contains the positions and lengths of the brackets. Return null if there is nothing to highlight.</returns>
BracketSearchResult SearchBracket(IDocument document, int offset); BracketSearchResult? SearchBracket(IDocument document, int offset);
} }
public class DefaultBracketSearcher : IBracketSearcher public class DefaultBracketSearcher : IBracketSearcher

6
ILSpy/Themes/WindowStyleManagerBehavior.cs

@ -65,7 +65,7 @@ namespace ICSharpCode.ILSpy.Themes
SettingsService.Instance.DisplaySettings.PropertyChanged -= DisplaySettings_PropertyChanged; SettingsService.Instance.DisplaySettings.PropertyChanged -= DisplaySettings_PropertyChanged;
} }
private void Color_Changed(object sender, EventArgs e) private void Color_Changed(object? sender, EventArgs e)
{ {
ApplyThemeToWindowCaption(); ApplyThemeToWindowCaption();
} }
@ -83,7 +83,7 @@ namespace ICSharpCode.ILSpy.Themes
MessageBox.Show(Properties.Resources.SettingsChangeRestartRequired); MessageBox.Show(Properties.Resources.SettingsChangeRestartRequired);
} }
private void DisplaySettings_PropertyChanged(object sender, PropertyChangedEventArgs e) private void DisplaySettings_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName == nameof(DisplaySettings.StyleWindowTitleBar)) if (e.PropertyName == nameof(DisplaySettings.StyleWindowTitleBar))
{ {
@ -114,7 +114,7 @@ namespace ICSharpCode.ILSpy.Themes
} }
else else
{ {
void Initialized(object o, EventArgs eventArgs) void Initialized(object? o, EventArgs eventArgs)
{ {
ApplyThemeToWindowCaption(); ApplyThemeToWindowCaption();
window.SourceInitialized -= Initialized; window.SourceInitialized -= Initialized;

4
ILSpy/TreeNodes/AssemblyListTreeNode.cs

@ -26,8 +26,8 @@ using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.Util; using ICSharpCode.Decompiler.Util;
using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -57,7 +57,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
this.Children.Clear(); this.Children.Clear();
this.Children.AddRange(collection.GetAssemblies().Select(a => new AssemblyTreeNode(a))); this.Children.AddRange(collection.GetAssemblies().Select(a => new AssemblyTreeNode(a)));
collection.CollectionChanged += delegate (object sender, NotifyCollectionChangedEventArgs e) { collection.CollectionChanged += delegate (object? sender, NotifyCollectionChangedEventArgs e) {
switch (e.Action) switch (e.Action)
{ {
case NotifyCollectionChangedAction.Add: case NotifyCollectionChangedAction.Add:

4
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -29,8 +29,8 @@ using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX.Abstractions; using ICSharpCode.ILSpyX.Abstractions;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -128,7 +128,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
} }
protected virtual void LanguageSettings_Changed(object sender, EventArgs e) protected virtual void LanguageSettings_Changed(object? sender, EventArgs e)
{ {
RaisePropertyChanged(nameof(Text)); RaisePropertyChanged(nameof(Text));
if (IsVisible) if (IsVisible)

2
ILSpy/Updates/NotifyOfUpdatesStrategy.cs

@ -87,7 +87,7 @@ namespace ICSharpCode.ILSpy.Updates
} }
} }
public static Task<string> CheckForUpdatesAsync(ILSpySettings spySettings) public static Task<string?> CheckForUpdatesAsync(ILSpySettings spySettings)
{ {
UpdateSettings s = new UpdateSettings(spySettings); UpdateSettings s = new UpdateSettings(spySettings);
return CheckForUpdateInternal(s); return CheckForUpdateInternal(s);

4
ILSpy/Updates/UpdateSettings.cs

@ -78,9 +78,9 @@ namespace ICSharpCode.ILSpy.Updates
ILSpySettings.SaveSettings(updateSettings); ILSpySettings.SaveSettings(updateSettings);
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged(string propertyName) void OnPropertyChanged(string? propertyName)
{ {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} }

4
ILSpy/ViewModels/PaneModel.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.ILSpy.ViewModels
this.model.PropertyChanged += Model_PropertyChanged; this.model.PropertyChanged += Model_PropertyChanged;
} }
private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e) private void Model_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName == nameof(model.IsCloseable)) if (e.PropertyName == nameof(model.IsCloseable))
{ {
@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpy.ViewModels
} }
} }
public event EventHandler CanExecuteChanged; public event EventHandler? CanExecuteChanged;
public bool CanExecute(object? parameter) public bool CanExecute(object? parameter)
{ {

4
ILSpy/ViewModels/ViewModelBase.cs

@ -23,9 +23,9 @@ namespace ICSharpCode.ILSpy.ViewModels
{ {
public abstract class ViewModelBase : INotifyPropertyChanged public abstract class ViewModelBase : INotifyPropertyChanged
{ {
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) protected void RaisePropertyChanged([CallerMemberName] string? propertyName = null)
{ {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} }

Loading…
Cancel
Save