From 6d2582f5b8ce4308d0c3a87c04eb091dbeae1990 Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Mon, 2 May 2022 16:32:28 +0200 Subject: [PATCH] [Refactoring] Fix an issue where refactoring misses to refactor references after prefix operators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The removed `else if` branch caused the argument to the `-` operator to be be reported as `Mismatch`. I couldn’t figure out what that branch was for, so I removed it. rdar://91588948 --- lib/IDE/Refactoring.cpp | 5 ----- lib/IDE/SwiftSourceDocInfo.cpp | 8 +++++--- .../Outputs/prefix_operator/refactor.swift.expected | 6 ++++++ test/refactoring/rename/prefix_operator.swift | 13 +++++++++++++ 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 test/refactoring/rename/Outputs/prefix_operator/refactor.swift.expected create mode 100644 test/refactoring/rename/prefix_operator.swift diff --git a/lib/IDE/Refactoring.cpp b/lib/IDE/Refactoring.cpp index f42aca90a8b8f..34dfe31edceff 100644 --- a/lib/IDE/Refactoring.cpp +++ b/lib/IDE/Refactoring.cpp @@ -440,11 +440,6 @@ class Renamer { HandleLabels = Resolved.LabelType != LabelRangeType::None; break; } - } else if (Resolved.LabelType != LabelRangeType::None && - !Config.IsNonProtocolType && - // FIXME: Workaround for enum case labels until we support them - Config.Usage != NameUsage::Definition) { - return RegionType::Mismatch; } if (HandleLabels) { diff --git a/lib/IDE/SwiftSourceDocInfo.cpp b/lib/IDE/SwiftSourceDocInfo.cpp index 90b85e03b0ba3..dd685a58964d5 100644 --- a/lib/IDE/SwiftSourceDocInfo.cpp +++ b/lib/IDE/SwiftSourceDocInfo.cpp @@ -310,10 +310,12 @@ static Expr *extractNameExpr(Expr *Fn) { std::pair NameMatcher::walkToArgumentListPre(ArgumentList *ArgList) { - auto Labels = getCallArgLabelRanges(getSourceMgr(), ArgList, - LabelRangeEndAt::BeforeElemStart); - tryResolve(Parent, ArgList->getStartLoc(), LabelRangeType::CallArg, + if (!ArgList->isImplicit()) { + auto Labels = getCallArgLabelRanges(getSourceMgr(), ArgList, + LabelRangeEndAt::BeforeElemStart); + tryResolve(Parent, ArgList->getStartLoc(), LabelRangeType::CallArg, Labels.first, Labels.second); + } if (isDone()) return {false, ArgList}; diff --git a/test/refactoring/rename/Outputs/prefix_operator/refactor.swift.expected b/test/refactoring/rename/Outputs/prefix_operator/refactor.swift.expected new file mode 100644 index 0000000000000..46cda34c9612a --- /dev/null +++ b/test/refactoring/rename/Outputs/prefix_operator/refactor.swift.expected @@ -0,0 +1,6 @@ +let bar: Int = 12 +let negfoo = -bar +print("opposite of \(bar) is \(negfoo)") + + + diff --git a/test/refactoring/rename/prefix_operator.swift b/test/refactoring/rename/prefix_operator.swift new file mode 100644 index 0000000000000..344e187d7591e --- /dev/null +++ b/test/refactoring/rename/prefix_operator.swift @@ -0,0 +1,13 @@ +let foo: Int = 12 +let negfoo = -foo +print("opposite of \(foo) is \(negfoo)") + +// RUN: %empty-directory(%t.result) + +// RUN: %refactor -rename -source-filename %s -pos=1:5 -new-name bar >> %t.result/def.swift +// RUN: %target-swift-frontend-typecheck %t.result/def.swift +// RUN: diff -u %S/Outputs/prefix_operator/refactor.swift.expected %t.result/def.swift + +// RUN: %refactor -rename -source-filename %s -pos=2:15 -new-name bar >> %t.result/operator_ref.swift +// RUN: %target-swift-frontend-typecheck %t.result/operator_ref.swift +// RUN: diff -u %S/Outputs/prefix_operator/refactor.swift.expected %t.result/operator_ref.swift