Commit Graph

2609 Commits

Author SHA1 Message Date
John McCall
c3958ea8d7 Import DynamicSelf types as unchecked optionals
when that import mode is enabled.

Patch by Jordan, thanks.

Swift SVN r15574
2014-03-28 05:39:25 +00:00
Doug Gregor
831b444aa1 If only C++ had a definite initialization pass...
Swift SVN r15535
2014-03-26 22:54:16 +00:00
Joe Pamer
bcab632730 When requesting members or protocols from a type declaration, force any delayed members by default. This allows us to pretty-print otherwise unresolved implicit members of imported enums. (rdar://problem/16430343)
Swift SVN r15534
2014-03-26 22:31:02 +00:00
Jordan Rose
3057645677 [ClangImporter] Resolve @partial_interface to a Swift class, like @class.
@partial_interface is like @class, but it allows the user to write categories
or (eventually) subclasses in their Objective-C headers even though the
class will be implemented in Swift. The resolution rules are thus exactly the
same as for class.

I've included a template hack to allow you to keep building without switching
to the new internal Clang repo; in this case you will see one test failure.

<rdar://problem/16426884>

Swift SVN r15523
2014-03-26 21:08:50 +00:00
Doug Gregor
019bb049a1 [Clang importer] Import initializer methods in protocols as initializers.
You can't actually call these initializers with an existential yet, but nor could you safely call the init methods anyway. At least you'll be able to conform to NSCoding with an initializer rather than an "init method". Fixes <rdar://problem/15595471>.

Swift SVN r15521
2014-03-26 21:02:35 +00:00
Dmitri Hrybenko
a15acc0536 Remove duplicated type name in comment and fix some questionable formatting
Swift SVN r15503
2014-03-26 10:59:12 +00:00
Joe Pamer
eebe1ebf37 When importing external enum types, delay the creation of implicit members and their associated support functions until after the types are actually referenced.
This significantly reduces the amount of overhead incurred when naively importing large external modules without referencing many of its members, which should directly improve response times in the playground. For example, the repro code attached to rdar://problem/16387393 imports Foundation but references none of its members, and with these changes its total compilation time is almost 2.5x faster.

Swift SVN r15479
2014-03-26 01:06:27 +00:00
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
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
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
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
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
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
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
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
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
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
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
Joe Groff
8e6b353542 Derive conformances of Equatable and Hashable for simple enums.
If an enum has no cases with payloads, make it implicitly Equatable and Hashable, and derive default implementations of '==' and 'hashValue'. Insert the derived '==' into module context wrapped in a new DerivedFileUnit kind, and arrange for it to be codegenned with the deriving EnumDecl by adding a 'DerivedOperatorDecls' array to NominalTypeDecls that gets visited at SILGen time.

Swift SVN r14471
2014-02-27 20:28:38 +00:00
Jordan Rose
0d4b039e11 Support properties in Objective-C protocols.
There are two parts to this:
- Import protocol properties as properties, instead of as a pair of methods.
- Fix IRGen to handle property accesses in @objc protocols.

<rdar://problem/12993073>

Swift SVN r14438
2014-02-27 01:19:08 +00:00
Chris Lattner
1344319677 Rename the internal compiler lexicon from val -> let.
Swift SVN r14408
2014-02-26 21:21:18 +00:00
Dmitri Hrybenko
a44da77de7 Clang importer: don't import structs with bitfields
Fixes rdar://16028632


Swift SVN r14395
2014-02-26 15:21:39 +00:00
Jordan Rose
0f71586952 [ClangImporter] Start importing Objective-C references using UncheckedOptional.
This is hidden behind the frontend flag -enable-objc-optional. Use -Xfrontend
when invoking the Swift driver.

Part of <rdar://problem/15189135>

Swift SVN r14332
2014-02-25 02:04:02 +00:00
Jordan Rose
3e846134e1 [ClangImporter] Don't mirror a protocol's methods if they're in the superclass.
Right now we have a hack to mirror ObjC protocol methods into an imported
ObjC class, because Swift's lookup only looks into superclasses, not into
protocols (by default, anyway). This already isn't great because it's wrong
for @optional, but it was particularly bad if /two/ superclasses conformed
to the same protocol (directly or indirectly). Because the mirrored methods
weren't marked as overrides, the type checker would consider them both as
possibilities, leading to strange errors like this:

  <REPL Input>:1:1: error: ambiguous use of 'description'
  w.description()
  ^
  AppKit.NSWindow:268:8: note: found this candidate
    func description() -> String
         ^
  ObjectiveC.NSObject:72:8: note: found this candidate
    func description() -> String
         ^

Now, we check to see if a superclass conforms to a protocol already before
mirroring its methods into the current class or category.

<rdar://problem/16102321> and possibly also <rdar://problem/16038085>

Swift SVN r14189
2014-02-21 00:35:49 +00:00
Jordan Rose
5c9aea79f0 [ClangImporter] Restore typealiases for NSInteger, size_t, etc.
We will still import these as just 'Int', 'UInt', etc., but we still want to
allow users to write some of these types themselves. We now have an enum field
in MappedTypes.def to control this.

Fix-up for r14069 and <rdar://problem/16067854>

Swift SVN r14105
2014-02-19 22:29:25 +00:00
Jordan Rose
518c777bc8 [ClangImporter] Treat NSUInteger as UInt when it's an enum underlying type.
...rather than Int.

This handles the case where there are existing 32-bit enum constants with
the bit set, which isn't that uncommon for NS_OPTIONS declarations.

Part of <rdar://problem/15368372>, but should also fix the main issue in
<rdar://problem/15236662>.

Swift SVN r14090
2014-02-19 18:29:46 +00:00
Chris Lattner
ecbbb4a42c rework our representations of subscripts to not curry the indexes
separately from the get/set value.  There is no exposed way in the
source language to use this, and this causes shorter term annoyance.

I chose to flatten the value and indices so the value comes first.
In principle, this allows us to completely eliminate our ObjC importer
thunks.  I haven't removed them though, because they might be useful
for something else.


Swift SVN r14049
2014-02-18 21:34:33 +00:00
Jordan Rose
0b2541b58f Rename the standard library to "Swift" (instead of "swift")
This is more in line with all other modules currently on our system.
If/when we get our final name for the language, we're at least now set
up to rename the library without /too/ much trouble. (This is mostly just
a lot of searching for "import swift", "swift.", "'swift'", and '"swift"'.
The compiler itself is pretty much just using STDLIB_NAME consistently now,
per r13758.)

<rdar://problem/15972383>

Swift SVN r14001
2014-02-17 19:30:47 +00:00
Chris Lattner
28903887e7 Rename the internal compiler lexicon from let -> val.
Swift SVN r13992
2014-02-17 16:48:21 +00:00
Dmitri Hrybenko
571c9b3c5e Split 'type' keyword into 'static' and 'class'
rdar://15911697


Swift SVN r13908
2014-02-14 14:50:32 +00:00
Dmitri Hrybenko
b8817ae5f6 Move two operators to KnownIdentifiers.def
Swift SVN r13866
2014-02-13 10:37:31 +00:00
Doug Gregor
873396fd41 Check for recursive @property imports in the Clang importer.
Fixes <rdar://problem/16053872>.


Swift SVN r13852
2014-02-13 00:09:30 +00:00
Joe Groff
5c9470b9ca AST: Shun empty GenericSignatures, and remove the ASTContext argument from GenericSignature factories.
GenericSignatures with no params or requirements are a bug, so verify that they don't happen by making GenericSignature::get return null and GenericFunctionType assert that it has a nonnull signature. Hack Sema not to try to produce nongeneric GenericFunctionTypes when a function in a local type in a generic function context is type-checked; there's a deeper modeling issue that needs to be fixed here, but that's beyond the scope of 1.0. Now that GenericSignature always has at least one subtype, its factories no longer need an independent ASTContext argument.

Swift SVN r13837
2014-02-12 19:17:27 +00:00
Joe Groff
68db63b45d AST: Have GenericFunctionType use GenericSignature.
Change GenericFunctionType to reference a GenericSignature instead of containing its generic parameters and requirements in-line, and clean up some interface type APIs that awkwardly returned ArrayRef pairs to instead return GenericSignatures instead.

Swift SVN r13807
2014-02-12 03:44:28 +00:00