in src/Bicep.Core.IntegrationTests/Semantics/SemanticModelTests.cs [103:178]
public async Task NameBindingsShouldBeConsistent(DataSet dataSet)
{
var (compilation, _, _) = await dataSet.SetupPrerequisitesAndCreateCompilation(TestContext);
var model = compilation.GetEntrypointSemanticModel();
var symbolReferences = GetAllBoundSymbolReferences(compilation.SourceFileGrouping.EntryPoint.ProgramSyntax);
// just a sanity check
symbolReferences.Should().AllBeAssignableTo<ISymbolReference>();
foreach (SyntaxBase symbolReference in symbolReferences)
{
var symbol = model.GetSymbolInfo(symbolReference);
symbol.Should().NotBeNull();
if (dataSet.IsValid)
{
// valid cases should not return error symbols for any symbol reference node
symbol.Should().NotBeOfType<ErrorSymbol>();
symbol.Should().Match(s =>
s is MetadataSymbol ||
s is ParameterSymbol ||
s is TypeAliasSymbol ||
s is AmbientTypeSymbol ||
s is VariableSymbol ||
s is ResourceSymbol ||
s is ModuleSymbol ||
s is OutputSymbol ||
s is FunctionSymbol ||
s is DeclaredFunctionSymbol ||
s is ExtensionNamespaceSymbol ||
s is BuiltInNamespaceSymbol ||
s is LocalVariableSymbol ||
s is TestSymbol ||
s is ImportedTypeSymbol ||
s is ImportedVariableSymbol ||
s is ImportedFunctionSymbol ||
s is WildcardImportSymbol);
}
else
{
// invalid files may return errors
symbol.Should().Match(s =>
s is ErrorSymbol ||
s is MetadataSymbol ||
s is ParameterSymbol ||
s is TypeAliasSymbol ||
s is AmbientTypeSymbol ||
s is VariableSymbol ||
s is ResourceSymbol ||
s is ModuleSymbol ||
s is OutputSymbol ||
s is FunctionSymbol ||
s is DeclaredFunctionSymbol ||
s is ExtensionNamespaceSymbol ||
s is BuiltInNamespaceSymbol ||
s is LocalVariableSymbol ||
s is TestSymbol ||
s is ImportedTypeSymbol ||
s is ImportedVariableSymbol ||
s is ImportedFunctionSymbol ||
s is ErroredImportSymbol ||
s is WildcardImportSymbol);
}
var foundRefs = model.FindReferences(symbol!);
// the returned references should contain the original ref that we used to find the symbol
foundRefs.Should().Contain(symbolReference);
// each ref should map to the same exact symbol
foreach (SyntaxBase foundRef in foundRefs)
{
model.GetSymbolInfo(foundRef).Should().BeSameAs(symbol);
}
}
}