本文整理汇总了C++中TypeChecker::getLangOpts方法的典型用法代码示例。如果您正苦于以下问题:C++ TypeChecker::getLangOpts方法的具体用法?C++ TypeChecker::getLangOpts怎么用?C++ TypeChecker::getLangOpts使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TypeChecker
的用法示例。
在下文中一共展示了TypeChecker::getLangOpts方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: isDeclAsSpecializedAs
/// \brief Determine whether the first declaration is as "specialized" as
/// the second declaration.
///
/// "Specialized" is essentially a form of subtyping, defined below.
static bool isDeclAsSpecializedAs(TypeChecker &tc, DeclContext *dc,
ValueDecl *decl1, ValueDecl *decl2) {
if (tc.getLangOpts().DebugConstraintSolver) {
auto &log = tc.Context.TypeCheckerDebug->getStream();
log << "Comparing declarations\n";
decl1->print(log);
log << "\nand\n";
decl2->print(log);
log << "\n";
}
if (!tc.specializedOverloadComparisonCache.count({decl1, decl2})) {
auto compareSpecializations = [&] () -> bool {
// If the kinds are different, there's nothing we can do.
// FIXME: This is wrong for type declarations, which we're skipping
// entirely.
if (decl1->getKind() != decl2->getKind() || isa<TypeDecl>(decl1))
return false;
// A non-generic declaration is more specialized than a generic declaration.
if (auto func1 = dyn_cast<AbstractFunctionDecl>(decl1)) {
auto func2 = cast<AbstractFunctionDecl>(decl2);
if (static_cast<bool>(func1->getGenericParams()) !=
static_cast<bool>(func2->getGenericParams()))
return func2->getGenericParams();
}
// A witness is always more specialized than the requirement it satisfies.
switch (compareWitnessAndRequirement(tc, dc, decl1, decl2)) {
case Comparison::Unordered:
break;
case Comparison::Better:
return true;
case Comparison::Worse:
return false;
}
// Members of protocol extensions have special overloading rules.
ProtocolDecl *inProtocolExtension1 = decl1->getDeclContext()
->getAsProtocolExtensionContext();
ProtocolDecl *inProtocolExtension2 = decl2->getDeclContext()
->getAsProtocolExtensionContext();
if (inProtocolExtension1 && inProtocolExtension2) {
// Both members are in protocol extensions.
// Determine whether the 'Self' type from the first protocol extension
// satisfies all of the requirements of the second protocol extension.
DeclContext *dc1 = decl1->getDeclContext();
DeclContext *dc2 = decl2->getDeclContext();
bool better1 = isProtocolExtensionAsSpecializedAs(tc, dc1, dc2);
bool better2 = isProtocolExtensionAsSpecializedAs(tc, dc2, dc1);
if (better1 != better2) {
return better1;
}
} else if (inProtocolExtension1 || inProtocolExtension2) {
// One member is in a protocol extension, the other is in a concrete type.
// Prefer the member in the concrete type.
return inProtocolExtension2;
}
Type type1 = decl1->getInterfaceType();
Type type2 = decl2->getInterfaceType();
/// What part of the type should we check?
enum {
CheckAll,
CheckInput,
} checkKind;
if (isa<AbstractFunctionDecl>(decl1) || isa<EnumElementDecl>(decl1)) {
// Nothing to do: these have the curried 'self' already.
if (auto elt = dyn_cast<EnumElementDecl>(decl1)) {
checkKind = elt->hasArgumentType() ? CheckInput : CheckAll;
} else {
checkKind = CheckInput;
}
} else {
// Add a curried 'self' type.
assert(!type1->is<GenericFunctionType>() && "Odd generic function type?");
assert(!type2->is<GenericFunctionType>() && "Odd generic function type?");
type1 = addCurriedSelfType(tc.Context, type1, decl1->getDeclContext());
type2 = addCurriedSelfType(tc.Context, type2, decl2->getDeclContext());
// For a subscript declaration, only look at the input type (i.e., the
// indices).
if (isa<SubscriptDecl>(decl1))
checkKind = CheckInput;
else
checkKind = CheckAll;
}
// Construct a constraint system to compare the two declarations.
ConstraintSystem cs(tc, dc, ConstraintSystemOptions());
//.........这里部分代码省略.........
示例2: isDeclAsSpecializedAs
/// \brief Determine whether the first declaration is as "specialized" as
/// the second declaration.
///
/// "Specialized" is essentially a form of subtyping, defined below.
static bool isDeclAsSpecializedAs(TypeChecker &tc, DeclContext *dc,
ValueDecl *decl1, ValueDecl *decl2) {
if (tc.getLangOpts().DebugConstraintSolver) {
auto &log = tc.Context.TypeCheckerDebug->getStream();
log << "Comparing declarations\n";
decl1->print(log);
log << "\nand\n";
decl2->print(log);
log << "\n";
}
if (!tc.specializedOverloadComparisonCache.count({decl1, decl2})) {
auto compareSpecializations = [&] () -> bool {
// If the kinds are different, there's nothing we can do.
// FIXME: This is wrong for type declarations, which we're skipping
// entirely.
if (decl1->getKind() != decl2->getKind() || isa<TypeDecl>(decl1))
return false;
// A non-generic declaration is more specialized than a generic declaration.
if (auto func1 = dyn_cast<AbstractFunctionDecl>(decl1)) {
auto func2 = cast<AbstractFunctionDecl>(decl2);
if (static_cast<bool>(func1->getGenericParams()) !=
static_cast<bool>(func2->getGenericParams()))
return func2->getGenericParams();
}
// A witness is always more specialized than the requirement it satisfies.
switch (compareWitnessAndRequirement(tc, dc, decl1, decl2)) {
case Comparison::Unordered:
break;
case Comparison::Better:
return true;
case Comparison::Worse:
return false;
}
// Members of protocol extensions have special overloading rules.
ProtocolDecl *inProtocolExtension1 = decl1->getDeclContext()
->isProtocolExtensionContext();
ProtocolDecl *inProtocolExtension2 = decl2->getDeclContext()
->isProtocolExtensionContext();
if (inProtocolExtension1 && inProtocolExtension2) {
// Both members are in protocol extensions.
// Determine whether the 'Self' type from the first protocol extension
// satisfies all of the requirements of the second protocol extension.
DeclContext *dc1 = decl1->getDeclContext();
DeclContext *dc2 = decl2->getDeclContext();
bool better1 = isProtocolExtensionAsSpecializedAs(tc, dc1, dc2);
bool better2 = isProtocolExtensionAsSpecializedAs(tc, dc2, dc1);
if (better1 != better2) {
return better1;
}
} else if (inProtocolExtension1 || inProtocolExtension2) {
// One member is in a protocol extension, the other is in a concrete type.
// Prefer the member in the concrete type.
return inProtocolExtension2;
}
Type type1 = decl1->getInterfaceType();
Type type2 = decl2->getInterfaceType();
/// What part of the type should we check?
enum {
CheckAll,
CheckInput,
} checkKind;
if (isa<AbstractFunctionDecl>(decl1) || isa<EnumElementDecl>(decl1)) {
// Nothing to do: these have the curried 'self' already.
if (auto elt = dyn_cast<EnumElementDecl>(decl1)) {
checkKind = elt->hasArgumentType() ? CheckInput : CheckAll;
} else {
checkKind = CheckInput;
}
} else {
// Add a curried 'self' type.
assert(!type1->is<GenericFunctionType>() && "Odd generic function type?");
assert(!type2->is<GenericFunctionType>() && "Odd generic function type?");
type1 = addCurriedSelfType(tc.Context, type1, decl1->getDeclContext());
type2 = addCurriedSelfType(tc.Context, type2, decl2->getDeclContext());
// For a subscript declaration, only look at the input type (i.e., the
// indices).
if (isa<SubscriptDecl>(decl1))
checkKind = CheckInput;
else
checkKind = CheckAll;
}
// Construct a constraint system to compare the two declarations.
ConstraintSystem cs(tc, dc, ConstraintSystemOptions());
//.........这里部分代码省略.........
示例3: isDeclAsSpecializedAs
/// \brief Determine whether the first declaration is as "specialized" as
/// the second declaration.
///
/// "Specialized" is essentially a form of subtyping, defined below.
static bool isDeclAsSpecializedAs(TypeChecker &tc, DeclContext *dc,
ValueDecl *decl1, ValueDecl *decl2) {
if (tc.getLangOpts().DebugConstraintSolver) {
auto &log = tc.Context.TypeCheckerDebug->getStream();
log << "Comparing declarations\n";
decl1->print(log);
log << "\nand\n";
decl2->print(log);
log << "\n";
}
auto *innerDC1 = decl1->getInnermostDeclContext();
auto *innerDC2 = decl2->getInnermostDeclContext();
auto *outerDC1 = decl1->getDeclContext();
auto *outerDC2 = decl2->getDeclContext();
if (!tc.specializedOverloadComparisonCache.count({decl1, decl2})) {
auto compareSpecializations = [&] () -> bool {
// If the kinds are different, there's nothing we can do.
// FIXME: This is wrong for type declarations, which we're skipping
// entirely.
if (decl1->getKind() != decl2->getKind() || isa<TypeDecl>(decl1))
return false;
// A non-generic declaration is more specialized than a generic declaration.
if (auto func1 = dyn_cast<AbstractFunctionDecl>(decl1)) {
auto func2 = cast<AbstractFunctionDecl>(decl2);
if (func1->isGeneric() != func2->isGeneric())
return func2->isGeneric();
}
if (auto subscript1 = dyn_cast<SubscriptDecl>(decl1)) {
auto subscript2 = cast<SubscriptDecl>(decl2);
if (subscript1->isGeneric() != subscript2->isGeneric())
return subscript2->isGeneric();
}
// Members of protocol extensions have special overloading rules.
ProtocolDecl *inProtocolExtension1 = outerDC1
->getAsProtocolExtensionContext();
ProtocolDecl *inProtocolExtension2 = outerDC2
->getAsProtocolExtensionContext();
if (inProtocolExtension1 && inProtocolExtension2) {
// Both members are in protocol extensions.
// Determine whether the 'Self' type from the first protocol extension
// satisfies all of the requirements of the second protocol extension.
bool better1 = isProtocolExtensionAsSpecializedAs(tc, outerDC1, outerDC2);
bool better2 = isProtocolExtensionAsSpecializedAs(tc, outerDC2, outerDC1);
if (better1 != better2) {
return better1;
}
} else if (inProtocolExtension1 || inProtocolExtension2) {
// One member is in a protocol extension, the other is in a concrete type.
// Prefer the member in the concrete type.
return inProtocolExtension2;
}
Type type1 = decl1->getInterfaceType();
Type type2 = decl2->getInterfaceType();
/// What part of the type should we check?
enum {
CheckAll,
CheckInput,
} checkKind;
if (isa<AbstractFunctionDecl>(decl1) || isa<EnumElementDecl>(decl1)) {
// Nothing to do: these have the curried 'self' already.
if (auto elt = dyn_cast<EnumElementDecl>(decl1)) {
checkKind = elt->hasAssociatedValues() ? CheckInput : CheckAll;
} else {
checkKind = CheckInput;
}
} else {
// Add a curried 'self' type.
type1 = addCurriedSelfType(tc.Context, type1, outerDC1);
type2 = addCurriedSelfType(tc.Context, type2, outerDC2);
// For a subscript declaration, only look at the input type (i.e., the
// indices).
if (isa<SubscriptDecl>(decl1))
checkKind = CheckInput;
else
checkKind = CheckAll;
}
// Construct a constraint system to compare the two declarations.
ConstraintSystem cs(tc, dc, ConstraintSystemOptions());
bool knownNonSubtype = false;
auto locator = cs.getConstraintLocator(nullptr);
// FIXME: Locator when anchored on a declaration.
// Get the type of a reference to the second declaration.
OpenedTypeMap unused;
//.........这里部分代码省略.........