提交 40c84592 编写于 作者: T Tom Meschter

Add VB samples for additional files

Add a couple of sample analyzers that demonstrate the use of additional
files. The SimpleAdditionalFileAnalyzer uses the additional file's
`SourceText` instance to read it line by line, while the
XmlAdditionalFileAnalyzer writes the contents out to a `Stream` so that
it can be read by `XDocument.Load`.
上级 d2a94975
Imports System.IO
Namespace BasicAnalyzers
''' <summary>
''' Analyzer to demonstrate reading an additional file line-by-line.
''' It looks for an additional file named "Terms.txt" and extracts a set of
''' terms, one per line. It then detects type names that use those terms and
''' reports diagnostics.
''' </summary>
<DiagnosticAnalyzer(LanguageNames.VisualBasic, LanguageNames.CSharp)>
Public Class SimpleAdditionalFileAnalyzer
Inherits DiagnosticAnalyzer
Private Const Title As String = "Type name contains invalid term"
Private Const MessageFormat As String = "The term '{0}' is not allowed in a type name."
Private Shared Rule As DiagnosticDescriptor =
New DiagnosticDescriptor(
DiagnosticIds.SimpleAdditionalFileAnalyzerRuleId,
Title,
MessageFormat,
DiagnosticCategories.AdditionalFile,
DiagnosticSeverity.Error,
isEnabledByDefault:=True)
Public Overrides ReadOnly Property SupportedDiagnostics As ImmutableArray(Of DiagnosticDescriptor)
Get
Return ImmutableArray.Create(Rule)
End Get
End Property
Public Overrides Sub Initialize(context As AnalysisContext)
context.RegisterCompilationStartAction(
Sub(compilationStartContext)
' Find the additional file with the terms.
Dim additionalFiles As ImmutableArray(Of AdditionalText) = compilationStartContext.Options.AdditionalFiles
Dim termsFile As AdditionalText = additionalFiles.FirstOrDefault(
Function(file)
Return Path.GetFileName(file.Path).Equals("Terms.txt")
End Function)
If termsFile IsNot Nothing Then
Dim terms As HashSet(Of String) = New HashSet(Of String)
' Read the file line-by-line to get the terms.
Dim fileText As SourceText = termsFile.GetText(compilationStartContext.CancellationToken)
For Each line As TextLine In fileText.Lines
terms.Add(line.ToString())
Next
' Check every named type for the invalid terms.
compilationStartContext.RegisterSymbolAction(
Sub(symbolAnalysisContext)
Dim namedTypeSymbol As INamedTypeSymbol = DirectCast(symbolAnalysisContext.Symbol, INamedTypeSymbol)
Dim symbolName As String = namedTypeSymbol.Name
For Each term As String In terms
If symbolName.Contains(term) Then
symbolAnalysisContext.ReportDiagnostic(
Diagnostic.Create(Rule, namedTypeSymbol.Locations(0), term))
End If
Next
End Sub,
SymbolKind.NamedType)
End If
End Sub)
End Sub
End Class
End Namespace
\ No newline at end of file
Imports System.IO
Namespace BasicAnalyzers
''' <summary>
''' Analyzer to demonstrate reading an additional file with a structed format.
''' It looks for an additional file named "Terms.xml" and dumps it to a stream
''' so that it can be loaded into an <see cref="XDocument"/>. It then extracts
''' terms from the XML, detects type names that use those terms and reports
''' diagnostics on them.
''' </summary>
<DiagnosticAnalyzer(LanguageNames.VisualBasic, LanguageNames.CSharp)>
Public Class XmlAdditionalFileAnalyzer
Inherits DiagnosticAnalyzer
Private Const Title As String = "Type name contains invalid term"
Private Const MessageFormat As String = "The term '{0}' is not allowed in a type name."
Private Shared Rule As DiagnosticDescriptor =
New DiagnosticDescriptor(
DiagnosticIds.XmlAdditionalFileAnalyzerRuleId,
Title,
MessageFormat,
DiagnosticCategories.AdditionalFile,
DiagnosticSeverity.Error,
isEnabledByDefault:=True)
Public Overrides ReadOnly Property SupportedDiagnostics As ImmutableArray(Of DiagnosticDescriptor)
Get
Return ImmutableArray.Create(Rule)
End Get
End Property
Public Overrides Sub Initialize(context As AnalysisContext)
context.RegisterCompilationStartAction(
Sub(compilationStartContext)
' Find the additional file with the terms.
Dim additionalFiles As ImmutableArray(Of AdditionalText) = compilationStartContext.Options.AdditionalFiles
Dim termsFile As AdditionalText = additionalFiles.FirstOrDefault(
Function(file)
Return Path.GetFileName(file.Path).Equals("Terms.txt")
End Function)
If termsFile IsNot Nothing Then
Dim terms As HashSet(Of String) = New HashSet(Of String)
Dim fileText As SourceText = termsFile.GetText(compilationStartContext.CancellationToken)
' Write the additional file back to a stream.
Dim stream As MemoryStream = New MemoryStream()
Using writer As StreamWriter = New StreamWriter(stream)
fileText.Write(writer)
End Using
' Read all the <Term> elements to get the terms.
Dim document As XDocument = XDocument.Load(stream)
For Each termElement As XElement In document.Descendants("Term")
terms.Add(termElement.Value)
Next
' Check every named type for the invalid terms.
compilationStartContext.RegisterSymbolAction(
Sub(symbolAnalysisContext)
Dim namedTypeSymbol As INamedTypeSymbol = DirectCast(symbolAnalysisContext.Symbol, INamedTypeSymbol)
Dim symbolName As String = namedTypeSymbol.Name
For Each term As String In terms
If symbolName.Contains(term) Then
symbolAnalysisContext.ReportDiagnostic(
Diagnostic.Create(Rule, namedTypeSymbol.Locations(0), term))
End If
Next
End Sub,
SymbolKind.NamedType)
End If
End Sub)
End Sub
End Class
End Namespace
\ No newline at end of file
......@@ -68,6 +68,8 @@
<Import Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="AdditionalFileAnalyzers\SimpleAdditionalFileAnalyzer.vb" />
<Compile Include="AdditionalFileAnalyzers\XmlAdditionalFileAnalyzer.vb" />
<Compile Include="DiagnosticCategories.vb" />
<Compile Include="DiagnosticIds.vb" />
<Compile Include="My Project\AssemblyInfo.vb" />
......
......@@ -2,5 +2,6 @@
Public Module DiagnosticCategories
Public Const Stateless As String = "SampleStatelessAnalyzers"
Public Const Stateful As String = "SampleStatefulAnalyzers"
Public Const AdditionalFile As String = "SampleAdditionalFileAnalyzers"
End Module
End Namespace
......@@ -12,5 +12,9 @@
Public Const CodeBlockStartedAnalyzerRuleId As String = "VBS0101"
Public Const CompilationStartedAnalyzerRuleId As String = "VBS0102"
Public Const CompilationStartedAnalyzerWithCompilationWideAnalysisRuleId As String = "VBS0103"
' Additional File analyzer IDs.
Public Const SimpleAdditionalFileAnalyzerRuleId = "VBS0201"
Public Const XmlAdditionalFileAnalyzerRuleId = "VBS0202"
End Module
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册