提交 5f7a42bc 编写于 作者: C Charles Stoner

Allow top-level extension methods in VB script code

上级 2a5570e0
......@@ -113,5 +113,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Return False
End Function
<Extension()>
Friend Function AllowsExtensionMethods(container As NamedTypeSymbol) As Boolean
Return container.TypeKind = TypeKind.Module OrElse container.IsScriptClass
End Function
End Module
End Namespace
......@@ -3333,7 +3333,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
' Only Modules can declare extension methods.
If _lazyContainsExtensionMethods = ThreeState.Unknown Then
If Not (_containingSymbol.Kind = SymbolKind.Namespace AndAlso Me.TypeKind = TypeKind.Module AndAlso Me.AnyMemberHasAttributes) Then
If Not (_containingSymbol.Kind = SymbolKind.Namespace AndAlso Me.AllowsExtensionMethods() AndAlso Me.AnyMemberHasAttributes) Then
_lazyContainsExtensionMethods = ThreeState.False
End If
End If
......
......@@ -85,7 +85,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
' Check attributes quickly.
_quickAttributes = binder.QuickAttributeChecker.CheckAttributes(syntax.AttributeLists)
If containingType.TypeKind <> TypeKind.Module Then
If Not containingType.AllowsExtensionMethods() Then
' Extension methods in source can only be inside modules.
_quickAttributes = _quickAttributes And Not QuickAttributes.Extension
End If
......
......@@ -1471,7 +1471,7 @@ lReportErrorOnTwoTokens:
Dim isExtensionMethod As Boolean = False
If Not (Me.MethodKind <> MethodKind.Ordinary AndAlso Me.MethodKind <> MethodKind.DeclareMethod) AndAlso
m_containingType.TypeKind = TYPEKIND.Module AndAlso
m_containingType.AllowsExtensionMethods() AndAlso
Me.ParameterCount <> 0 Then
Debug.Assert(Me.IsShared)
......@@ -1569,7 +1569,7 @@ lReportErrorOnTwoTokens:
If Me.MethodKind <> MethodKind.Ordinary AndAlso Me.MethodKind <> MethodKind.DeclareMethod Then
arguments.Diagnostics.Add(ERRID.ERR_ExtensionOnlyAllowedOnModuleSubOrFunction, arguments.AttributeSyntaxOpt.GetLocation())
ElseIf m_containingType.TypeKind <> TYPEKIND.Module Then
ElseIf Not m_containingType.AllowsExtensionMethods() Then
arguments.Diagnostics.Add(ERRID.ERR_ExtensionMethodNotInModule, arguments.AttributeSyntaxOpt.GetLocation())
ElseIf Me.ParameterCount = 0 Then
......
......@@ -2431,6 +2431,59 @@ End Module
End Sub
<Fact>
Public Sub ScriptExtensionMethods()
Dim comp = CreateCompilationWithMscorlib(
<compilation>
<file name="a.vbx"><![CDATA[
Imports System.Runtime.CompilerServices
<Extension>
Shared Function F(o As Object) As Object
Return Nothing
End Function
Dim o As New Object()
o.F()]]></file>
</compilation>,
parseOptions:=TestOptions.Script,
references:={MscorlibRef, SystemCoreRef})
comp.VerifyDiagnostics()
Assert.True(comp.SourceAssembly.MightContainExtensionMethods)
End Sub
<Fact>
Public Sub InteractiveExtensionMethods()
Dim parseOptions = TestOptions.Interactive
Dim references = {MscorlibRef, SystemCoreRef}
Dim source0 = <![CDATA[
Imports System.Runtime.CompilerServices
<Extension>
Shared Function F(o As Object) As Object
Return 0
End Function
Dim o As New Object()
? o.F()]]>
Dim source1 = <![CDATA[
<Extension>
Shared Function G(o As Object) As Object
Return 1
End Function
Dim o As New Object()
? o.G().F()]]>
Dim s0 = VisualBasicCompilation.CreateSubmission(
"s0.dll",
syntaxTree:=Parse(source0.Value, parseOptions),
references:=references)
s0.VerifyDiagnostics()
Assert.True(s0.SourceAssembly.MightContainExtensionMethods)
Dim s1 = VisualBasicCompilation.CreateSubmission(
"s1.dll",
syntaxTree:=Parse(source0.Value, parseOptions),
previousSubmission:=s0,
references:=references)
s1.VerifyDiagnostics()
Assert.True(s1.SourceAssembly.MightContainExtensionMethods)
End Sub
End Class
End Namespace
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册