Skip to content

Commit d4777a4

Browse files
committed
Supported references
1 parent 406b7f2 commit d4777a4

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { onCompletion } from "./completion";
1111
import { onDefinition } from "./definition";
1212
import { onFormatting } from "./formatting";
1313
import { onHover } from "./hover";
14+
import { onReferences } from "./references";
1415
import { onRename } from "./rename";
1516
import { Solidity } from "./solidity";
1617

@@ -36,6 +37,7 @@ export function createServer(
3637
connection.onHover(onHover);
3738
connection.onCompletion(onCompletion);
3839
connection.onRenameRequest(onRename);
40+
connection.onReferences(onReferences);
3941

4042
connection.onDidChangeConfiguration(({ settings }) => {
4143
options = settings.solidity;

src/parse.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ import {
66
EventDefinition,
77
Expression,
88
FunctionDefinition,
9+
Identifier,
910
IdentifierPath,
1011
ImportDirective,
12+
MemberAccess,
1113
ModifierDefinition,
1214
SourceUnit,
1315
Statement,
1416
StructDefinition,
1517
TypeName,
18+
UserDefinedTypeName,
1619
UserDefinedValueTypeDefinition,
1720
VariableDeclaration,
1821
} from "solidity-ast";
@@ -50,10 +53,13 @@ export type Definition =
5053

5154
export type DefinitionNode = Definition & ASTNodeData;
5255
export type ImportNode = ImportDirective & ASTNodeData;
56+
export type IdentifierNode = (Identifier | MemberAccess | UserDefinedTypeName) &
57+
ASTNodeData;
5358

5459
export function parse(
5560
node: ASTNode,
5661
root: ASTNode,
62+
identifiers: ASTNode[],
5763
definitions: ASTNode[],
5864
scopes: Map<number, DefinitionNode[]>,
5965
nodes: ASTNode[],
@@ -83,6 +89,10 @@ export function parse(
8389
} else {
8490
scopes.set(scopeId, [node]);
8591
}
92+
case "Identifier":
93+
case "MemberAccess":
94+
case "UserDefinedTypeName":
95+
identifiers.push(node);
8696
break;
8797
}
8898
switch (node.nodeType) {
@@ -175,7 +185,7 @@ export function parse(
175185
for (const child of children) {
176186
if (!child) continue;
177187
child.parent = node;
178-
parse(child, root, definitions, scopes, nodes, nodeMap);
188+
parse(child, root, identifiers, definitions, scopes, nodes, nodeMap);
179189
}
180190
}
181191

src/references.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Location, Range, ReferenceParams } from "vscode-languageserver";
2+
import { documents, solidityMap } from ".";
3+
4+
export function onReferences({
5+
textDocument: { uri },
6+
position,
7+
}: ReferenceParams): Location[] {
8+
const document = documents.get(uri);
9+
if (!document) return [];
10+
11+
const solidity = solidityMap.get(uri);
12+
if (!solidity) return [];
13+
14+
const node = solidity.getCurrentNodes(position)[0];
15+
let nodeId = node.id;
16+
const ref = Reflect.get(node, "referencedDeclaration");
17+
if (ref) {
18+
nodeId = ref;
19+
}
20+
const items = solidity.identifiers.filter(
21+
(i) => i.referencedDeclaration == nodeId
22+
);
23+
24+
return items.map((i) => {
25+
return Location.create(
26+
uri,
27+
Range.create(
28+
document.positionAt(i.srcStart!),
29+
document.positionAt(i.srcEnd!)
30+
)
31+
);
32+
});
33+
}

src/solidity.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { SourceUnit } from "solidity-ast";
22
import { Position, TextDocument } from "vscode-languageserver-textdocument";
3-
import { ASTNode, DefinitionNode, ImportNode, parse } from "./parse";
3+
import {
4+
ASTNode,
5+
DefinitionNode,
6+
IdentifierNode,
7+
ImportNode,
8+
parse,
9+
} from "./parse";
410

511
export class Solidity {
612
document: TextDocument;
13+
identifiers: IdentifierNode[] = [];
714
definitions: DefinitionNode[] = [];
815
nodes = new Map<string, ASTNode[]>();
916
scopes = new Map<number, DefinitionNode[]>();
@@ -21,6 +28,7 @@ export class Solidity {
2128
parse(
2229
root,
2330
root,
31+
this.identifiers,
2432
this.definitions,
2533
this.scopes,
2634
this.nodes.get(uri)!,

0 commit comments

Comments
 (0)