Implement type sugar "T?" for Optional<T>.

- New type representation OptionalTypeRepr.
- New sugared type OptionalType.
- New base type SyntaxSugarType, parent of ArraySliceType and OptionalType.
  These two are the same in a lot of ways.
- The form "T[]?" is forbidden, because it makes "Int[4][2]" oddly
  different from "Int[4]?[2]". The type can be spelled "(T[])?" or
  Optional<T[]>.
- Like Slice, "Optional" is just looked up in the current module. This may
  or may not be the desired behavior in the long run.

<rdar://problem/14666783>

Swift SVN r7100
This commit is contained in:
Jordan Rose
2013-08-09 21:33:36 +00:00
parent f736e1711c
commit 88cad52d72
17 changed files with 290 additions and 58 deletions

View File

@@ -1892,6 +1892,20 @@ Type ModuleFile::getType(TypeID TID) {
break;
}
case decls_block::OPTIONAL_TYPE: {
TypeID baseID, implID;
decls_block::OptionalTypeLayout::readRecord(scratch, baseID, implID);
auto optionalTy = OptionalType::get(getType(baseID), ctx);
typeOrOffset = optionalTy;
// Optional types are uniqued by the ASTContext, so they may already have
// type information. If so, ignore the information in the module.
if (!optionalTy->hasImplementationType())
optionalTy->setImplementationType(getType(implID));
break;
}
case decls_block::ARRAY_TYPE: {
TypeID baseID;
uint64_t size;