mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The macro name resolution in the source lookup cache was only looking at macros in the current module, meaning that any names introduced by peer or declaration macros declared in one module but used in another would not be found by name lookup. Switch the source lookup cache over to using the same `forEachPotentialResolvedMacro` API that is used by lookup within types, so we have consistent name-lookup-level macro resolution in both places. ... except that would be horribly cyclic, of course, so introduce name lookup flags to ignore top-level declarations introduced by macro expansions. This is semantically correct because macro expansions are not allowed to introduce new macros anyway, because that would have been a terrible idea. Fixes rdar://107321469. Peer and declaration macros at module scope should work a whole lot better now.
97 lines
3.0 KiB
C++
97 lines
3.0 KiB
C++
//===--- LookupKinds.h - Swift name-lookup enums ----------------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines enums relating to name lookup.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_LOOKUPKINDS_H
|
|
#define SWIFT_LOOKUPKINDS_H
|
|
|
|
namespace swift {
|
|
|
|
/// NLKind - This is a specifier for the kind of name lookup being performed
|
|
/// by various query methods.
|
|
enum class NLKind {
|
|
UnqualifiedLookup,
|
|
QualifiedLookup
|
|
};
|
|
|
|
void simple_display(llvm::raw_ostream &out, NLKind kind);
|
|
|
|
/// Constants used to customize name lookup.
|
|
enum NLOptions : unsigned {
|
|
/// Consider declarations within protocols to which the context type conforms.
|
|
NL_ProtocolMembers = 1 << 0,
|
|
|
|
/// Remove non-visible declarations from the set of results.
|
|
NL_RemoveNonVisible = 1 << 1,
|
|
|
|
/// Remove overridden declarations from the set of results.
|
|
NL_RemoveOverridden = 1 << 2,
|
|
|
|
/// Don't check access when doing lookup into a type.
|
|
///
|
|
/// This option is not valid when performing lookup into a module.
|
|
NL_IgnoreAccessControl = 1 << 3,
|
|
|
|
/// This lookup should only return type declarations.
|
|
NL_OnlyTypes = 1 << 4,
|
|
|
|
/// Include synonyms declared with @_implements()
|
|
NL_IncludeAttributeImplements = 1 << 5,
|
|
|
|
// Include @usableFromInline and @inlinable
|
|
NL_IncludeUsableFromInline = 1 << 6,
|
|
|
|
/// Exclude names introduced by macro expansions in the top-level module.
|
|
NL_ExcludeMacroExpansions = 1 << 7,
|
|
|
|
/// The default set of options used for qualified name lookup.
|
|
///
|
|
/// FIXME: Eventually, add NL_ProtocolMembers to this, once all of the
|
|
/// callers can handle it.
|
|
NL_QualifiedDefault = NL_RemoveNonVisible | NL_RemoveOverridden,
|
|
|
|
/// The default set of options used for unqualified name lookup.
|
|
NL_UnqualifiedDefault = NL_RemoveNonVisible | NL_RemoveOverridden
|
|
};
|
|
|
|
static inline NLOptions operator|(NLOptions lhs, NLOptions rhs) {
|
|
return NLOptions(unsigned(lhs) | unsigned(rhs));
|
|
}
|
|
static inline NLOptions &operator|=(NLOptions &lhs, NLOptions rhs) {
|
|
return (lhs = lhs | rhs);
|
|
}
|
|
static inline NLOptions operator&(NLOptions lhs, NLOptions rhs) {
|
|
return NLOptions(unsigned(lhs) & unsigned(rhs));
|
|
}
|
|
static inline NLOptions &operator&=(NLOptions &lhs, NLOptions rhs) {
|
|
return (lhs = lhs & rhs);
|
|
}
|
|
static inline NLOptions operator~(NLOptions value) {
|
|
return NLOptions(~(unsigned)value);
|
|
}
|
|
|
|
void simple_display(llvm::raw_ostream &out, NLOptions options);
|
|
|
|
|
|
/// Flags affecting module-level lookup.
|
|
enum class ModuleLookupFlags : unsigned {
|
|
/// Exclude names introduced by macro expansions in the top-level module.
|
|
ExcludeMacroExpansions = 1 << 0,
|
|
};
|
|
|
|
} // end namespace swift
|
|
|
|
#endif
|