Revert "Sema: Make derived conformances work from extensions"

Speculatively revert; this looks like it is breaking the iOS bots.

Swift SVN r28963
This commit is contained in:
Ted Kremenek
2015-05-23 15:26:55 +00:00
parent 9917e74533
commit a575727a2b
18 changed files with 163 additions and 321 deletions

View File

@@ -3500,32 +3500,31 @@ static void addOperatorsAndTopLevel(Serializer &S, Range members,
bool isDerivedTopLevel,
bool isLocal = false) {
for (const Decl *member : members) {
if (auto memberValue = dyn_cast<ValueDecl>(member)) {
if (!memberValue->hasName())
continue;
auto memberValue = dyn_cast<ValueDecl>(member);
if (!memberValue)
continue;
if (isDerivedTopLevel) {
topLevelDecls[memberValue->getName()].push_back({
/*ignored*/0,
S.addDeclRef(memberValue, /*force=*/true)
});
} else if (memberValue->isOperator()) {
// Add operator methods.
// Note that we don't have to add operators that are already in the
// top-level list.
operatorMethodDecls[memberValue->getName()].push_back({
/*ignored*/0,
S.addDeclRef(memberValue)
});
}
if (isDerivedTopLevel) {
topLevelDecls[memberValue->getName()].push_back({
/*ignored*/0,
S.addDeclRef(memberValue, /*force=*/true)
});
} else if (memberValue->isOperator()) {
// Add operator methods.
// Note that we don't have to add operators that are already in the
// top-level list.
operatorMethodDecls[memberValue->getName()].push_back({
/*ignored*/0,
S.addDeclRef(memberValue)
});
}
// Recurse into nested declarations.
if (auto iterable = dyn_cast<IterableDeclContext>(member)) {
addOperatorsAndTopLevel(S, iterable->getMembers(),
// Recurse into nested types.
if (auto nominal = dyn_cast<NominalTypeDecl>(member)) {
addOperatorsAndTopLevel(S, nominal->getMembers(),
operatorMethodDecls, topLevelDecls, objcMethods,
false);
addOperatorsAndTopLevel(S, iterable->getDerivedGlobalDecls(),
addOperatorsAndTopLevel(S, nominal->getDerivedGlobalDecls(),
operatorMethodDecls, topLevelDecls, objcMethods,
true);
}
@@ -3539,7 +3538,7 @@ static void addOperatorsAndTopLevel(Serializer &S, Range members,
objcMethods[func->getObjCSelector()].push_back(
std::make_tuple(owningTypeID,
func->isObjCInstanceMethod(),
S.addDeclRef(func)));
S.addDeclRef(memberValue)));
}
}
}
@@ -3566,30 +3565,36 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
for (auto D : fileDecls) {
if (isa<ImportDecl>(D))
continue;
if (auto VD = dyn_cast<ValueDecl>(D)) {
else if (auto VD = dyn_cast<ValueDecl>(D)) {
if (!VD->hasName())
continue;
topLevelDecls[VD->getName()]
.push_back({ getKindForTable(D), addDeclRef(D) });
// Add operator methods from nominal types.
if (auto nominal = dyn_cast<NominalTypeDecl>(VD)) {
addOperatorsAndTopLevel(*this, nominal->getMembers(),
operatorMethodDecls, topLevelDecls,
objcMethods, false);
addOperatorsAndTopLevel(*this, nominal->getDerivedGlobalDecls(),
operatorMethodDecls, topLevelDecls,
objcMethods, true);
}
} else if (auto ED = dyn_cast<ExtensionDecl>(D)) {
Type extendedTy = ED->getExtendedType();
const NominalTypeDecl *extendedNominal = extendedTy->getAnyNominal();
extensionDecls[extendedNominal->getName()]
.push_back({ getKindForTable(extendedNominal), addDeclRef(D) });
// Add operator methods from extensions.
addOperatorsAndTopLevel(*this, ED->getMembers(),
operatorMethodDecls, topLevelDecls, objcMethods,
false);
} else if (auto OD = dyn_cast<OperatorDecl>(D)) {
operatorDecls[OD->getName()]
.push_back({ getStableFixity(OD->getKind()), addDeclRef(D) });
}
if (auto IDC = dyn_cast<IterableDeclContext>(D)) {
addOperatorsAndTopLevel(*this, IDC->getMembers(),
operatorMethodDecls, topLevelDecls,
objcMethods, false);
addOperatorsAndTopLevel(*this, IDC->getDerivedGlobalDecls(),
operatorMethodDecls, topLevelDecls,
objcMethods, true);
}
}
SmallVector<TypeDecl *, 16> localTypeDecls;
@@ -3609,11 +3614,11 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
addDeclRef(TD), TD->getLocalDiscriminator()
});
if (auto IDC = dyn_cast<IterableDeclContext>(TD)) {
addOperatorsAndTopLevel(*this, IDC->getMembers(),
if (auto nominal = dyn_cast<NominalTypeDecl>(TD)) {
addOperatorsAndTopLevel(*this, nominal->getMembers(),
operatorMethodDecls, topLevelDecls,
objcMethods, false, /*isLocal=*/true);
addOperatorsAndTopLevel(*this, IDC->getDerivedGlobalDecls(),
addOperatorsAndTopLevel(*this, nominal->getDerivedGlobalDecls(),
operatorMethodDecls, topLevelDecls,
objcMethods, true, /*isLocal=*/true);
}