Commit Graph

4093 Commits

Author SHA1 Message Date
Alex Hoppen
a0a74aeb46 SE-0064 / SR-1239: Code completion for #selector of property getters/setters.
Implement basic code completion support for #selector with property
getters/setters. The vast majority of this implementation comes from
Alex Hoppen (@ahoppen), with only a handful of my own tweaks. Alex has
more interesting ideas on improving this that I wasn't quite ready to
commit to, so this is more basic than the overall goal.
2016-05-11 23:03:37 -07:00
Alex Hoppen
d2e045c8b5 Implement SE-0064 / SR-1239: #selector for property getters and setters
Implements the core functionality of SE-0064 / SR-1239, which
introduces support for accessing the Objective-C selectors of the
getter and setter of an @objc property via #selector(getter:
propertyName) and #selector(setter: propertyName).

Introduce a bunch of QoI around mistakes using #selector to refer to a
property without the "getter:" or "setter:", using Fix-Its to help the
user get it right. There is more to do in this area, still, but we
have an end-to-end feature working.

Much of the implementation and nearly all of the test cases are from
Alex Hoppen (@ahoppen). I've done a bit of refactoring, simplified the
AST representation, and replaced Alex's custom
expression-to-declaration logic with an extension to the constraint
solver. The last bit might be short-lived, based on swift-evolution
PR280, which narrows the syntax of #selector considerably.
2016-05-11 16:51:27 -07:00
Jordan Rose
670f7b5b6d Optionals of imported value types are not @objc.
While we could bridge 'NSRange' to 'NSRange' and 'NSRange?' to
'NSValue * _Nullable', that (a) would be confusing, and (b) isn't
actually implemented at the moment. Fix my mistake in 477933b to
start accepting these.
2016-05-11 16:18:24 -07:00
Ted Kremenek
942e524285 Revert "SE-0036: Requiring Leading Dot Prefixes for Enum Instance Member Implementations" (#2477) 2016-05-11 11:02:37 -07:00
Jordan Rose
14a7334aef Merge pull request #2224: SE-0036: Requiring Leading Dot Prefixes for Enum Instance Member Implementations
from @ahoppen
2016-05-10 19:58:09 -07:00
Joe Groff
063e755e7e Merge pull request #2456 from jckarter/sr1323
AST: More robust rewrite of ProtocolConformance::getInheritedConformance.
2016-05-10 12:42:04 -07:00
Doug Gregor
aec6ea71a0 Merge pull request #2463 from milseman/newtype
[SILGen] Recognize swift_newtype-ed CF foreign class types
2016-05-10 12:00:08 -07:00
Joe Groff
01f98fa4dc AST: More robust rewrite of ProtocolConformance::getInheritedConformance.
A recursive implementation is cleaner, and more cleanly preserves class inheritance and generic specialization through the operation to get the refined protocol conformance. Fixes SR-1323.
2016-05-10 10:41:16 -07:00
Michael Ilseman
9dd6217a14 [SILGen] Recognize swift_newtype-ed CF foreign class types
Teach isClangTypeMoreIndirectThanSubstType about swift_newtype-ed
typedefs, which may be of CF foreign class type. In these cases, we
should reason about the underlying, wrapped type. Includes
refactoring of common logic and tests.
2016-05-10 10:21:15 -07:00
Jordan Rose
477933be1d Fix @objc checking for optional value types.
We previously treated 'NSFoo?' as ObjC-compatible simply because 'NSFoo'
was an imported type or was marked '@objc'.
2016-05-09 19:44:55 -07:00
Jordan Rose
4d9e8d9212 Constify several DeclContext parameters. NFC. 2016-05-09 17:51:46 -07:00
Argyrios Kyrtzidis
8ce372dca9 [IDE] Move determination of the decl group at the Decl::getGroupName() caller. 2016-05-08 16:27:46 -07:00
Alex Hoppen
0e8c69c56f [SE-0036]: Requiring Leading Dot Prefixes for Enum Instance Member Implementations 2016-05-07 22:39:26 +02:00
Alex Hoppen
b7abfd2d5c [Gardening] Fixed formatting issue in ASTDumper 2016-05-07 22:39:18 +02:00
Doug Gregor
55a3f5398c [Clang importer] Import Swift 2 "stubs" to improve errors in "Swift 2" code.
When attempting to compile Swift 2 code (or any Swift code using the
Swift 2 names) in Swift 3, the compiler diagnostics are often entirely
useless because the names have changed radically enough that one
generally gets "no member named 'foo'" errors rather than a helpful
"'foo' was renamed to 'bar'" error. This makes for a very poor user
experience when (e.g.) trying to move Swift 2 code forward to Swift 3.

To improve the experience, when the Swift 2 and Swift 3 names of an
API differ, the Clang importer will produce a "stub" declaration that
matches the Swift 2 API. That stub will be marked with a synthesized
attribute

  @available(unavailable, renamed: "the-swift-3-name")

that enables better diagnostics (e.g., "'foo' is unavailable: renamed
to 'bar') along with Fix-Its (courtesy of @jrose-apple's recent work)
that fix the Swift 2 code to compile in Swift 3.

This change addresses much of rdar://problem/25309323 (concerning QoI
of Swift 2 code compiled with a Swift 3 compiler), but some cleanup
remains.
2016-05-06 21:12:20 -07:00
Mark Lacey
0eb8d01b38 Fix a crasher in the archetype builder.
This particular crasher very rarely didn't crash, causing mayhem with
false failures on the builders.

We were keeping a reference to a vector that could be reallocated in a
recursive call back into the same function. Instead, tend towards
looking up the vector in the map each time we need it.
2016-05-05 16:09:54 -07:00
Joe Groff
225b94ad09 Further refinement of isBindableTo for BoundGenericType conformances.
The conformances for e.g. `Foo<T>` might still be bindable to those for `Foo<Int>`; we can handle this by looking to see if the conformances' root NormalProtocolConformances match instead of their leaf specializations.
2016-04-29 10:46:11 -07:00
swiftix
3fe16591c6 Merge pull request #2338 from swiftix/devirtualizer-bugfix
[sil-devirtualizer] Fix some bugs in the devirtualizer.
2016-04-29 00:21:29 -07:00
Roman Levenstein
7a9b05babf [sil-devirtualizer] Fix some bugs in the devirtualizer.
- Don't crash if a class_method instruction could not be devirtualized.
- Improve devirtualization of methods with generic parameters and using dependent types.
- Fix a bug in isBindableToSuperclassOf, uncovered while fixing the original bug reported in SR-1206.
  This bug could lead in certain cases to invocations of a wrong method from the base class, instead
  of using a method from a derived class.

rdar://25891588   and SR-1206
2016-04-28 22:40:47 -07:00
John McCall
7070cbe8a0 Diagnose attempts to infer closure parameters to have tuple-of-inout type.
As a special case (at least for now), permit this for anonymous closure
parameters, and teach SILGen not to crash on them.
2016-04-28 21:50:13 -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
Xi Ge
c4d7b1a185 ASTPrinter: never synthesize extensions for raw types of enum decls.
Even thought raw types are specified in inheritance clauses, their
members are not usable through an enum instance. Thus, there is no
point to synthesize their members.
2016-04-22 22:52:46 -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
Jordan Rose
d5b30ee85e [ASTVerifier] Check the type of a TupleExpr, at least at a basic level. (#2261) 2016-04-21 13:10:08 -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
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
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
743b07ffd7 [Code completion] Be more lack when suppressing witnesses for requirements.
Semantic analysis may match up a witness to a requirement with
renaming; when performing code completion, we still want to see the
requirement because it's possible that the user just hasn't written it
yet. Fixes the regression I caused earlier today.
2016-04-18 20:54:32 -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
Chris Lattner
2f004d8d47 Reapply "Progress towards nested generic typealiases."
This reverts commit 2aaccee71c.
2016-04-16 21:51:37 -07:00
swift-ci
2af7041af3 Merge pull request #2210 from jckarter/objc-extension-generic-params 2016-04-16 11:38:50 -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
Slava Pestov
67e031cf8e AST: Remove dead code, NFC 2016-04-16 02:15:45 -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
Chris Lattner
a0c5d2a7df adjust autoclosure/noescape printing to print them in their type
position instead of before a parameter.  This wraps up the meat of
SE-0049.
2016-04-15 17:04:12 -07:00
Chris Lattner
d1ea6e9487 Merge pull request #2209 from danra/stmt_spacing
Make getSourceRange/Impl spacing consistent with getStartLoc/Impl and…
2016-04-15 15:57:57 -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
Dan Raviv
f75199a74a Make getSourceRange/Impl spacing consistent with getStartLoc/Impl and getEndLoc/Impl (NFC) 2016-04-16 00:57:50 +03: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
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
Xi Ge
42498ac542 [AST] For decls with underlying clang nodes, do not try to get group name and source order. 2016-04-12 18:52:10 -07:00
Jordan Rose
bc83940301 Make pointer nullability explicit using Optional.
Implements SE-0055: https://github.com/apple/swift-evolution/blob/master/proposals/0055-optional-unsafe-pointers.md

- Add NULL as an extra inhabitant of Builtin.RawPointer (currently
  hardcoded to 0 rather than being target-dependent).
- Import non-object pointers as Optional/IUO when nullable/null_unspecified
  (like everything else).
- Change the type checker's *-to-pointer conversions to handle a layer of
  optional.
- Use 'AutoreleasingUnsafeMutablePointer<NSError?>?' as the type of error
  parameters exported to Objective-C.
- Drop NilLiteralConvertible conformance for all pointer types.
- Update the standard library and then all the tests.

I've decided to leave this commit only updating existing tests; any new
tests will come in the following commits. (That may mean some additional
implementation work to follow.)

The other major piece that's missing here is migration. I'm hoping we get
a lot of that with Swift 1.1's work for optional object references, but
I still need to investigate.
2016-04-11 20:06:38 -07:00
Jordan Rose
952224398a Make PointerToPointer AST verification stronger. NFC. 2016-04-11 17:55:10 -07: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
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
David Farler
5eb479a6f2 Refactor: extractCommentParts can theoretically work for any markup AST node 2016-04-10 13:36:08 -07:00
Xi Ge
94187180a6 [CodeCompletion] Remove code completion results from extensions that can never apply. rdar://24562621 2016-04-08 16:32:47 -07:00