Skip to content

Commit 4eb87bd

Browse files
authored
Merge pull request #64197 from bnbarham/allow-at-or-pound
[CursorInfo] Handle @ and # position
2 parents b94b362 + daa80bb commit 4eb87bd

File tree

3 files changed

+99
-91
lines changed

3 files changed

+99
-91
lines changed

lib/IDE/IDERequests.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,30 @@ SourceManager &CursorInfoResolver::getSourceMgr() const
113113
return SrcFile.getASTContext().SourceMgr;
114114
}
115115

116+
static bool locationMatches(SourceLoc currentLoc, SourceLoc toResolveLoc,
117+
SourceManager &SM) {
118+
if (currentLoc == toResolveLoc)
119+
return true;
120+
121+
if (currentLoc.getAdvancedLoc(-1) != toResolveLoc)
122+
return false;
123+
124+
// Check if the location to resolve is a '@' or '#' and accept if so (to
125+
// allow clients to send either the name location or the start of the
126+
// attribute/expansion).
127+
unsigned bufferID = SM.findBufferContainingLoc(toResolveLoc);
128+
StringRef initialChar = SM.extractText({toResolveLoc, 1}, bufferID);
129+
return initialChar == "@" || initialChar == "#";
130+
}
131+
116132
bool CursorInfoResolver::tryResolve(ValueDecl *D, TypeDecl *CtorTyRef,
117133
ExtensionDecl *ExtTyRef, SourceLoc Loc,
118134
bool IsRef, Type Ty,
119135
Optional<ReferenceMetaData> Data) {
120136
if (!D->hasName())
121137
return false;
122138

123-
if (Loc != LocToResolve)
139+
if (!locationMatches(Loc, LocToResolve, getSourceMgr()))
124140
return false;
125141

126142
if (auto *VD = dyn_cast<VarDecl>(D)) {

lib/Refactoring/Refactoring.cpp

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8566,50 +8566,49 @@ getMacroExpansionBuffers(MacroDecl *macro, const CustomAttr *attr, Decl *decl) {
85668566
/// macro reference here.
85678567
static llvm::SmallVector<unsigned, 2>
85688568
getMacroExpansionBuffers(SourceManager &sourceMgr, ResolvedCursorInfoPtr Info) {
8569-
// Handle '#' position in '#macroName(...)'.
8570-
if (auto exprInfo = dyn_cast<ResolvedExprStartCursorInfo>(Info)) {
8571-
if (auto target =
8572-
dyn_cast_or_null<MacroExpansionExpr>(exprInfo->getTrailingExpr())) {
8573-
if (auto bufferID = getMacroExpansionBuffer(sourceMgr, target))
8574-
return { *bufferID };
8575-
}
8569+
auto *refInfo = dyn_cast<ResolvedValueRefCursorInfo>(Info);
8570+
if (!refInfo || !refInfo->isRef())
8571+
return {};
85768572

8577-
return { };
8573+
auto *macro = dyn_cast_or_null<MacroDecl>(refInfo->getValueD());
8574+
if (!macro)
8575+
return {};
8576+
8577+
// Attached macros
8578+
if (auto customAttrRef = refInfo->getCustomAttrRef()) {
8579+
auto macro = cast<MacroDecl>(refInfo->getValueD());
8580+
return getMacroExpansionBuffers(macro, customAttrRef->first,
8581+
customAttrRef->second);
85788582
}
85798583

8580-
if (auto refInfo = dyn_cast<ResolvedValueRefCursorInfo>(Info)) {
8581-
if (refInfo->isRef() && isa_and_nonnull<MacroDecl>(refInfo->getValueD())) {
8582-
// Handle 'macroName' position in '@macroName(...)'.
8583-
if (auto customAttrRef = refInfo->getCustomAttrRef()) {
8584-
auto macro = cast<MacroDecl>(refInfo->getValueD());
8585-
return getMacroExpansionBuffers(
8586-
macro, customAttrRef->first, customAttrRef->second);
8587-
}
8584+
// FIXME: A resolved cursor should contain a slice up to its reference.
8585+
// We shouldn't need to find it again.
8586+
ContextFinder Finder(*Info->getSourceFile(), Info->getLoc(), [&](ASTNode N) {
8587+
if (N.getStartLoc() == Info->getLoc())
8588+
return true;
85888589

8589-
// Handle 'macroName' position in '#macroName(...)'.
8590-
ContextFinder Finder(
8591-
*Info->getSourceFile(), Info->getLoc(), [&](ASTNode N) {
8592-
auto *expr =
8593-
dyn_cast_or_null<MacroExpansionExpr>(N.dyn_cast<Expr *>());
8594-
return expr &&
8595-
(expr->getMacroNameLoc().getBaseNameLoc() == Info->getLoc());
8596-
});
8597-
Finder.resolve();
8598-
if (!Finder.getContexts().empty()) {
8599-
auto *target =
8600-
dyn_cast<MacroExpansionExpr>(Finder.getContexts()[0].get<Expr *>());
8601-
if (target) {
8602-
if (auto bufferID = getMacroExpansionBuffer(sourceMgr, target))
8603-
return { *bufferID };
8604-
}
8605-
}
8590+
// TODO: Handle MacroExpansionDecl
8591+
if (auto *expr =
8592+
dyn_cast_or_null<MacroExpansionExpr>(N.dyn_cast<Expr *>())) {
8593+
return expr->getMacroNameLoc().getBaseNameLoc() == Info->getLoc();
86068594
}
86078595

8608-
return { };
8596+
return false;
8597+
});
8598+
Finder.resolve();
8599+
8600+
if (!Finder.getContexts().empty()) {
8601+
Optional<unsigned> bufferID;
8602+
if (auto *target = dyn_cast<MacroExpansionExpr>(
8603+
Finder.getContexts()[0].get<Expr *>())) {
8604+
bufferID = getMacroExpansionBuffer(sourceMgr, target);
8605+
}
8606+
8607+
if (bufferID)
8608+
return {*bufferID};
86098609
}
86108610

8611-
// TODO: handle MacroExpansionDecl.
8612-
return { };
8611+
return {};
86138612
}
86148613

86158614
bool RefactoringActionExpandMacro::isApplicable(ResolvedCursorInfoPtr Info,

test/SourceKit/Macros/macro_basic.swift

Lines changed: 47 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -75,64 +75,57 @@ struct S4 { }
7575
// RUN: %s \
7676
// RUN: )
7777

78-
//##-- cursor-info at '#' position. Cursor doesn't resolve but we will still
79-
// get refactorings. Should fix that in the new cursor info.
80-
// RUN: %sourcekitd-test -req=cursor -pos=4:7 -cursor-action %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_POUND %s
81-
// CURSOR_POUND-NOT: source.lang.swift.ref.macro
82-
// CURSOR_POUND-LABEL: ACTIONS BEGIN
83-
// CURSOR_POUND: source.refactoring.kind.expand.macro
84-
// CURSOR_POUND-NEXT: Expand Macro
85-
// CURSOR_POUND: ACTIONS END
86-
87-
//##-- cursor-info at 'stringify' position.
88-
// RUN: %sourcekitd-test -req=cursor -pos=4:8 -cursor-action -req-opts=retrieve_symbol_graph=1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_MACRONAME %s
89-
// CURSOR_MACRONAME: source.lang.swift.ref.macro (1:33-1:42)
90-
// CURSOR_MACRONAME: (T) -> (T, String)
91-
// CURSOR_MACRONAME: <Declaration>@freestanding(expression) macro stringify&lt;T&gt;(_ value: <Type usr="s:9MacroUser1TL_xmfp">T</Type>) -&gt; (<Type usr="s:9MacroUser1TL_xmfp">T</Type>, <Type usr="s:SS">String</Type>) = #externalMacro(module: &quot;MacroDefinition&quot;, type: &quot;StringifyMacro&quot;)</Declaration>
92-
// CURSOR_MACRONAME: <decl.macro><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@freestanding</syntaxtype.attribute.name>(expression)</syntaxtype.attribute.builtin> <syntaxtype.keyword>macro</syntaxtype.keyword> <decl.name>stringify</decl.name>&lt;<decl.generic_type_param usr="s:9MacroUser1TL_xmfp"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>&gt;(<decl.var.parameter><decl.var.parameter.argument_label>_</decl.var.parameter.argument_label> <decl.var.parameter.name>value</decl.var.parameter.name>: <decl.var.parameter.type><ref.generic_type_param usr="s:9MacroUser1TL_xmfp">T</ref.generic_type_param></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><tuple>(<tuple.element><tuple.element.type><ref.generic_type_param usr="s:9MacroUser1TL_xmfp">T</ref.generic_type_param></tuple.element.type></tuple.element>, <tuple.element><tuple.element.type><ref.struct usr="s:SS">String</ref.struct></tuple.element.type></tuple.element>)</tuple></decl.function.returntype> = #externalMacro(module: &quot;MacroDefinition&quot;, type: &quot;StringifyMacro&quot;)</decl.macro>
93-
// CURSOR_MACRONAME-LABEL: SYMBOL GRAPH BEGIN
94-
// CURSOR_MACRONAME: "identifier": {
95-
// CURSOR_MACRONAME-NEXT: "interfaceLanguage": "swift",
96-
// CURSOR_MACRONAME-NEXT: "precise": "s:9MacroUser9stringifyyx_SStxclufm"
97-
// CURSOR_MACRONAME-NEXT: },
98-
// CURSOR_MACRONAME-NEXT: "kind": {
99-
// CURSOR_MACRONAME-NEXT: "displayName": "Macro",
100-
// CURSOR_MACRONAME-NEXT: "identifier": "swift.macro"
101-
// CURSOR_MACRONAME-NEXT: },
102-
// CURSOR_MACRONAME: SYMBOL GRAPH END
103-
// CURSOR_MACRONAME-LABEL: ACTIONS BEGIN
104-
// CURSOR_MACRONAME: source.refactoring.kind.rename.global
105-
// CURSOR_MACRONAME-NEXT: Global Rename
106-
// CURSOR_MACRONAME: source.refactoring.kind.expand.macro
107-
// CURSOR_MACRONAME-NEXT: Expand Macro
108-
// CURSOR_MACRONAME: ACTIONS END
109-
110-
//##-- Refactoring at both position.
78+
//##-- cursor-info on macro expression
79+
// RUN: %sourcekitd-test -req=cursor -pos=4:7 -cursor-action -req-opts=retrieve_symbol_graph=1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_MACRO_EXPR %s
80+
// RUN: %sourcekitd-test -req=cursor -pos=4:8 -cursor-action -req-opts=retrieve_symbol_graph=1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_MACRO_EXPR %s
81+
// CURSOR_MACRO_EXPR: source.lang.swift.ref.macro (1:33-1:42)
82+
// CURSOR_MACRO_EXPR: (T) -> (T, String)
83+
// CURSOR_MACRO_EXPR: <Declaration>@freestanding(expression) macro stringify&lt;T&gt;(_ value: <Type usr="s:9MacroUser1TL_xmfp">T</Type>) -&gt; (<Type usr="s:9MacroUser1TL_xmfp">T</Type>, <Type usr="s:SS">String</Type>) = #externalMacro(module: &quot;MacroDefinition&quot;, type: &quot;StringifyMacro&quot;)</Declaration>
84+
// CURSOR_MACRO_EXPR: <decl.macro><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@freestanding</syntaxtype.attribute.name>(expression)</syntaxtype.attribute.builtin> <syntaxtype.keyword>macro</syntaxtype.keyword> <decl.name>stringify</decl.name>&lt;<decl.generic_type_param usr="s:9MacroUser1TL_xmfp"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>&gt;(<decl.var.parameter><decl.var.parameter.argument_label>_</decl.var.parameter.argument_label> <decl.var.parameter.name>value</decl.var.parameter.name>: <decl.var.parameter.type><ref.generic_type_param usr="s:9MacroUser1TL_xmfp">T</ref.generic_type_param></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><tuple>(<tuple.element><tuple.element.type><ref.generic_type_param usr="s:9MacroUser1TL_xmfp">T</ref.generic_type_param></tuple.element.type></tuple.element>, <tuple.element><tuple.element.type><ref.struct usr="s:SS">String</ref.struct></tuple.element.type></tuple.element>)</tuple></decl.function.returntype> = #externalMacro(module: &quot;MacroDefinition&quot;, type: &quot;StringifyMacro&quot;)</decl.macro>
85+
// CURSOR_MACRO_EXPR-LABEL: SYMBOL GRAPH BEGIN
86+
// CURSOR_MACRO_EXPR: "identifier": {
87+
// CURSOR_MACRO_EXPR-NEXT: "interfaceLanguage": "swift",
88+
// CURSOR_MACRO_EXPR-NEXT: "precise": "s:9MacroUser9stringifyyx_SStxclufm"
89+
// CURSOR_MACRO_EXPR-NEXT: },
90+
// CURSOR_MACRO_EXPR-NEXT: "kind": {
91+
// CURSOR_MACRO_EXPR-NEXT: "displayName": "Macro",
92+
// CURSOR_MACRO_EXPR-NEXT: "identifier": "swift.macro"
93+
// CURSOR_MACRO_EXPR-NEXT: },
94+
// CURSOR_MACRO_EXPR: SYMBOL GRAPH END
95+
// CURSOR_MACRO_EXPR-LABEL: ACTIONS BEGIN
96+
// CURSOR_MACRO_EXPR: source.refactoring.kind.rename.global
97+
// CURSOR_MACRO_EXPR-NEXT: Global Rename
98+
// CURSOR_MACRO_EXPR: source.refactoring.kind.expand.macro
99+
// CURSOR_MACRO_EXPR-NEXT: Expand Macro
100+
// CURSOR_MACRO_EXPR: ACTIONS END
101+
102+
//##-- Refactoring on macro expression
111103
// RUN: %sourcekitd-test -req=refactoring.expand.macro -pos=4:7 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=EXPAND %s
112104
// RUN: %sourcekitd-test -req=refactoring.expand.macro -pos=4:8 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=EXPAND %s
113-
114105
// EXPAND: source.edit.kind.active:
115106
// EXPAND-NEXT: 4:7-4:24 (@__swiftmacro_9MacroUser13testStringify1a1bySi_SitF9stringifyfMf_.swift) "(a + b, "a + b")"
116107

117-
//##-- cursor-info at 'myTypeWrapper' position following @. We don't support
118-
// on the @ currently.
119-
// RUN: %sourcekitd-test -req=cursor -pos=21:2 -cursor-action -req-opts=retrieve_symbol_graph=1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_ATTACHED_MACRO %s
120-
// CURSOR_ATTACHED_MACRO-LABEL: SYMBOL GRAPH BEGIN
121-
// CURSOR_ATTACHED_MACRO: "identifier": {
122-
// CURSOR_ATTACHED_MACRO-NEXT: "interfaceLanguage": "swift",
123-
// CURSOR_ATTACHED_MACRO-NEXT: "precise": "s:9MacroUser13myTypeWrapperyycfm"
124-
// CURSOR_ATTACHED_MACRO-NEXT: },
125-
// CURSOR_ATTACHED_MACRO-NEXT: "kind": {
126-
// CURSOR_ATTACHED_MACRO-NEXT: "displayName": "Macro",
127-
// CURSOR_ATTACHED_MACRO-NEXT: "identifier": "swift.macro"
128-
// CURSOR_ATTACHED_MACRO-NEXT: },
129-
// CURSOR_ATTACHED_MACRO: SYMBOL GRAPH END
130-
// CURSOR_ATTACHED_MACRO-LABEL: ACTIONS BEGIN
131-
// CURSOR_ATTACHED_MACRO: source.refactoring.kind.expand.macro
132-
// CURSOR_ATTACHED_MACRO-NEXT: Expand Macro
133-
// CURSOR_ATTACHED_MACRO: ACTIONS END
134-
135-
//##-- Refactoring expanding the attached macro
108+
//##-- cursor-info on attached macro
109+
// RUN: %sourcekitd-test -req=cursor -pos=21:1 -cursor-action -req-opts=retrieve_symbol_graph=1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_ATTACHED %s
110+
// RUN: %sourcekitd-test -req=cursor -pos=21:2 -cursor-action -req-opts=retrieve_symbol_graph=1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=CURSOR_ATTACHED %s
111+
// CURSOR_ATTACHED: source.lang.swift.ref.macro (9:7-9:20)
112+
// CURSOR_ATTACHED-LABEL: SYMBOL GRAPH BEGIN
113+
// CURSOR_ATTACHED: "identifier": {
114+
// CURSOR_ATTACHED-NEXT: "interfaceLanguage": "swift",
115+
// CURSOR_ATTACHED-NEXT: "precise": "s:9MacroUser13myTypeWrapperyycfm"
116+
// CURSOR_ATTACHED-NEXT: },
117+
// CURSOR_ATTACHED-NEXT: "kind": {
118+
// CURSOR_ATTACHED-NEXT: "displayName": "Macro",
119+
// CURSOR_ATTACHED-NEXT: "identifier": "swift.macro"
120+
// CURSOR_ATTACHED-NEXT: },
121+
// CURSOR_ATTACHED: SYMBOL GRAPH END
122+
// CURSOR_ATTACHED-LABEL: ACTIONS BEGIN
123+
// CURSOR_ATTACHED: source.refactoring.kind.expand.macro
124+
// CURSOR_ATTACHED-NEXT: Expand Macro
125+
// CURSOR_ATTACHED: ACTIONS END
126+
127+
//##-- Refactoring on attached macro
128+
// RUN: %sourcekitd-test -req=refactoring.expand.macro -pos=21:1 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=ATTACHED_EXPAND %s
136129
// RUN: %sourcekitd-test -req=refactoring.expand.macro -pos=21:2 %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=ATTACHED_EXPAND %s
137130
// ATTACHED_EXPAND: source.edit.kind.active:
138131
// ATTACHED_EXPAND-NEXT: 23:3-23:3 (@__swiftmacro_9MacroUser1SV13myTypeWrapperfMA_.swift) "@accessViaStorage "
@@ -146,7 +139,7 @@ struct S4 { }
146139
// ATTACHED_EXPAND-NEXT: source.edit.kind.active:
147140
// ATTACHED_EXPAND-NEXT: 21:1-21:15 ""
148141

149-
//##-- Refactoring expanding the attribute expanded by @myTypeWrapper
142+
//##-- Refactoring on the attribute expanded by @myTypeWrapper
150143
// RUN: %sourcekitd-test -req=refactoring.expand.macro -pos=1:2 @__swiftmacro_9MacroUser1SV13myTypeWrapperfMA_.swift -primary-file %s -- ${COMPILER_ARGS[@]} | %FileCheck -check-prefix=NESTED_ATTACHED_EXPAND %s
151144
// NESTED_ATTACHED_EXPAND: source.edit.kind.active:
152145
// NESTED_ATTACHED_EXPAND-NEXT: Macros/macro_basic.swift 23:13-23:13 (@__swiftmacro_9MacroUser1SV1xSivp16accessViaStoragefMa_.swift) "{

0 commit comments

Comments
 (0)