Commit Graph

366 Commits

Author SHA1 Message Date
Alex Hoppen
3b2372307c Merge pull request #37421 from ahoppen/pr/fix-crash-complete-in-result-builder-with-nil
[CodeComplete] Fix crash when completing inside a result builder containing a variable initialized with `nil`
2021-05-17 18:56:45 +02:00
Alex Hoppen
ad5dc2d76f [CodeComplete] Fix crash when completing inside a result builder containing a variable initialized with nil
Resolves rdar://78017503
2021-05-14 17:21:26 +02:00
Alex Hoppen
4566bf3136 [Sema] Remove TypeCheckExprFlags::AllowUnresolvedTypeVariables
Remove the `TypeCheckExprFlags::AllowUnresolvedTypeVariables` flag, fixing another occurance of rdar://76686564 (https://github.com/apple/swift/pull/37309)

This does not break anything in the test suite, so I think the removal of the flag is fine.

Resolves rdar://76686564 and rdar://77659417
2021-05-10 20:11:43 +02:00
Alex Hoppen
759419190e Merge pull request #36992 from ahoppen/pr/wrapping-lvalue
[TypeChecker] Clear param specifiers before re-typechecking expression for completion
2021-05-07 14:10:45 +02:00
Alex Hoppen
74ff6923a1 [Sema] Don’t allow unresolved type variables if LeaveBraceStmtBodyUnchecked is true
According to Pavel, we want to eliminate allowing unresolved variables as much as possible. Removing this flag doesn’t break any test cases (at least not in a meaningful way) and fixes a crasher, so it seems reasonable to remove it.

Fixes rdar://76686564
2021-05-06 10:19:05 +02:00
Alex Hoppen
b1a4708782 [TypeChecker] Clear param specifiers before re-typechecking expression for completion
Because we are completing inside a result builder, we are never calling into `typeCheckExpression` and thus never call into `typeCheckForCodeCompletion` before `fallbackTypeCheck` (SR-14601).

This works fine in most cases, but in the added test case, we are hitting an assertion because the specifiers are not correctly erased from the `ClosureExpr` before re-typechecking for completion. Erasing them before fixes the test case until the underlying issue described above is fixed.

Fixes rdar://76710904 [SR-14494]
2021-05-06 10:00:25 +02:00
Nathan Hawes
b8f5bf3434 [CodeCompletion][Parse] Don't drop the contained expression when completing within an InOutExpr
When completing within an InOutExpr like `&foo.<complete>`, we were forming a
CodeCompletionExpr with a base when parsing the content of the InOutExpr and
storing it in CodeCompletionCallbacksImpl::CodeCompleteTokenExpr. When the
result of that parse contained a code completion though, we were dropping the
sub-expression completely and forming an empty code completion result in place
of the inout expression, which resulted in later code inserting a code
completion expression with no base into the AST. The solver based completion
was later asking for the type of the code completion and its base using the
expression stored in CodeCompletionCallbacksImpl::CodeCompleteTokenExpr, but
that never ended up in the AST so we hit an assertion about the expression not
have a type in the formed solutions.

Resolves rdar://75366814
2021-04-03 13:39:23 +10:00
Alex Hoppen
2c0b8ac479 Merge pull request #36517 from ahoppen/pr/rdar64141399
[CodeComplete] Fix code completion of initialization for variable wrapped by generic property wrapper
2021-03-26 11:24:52 +01:00
Alex Hoppen
ef75cf7c77 Merge pull request #36534 from ahoppen/pr/rdar64265821
Add test case for rdar://64265821
2021-03-23 08:29:33 +01:00
Alex Hoppen
efbfbc4200 Merge pull request #36495 from ahoppen/pr/rdar71566576
Add test case for rdar://71566576
2021-03-22 17:32:52 +01:00
Alex Hoppen
86e5e7dbf3 Add test case for rdar://64265821
rdar://64265821 [SR-12985] appears to have been fixed already. Let’s add a test case for it.
2021-03-22 14:02:11 +01:00
Alex Hoppen
28ee60e893 [CodeComplete] Fix code completion of initialization for variable wrapped by generic property wrapper
If completing the initialization of a variable that’s wrapped in a generic, unbound property wrapper, the expression's type is an `UnboundGenericType`. AFAICT that’s expected and the correct type to assign.

We hit the first assertion failure by trying to retrieve that type's substitution map. `UnboundGenericType`s were not handled here, so we crashed. AFAICT we can't get any substitutions out of an unbound generic type, so we should just continue looking into the parent type.

We hit the second assertion when trying to retrieve the property wrapper’s backing type, which is null (becuase it couldn't be resolved). However, we haven’t emitted a diagnostic because the variable declaration is perfectly valid. Hence I’m removing the assertion.

Fixes rdar://64141399
2021-03-19 20:51:48 +01:00
Alex Hoppen
dc88b4b735 Add test case for rdar://71566576
rdar://71566576 appears to have been fixed already. Still, add a test case for it to ensure we don’t hit it again.
2021-03-19 19:54:20 +01:00
Alex Hoppen
180dd2b2c9 [IDE] Add test cases for compiler crashes fixed by reverting 9d3c8ca 2021-03-19 19:38:52 +01:00
Robert Widmann
318f772e91 Check The DeclContext When Retrieving Conforming Decls
Checking for staticness is not enough because top-level decls count as
non-static yet do not have a sufficient curry level to satisfy this
check. Make sure we're looking for decls that reside inside of types.

rdar://75299825, SR-14327
2021-03-11 14:26:38 -08:00
Rintaro Ishizaki
d78bf22413 [CodeCompletion] Fix crashes in TypeCheckASTNodeAtLocRequest
receive {
    switch <HERE>
  }

In the current Parser implementation, if there's a error in 'switch'
subject, the 'SwitchStmt' is not placed in the parsed AST.

When the type checker searches AST node at the location, it used to find
'receive { ... }' because that is the *innermost* node in the AST that
contains the loc. But the decl context is the closure. This behavior used
to cause crashes because 'receive { ... }' is re-typechecked.

For solution, when finding the innermost AST node, clear the found node
in parent context before walking into brace statement.

rdar://problem/69246891
2020-10-30 15:56:31 -07:00
Rintaro Ishizaki
84205e3c97 [CodeCompletion] Fix a crash in collectPossibleReturnTypesFromContext
Avoid re-typechecking for nested closures. For example:

  Something {
    Other {
      #^COMPLETE^#
    }
  }

If 'Something' is successfully type checked but 'Other' is failed, the
outer closure has type, but the inner closure doesn't. In such state,
when the type of 'Other' is requested, the outer closure used to be
re-typechecked. That may cause crash because it may contain expressions
CSGen doesn't expect.

rdar://problem/69246891
2020-10-28 15:21:13 -07:00
Rintaro Ishizaki
d9a9b59634 [CodeCompletion] Skip an ASTScope assertion for labeled statements
Code completion performs 'typeCheckASTNodeAtLoc()' which ignores
'StmtChecker::ActiveLabeledStmts'. Since this is not necessary for code
completions, skip an assertion to verify the correctness of ASTScope.

rdar://problem/67102611
2020-08-14 16:01:47 -07:00
Rintaro Ishizaki
f7fc1ed7b5 [CodeCompletion] Fix a crash in CCExprRemover
- Handle cases where getArgumentLabelLocs().size() == 0
- Add some assertions to verify invariants
- Explicit handling of 'llvm::Optional' for 'getUnlabeledTrailingClosureIndex()'
- Avoid walking into nodes after the removing happens

rdar://problem/65556791
2020-07-15 09:56:20 -07:00
Rintaro Ishizaki
0e7e4baa71 [CodeCompletion] Add an already-fixed crashing test case
rdar://problem/58470999
2020-05-14 09:18:29 -07:00
Rintaro Ishizaki
75a0c9f819 [CodeCompletion] Add 'IsSystem' flag to code completion result item
'key.is_system: 1' is added if the associated declaration is from a
system module.

rdar://problem/62617558
2020-05-11 12:24:36 -07:00
Argyrios Kyrtzidis
bbdada475b [Parse] Try to preserve the invariant that anything that contains KeyPathDotExpr must be wrapped in KeyPathExpr
Even in the presence of invalid code. Fixes typechecker crash in rdar://50666427
2020-02-20 15:07:00 -08:00
Rintaro Ishizaki
0ca869e40e Merge pull request #29118 from rintaro/ide-completion-rdar56834798
[CodeCompletion] Allow type variable in MakeAbstractConformanceForGenericType
2020-02-19 09:30:08 -08:00
Hamish Knight
5ed2847f4e Create a new module and SourceFile for REPL completion
Rather than attempting to temporarily insert decls
into the last source file, just create a new module
and source file and carry across the imports from
the last module. This matches how the REPL deals
with new lines of input.
2020-02-05 14:01:20 -08:00
Marc Rasi
d608220360 negative test for SR-12076: completion crash 2020-01-24 10:12:39 -08:00
Rintaro Ishizaki
4ced714e25 [CodeCompletion] Allow type variable in MakeAbstractConformanceForGenericType
When typesSatisfyConstraint() is called with 'openArchetypes=true',
archetypes are substituted with type variables. If they have
conformances, they used to hit assertion in
'MakeAbstractConformanceForGenericType::operator()'.

Adjust the assetion to accept 'TypeVariableType'.

rdar://problem/56834798
2020-01-09 23:18:27 -08:00
Rintaro Ishizaki
091c36bc82 [CodeCompletion] Evaluate 'PatternBindingEntry' before checking the init
If a completion happens in an 'PatternBindingInitializer' context for
'TypedPattern' without any 'VarDecl', e.g.:

    let _: Int = <COMPLETION>

it crashes because 'typeCheckPatternBinding()' requires that the
'TypedPattern' has the type.

rdar://problem/52105899
2019-12-25 16:30:52 -08:00
Rintaro Ishizaki
cb00b8faf9 Revert "Merge pull request #27120 from rintaro/parser-rdar55267292"
This reverts commit e1b51f32aa, reversing
changes made to 086eb07ede.
2019-10-14 13:39:48 -07:00
Rintaro Ishizaki
da95961de2 [SyntaxParse] Fix a crash in TokenReceiver
rdar://problem/55267292
2019-09-11 10:51:07 -07:00
Slava Pestov
1caf2c7544 Sema: Fix code completion crash when a ParamDecl hasn't had its type set yet
We set the type of ParamDecls when applying solutions in the normal path, but
sometimes code completion will type check an expression inside a closure without
checking the outer expression. In this case, we may have inferred a type for
the ParamDecl, but we don't write it back.

Instead, just look at the DeclRefExpr's type.

Fixes <rdar://problem/42098113>.
2019-04-02 00:25:24 -04:00
Rintaro Ishizaki
d01e80d499 Merge pull request #23308 from rintaro/ide-completion-rdar48896424
[CodeCompletion] Fix an assertion failure
2019-03-14 14:53:54 -07:00
Rintaro Ishizaki
71aeea93f5 [CodeCompletion] Fix an assertion failure
If the type has unbound generic parameter, we cannot substitute types
for member decls.

rdar://problem/48896424
2019-03-14 12:22:19 -07:00
Rintaro Ishizaki
fad6ba9459 Merge pull request #23243 from rintaro/ide-completion-rdar48698892
[CodeCompletion] Move a test to long test suite
2019-03-12 16:55:25 -07:00
Rintaro Ishizaki
51234d498a [CodeCompletion] Move a test to long test suite
rdar://problem/48698892
2019-03-12 12:26:35 -07:00
Rintaro Ishizaki
19e54fed78 [CodeCompletion] Fixed a crasher regarding malformed operator decl
Infix operator completion used to crash if multiple infix operators with the
same name are declared in the module.

rdar://problem/48648877
2019-03-08 16:31:31 -08:00
Rintaro Ishizaki
5df5711b67 [CodeCompletion] Rework getOperatorCompletions() (#20632)
In postfix completion, for operator completion, we do:

  1. Type check the operand without applying it, but set the resolved
     type to the root of the expression.
  2. For each possible operators:
      i. Build temporary binary/postfix expression
      ii. Perform type checking to see whether the operator is applicable 

This could be very slow especially if the operand is complex.

* Introduce `ReusePrecheckedType` option to constraint system. With
  this option, CSGen respects pre-stored types in expressions and doesn't
  take its sub-expressions into account.
  * Improve type checking performance because type variables aren't
     generated for sub-expressions of LHS (45511835)
  * Guarantee that the operand is not modified by the type checker because
     expression walkers in `CSGen` doesn't walk into the operand.

* Introduce `TypeChecker::findLHS()` to find LHS for a infix operator from
  pre-folded expression. We used to `foldSequence()` temporary
  `SequenceExpr` and find 'CodeCompletionExpr' for each attempt.
  * No need to flatten folded expression after initial type-checking.
  * Save memory of temporary `BinaryExpr` which used to be allocated by
    `foldSequence()`.
  * Improve accuracy of the completion. `foldSequence()` recovers invalid
    combination of operators by `left` associative manner (with
    diagnostics). This used to cause false-positive results. For instance,
    `a == b <HERE>` used to suggest `==` operator. `findLHS()` returns
    `nullptr` for such invalid combination.

rdar://problem/45511835
https://bugs.swift.org/browse/SR-9061
2018-11-22 21:20:51 +09:00
Pavel Yaskevich
0a3f666367 [IDE] NFC: Add a test-case for a fixed SourceKit crasher
Resolves: rdar://problem/41331096
2018-11-06 11:58:38 -08:00
Rintaro Ishizaki
07172f47c3 [CodeCompletion] Don't try to resolve generic env for extension in inactive block
Fixes code-completion crash in validateExtension().

When code completion happens, it tries to validate decl contexts. If
it's in an extension in inactivec conditional block, the extension
haven't been bound to nominal type. That used to cause crash because its
GenericParams hasn't been set.

rdar://problem/45275782
https://bugs.swift.org/browse/SR-9001
2018-10-26 10:08:51 +09:00
Rintaro Ishizaki
c6017095c3 [AST] Use invalid conformance for unsatisfied requirement
There is an invariant that SignatureConformances should have the same
size as the number of conformance requirements in the signature.
Previously, since unsatisfied requirements weren't reflected in it,
that caused a crash.

rdar://problem/43625800
2018-10-10 21:03:25 +09:00
Rintaro Ishizaki
592b5de206 [CodeCompletion] Remove a wrong assert()
`CS.solve()` with `FreeTypeVariableBinding::Disallow` still may emit
unresolved type. e.g. `DeclRefExpr` to decl with unresolved type.

https://bugs.swift.org/browse/SR-8568
rdar://problem/43433253
2018-08-20 19:50:09 +09:00
Rintaro Ishizaki
682fc12c39 [Parse] Don't use getAsNominalTypeOrNominalTypeExtensionContext in Parse
`getAsNominalTypeOrNominalTypeExtensionContext()` requires fully parsed
AST. Use `isTypeContext()` instead.

https://bugs.swift.org/browse/SR-8554
rdar://problem/43394866
2018-08-18 12:48:13 +09:00
Rintaro Ishizaki
c68157a27d [CodeCompletion] Remove unresolved type in prepareForRetypechecking()
Unresolved type attached to expressions may fail re-typechecking.
Also, disallow unresolved type in typeCheckCompletionSequence(). It doesn't
provide useful completions to developers.

rdar://problem/41224316
2018-08-15 20:39:12 +09:00
Rintaro Ishizaki
7532da4e37 [ConstraintSystem] Remove any semantic expression in SanitizeExpr
Existence of semantic expr (`getSemanticExpr()`) prevents ASTWalker
walking into the *original* sub expressions which may cause
re-typechecking failure. For example,
`ConstraintGenerator::visitArrayExpr()` assumes we already visited its
elements, but that's not the case if the semantic expr exists.

rdar://problem/42639255
2018-08-13 20:36:07 +09:00
Rintaro Ishizaki
5e001f1913 Merge pull request #18626 from rintaro/ide-completion-unresolved-refactor
[CodeCompletion] Completion for UnresolvedMember via CodeCompletionExpr
2018-08-11 09:10:28 +09:00
Rintaro Ishizaki
b5a537ea26 [CodeCompletion] Add fixed test case fixed in previous commit
rdar://problem/42828673
2018-08-10 22:23:23 +09:00
Rintaro Ishizaki
33e7d06cbf [CodeCompletion] Add previously crashing test case. 2018-08-10 20:30:19 +09:00
Pavel Yaskevich
dc6f86d9b7 [CSRanking] Fix solution filtering not to erase everything when set is completely ambiguous
Since constraint solver has been improved to diagnose more problems
via "fixes", sometimes applying fixes might lead to producing solutions
which are completely ambiguous when compared to each other, and/or are
incomparable, which leads to `findBestSolutions` erasing all of them
while trying to compute best "partial" solution, which is incorrect.

Resolves: rdar://problem/42678836
2018-08-06 17:25:58 -07:00
Rintaro Ishizaki
c5a84565d7 [Parse] Fix end location of dummy top level code for code completion
Fix ASTVerifier error for end location of 'IfConfigDecl'.
Previously, for:
```
  #if
  // something
  <COMPLETE>
```
End location of the dummy body of 'TopLevelCodeDecl' was at the eof, but the
end loc of the 'IfConfigDecl' was at the code-completion token. That
caused the ASTVerifier error "invalid IfConfigStmt end location".

https://bugs.swift.org/browse/SR-2364
rdar://problem/41217187
2018-07-30 20:23:26 +09:00
Rintaro Ishizaki
21db9723e4 [Lexer] Don't include backtick length into comment length
Although backtick is a kind of trivia piece, Token::getCommentRange doesn't
take it into account. Invalid Token::getCommentRange used to cause
compiler crash.

rdar://problem/42492793
https://bugs.swift.org/browse/SR-8315
2018-07-24 04:37:07 +09:00
Rintaro Ishizaki
4a01a28282 [Lexer] Add crashing test case for SR-8315 2018-07-23 17:52:43 +09:00