private string GetSourceLocation(IBindingMethod bindingMethod, WarningCollector warningCollector) { if (bindingMethod is RuntimeBindingMethod runtimeBindingMethod && runtimeBindingMethod.MethodInfo.DeclaringType != null) { try { var symbolReader = GetOrCreateSymbolReader(runtimeBindingMethod.MethodInfo.DeclaringType.Assembly, warningCollector); var methodSymbol = symbolReader.ReadMethodSymbol(runtimeBindingMethod.MethodInfo.MetadataToken); var startSequencePoint = methodSymbol?.SequencePoints?.FirstOrDefault(sp => !sp.IsHidden); if (startSequencePoint == null) { return(null); } var sourceKey = GetKey(_sourceFiles, startSequencePoint.SourcePath); var sourceLocation = $"#{sourceKey}|{startSequencePoint.StartLine}|{startSequencePoint.StartColumn}"; var endSequencePoint = methodSymbol.SequencePoints.LastOrDefault(sp => !sp.IsHidden); if (endSequencePoint != null) { sourceLocation = sourceLocation + $"|{endSequencePoint.EndLine}|{endSequencePoint.EndColumn}"; } return(sourceLocation); } catch (Exception ex) { warningCollector.AddWarning("GetSourceLocation", ex); return(null); } } return(null); }
internal DiscoveryResult DiscoverInternal(Assembly testAssembly, string testAssemblyPath, string configFilePath) { var bindingRegistry = GetBindingRegistry(testAssembly, configFilePath); var result = new DiscoveryResult(); var warningCollector = new WarningCollector(); _sourceFiles.Clear(); GetOrCreateSymbolReader(testAssembly, warningCollector, testAssemblyPath); result.StepDefinitions = GetStepDefinitions(bindingRegistry).Select(sdb => new StepDefinition { Type = sdb.StepDefinitionType.ToString(), Regex = sdb.Regex.ToString(), Method = sdb.Method.ToString(), ParamTypes = GetParamTypes(sdb.Method), Scope = GetScope(sdb), SourceLocation = GetSourceLocation(sdb.Method, warningCollector) }) .Distinct() //TODO: SpecFlow discoverers bindings from external assemblies twice -- needs fix .ToArray(); result.SourceFiles = _sourceFiles.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key); result.TypeNames = _typeNames.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key); result.Warnings = warningCollector.Warnings; result.SpecFlowVersion = typeof(IStepDefinitionBinding).Assembly.Location; return(result); }
private IDeveroomSymbolReader GetOrCreateSymbolReader(Assembly assembly, WarningCollector warningCollector, string assemblyFilePath = null) { if (!_symbolReaders.TryGetValue(assembly, out var symbolReader)) { assemblyFilePath = assemblyFilePath ?? new Uri(assembly.CodeBase).LocalPath; symbolReader = CreateSymbolReader(assemblyFilePath, warningCollector); _symbolReaders.Add(assembly, symbolReader); } return(symbolReader); }
private StepDefinition CreateStepDefinition(IStepDefinitionBinding sdb, WarningCollector warningCollector) { var stepDefinition = new StepDefinition { Type = sdb.StepDefinitionType.ToString(), Regex = sdb.Regex?.ToString(), Method = sdb.Method.ToString(), ParamTypes = GetParamTypes(sdb.Method), Scope = GetScope(sdb), SourceLocation = GetSourceLocation(sdb.Method, warningCollector), Expression = GetSourceExpression(sdb), Error = GetError(sdb) }; return(stepDefinition); }
internal DiscoveryResult DiscoverInternal(Assembly testAssembly, string testAssemblyPath, string configFilePath) { try { var bindingRegistry = GetBindingRegistry(testAssembly, configFilePath); var result = new DiscoveryResult(); var warningCollector = new WarningCollector(); _sourceFiles.Clear(); GetOrCreateSymbolReader(testAssembly, warningCollector, testAssemblyPath); result.StepDefinitions = GetStepDefinitions(bindingRegistry) .Select(sdb => CreateStepDefinition(sdb, warningCollector)) .Distinct() //TODO: SpecFlow discoverers bindings from external assemblies twice -- needs fix .ToArray(); result.SourceFiles = _sourceFiles.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key); result.TypeNames = _typeNames.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key); result.Warnings = warningCollector.Warnings; result.SpecFlowVersion = typeof(IStepDefinitionBinding).Assembly.Location; return(result); } catch (Exception ex) when(GetRegexError(ex) != null) { var regexError = GetRegexError(ex); return(new DiscoveryResult() { SpecFlowVersion = typeof(IStepDefinitionBinding).Assembly.Location, StepDefinitions = new[] { new StepDefinition { Method = "Unknown method", Error = $"Step definition regular expression error: {regexError.Message}" } } }); } }
protected virtual IDeveroomSymbolReader CreateSymbolReader(string assemblyFilePath, WarningCollector warningCollector) { try { return(new DnLibDeveroomSymbolReader(assemblyFilePath)); } catch (Exception ex) { warningCollector.AddWarning($"Unable to create symbol reader for '{assemblyFilePath}'.", ex); return(new NullDeveroomSymbolReader()); } }
protected override IDeveroomSymbolReader CreateSymbolReader(string assemblyFilePath, WarningCollector warningCollector) { var symbolReaderFactories = new Func <string, IDeveroomSymbolReader>[] { path => new DnLibDeveroomSymbolReader(path), path => new ComDeveroomSymbolReader(path), }; foreach (var symbolReaderFactory in symbolReaderFactories) { try { return(symbolReaderFactory(assemblyFilePath)); } catch (Exception ex) { warningCollector.AddWarning($"CreateSymbolReader({assemblyFilePath})", ex); } } return(new NullDeveroomSymbolReader()); }
protected override IDeveroomSymbolReader CreateSymbolReader(string assemblyFilePath, WarningCollector warningCollector) { return(new StubSymbolReader()); }