diff --git a/src/Compilers/VisualBasic/Portable/Lowering/Instrumentation/DynamicAnalysisInjector.vb b/src/Compilers/VisualBasic/Portable/Lowering/Instrumentation/DynamicAnalysisInjector.vb index d2b5ea05223758c7ed8fb4b604740a45cff1acaf..d41cfd0662a51de259d624a491641eb6c4d39489 100644 --- a/src/Compilers/VisualBasic/Portable/Lowering/Instrumentation/DynamicAnalysisInjector.vb +++ b/src/Compilers/VisualBasic/Portable/Lowering/Instrumentation/DynamicAnalysisInjector.vb @@ -30,7 +30,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Public Shared Function TryCreate(method As MethodSymbol, methodBody As BoundStatement, methodBodyFactory As SyntheticBoundNodeFactory, diagnostics As DiagnosticBag, debugDocumentProvider As DebugDocumentProvider, previous As Instrumenter) As DynamicAnalysisInjector ' Do not instrument implicitly-declared methods. - If Not method.IsImplicitlyDeclared Then + If Not method.IsImplicitlyDeclared OrElse method.IsAnyConstructor Then Dim createPayload As MethodSymbol = GetCreatePayload(methodBodyFactory.Compilation, methodBody.Syntax, diagnostics) ' Do not instrument any methods if CreatePayload is not present. @@ -70,7 +70,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' The first point indicates entry into the method and has the span of the method definition. Dim bodySyntax As VisualBasicSyntaxNode = methodBody.Syntax - _methodEntryInstrumentation = AddAnalysisPoint(bodySyntax, SkipAttributes(bodySyntax), methodBodyFactory) + If Not method.IsImplicitlyDeclared Then + _methodEntryInstrumentation = AddAnalysisPoint(bodySyntax, SkipAttributes(bodySyntax), methodBodyFactory) + End If End Sub Public Overrides Function CreateBlockPrologue(trueOriginal As BoundBlock, original As BoundBlock, ByRef synthesizedLocal As LocalSymbol) As BoundStatement @@ -106,7 +108,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Dim prologueStatements As ArrayBuilder(Of BoundStatement) = ArrayBuilder(Of BoundStatement).GetInstance(If(previousPrologue Is Nothing, 3, 4)) prologueStatements.Add(payloadInitialization) prologueStatements.Add(payloadIf) - prologueStatements.Add(_methodEntryInstrumentation) + If _methodEntryInstrumentation IsNot Nothing Then + prologueStatements.Add(_methodEntryInstrumentation) + End If If previousPrologue IsNot Nothing Then prologueStatements.Add(previousPrologue) End If diff --git a/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicAnalysisResourceTests.vb b/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicAnalysisResourceTests.vb index b2de214d51c3008671280b542b883a0e99fc31c9..1230a0205ccdd6618254b9a8c27819bedaaa4a85 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicAnalysisResourceTests.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicAnalysisResourceTests.vb @@ -587,6 +587,71 @@ End Class New SpanResult(37, 8, 37, 18, "_z = a + b")) End Sub + + Public Sub TestImplicitConstructorSpans() + Dim testSource As XElement = + + + Dim source As Xml.Linq.XElement = + source.Add(testSource) + source.Add(InstrumentationHelperSource) + + Dim c = CompilationUtils.CreateCompilationWithMscorlibAndVBRuntime(source) + Dim peImage = c.EmitToArray(EmitOptions.Default.WithInstrument("Test.Flag")) + + Dim PEReader As New PEReader(peImage) + Dim reader = DynamicAnalysisDataReader.TryCreateFromPE(PEReader, "") + + VerifyDocuments(reader, reader.Documents, "'c.vb'", "'a.vb'") + + Dim sourceLines As String() = testSource.ToString().Split(vbLf(0)) + + VerifySpans(reader, reader.Methods(0), sourceLines, + New SpanResult(3, 4, 5, 11, "Public Sub Main()"), + New SpanResult(4, 8, 4, 18, "TestMain()")) + + VerifySpans(reader, reader.Methods(1), sourceLines, + New SpanResult(7, 4, 9, 11, "Sub TestMain()"), + New SpanResult(8, 21, 8, 28, "New C()")) + + VerifySpans(reader, reader.Methods(4), sourceLines, + New SpanResult(13, 4, 15, 16, "Shared Function Init() As Integer"), + New SpanResult(14, 8, 14, 17, "Return 33")) + + VerifySpans(reader, reader.Methods(2), sourceLines, ' implicit shared constructor + New SpanResult(19, 36, 19, 42, "Init()"), + New SpanResult(20, 36, 20, 48, "Init() + 153"), + New SpanResult(21, 36, 21, 39, "144")) + + VerifySpans(reader, reader.Methods(3), sourceLines, ' implicit default constructor + New SpanResult(17, 28, 17, 34, "Init()"), + New SpanResult(18, 28, 18, 39, "Init() + 12")) + End Sub + Public Sub TestDynamicAnalysisResourceMissingWhenInstrumentationFlagIsDisabled() Dim source As Xml.Linq.XElement = diff --git a/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.vb b/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.vb index 67ddc0782be6a429778e6d6813c7c527622df962..1dc4372f358dbf4c54c1749b9fd9ad3462d04d86 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.vb @@ -1223,6 +1223,7 @@ True CompileAndVerify(source, expectedOutput) End Sub + Public Sub TestFieldInitializerSpans() Dim testSource As XElement = @@ -1327,6 +1328,89 @@ True CompileAndVerify(source, expectedOutput) End Sub + + Public Sub TestImplicitConstructorSpans() + Dim testSource As XElement = + + + Dim source As Xml.Linq.XElement = + source.Add(testSource) + source.Add(InstrumentationHelperSource) + + Dim expectedOutput As XCData = + + CompileAndVerify(source, expectedOutput) + End Sub + Public Sub MissingMethodNeededForAnaysis() Dim testSource As XElement =