[serialization] Preserve the implicit bit for patterns.

This is used by code completion to determine if curried
arguments are implicit, e.g. for method calls.

Swift SVN r6516
This commit is contained in:
Jordan Rose
2013-07-23 23:09:56 +00:00
parent 5689d1a4a4
commit be6c5b3707
5 changed files with 94 additions and 59 deletions

View File

@@ -117,12 +117,16 @@ Pattern *ModuleFile::maybeReadPattern() {
unsigned kind = DeclTypeCursor.readRecord(next.ID, scratch);
switch (kind) {
case decls_block::PAREN_PATTERN: {
bool isImplicit;
ParenPatternLayout::readRecord(scratch, isImplicit);
Pattern *subPattern = maybeReadPattern();
assert(subPattern);
auto result = new (ModuleContext->Ctx) ParenPattern(SourceLoc(),
subPattern,
SourceLoc());
SourceLoc(),
isImplicit);
result->setType(subPattern->getType());
return result;
}
@@ -130,8 +134,10 @@ Pattern *ModuleFile::maybeReadPattern() {
TypeID tupleTypeID;
unsigned count;
bool hasVararg;
bool isImplicit;
TuplePatternLayout::readRecord(scratch, tupleTypeID, count, hasVararg);
TuplePatternLayout::readRecord(scratch, tupleTypeID, count, hasVararg,
isImplicit);
SmallVector<TuplePatternElt, 8> elements;
for ( ; count > 0; --count) {
@@ -162,7 +168,7 @@ Pattern *ModuleFile::maybeReadPattern() {
auto result = TuplePattern::create(ModuleContext->Ctx, SourceLoc(),
elements, SourceLoc(), hasVararg,
SourceLoc());
SourceLoc(), isImplicit);
{
BCOffsetRAII restoreOffset(DeclTypeCursor);
result->setType(getType(tupleTypeID));
@@ -170,23 +176,24 @@ Pattern *ModuleFile::maybeReadPattern() {
return result;
}
case decls_block::NAMED_PATTERN: {
DeclID varID;
NamedPatternLayout::readRecord(scratch, varID);
bool isImplicit;
NamedPatternLayout::readRecord(scratch, varID, isImplicit);
BCOffsetRAII restoreOffset(DeclTypeCursor);
auto var = cast<VarDecl>(getDecl(varID));
auto result = new (ModuleContext->Ctx) NamedPattern(var);
auto result = new (ModuleContext->Ctx) NamedPattern(var, isImplicit);
if (var->hasType())
result->setType(var->getType());
return result;
}
case decls_block::ANY_PATTERN: {
TypeID typeID;
bool isImplicit;
AnyPatternLayout::readRecord(scratch, typeID);
auto result = new (ModuleContext->Ctx) AnyPattern(SourceLoc());
AnyPatternLayout::readRecord(scratch, typeID, isImplicit);
auto result = new (ModuleContext->Ctx) AnyPattern(SourceLoc(), isImplicit);
{
BCOffsetRAII restoreOffset(DeclTypeCursor);
result->setType(getType(typeID));
@@ -195,13 +202,15 @@ Pattern *ModuleFile::maybeReadPattern() {
}
case decls_block::TYPED_PATTERN: {
TypeID typeID;
bool isImplicit;
TypedPatternLayout::readRecord(scratch, typeID);
TypedPatternLayout::readRecord(scratch, typeID, isImplicit);
Pattern *subPattern = maybeReadPattern();
assert(subPattern);
TypeLoc typeInfo = TypeLoc::withoutLoc(getType(typeID));
auto result = new (ModuleContext->Ctx) TypedPattern(subPattern, typeInfo);
auto result = new (ModuleContext->Ctx) TypedPattern(subPattern, typeInfo,
isImplicit);
{
BCOffsetRAII restoreOffset(DeclTypeCursor);
result->setType(typeInfo.getType());