private BoundType BindType(TypeSyntax syntax, Symbol parent)
{
switch (syntax.Kind)
{
case SyntaxKind.PredefinedScalarType:
return BindScalarType((ScalarTypeSyntax) syntax);
case SyntaxKind.PredefinedVectorType:
return BindVectorType((VectorTypeSyntax) syntax);
case SyntaxKind.PredefinedGenericVectorType:
return BindGenericVectorType((GenericVectorTypeSyntax) syntax);
case SyntaxKind.PredefinedMatrixType:
return BindMatrixType((MatrixTypeSyntax) syntax);
case SyntaxKind.PredefinedGenericMatrixType:
return BindGenericMatrixType((GenericMatrixTypeSyntax) syntax);
case SyntaxKind.PredefinedObjectType:
return new BoundObjectType(BindObjectType((PredefinedObjectTypeSyntax) syntax));
case SyntaxKind.StructType:
{
// Inline struct.
return BindStructDeclaration((StructTypeSyntax) syntax, parent);
}
case SyntaxKind.IdentifierName:
{
var identifierName = (IdentifierNameSyntax) syntax;
var symbols = LookupTypeSymbol(identifierName.Name).ToImmutableArray();
if (symbols.Length == 0)
{
Diagnostics.ReportUndeclaredType(syntax);
return new BoundUnknownType();
}
if (symbols.Length > 1)
Diagnostics.ReportAmbiguousType(identifierName.Name, symbols);
return new BoundName(symbols.First());
}
case SyntaxKind.QualifiedName:
{
var qualifiedName = (QualifiedNameSyntax) syntax;
return BindQualifiedType(qualifiedName);
}
default:
throw new InvalidOperationException(syntax.Kind.ToString());
}
}