* add convertOptionalChain * cover more cases * expose containsMatchingReference * clean up performing edits * bound start position * add tests * refactor and handle edge cases * update tests * consider explicit requests for empty spans * update fourslash to use trigger reason * add tests cases for trigger reason * fix errors * remove type assertion * fix non ampersand chains * clean up some logic * add ternary case * add diagnostic message * add nullish check for ternary expressions * Update src/services/refactors/convertToOptionalChainExpression.ts Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> * Update src/services/refactors/convertToOptionalChainExpression.ts Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> * Update tests/cases/fourslash/refactorConvertToOptionalChainExpressionForTriggerReason3.ts Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> * Update tests/cases/fourslash/refactorConvertToOptionalChainExpressionForTriggerReason1.ts Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> * reformat and remove unused checks * allow any for ternary refactor * add tests * add tests * check return and variable statements * use isMatchingReference instead of containsMatchingReference * allow partial selections * fine tune selection ranges * recurse for call expressions * fix spellings * add recursive cases * remove isOrContainsMatchingReference * cleanup * more refactoring * cleanup * rename tests * address PR comments * check match syntactically * handle another call expression case * some renames * inline some checks * add test * address comments * add refactorNotAvailableReason Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com>
34 lines
873 B
TypeScript
34 lines
873 B
TypeScript
/// <reference path='fourslash.ts' />
|
|
|
|
////let a = { b: ()=> {
|
|
//// return {
|
|
//// c: ()=> {
|
|
//// return {
|
|
//// d: 0
|
|
//// }
|
|
//// }
|
|
//// }
|
|
////}};
|
|
/////*1a*//*2a*/a && a.b && a.b().c/*1b*/ && a.b().c().d;/*2b*/
|
|
|
|
// We should stop at the first call for b since it may not be a pure function.
|
|
goTo.select("2a", "2b");
|
|
verify.not.refactorAvailable("Convert to optional chain expression");
|
|
|
|
goTo.select("1a", "1b");
|
|
edit.applyRefactor({
|
|
refactorName: "Convert to optional chain expression",
|
|
actionName: "Convert to optional chain expression",
|
|
actionDescription: "Convert to optional chain expression",
|
|
newContent:
|
|
`let a = { b: ()=> {
|
|
return {
|
|
c: ()=> {
|
|
return {
|
|
d: 0
|
|
}
|
|
}
|
|
}
|
|
}};
|
|
a?.b?.().c && a.b().c().d;`
|
|
}); |