From 7b16dcb244d09fae4a966fc1581ded125c25487b Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Fri, 27 Jan 2017 16:03:19 -0800 Subject: [PATCH] Fix running unit tests defined in nested classes --- .../Extensions/ISymbolExtensions.cs | 71 +++++++++++++++++++ .../Helpers/TestFeaturesDiscover.cs | 15 ++-- 2 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 src/OmniSharp.Abstractions/Extensions/ISymbolExtensions.cs diff --git a/src/OmniSharp.Abstractions/Extensions/ISymbolExtensions.cs b/src/OmniSharp.Abstractions/Extensions/ISymbolExtensions.cs new file mode 100644 index 0000000000..04138661a5 --- /dev/null +++ b/src/OmniSharp.Abstractions/Extensions/ISymbolExtensions.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using Microsoft.CodeAnalysis; +namespace OmniSharp.Extensions +{ + public static class ISymbolExtensions + { + private readonly static CachedStringBuilder s_cachedBuilder; + + public static string GetMetadataName(this ISymbol symbol) + { + if (symbol == null) + { + throw new ArgumentNullException(nameof(symbol)); + } + + var symbols = new Stack(); + + while (symbol != null) + { + if (symbol.Kind == SymbolKind.Assembly || + symbol.Kind == SymbolKind.NetModule) + { + break; + } + + if ((symbol as INamespaceSymbol)?.IsGlobalNamespace == true) + { + break; + } + + symbols.Push(symbol); + symbol = symbol.ContainingSymbol; + } + + var builder = s_cachedBuilder.Acquire(); + try + { + ISymbol current = null, previous = null; + + while (symbols.Count > 0) + { + current = symbols.Pop(); + + if (previous != null) + { + if (previous.Kind == SymbolKind.NamedType && + current.Kind == SymbolKind.NamedType) + { + builder.Append('+'); + } + else + { + builder.Append('.'); + } + } + + builder.Append(current.MetadataName); + + previous = current; + } + + return builder.ToString(); + } + finally + { + s_cachedBuilder.Release(builder); + } + } + } +} diff --git a/src/OmniSharp.DotNetTest/Helpers/TestFeaturesDiscover.cs b/src/OmniSharp.DotNetTest/Helpers/TestFeaturesDiscover.cs index ab3239785a..59f95eaa48 100644 --- a/src/OmniSharp.DotNetTest/Helpers/TestFeaturesDiscover.cs +++ b/src/OmniSharp.DotNetTest/Helpers/TestFeaturesDiscover.cs @@ -5,6 +5,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using OmniSharp.Abstractions.Services; +using OmniSharp.Extensions; using OmniSharp.Models; namespace OmniSharp.DotNetTest.Helpers @@ -25,7 +26,7 @@ public IEnumerable Discover(SyntaxNode node, SemanticModel semant bool isTestMethod = false; string featureName = null; - if(IsTestMethod(method, semanticModel, IsDerivedFromFactAttribute)) + if (IsTestMethod(method, semanticModel, IsDerivedFromFactAttribute)) { isTestMethod = true; featureName = XunitFeatureName; @@ -38,8 +39,7 @@ public IEnumerable Discover(SyntaxNode node, SemanticModel semant if (isTestMethod) { - var methodName = semanticModel.GetDeclaredSymbol(node).ToDisplayString(); - methodName = methodName.Substring(0, methodName.IndexOf('(')); + var methodName = semanticModel.GetDeclaredSymbol(node).GetMetadataName(); yield return new SyntaxFeature { @@ -50,8 +50,7 @@ public IEnumerable Discover(SyntaxNode node, SemanticModel semant } } - private bool IsTestMethod(MethodDeclarationSyntax node, - SemanticModel sematicModel, Func predicate) + private bool IsTestMethod(MethodDeclarationSyntax node, SemanticModel sematicModel, Func predicate) { return node.DescendantNodes() .OfType() @@ -71,7 +70,8 @@ private static bool IsDerivedFromFactAttribute(ITypeSymbol symbol) } symbol = symbol.BaseType; - } while (symbol.Name != "Object"); + } + while (symbol.SpecialType != SpecialType.System_Object); return false; } @@ -90,7 +90,8 @@ private bool IsNUnitTest(ITypeSymbol symbol) } symbol = symbol.BaseType; - } while (symbol.Name != "Object"); + } + while (symbol.SpecialType != SpecialType.System_Object); return false; }