Commit Graph

5015 Commits

Author SHA1 Message Date
Slava Pestov
cbf08e4359 AST: Make ProtocolDecl::requiresClass() const 2016-04-25 15:03:16 -07:00
Ted Kremenek
b8bbed8c13 [WIP] Implement SE-0039 (Modernizing Playground Literals) (#2215)
* Implement the majority of parsing support for SE-0039.

* Parse old object literals names using new syntax and provide FixIt.

For example, parse "#Image(imageLiteral:...)" and provide a FixIt to
change it to "#imageLiteral(resourceName:...)".  Now we see something like:

test.swift:4:9: error: '#Image' has been renamed to '#imageLiteral
var y = #Image(imageLiteral: "image.jpg")
        ^~~~~~ ~~~~~~~~~~~~
        #imageLiteral resourceName

Handling the old syntax, and providing a FixIt for that, will be handled in a separate
commit.

Needs tests.  Will be provided in later commit once full parsing support is done.

* Add back pieces of syntax map for object literals.

* Add parsing support for old object literal syntax.

... and provide fixits to new syntax.

Full tests to come in later commit.

* Improve parsing of invalid object literals with old syntax.

* Do not include bracket in code completion results.

* Remove defunct code in SyntaxModel.

* Add tests for migration fixits.

* Add literals to code completion overload tests.

@akyrtzi told me this should be fine.

* Clean up response tests not to include full paths.

* Further adjust offsets.

* Mark initializer for _ColorLiteralConvertible in UIKit as @nonobjc.

* Put attribute in the correct place.
2016-04-25 07:19:26 -07:00
Slava Pestov
0d34bc21ef IRGen: Emit reflection metadata for certain builtin types when -enable-reflection-builtins flag is passed in
These types are not directly referenced as fields of aggregate types,
but are needed for reflection type lowering.

Also, use a SetVector to collect referenced builtin types, instead of
a SmallPtrSet, to ensure compiler output is deterministic.
2016-04-22 22:36:05 -07:00
Chris Willmore
02a6be6d01 Allow parsing of function types in expr position (#2273)
Previously it was not possible to parse expressions of the form

    [Int -> Int]()

because no Expr could represent the '->' token and be converted later
into a FunctionTypeRepr. This commit introduces ArrowExpr which exists
solely to be converted to FunctionTypeRepr later by simplifyTypeExpr.

https://bugs.swift.org/browse/SR-502
2016-04-22 21:53:26 -07:00
Doug Gregor
df02ddd422 [Conformance checking] Diagnose the actual problem with near-misses.
Use the diagnostics machinery of the protocol conformance checker to
say why each near-miss actually missed, e.g., a type conflict. This
gives better information regarding how to fix the actual problem. Yet
more QoI for rdar://problem/25159872.
2016-04-22 14:50:03 -07:00
John McCall
e4ddee46c0 Don't crash if a -filelist file doesn't exist or doesn't contain the primary file.
I know this is the frontend and not the driver, but c'mon.
2016-04-22 10:31:22 -07:00
Slava Pestov
98abbdb332 Emit reflection metadata, but not reflection names, by default
This allows the reflection type lowering test to pass with the
default build configuration.
2016-04-21 15:15:30 -07:00
Joe Pamer
78db42ea71 When obtaining the decl context for an inherited protocol conformance,
use the inherited conformance's decl context if the conformance type
does not yet have a registered class decl.

(Addresses SR-1267 and SR-1270)
2016-04-20 22:42:29 -07:00
Doug Gregor
f6835ec42d [Protocol conformance] Simplify/unify checking for @objc/non-@objc conflicts.
When a non-@objc witness matches an @objc requirement except for
@objc-ness, treat it the same way whether it's an optional requirement
or not, except that it's a warning for the optional case. Should
finish off rdar://problem/25159872.
2016-04-20 16:41:44 -07:00
Doug Gregor
58570fdf9a Introduce "near-miss" warnings for unsatisfied optional requirements.
It's a common mistake to mistype a declaration that is intended to
satisfy an optional requirement. In such "near misses", we want to
warn about the mistake and give the user options to either fix the
declaration or suppress the warning. Approach this problem be walking
over all of the members of each nominal type declaration or extension
therefore and looking to see if there are any members remaining that

(1) are similarly-named to an unfilfilled optional requirement of a
protocol whose conformance is attributed to that nominal type
declaration or extension,
(2) are not witnesses to another optional requirement,
(3) haven't explicitly suppressed the warning (e.g., by adding
explicit "private" or explicit "@nonobjc"), and
(4) have a useful suppression mechanism.

In addition to the suppression mechanisms described in (3), one can
suppress this warning by moving the declaration to an(other)
extension. This encourages a programming style where one breaks an
interface into extensions each implement conformance to one
protocol. Note that we encode the various cases where one cannot move
the declaration to another extension (e.g., one cannot move a
designated initializer or stored property out of a class declaration)
and suppress the warning when there's no way for the user to cope with
it.

Each warning produced by this diagnostic can have a bunch of notes on
it for various courses of action. For example:

t2.swift:7:14: warning: instance method 'doSomething(z:)' nearly
matches optional requirement 'doSomething(x:)' of protocol 'P1'
  @objc func doSomething(z: Double) { }
             ^
t2.swift:7:14: note: rename to 'doSomething(x:)' to satisfy this
requirement
  @objc func doSomething(z: Double) { }
             ^
                         x
t2.swift:7:14: note: move 'doSomething(z:)' to an extension to silence
this warning
  @objc func doSomething(z: Double) { }
             ^
t2.swift:7:14: note: make 'doSomething(z:)' private to silence this
warning
  @objc func doSomething(z: Double) { }
             ^
        private
t2.swift:2:17: note: requirement 'doSomething(x:)' declared here
  optional func doSomething(x: Int)
                ^

It's a *lot* of detail, but is intended to cover the various choices
available to the user: Fix-It to the names of the requirement (for
naming-related mistakes) or suppress via various mechanisms. Combining
notes means losing Fix-Its, while dropping notes can lead users to
non-optimal solutions.

This is more of rdar://problem/25159872.
2016-04-19 17:21:49 -07:00
Doug Gregor
8802d6d52a Improve diagnostics for selector collisions with @objc optional requirements.
When an optional requirement of an @objc protocol has a selector that
collides with an entity that has a different *Swift* name but produces
an Objective-C method with the same selector, we have an existing
diagnostic complaining about the conflict. In such cases, make a few
suggestions (with Fix-Its) to improve the experience:

* Change Swift name to match the requirement, adding or modifying the
  @objc as appropriate.
* Add "@nonobjc" to silence the diagnostic, explicitly opting out of
  matching an @objc requirement.

This is intended to help with migration of Swift 2 code into Swift
3. The Swift 2 code will produce selectors that match Objective-C
methods in the protocol from Swift names that don't match; this helps
fix up those Swift names so that we now match.

Fixes the rest of rdar://problem/25159872. In some sense, it's a
stop-gap for more detailed checking of near-misses for optional
requirements, but it's not clear how wide-reaching such changes would
be.
2016-04-19 10:22:23 -07:00
Doug Gregor
bc158c31bf [Sema] Improve diagnostics for witness mismatches against @objc protocols.
Simplify and improve the checking of @objc names when matching a
witness to a requirement in the @objc protocol. First, don't use
@objc-ness as part of the initial screening to determine whether a
witness potentially matches an @objc requirement: we will only reject
a potential witness when the potential witness has an explicit
"@nonobjc" attribute on it. Otherwise, the presence of @objc and the
corresponding Objective-C name is checked only after selecting a
candidate. This more closely mirrors what we do for override checking,
where we match based on the Swift names (first) and validate
@objc'ness afterward. It is also a stepping stone to inferring
@objc'ness and @objc names from protocol conformances.

Second, when emitting a diagnostic about a missing or incorrect @objc
annotation, make sure the Fix-It gets the @objc name right: this might
mean adding the Objective-C name along with @objc (e.g.,
"@objc(fooWithString:bar:)"), adding the name to an
unadorned-but-explicit "@objc" attribute, or fixing the name of an
@objc attribute (e.g., "@objc(foo:bar:)" becomes
@objc(fooWithString:bar:)"). Make this diagnostic an error, rather
than a note on a generic "does not conform" diagnostic, so it's much
easier to see the diagnostic and apply the Fix-It.

Third, when emitting the warning about a non-@objc near-match for an
optional @objc requirement, provide two Fix-Its: one that adds the
appropriate @objc annotation (per the paragraph above), and one that
adds @nonobjc to silence the warning.

Part of the QoI improvements for conformances to @objc protocols,
rdar://problem/25159872.
2016-04-19 10:22:23 -07:00
Greg Parker
125a146365 Revert "[Sema] Improve diagnostics for witness mismatches against @objc protocols." and "Improve diagnostics for selector collisions with @objc optional requirements."
This reverts commits 46269299cd
and 27279866ad
and c826a408dd.

The changes broke test bots, including
https://ci.swift.org/job/oss-swift-package-osx/1348/
2016-04-19 05:52:33 -07:00
Doug Gregor
27279866ad Improve diagnostics for selector collisions with @objc optional requirements.
When an optional requirement of an @objc protocol has a selector that
collides with an entity that has a different *Swift* name but produces
an Objective-C method with the same selector, we have an existing
diagnostic complaining about the conflict. In such cases, make a few
suggestions (with Fix-Its) to improve the experience:

* Change Swift name to match the requirement, adding or modifying the
  @objc as appropriate.
* Add "@nonobjc" to silence the diagnostic, explicitly opting out of
  matching an @objc requirement.

This is intended to help with migration of Swift 2 code into Swift
3. The Swift 2 code will produce selectors that match Objective-C
methods in the protocol from Swift names that don't match; this helps
fix up those Swift names so that we now match.

Fixes the rest of rdar://problem/25159872. In some sense, it's a
stop-gap for more detailed checking of near-misses for optional
requirements, but it's not clear how wide-reaching such changes would
be.
2016-04-18 17:08:06 -07:00
Doug Gregor
46269299cd [Sema] Improve diagnostics for witness mismatches against @objc protocols.
Simplify and improve the checking of @objc names when matching a
witness to a requirement in the @objc protocol. First, don't use
@objc-ness as part of the initial screening to determine whether a
witness potentially matches an @objc requirement: we will only reject
a potential witness when the potential witness has an explicit
"@nonobjc" attribute on it. Otherwise, the presence of @objc and the
corresponding Objective-C name is checked only after selecting a
candidate. This more closely mirrors what we do for override checking,
where we match based on the Swift names (first) and validate
@objc'ness afterward. It is also a stepping stone to inferring
@objc'ness and @objc names from protocol conformances.

Second, when emitting a diagnostic about a missing or incorrect @objc
annotation, make sure the Fix-It gets the @objc name right: this might
mean adding the Objective-C name along with @objc (e.g.,
"@objc(fooWithString:bar:)"), adding the name to an
unadorned-but-explicit "@objc" attribute, or fixing the name of an
@objc attribute (e.g., "@objc(foo:bar:)" becomes
@objc(fooWithString:bar:)"). Make this diagnostic an error, rather
than a note on a generic "does not conform" diagnostic, so it's much
easier to see the diagnostic and apply the Fix-It.

Third, when emitting the warning about a non-@objc near-match for an
optional @objc requirement, provide two Fix-Its: one that adds the
appropriate @objc annotation (per the paragraph above), and one that
adds @nonobjc to silence the warning.

Part of the QoI improvements for conformances to @objc protocols,
rdar://problem/25159872.
2016-04-18 17:08:06 -07:00
Xi Ge
a41c9eb8e6 [Sema] Suggested by Jordan, refine a recently added diagnosis message. 2016-04-18 16:55:03 -07:00
Chris Lattner
183ae24249 Upgrade deprecation warnings about snake case identifiers, C style for loops,
and : vs = in attributes to errors.
2016-04-17 10:20:12 -07:00
Chris Lattner
8e12008d2b Mark tuple splat and ++/-- as errors instead of warnings. This
wraps up SE-0004 and SE-0029.

I consider the diagnostic changes in Constraints/lvalues.swift to be
indicative of a QoI regression, but I'll deal with that separately.
2016-04-16 23:44:22 -07:00
Chris Lattner
985f0bf73c [generic typealiases] Allow constraints to be spelled in type alias
decls, aligning with the final direction of SE-0048
2016-04-16 22:21:40 -07:00
Joe Groff
f4765f676c Sema: Allow ObjC generic extensions to perform @objc operations involving generics.
Though the generic type information isn't present, it isn't necessary if we're just invoking other operations from Objective-C. This should allow an extension to use the generic class's own API to some degree, as it would if defined on the nongeneric form.
2016-04-16 08:27:32 -07:00
Jordan Rose
e1a5bcfdfd Improve the diagnostic for mismatched optionals in subscripts. 2016-04-15 18:06:21 -07:00
Jordan Rose
d669d152d0 Add fix-its when an override has mismatched optionals. 2016-04-15 18:03:18 -07:00
Jordan Rose
996ee1ec53 Add an override-checking mode that allows mismatched optionals.
Not yet plugged into any actual features.
2016-04-15 17:18:10 -07:00
Xi Ge
6a660e23d9 [Sema] Suggested by Jordan, use another diagnosis message when fixit is available so that they are more cohesive. 2016-04-15 16:37:38 -07:00
Chris Lattner
4b5ae85288 emit a warning + fixit to move @autoclosure/@noescape to the type position
instead of from the parameter position.

This should be upgraded to an error later in Swift 3, but we'll give the
community some time to react.
2016-04-15 16:05:35 -07:00
Chris Lattner
725f1ba737 Remove the long-obsolete and deprecated Swift 1 @objc_block and @thin attributes,
these were subsumed by @convention in Swift 2.

We still support @thin for metatypes in SIL of course.
2016-04-15 15:06:58 -07:00
Chris Lattner
b5828e6a61 Port over all the semantic checking for @noescape/@autoclosure from the
declattr path to the typeattr path.  The decl attr path will eventually
go away, but we need to keep it for now to support the legacy syntax
migration.
2016-04-15 14:16:43 -07:00
Chris Lattner
ab14e6706f Progress towards implementing SE-0049 - Allow autoclosure in parameter types
as well as on parameter decls.  Also, tighten up the type checker to look at
parameter types instead of decl attributes in some cases (exposing a type
checker bug).

Still TODO:
 - Reject autoclosure/noescape on non-parameter types.
 - Move stdlib and other code to use noescape and autoclosure in the right
   spot.
 - Warn about autoclosure/noescape on parameters decls, with a fixit to move it.
 - Upgrade the warning to an error.
2016-04-14 23:13:43 -07:00
Chris Lattner
a3185cfdcc Merge pull request #2167 from danra/stmt_deleted_assignment
Fix type of deleted Stmt assignment operator
2016-04-14 16:54:00 -07:00
Jordan Rose
831f086c6c Override checking: use an enum instead of a boolean flag.
No functionality change, but the next commit will add another
case to the enum.
2016-04-14 16:00:46 -07:00
John McCall
b3a2762f59 Improve the dumping of ProtocolConformances, Substitutions,
and ErasureExpr.
2016-04-14 10:33:44 -07:00
Dan Raviv
6ccca44aee Add comment to header guard endif. Whitespace. (NFC) 2016-04-13 20:35:21 +03:00
Dan Raviv
103ba7487d Fix type of deleted Stmt assignment operator 2016-04-13 20:33:37 +03:00
practicalswift
637db8809b Merge pull request #2143 from practicalswift/osx
[gardening] "OSX" → "OS X"
2016-04-12 09:24:03 +02:00
Jordan Rose
695d73e856 Rework the signature for ASTContext::getForeignRepresentable.
- Extract the cache entry type to a top-level type that can be used in the
  signature of the function.
- Rewrite the implementation of the type in terms of standard LLVM ADTs
  instead of manual bit manipulation.
- Add support for trivial-with-optional types (none of which exist yet).
- Drop the use of SIL/BridgedTypes.def; the only non-trivial non-object
  bridged type today is 'Bool' (for ObjCBool and DarwinBoolean) and that's
  already trivially bridged to CBool too.
- Save an Identifier lookup when possible.
- Finally, rename the function to getForeignRepresentationInfo.

No intended functionality change.
2016-04-11 17:55:10 -07:00
practicalswift
befbebcd30 [gardening] "OSX" → "OS X" 2016-04-11 23:12:40 +02:00
Josef Willsher
de18967992 [Sema] Improved error message for static functions on existential metatypes (#2127)
Type level lookups can fail because the lookup is on an existential
metatype, like `MyProtocol.staticMethod(_:)` is invalid; however the
error message is unclear: “static member 'staticMethod(_:)' cannot be
used on instance of type ‘MyProtocol.Protocol’”.

This fix checks the base of member lookups that failed with the reason
UR_TypeMemberOnInstance for being existential metatypes. It produces
the clearer message “static member ‘staticMethod(_:)’ cannot be used on
protocol metatype ‘MyProtocol.Protocol’”. This change makes it clear
that the use of a static member on the *existential* metatype is the
problem.
2016-04-10 19:03:20 -07:00
David Farler
c20f3db09e Nesting parameter/returns/throws doc comments for closure parameters
Under parameter doc comment list items, allow function doc comment
syntax to nest so you can document the meaning of closure parameters'
signatures.

rdar://problem/24794725
2016-04-10 15:32:07 -07:00
David Farler
a9297eed9f Rename llvm::markup namespace to swift::markup
This was naming was cargoed from long ago and this functionality isn't
directly related to LLVM, it's specific to Swift.
2016-04-10 13:46:25 -07:00
practicalswift
1ef6ea8c4c [gardening] \t → " " 2016-04-08 21:59:13 +02:00
Joe Groff
66d5971f42 Merge pull request #2086 from jckarter/generic-objc-subclass
Allow subclasses of specific instantiations of ObjC generic classes.
2016-04-07 08:42:40 -07:00
practicalswift
66183cdbf7 [gardening] Fix unjustified spacing 2016-04-07 10:10:24 +02:00
Joe Groff
9c5564f808 Allow subclasses of specific instantiations of ObjC generic classes.
If a subclass grounds all the type parameters from its base class, we don't have to worry about any erasure edge cases. We should be able to support this, giving existing code that subclasses the nongeneric form of the class a migration path. Spot-fix some places in IRGen where we assume we can't emit static references to ObjC generic classes or metaclasses.
2016-04-06 21:19:11 -07:00
Xi Ge
737155bd52 Merge pull request #2085 from nkcsgexi/master
[AST] Correctly set implicit for enum element patterns. rdar://24870746
2016-04-06 20:38:01 -07:00
Xi Ge
26b71a7d05 [AST] Correct set implicit for enum element patterns. 2016-04-06 18:27:52 -07:00
Manav Gabhawala
7928140f79 [SE-0046] Implements consistent function parameter labels by discarding extraneous parameter names and adding _ where necessary 2016-04-06 20:21:58 -04:00
Anna Zaks
92fae2e9a4 Add experimental support for Thread Sanitizer.
This patch threads the TSan option through the front end.
2016-04-06 11:53:43 -07:00
Roman Levenstein
c8f6a06c02 Add the frontend option -disable-sil-perf-optzns.
Useful when you want to enable -O LLVM opts but not -O SIL opts.
2016-04-05 11:09:24 -07:00
Doug Gregor
138bbe2167 [Clang importer] Delay resolution of import-as-member declarations when needed.
It's possible for swift_name to make a global declaration into a
member of another entity that has not been seen yet. In such cases,
delay resolution until the end of the translation unit (module). Fixes
the rest of rdar://problem/25502497.
2016-04-05 00:03:36 -07:00
practicalswift
b01c615e0d Merge pull request #2053 from practicalswift/spacing
[gardening] if ([space]…[space]) → if (…), for(…) → for (…), while(…) → while (…), [[space]x, y[space]] → [x, y]
2016-04-05 00:01:14 +02:00