Commit Graph

6196 Commits

Author SHA1 Message Date
Jordan Rose
5779d43238 [ClangImporter] Resolve forward @protocol declarations like we do @class.
When we see an unresolved @protocol in a Clang module, we now check the name
against the protocols in the Swift module with the same name like we do for
classes.

More <rdar://problem/16295994>

Swift SVN r15472
2014-03-25 23:16:01 +00:00
Jordan Rose
d98030b9d9 [ClangImporter] Include the enum type name in enum prefix stripping.
This keeps us from accidentally stripping off something semantically
meaningful, like in Foundation's NSDirectoryEnumerationOptions:

  NSDirectoryEnumerationSkipsSubdirectoryDescendants
  NSDirectoryEnumerationSkipsPackageDescendants
  NSDirectoryEnumerationSkipsHiddenFiles

<rdar://problem/15496513>

Swift SVN r15436
2014-03-25 01:43:20 +00:00
Jordan Rose
694987defc [ClangImporter] Don't mirror root class methods returning instancetype.
In Objective-C, all instance methods on a root class are also available as
class methods (because all class objects in Objective-C are instances of the
root class). However, we were incorrectly introducing class methods that
returned 'Self' (instead of 'Self.Type') for every instance method with a
related result type. Returning 'Self.Type' exposes a new type checker bug
<rdar://problem/16414206>, but in practice we don't have much reason to do
this anyway. For now, just don't try to mirror instancetype-returning methods
as class methods.

Swift SVN r15435
2014-03-25 01:19:58 +00:00
Jordan Rose
608fee70f1 Replace ASTMutationListener with a new LazyResolver callback.
..."resolveExternalDeclImplicitMembers".

Now that the ClangImporter has direct access to the type-checker (through
a LazyResolver), there's no reason to bounce through an obtusely generic
interface on ASTContext. Just call through directly to handle the implicit
members and conformances of external decls.

There's no actual functionality change here, though we can probably do
further cleanup in this area.

Swift SVN r15356
2014-03-22 00:20:00 +00:00
Jordan Rose
8d35d75ce3 [ClangImporter] Resolve forward class declarations to definitions in Swift.
When we see an unresolved @class in a Clang module, we check the class name
against the classes in the Swift module with the same name.

This unfortunately necessitates putting a reference to the active type checker
into the ClangImporter, because the class in the current Swift module hasn't
been type-checked yet. This is now being used everywhere we do a lookup.

<rdar://problem/16295994>

Swift SVN r15355
2014-03-22 00:19:59 +00:00
Chris Lattner
1f275532a6 now that nothing uses the PatternBindingDecl::HasStorage bit, there is no
reason to compute it, store it, serialize it, etc.  Remove the associated
logic.



Swift SVN r15302
2014-03-20 22:49:43 +00:00
Doug Gregor
1a25251ea6 Selector splitting: "scaleXBy" is three words, not two.
Swift SVN r15299
2014-03-20 21:38:04 +00:00
Doug Gregor
024b8d655c When splitting before a preposition, do so even if nothing follows the preposition.
This is more consistent.


Swift SVN r15298
2014-03-20 21:27:12 +00:00
Doug Gregor
5d0abd9849 Another preposition splitting option: directional prepositions.
Swift SVN r15297
2014-03-20 21:24:57 +00:00
Doug Gregor
b71a67616e Add option to split after the last preposition.
Swift SVN r15264
2014-03-20 04:01:40 +00:00
Jordan Rose
84d9be5610 [ClangImporter] Don't attach Clang decls to defined-in-Swift classes.
(and protocols)

I had missed this check before. It probably made very little difference, but
we use "hasClangNode" to mean "defined-in-Objective-C", so it's better to get
this correct.

The test change is fairly minimal: not giving the class a Clang node means we
have to find it by lookup, but the Objective-C part of the "Base" module
wasn't actually considered visible by Clang. In a real situation the "Base"
module would be a proper framework and both halves of the module would have
been imported, as tested by the mixed-language test.

Swift SVN r15248
2014-03-19 21:17:30 +00:00
Doug Gregor
e03cb7c0a0 Don't split when the preposition is the last word in the first selector piece.
Swift SVN r15244
2014-03-19 20:15:50 +00:00
Dmitri Hrybenko
52c69d038f Selector splitting: use ASCII-only APIs to process strings, and align detection
of 'init' method family with Clang (it looks like 'init123' would count as init
method in Clang, but not in the initial implementation of selector splitting in
Swift).


Swift SVN r15189
2014-03-18 12:04:49 +00:00
Dmitri Hrybenko
bca2205b29 Try harder at reverting the commit that disallowed importing "new"
Swift SVN r15188
2014-03-18 11:43:22 +00:00
Doug Gregor
730211196c Use escaped identifiers rather than restricting the importer.
I completely forgot about this feature. This tests the previous commit
to make escaped identifiers work.

Swift SVN r15179
2014-03-18 01:05:45 +00:00
Doug Gregor
1f5fce95c1 Preposition splitting: don't name a method "new" due to splitting.
It turns out that "new" is a truly awful reserved word to have in the
land of Cocoa.

Swift SVN r15176
2014-03-18 00:45:02 +00:00
Doug Gregor
04cb606a07 Uppercase prepositions.
Thanks, Dmitri!

Swift SVN r15162
2014-03-17 22:26:03 +00:00
Doug Gregor
e5fff12bf0 Add option to split Objective-C selectors based on the last preposition.
The frontend option -split-objc-selectors splits the first part of an
Objective-C selector into both a function name and the first parameter
name at the last preposition. For example, this Objective-C method:

  - (NSString *)stringByPaddingToLength:(NSUInteger)newLength withString:(NSString *)padString startingAtIndex:(NSUInteger)padIndex

is imported as

  func stringByPadding toLength(newLength: Int) withString(padString: String) startingAtIndex(padIndex: Int) -> String




Swift SVN r15156
2014-03-17 20:34:48 +00:00
Jordan Rose
c7804dc779 When loading a Swift framework module, see if it's also a Clang module.
In a framework containing both Clang headers and a Swift module, the Swift
module gets picked up first, but then automatically imports (and re-exports)
the Clang module as well.

One interesting case here is that it's possible for the Clang side to add
categories to a class declared in Swift. In order to support this, the
Clang importer can now find extensions for Swift classes marked @objc.
(I couldn't think of a way to test this separately; the previous commit
was supposed to do that, but worked without this change.)

<rdar://problem/16295937>

Swift SVN r15084
2014-03-14 22:21:08 +00:00
Doug Gregor
8cf018a1d2 Give Pattern::clone() an OptionSet rather than a bool; it's going to get more interesting.
Swift SVN r15061
2014-03-14 18:31:21 +00:00
Jordan Rose
455e96e955 @objc should be enough to make a protocol a class protocol.
There are very few times where we'd want to use @class_protocol outside of
@objc, and it feels weird to tell someone coming from Objective-C that they
need to mark their already-@objc protocol as @class_protocol. Instead, just
change ProtocolDecl::requiresClass to check for @objc.

(The commit checks for /both/ @objc-the-attribute and the IsObjC flag.
This is to give the right answer before type-checking, or at least the
likely-intended answer.)

<rdar://problem/16302887>

Swift SVN r15060
2014-03-14 17:56:07 +00:00
Doug Gregor
ea7e70bbf7 Automatically inherit subobject initializers when none are explicitly defined.
If a subclass defines no subobject initializers and all of its stored
properties have initial values, "inherit" all of the subobject
initializers of its superclass by creating a new initializer with the
same signature that overrides (and chains to) the corresponding
subobject initializer of its parent. Do this instead of blindly
creating a default initializer.

Note that we aren't yet doing this for generic initializers. That will
be a separate step.

Swift SVN r14995
2014-03-13 18:43:30 +00:00
Jordan Rose
12964f2e27 [ClangImporter] Resolve generated header protocols to native decls as well.
This is the same as the previous commit, but for protocols. To do this I
had to modify the ObjC printer to include a SWIFT_PROTOCOL annotation like
the SWIFT_CLASS annotation already in use. This is probably a good thing
anyway.

Second half of <rdar://problem/16296027>

Swift SVN r14985
2014-03-13 00:19:12 +00:00
Jordan Rose
64debb657d [ClangImporter] Match up classes in generated headers with native classes.
This is necessary to handle Swift code using API defined in Objective-C
that itself uses classes defined in Swift. Protocols coming next.

First half of <rdar://problem/16296027>

Swift SVN r14984
2014-03-13 00:19:10 +00:00
Joe Groff
c7251df2f1 Clang importer: set the AllArchetypes of imported protocol decl generic param lists.
Swift SVN r14961
2014-03-12 18:32:58 +00:00
Jordan Rose
949064bb06 [ClangImporter] For now, treat the runtime resources as user headers.
...so that the Clang module machinery will check that the generated pcm
is up-to-date.

We probably want this to be considered a system header in the long run,
but this is a quick fix for those working on the standard library.

<rdar://problem/16285900>

Swift SVN r14926
2014-03-11 21:12:05 +00:00
Joe Groff
8e2521e8c2 SILGen: Emit derived '==' operators from Clang modules with shared linkage.
In Sema, give derived '==' definitions the module's DerivedFileUnit as their decl context instead of the more general Module, and give it a backreference to the nominal type for which it was derived. 
In SILGen, visit the derived global decls associated with Clang-imported enums, and give them shared linkage. Part of fixing <rdar://problem/16264703>.

Swift SVN r14875
2014-03-10 20:33:54 +00:00
Dmitri Hrybenko
c330a18a61 Remove stale comment
Swift SVN r14869
2014-03-10 15:25:39 +00:00
Doug Gregor
163d2fa24d [Clang importer] Go back to mirroring superclass initializers in subclasses.
When importing an Objective-C class, import all of the initializers in
all of its superclasses. When we have no information about designated
initializers for a class, the initializers come in as subobject
initializers. When we do have information about designated
initializers, we (1) use it to sort out subobject from complete object
initializers in that class, and (2) assume that all initializers from
superclasses are complete object initializers. Overall, this better
matches Objective-C's semantics.



Swift SVN r14841
2014-03-09 08:01:37 +00:00
Jordan Rose
a36a81d59c [ClangImporter] For now, don't import block pointers as optional.
We want to do this, but let's take things one step at a time. Objects first.

Swift SVN r14818
2014-03-08 02:11:50 +00:00
Jordan Rose
b9d1e14dd6 [serialization] Break a cyclic dependency involving associated types.
The standard library likes to have default definitions for associated types,
which is good. Often the /choice/ of default type, however, is a type that
(indirectly) conforms to the very protocol containing the associated type.
Rather than try to make sure everything is present all at once, just delay
the deserialization of the default definition until it's actually requested.

This does swell the size of AssociatedTypeDecl by two words. I've filed
<rdar://problem/16266669> to remind myself to try to reduce this.

Part of <rdar://problem/16257259>

Swift SVN r14809
2014-03-08 00:07:29 +00:00
Joe Groff
5bb6c6a39c ClangImporter: Import ObjCMethod selector names as Swift DeclNames.
This gets selector references working for imported ObjC methods.

Swift SVN r14797
2014-03-07 22:43:05 +00:00
Jordan Rose
921f93ddf4 [ClangImporter] Allow importing modules even without an SDK.
In these cases, disable the standard system include paths so we don't
accidentally pick up headers in /.

This is going to be used by the runtime team for low-level interfaces with
C and Objective-C in the standard library.

Swift SVN r14789
2014-03-07 20:03:12 +00:00
Joe Groff
96c09d7179 Renovate name lookup to prepare for compound name lookup.
Make the name lookup interfaces all take DeclNames instead of identifiers, and update the lookup caches of the various file units to index their members by both compound name and simple name. Serialized modules are keyed by identifiers, so as a transitional hack, do simple name lookup then filter the results by compound name.

Swift SVN r14768
2014-03-07 03:21:29 +00:00
Greg Parker
58c40398a2 Brute force fix for NSStringEncoding: redeclare everything in the overlay.
Swift SVN r14764
2014-03-07 00:37:41 +00:00
Jordan Rose
205e236a7c [ClangImporter] Synthesize the Protocol class if needed.
'Protocol' is the class used by Objective-C to refer to the runtime metadata
for a protocol. It's used by APIs such as NSXPCConnection. The class is
defined as "@interface Protocol : NSObject" in the modern Objective-C runtime.

This is a workaround for a Clang bug, PR19061 / <rdar://problem/16244450>.
We ought to be able to see the definition of Protocol whenever the
ObjectiveC module is loaded, but right now we can't. Once that bug is fixed,
this change should be reverted.

<rdar://problem/16229963>

Swift SVN r14761
2014-03-06 23:20:48 +00:00
Jordan Rose
86a4f9998d [ClangImporter] Add ../lib/swift as an implicit import path.
This will allow us to ship headers that are used by the standard library.
They will be treated as system headers.

<rdar://problem/16227202>

Swift SVN r14757
2014-03-06 21:36:54 +00:00
Chris Lattner
870df7f266 import noreturn objc methods as swift noreturn function type. I don't
know how to test this presently, but it should theoretically work.



Swift SVN r14727
2014-03-06 07:43:35 +00:00
Doug Gregor
7ce9ce8c57 Actually import inherited initializers for Objective-C classes.
Swift SVN r14726
2014-03-06 06:24:35 +00:00
Greg Parker
958aa46f25 <rdar://16074941> Fix some NSStringEncoding ugliness by importing it specially.
NSStringEncoding does not use NS_ENUM for various reasons. This importer 
change makes NSStringEncoding's type match its intended values' types.

Old workarounds that used extra NSStringEncoding casts will need to be changed.
Example:
-  var enc = NSStringEncoding(NSUTF8StringEncoding)
+  var enc = NSUTF8StringEncoding


Swift SVN r14720
2014-03-06 04:27:41 +00:00
Chris Lattner
4a827b7de4 enhance the clang importer to import noreturn functions like abort/exit as noreturn
swift functions.  Unfortunately, this can't be satisfactorily tested at the moment,
but that will be fixed soon.



Swift SVN r14709
2014-03-06 00:56:44 +00:00
Jordan Rose
3d313fb3f0 [ClangImporter] Import macros containing a single NSString literal as String.
Bonus goodness related to the previous commit.

Swift SVN r14665
2014-03-05 00:29:44 +00:00
Jordan Rose
a84f939545 [ClangImporter] Import string macros as CStrings.
Also, pass "-std=gnu11" so that we accept UTF-8 strings in these macros.

<rdar://problem/16198953>

Swift SVN r14664
2014-03-05 00:29:43 +00:00
Chris Lattner
d758e0dfe3 Eliminate more "DynamicLookup" in favor of "AnyObject", this is the
bulk of finishing rdar://13327098.


Swift SVN r14653
2014-03-04 22:15:46 +00:00
Doug Gregor
9a3a9addd2 Mirror Objective-C initializers in subclasses that don't have designated inits.
This reverts part of r14563, which swapped out the mirroring of
Objective-C initializers into subclasses. We still need to do this
when a subclass does not declare it's designated initializers. At
least the mirroring code is more robust, and marks declarations as
implicit so they won't show up when printed.



Swift SVN r14633
2014-03-04 05:51:44 +00:00
Doug Gregor
6ef8e0792e When an Objective-C class that has designated initializers, mark the other initializers as complete object initializers.
This allows inheritance of complete object initializers from
Objective-C classes.

Swift SVN r14609
2014-03-03 21:38:26 +00:00
Dmitri Hrybenko
5889e17528 Rewrite the long assertion so that it does not trigger -Wlogical-op-parentheses
Swift SVN r14575
2014-03-02 16:21:29 +00:00
Dmitri Hrybenko
197a682e14 Don't compare 'const char *' with ==, use StringRef
Swift SVN r14574
2014-03-02 15:41:33 +00:00
Doug Gregor
a77d08f5a1 Use inherited initializers rather than cloning for Objective-C classes.
Make Objective-C initializers inherited according to the inheritance
rules we've specified. Prevent the Clang importer from manually
copying all of the initializers from every superclass into each
class. 

This eliminates a ton of extra allocating constructors generated when
importing Objective-C init methods. Now we only generate allocating
constructors for the init methods that are actually declared.

Note that initializer inheritance only actually works for
Objective-C-defined classes. More to come.



Swift SVN r14563
2014-03-02 01:59:54 +00:00
Jordan Rose
e02c02b403 [ClangImporter] Import libkern's UInt and SInt as CUnsignedInt and CInt.
This avoids an ambiguity when referring to "UInt" after importing Foundation.

<rdar://problem/14336263>

Swift SVN r14486
2014-02-27 23:32:59 +00:00