diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
index 042bddaa6d..47c1b00f18 100644
--- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
+++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
@@ -316,6 +316,7 @@
+
diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ResultOfAsyncCallShouldNotBeIgnoredIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ResultOfAsyncCallShouldNotBeIgnoredIssue.cs
new file mode 100644
index 0000000000..48dc4e9285
--- /dev/null
+++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ResultOfAsyncCallShouldNotBeIgnoredIssue.cs
@@ -0,0 +1,58 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.NRefactory.Semantics;
+using ICSharpCode.NRefactory.TypeSystem;
+
+namespace ICSharpCode.NRefactory.CSharp.Refactoring
+{
+ [IssueDescription("Result of async call is ignored",
+ Description = "Warns when the task returned by an async call is ignored, which causes exceptions" +
+ " thrown by the call to be silently ignored.",
+ Category = IssueCategories.CodeQualityIssues,
+ Severity = Severity.Warning)]
+ public class ResultOfAsyncCallShouldNotBeIgnoredIssue : ICodeIssueProvider
+ {
+ public IEnumerable GetIssues(BaseRefactoringContext context)
+ {
+ return new GatherVisitor().GetIssues();
+ }
+
+ sealed class GatherVisitor : GatherVisitorBase
+ {
+ public GatherVisitor(BaseRefactoringContext ctx)
+ : base(ctx)
+ {
+ }
+
+ public override void VisitExpressionStatement(ExpressionStatement expressionStatement)
+ {
+ base.VisitExpressionStatement(expressionStatement);
+ var invocation = expressionStatement.Expression as InvocationExpression;
+ if (invocation == null)
+ return;
+ var rr = ctx.Resolve(invocation) as InvocationResolveResult;
+ if (rr != null && (rr.Type.IsKnownType(KnownTypeCode.Task) || rr.Type.IsKnownType(KnownTypeCode.TaskOfT))) {
+ AddIssue(invocation, "Exceptions in async call will be silently ignored because the returned task is unused");
+ }
+ }
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/KnownTypeCache.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/KnownTypeCache.cs
index adcd1a8e34..c28e553a5e 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/KnownTypeCache.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/KnownTypeCache.cs
@@ -48,12 +48,13 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
KnownTypeReference typeRef = KnownTypeReference.Get(typeCode);
if (typeRef == null)
return SpecialType.UnknownType;
+ var typeName = new TopLevelTypeName(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount);
foreach (IAssembly asm in compilation.Assemblies) {
- var typeDef = asm.GetTypeDefinition(new TopLevelTypeName(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount));
+ var typeDef = asm.GetTypeDefinition(typeName);
if (typeDef != null)
return typeDef;
}
- return new UnknownType(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount);
+ return new UnknownType(typeName);
}
}
}