Commit Graph

1871 Commits

Author SHA1 Message Date
Doug Gregor
41b6a42067 Clang importer: whitelist certain Objective-C protocols for renaming.
Rather than append the "Proto" suffix to all imported Objective-C
protocols, which can be confusing, whitelist those protocols that we
do have to rename. Only NSObject falls into this category so far.

Fixes <rdar://problem/15741699>.

Swift SVN r11856
2014-01-03 07:04:44 +00:00
Jordan Rose
b1b50a134e Autolinking: include all imported modules.
Although Cocoa.framework re-exports AppKit, Foundation, and CoreData, an
arbitrary library does not re-export most of its imports. Normally this
would be fine, but the Clang importer can pull in types too eagerly and
then generate thunks and wrappers for things we don't care about. At least
for now, return to the behavior of autolinking /anything/ that gets visibly
imported.

<rdar://problem/15705923>

Swift SVN r11844
2014-01-03 01:21:11 +00:00
Dmitri Hrybenko
7e56d75a1e Clang importer: don't import superfluous typedefs to tag decls that have the same name
Not only this creates less ASTs, but this makes the resulting AST correct (it
is invalid to have a struct and a typealias with the same name).  But the
primary motivation is AST pretty-printing: we don't want to print those extra
useless typealiases.


Swift SVN r11289
2013-12-14 01:39:03 +00:00
Connor Wakamo
af6da9b455 [ClangImporter] Adjusted ClangImporter::create so that it accepts a ClangImporterOptions instead of individual parameters.
Swift SVN r11240
2013-12-13 04:52:59 +00:00
Connor Wakamo
48a111b0b3 [ClangImporter] Switch ClangImporter::create from directly accepting search path information to using the ASTContext’s SearchPathOptions.
Swift SVN r11239
2013-12-13 04:52:59 +00:00
Dmitri Hrybenko
ee8a9af14d AST printer: add an option to print types qualified if they are possibly ambiguous
Swift SVN r11210
2013-12-12 21:25:05 +00:00
Dmitri Hrybenko
7ca3ce1102 Speedup lookup visible decls in Clang importer
... by removing a call to isVisibleFromModule() call, which did not filter
anything.


Swift SVN r11168
2013-12-12 01:18:23 +00:00
Dmitri Hrybenko
a3bb62d619 AST printing: print imports of submodules while printing Clang modules
Swift SVN r11165
2013-12-12 00:56:20 +00:00
Dmitri Hrybenko
7dacbe0eee AST printer: print import declarations while printing Clang modules
Swift SVN r11152
2013-12-11 23:12:27 +00:00
Jordan Rose
8730b47e44 Fix autolinking to properly find indirectly-imported adapter modules.
"import Cocoa" exposes the Swift adapter for Foundation, so we need to make
sure to link against both Cocoa.framework and libswiftFoundation.dylib.
We don't need to link against CoreData.framework, though; that's taken care
of by Cocoa.framework.

Swift SVN r11149
2013-12-11 22:51:48 +00:00
Dmitri Hrybenko
ab384164d0 Remove leftover testing code
Swift SVN r11050
2013-12-09 23:18:59 +00:00
Dmitri Hrybenko
e27001dbc7 Clang importer: determine the module for enums correctly while importing enum's
decl context


Swift SVN r11039
2013-12-09 22:19:47 +00:00
Argyrios Kyrtzidis
32da0cd744 [ClangImporter] Fix a crash in the clang importer, due to not taking into account imported macros.
Swift SVN r10994
2013-12-08 18:36:08 +00:00
Dmitri Hrybenko
b76dbb095f ClangModuleUnit::getTopLevelDecls: filter out declarations that come from re-exported modules
Swift SVN r10970
2013-12-07 02:28:18 +00:00
Dmitri Hrybenko
11ccb38e06 AST printer: use getDisplayDecls() to find a list of decls to print.
We are still not completely correct in determining which extensions to print,
will fix in future patches.


Swift SVN r10960
2013-12-07 00:54:05 +00:00
Dmitri Hrybenko
a19ab4985c ClangImporter::lookupVisibleDecls: actually populate the cache. No testcase
because we don't do more than one lookupVisibleDecls() call in tests...


Swift SVN r10958
2013-12-07 00:27:50 +00:00
Jordan Rose
417b5d3982 Merge TranslationUnit into Module, and eliminate the term "translation unit".
This completes the FileUnit refactoring. A module consists of multiple
FileUnits, which provide decls from various file-like sources. I say
"file-like" because the Builtin module is implemented with a single
BuiltinUnit, and imported Clang modules are just a single FileUnit source
within a module.

Most modules, therefore, contain a single file unit; only the main module
will contain multiple source files (and eventually partial AST files).

The term "translation unit" has been scrubbed from the project. To refer
to the context of declarations outside of any other declarations, use
"top-level" or "module scope". To refer to a .swift file or its DeclContext,
use "source file". To refer to a single unit of compilation, use "module",
since the model is that an entire module will be compiled with a single
driver call. (It will still be possible to compile a single source file
through the direct-to-frontend interface, but only in the context of the
whole module.)

Swift SVN r10837
2013-12-05 01:51:15 +00:00
Jordan Rose
f5eae17dd2 Move VectorDeclConsumer to swift/AST/NameLookup.h.
This started out life as a helper class, but it's been used in multiple places.
Better to just have a single copy.

No functionality change.

Swift SVN r10835
2013-12-05 01:51:12 +00:00
Jordan Rose
be12d86ddd Turn ClangModule into ClangModuleUnit.
Part of the FileUnit restructuring. A Clang module (whether from a framework
or a simple collection of headers) is now imported as a TranslationUnit
containing a single ClangModuleUnit.

One wrinkle in all this is that Swift very much wants to do searches on a
per-module basis, but Clang can only do lookups across the entire
TranslationUnit. Unless and until we get a better way to deal with this,
we're stuck with an inefficiency here. Previously, we used to hack around
this by ignoring the "per-module" bit and only performing one lookup into
all Clang modules, but that's not actually correct with respect to visibility.

Now, we're just taking the filtering hit for looking up a particular name,
and caching the results when we look up everything (for code completion).
This isn't ideal, but it doesn't seem to be costing too much in performance,
at least not right now, and it means we can get visibility correct.

In the future, it might make sense to include a ClangModuleUnit alongside a
SerializedASTFile for adapter modules, rather than having two separate
modules with the same name. I haven't really thought through this yet, though.

Swift SVN r10834
2013-12-05 01:51:11 +00:00
Jordan Rose
8b8cc8ee62 Turn SerializedModule into SerializedASTFile.
Part of the FileUnit restructuring. A serialized module is now represented as
a TranslationUnit containing a single SerializedASTFile.

As part of this change, the FileUnit interface has been made virtual, rather
than switching on the Kind in every accessor. We think the operations
performed on files are sufficiently high-level that this shouldn't affect us.

A nice side effect of all this is that we now properly model the visibility
of modules imported into source files. Previously, we would always consider
the top-level imports of all files within a target, whether re-exported or
not.

We may still end up wanting to distinguish properties of a complete Swift
module file from a partial AST file, but we can do that within
SerializedModuleLoader.

Swift SVN r10832
2013-12-05 01:51:09 +00:00
Jordan Rose
eede5ec4f9 Begin refactoring for mixed file kinds within a single module.
The goal of this series of commits is to allow the main module to consist
of both source files and AST files, where the AST files represent files
that were already built and don't need to be rebuilt, or of Swift source
files and imported Clang headers that share a module (because they are in
the same target).

Currently modules are divided into different kinds, and that defines how
decls are looked up, how imports are managed, etc. In order to achieve the
goal above, that polymorphism should be pushed down to the individual units
within a module, so that instead of TranslationUnit, BuiltinModule,
SerializedModule, and ClangModule, we have SourceFile, BuiltinUnit,
SerializedFile, and ClangUnit. (Better names welcome.) At that point we can
hopefully collapse TranslationUnit into Module and make Module non-polymorphic.

This commit makes SourceFile the subclass of an abstract FileUnit, and
makes TranslationUnit hold an array of FileUnits instead of SourceFiles.
To demonstrate that this is actually working, the Builtin module has also
been converted to FileUnit: it is now a TranslationUnit containing a single
BuiltinUnit.

Swift SVN r10830
2013-12-05 01:51:03 +00:00
Adrian Prantl
7fca2d8142 Debug info: Encode the provenance of types imported from Objective-C in
the debug info.
<rdar://problem/15414884> Debug information must indicate location of Objective-C types

Swift SVN r10580
2013-11-20 03:38:21 +00:00
Joe Groff
1650a3d75b ClangImporter: Remove common prefix of C enum case names from Swift names.
Swift enum cases are already namespaced to their type, but Cocoa NS_ENUM constants are manually namespaced with a common prefix, so if we imported them as-is, we'd end up with expressions like 'NSStringSearchOptions.NSStringSearchCaseSensitive'. To make this a bit nicer, look for a common prefix of camel-case words among all of the constants in the enum, and remove that prefix from the enum case names in the Swift interface.

In the case of a single enum case, we have no basis for determining a prefix, so do nothing. This case doesn't come up in the frameworks (that I can see).

Swift SVN r9993
2013-11-06 18:15:07 +00:00
Dmitri Hrybenko
eb6a32813a Clang importer: correctly find the Clang module that corresponds to the decl
A single swift module can correspond to multiple Clang submodules.  We need to
ask the underlying clang::Decl about the owning Clang module to get the most
precise answer.


Swift SVN r9859
2013-10-31 22:56:48 +00:00
Dmitri Hrybenko
679b254469 Clang importer: don't verify imported modules if we verified them already
This helps improve responsiveness of code completion in REPL.


Swift SVN r9661
2013-10-24 22:38:01 +00:00
Dmitri Hrybenko
8d8b60f973 Code completion: implement result caching per-imported module across muptiple
ASTContexts

This introduces swift::ide::CodeCompletionCache, which is a persistent code
completion result cache.

Right now REPL happens to use it (try importing Cocoa and doing code
completion), and the difference is noticeable.  But completion in REPL is
still slow, because Cocoa goes through the AST Verifier on every completion
(for unknown reasons).

This commit does not implement cache invalidation yet, and it does not use
libcache to evict cache entries under memory pressure.

This commit also introduces two regressions:
- We get fewer Cocoa results that expected.  Module::isModuleVisible in Clang
does not incorrectly reports that that ObjectiveC.NSObject submodule is not
visible from Cocoa.

- We are not implementing the decl hiding rules correctly.  We used to rely on
visible decl lookup to do it for us, but now we have a different data structure
we have real decls from the current module and we have a text-only cache, so we
are forced to reimplement this part of name lookup in code completion.


Swift SVN r9633
2013-10-24 02:13:34 +00:00
Jordan Rose
1ecf1fb593 Distribute Module's lookup cache to its subclasses.
Each one has a different kind of lookup cache anyway, and there's no real
reason to have them share storage at the cost of type-safety.

Swift SVN r9242
2013-10-12 00:08:09 +00:00
Jordan Rose
7b936e2b85 Remove unfinished notion of "Component" (originally for resilience).
docs/Resilience.rst describes the notion of a resilience component:
if the current source file is in the same component as a module being
used, it can use fragile access for everything in the other module,
with the assumption that everything in a component will always be
recompiled together.

However, nothing is actually using this today, and the interface we
have is probably not what we'll want in 2.0, when we actually implement
resilience.

Swift SVN r9174
2013-10-10 21:41:57 +00:00
Jordan Rose
266c445b3c Push ASTStage down into SourceFile.
This was only meaningful for TranslationUnit anyway, and it may help
avoid repeating work in the future.

Swift SVN r9079
2013-10-09 18:38:28 +00:00
Dmitri Hrybenko
6895c34741 Code completion: report "semantic context" for every code completion result
Semantic context describes the origin of the declaration and serves the same
purpose as opaque numeric "priority" in Clang -- to determine the most likely
completion.

This is the initial implementation.  There are a few opportunities to bump the
priority of a certain decl by giving it SemanticContextKind::ExprSpecific
context that are not implemented yet.


Swift SVN r9052
2013-10-09 02:08:05 +00:00
Argyrios Kyrtzidis
3e2f360e45 [AST] In the ModuleKind enum class, shorten enumerators by removing 'Module'. No functionality change.
Swift SVN r8933
2013-10-04 21:29:22 +00:00
Dmitri Hrybenko
6a122e1d88 Clang module importer / code completion for DynamicLookup: when enumerating
decls accessible from DynamicLookup, don't import properties twice and don't
report properties with setters twice


Swift SVN r8858
2013-10-02 22:29:49 +00:00
Dmitri Hrybenko
14c0de117a Clang importer, lookupClassMembers(): return SubscriptDecls when enumerating
all class members

Code completion for DynamicLookup: add tests for imported ObjC classes


Swift SVN r8827
2013-10-02 00:08:21 +00:00
Argyrios Kyrtzidis
f0773bcba1 Rename '__subscript' -> 'subscript'.
Since 'subscript' is a keyword, it cannot conflict with a function name.

Swift SVN r8787
2013-09-30 19:17:29 +00:00
Doug Gregor
8b3d906ef7 Improve handling of Objective-C properties with dynamic lookup.
We want dynamic lookup to find the property, not the method, when
looking into an Objective-C module.


Swift SVN r8727
2013-09-27 17:08:27 +00:00
Doug Gregor
e1204bf388 Clean up handling of subscript imports from Objective-C modules.
I'm still not thrilled with this code, but it needs more thought. This
completes <rdar://problem/14656624>.


Swift SVN r8719
2013-09-27 03:58:03 +00:00
Doug Gregor
c4a065abce Teach dynamic lookup to find subscript operators.
The name used for name lookup of subscript operators is "__subscript",
but when looking into an Objective-C module we instead need to look
for methods with the subscripting selectors, e.g.,
objectAtIndexedSubscript:/objectForKeyedSubscript:. Do so, and make
sure that deserializing the method first still creates the subscript
declaration.

Fixes the majority of <rdar://problem/14656624>. We can subscript 'id' now.



Swift SVN r8700
2013-09-26 21:42:45 +00:00
Doug Gregor
aa761fbe89 Teach Clang importer to find Objective-C class methods.
Swift SVN r8488
2013-09-20 14:50:58 +00:00
Argyrios Kyrtzidis
6ee8877fbd [frontend] Enhance CompilerInvocation to accept an array of extra arguments to pass to the clang importer.
Swift SVN r8175
2013-09-13 01:16:28 +00:00
Dmitri Hrybenko
37ee3a210c Run AST verifier on modules produced by Clang importer and fix bugs found by it
Fixes two bugs in Clang importer and deserialization code that were found by
the verifier:

(1) FuncExprs were created with a null FuncDecl

(2) BoundGenericType that was created by Clang importer for UnsafePtr<> and
    other magic types did not have substitutions.


Swift SVN r8073
2013-09-10 18:22:12 +00:00
Chris Lattner
55200e5274 Now that Module has its own kind field, drop the various module
discriminators from DeclContext.  This is cleaner and should
enable us to drop the alignment of DeclContext (coming next Jordan!)



Swift SVN r8059
2013-09-09 22:43:11 +00:00
Chris Lattner
53e0f11141 Introduce a new ModuleKind enum to implement RTTI for module downcasting.
No functionality change.



Swift SVN r8053
2013-09-09 21:53:21 +00:00
Argyrios Kyrtzidis
36a469df0b [modules] Introduce Module::getTopLevelDecls() to get the local-in-module top-level decls.
getDisplayDecls() was introduced for ":print_module" and works slightly differently, e.g.
it will return the decls from a shadowed clang module, since we want to display them.

Swift SVN r7909
2013-09-04 20:55:27 +00:00
Argyrios Kyrtzidis
2a6dc12607 [modules] Introduce APIs to get the path for the file that a module came from.
Swift SVN r7890
2013-09-04 01:57:53 +00:00
Jordan Rose
9b9e669bf7 Add support for :print_module on Clang modules.
This isn't very efficient: it scans every decl in the Clang TU (forcing
deserialization) and filters based on the decl's enclosing module.
Moreover, since getClangModuleForDecl() currently only handles top-level
modules, all submodules get implicitly added to the top-level module...
and will /not/ match an explicit submodule request.

(This is probably close to the behavior we actually want: include decls that
are from modules that are (a) submodules and (b) re-exported by the top-level
module. We do want that extra check, though, and we would want to find things
specifically by submodule.)

Swift SVN r7602
2013-08-26 23:07:54 +00:00
Jordan Rose
7d6d336983 Add autolinking infrastructure to Module and ClangImporter.
...and use it to load frameworks and libraries in immediate modes (-i and
the REPL), replacing a walk of visible modules that checked if any imported
modules were Clang modules.

Swift SVN r7488
2013-08-22 23:20:23 +00:00
Jordan Rose
f1bc7801f4 Rework getReexportedModules to optionally find all imported modules.
...instead of just those that are re-exported. This will be used for
autolinking (and probably few other places).

As part of this, we get two name changes:
  (1) Module::getReexportedModules -> getImportedModules
  (2) TranslationUnit::getImportedModules -> getImports

The latter doesn't just get modules-plus-access-paths; it also includes
whether or not the import is re-exported. Mainly, though, it just didn't
seem like a good idea to overload this name when the two functions aren't
really related.

No tests yet, will come with autolinking.

Swift SVN r7487
2013-08-22 23:20:18 +00:00
Argyrios Kyrtzidis
0306a7f416 [ClangImporter] Stop ClangImporter from trying to figure out where the swift runtime library is,
this should be the responsibility of the caller to provide it.

Swift SVN r7480
2013-08-22 21:49:30 +00:00
Argyrios Kyrtzidis
ae65ab1ee0 Introduce NullClangImporter library which is for clients that don't want to link Clang.
ClangImporter::create had a 'weak' attribute but it did not actually have the desired effect,
static libraries still want to link to ClangImporter::create if it is used.
Avoiding linking ClangImporter kinda "worked" because CompilerInvocation::setSDKPath was inline,
so if you didn't call it then you didn't need to link to Clang importer, but that is avoiding
ClangImporter statically, not dynamically.
You could see this by moving CompilerInvocation::setSDKPath out-of-line and then sil-opt would fail to link.

In order to have clients avoiding linking Clang, introduce NullClangImporter which just returns null for the
ClangImporter constructor function.

Swift SVN r7465
2013-08-22 18:29:58 +00:00
Jordan Rose
4cefdf263c [ClangImporter] Don't unique selector names when doing id-style lookup.
Dmitri pointed out that we're just bloating the AST context's identifier
table and not actually saving any string comparison. StringRef's == is
pretty efficient anyway.

Swift SVN r7339
2013-08-19 22:45:14 +00:00