in Sources/SIL/SILParser.swift [577:634]
func parseNakedType() throws -> Type {
if skip("<") {
var params = [String]()
while true {
let name = try parseTypeName()
params.append(name)
guard !peek("where") && !peek(">") else { break }
try take(",")
}
let reqs: [TypeRequirement]
if peek("where") {
reqs = try parseMany("where", ",", ">") { try parseTypeRequirement() }
} else {
reqs = []
try take(">")
}
let type = try parseNakedType()
return .genericType(params, reqs, type)
} else if peek("@") {
let attrs = try parseMany("@") { try parseTypeAttribute() }
let type = try parseNakedType()
return .attributedType(attrs, type)
} else if skip("*") {
let type = try parseNakedType()
return .addressType(type)
} else if skip("[") {
let subtype = try parseNakedType()
try take("]")
return .specializedType(.namedType("Array"), [subtype])
} else if peek("(") {
let types = try parseMany("(", ",", ")") { try parseNakedType() }
if skip("->") {
let result = try parseNakedType()
return .functionType(types, result)
} else {
if types.count == 1 {
return types[0]
} else {
return .tupleType(types)
}
}
} else {
func grow(_ type: Type) throws -> Type {
if peek("<") {
let types = try parseMany("<", ",", ">") { try parseNakedType() }
return try grow(.specializedType(type, types))
} else if skip(".") {
let name = try parseTypeName()
return try grow(.selectType(type, name))
} else {
return type
}
}
let name = try parseTypeName()
let base: Type = name != "Self" ? .namedType(name) : .selfType
return try grow(base)
}
}