Forráskód Böngészése

Implement Goto Definition functionality in the language server (#1411)

Signed-off-by: Govardhan G D <chioni1620@gmail.com>
Govardhan G D 2 éve
szülő
commit
5d1702d4bb

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 641 - 247
src/bin/languageserver/mod.rs


+ 76 - 0
vscode/src/test/suite/extension.test.ts

@@ -68,6 +68,13 @@ suite('Extension Test Suite', function () {
   test('Testing for Hover', async () => {
   test('Testing for Hover', async () => {
     await testhover(hoverdoc1);
     await testhover(hoverdoc1);
   });
   });
+
+  // Tests for goto-definitions.
+  this.timeout(20000);
+  const defdoc1 = getDocUri('defs.sol');
+  test('Testing for GotoDefinitions', async () => {
+    await testdefs(defdoc1);
+  });
 });
 });
 
 
 function toRange(lineno1: number, charno1: number, lineno2: number, charno2: number) {
 function toRange(lineno1: number, charno1: number, lineno2: number, charno2: number) {
@@ -76,6 +83,75 @@ function toRange(lineno1: number, charno1: number, lineno2: number, charno2: num
   return new vscode.Range(start, end);
   return new vscode.Range(start, end);
 }
 }
 
 
+async function testdefs(docUri: vscode.Uri) {
+  await activate(docUri);
+
+  const pos1 = new vscode.Position(38, 16);
+  const actualdef1 = (await vscode.commands.executeCommand(
+    'vscode.executeDefinitionProvider',
+    docUri,
+    pos1
+  )) as vscode.Definition[];
+  const loc1 = actualdef1[0] as vscode.Location;
+  assert.strictEqual(loc1.range.start.line, 27);
+  assert.strictEqual(loc1.range.start.character, 24);
+  assert.strictEqual(loc1.range.end.line, 27);
+  assert.strictEqual(loc1.range.end.character, 25);
+  assert.strictEqual(loc1.uri.path, docUri.path);
+
+  const pos2 = new vscode.Position(33, 18);
+  const actualdef2 = (await vscode.commands.executeCommand(
+    'vscode.executeDefinitionProvider',
+    docUri,
+    pos2
+  )) as vscode.Definition[];
+  const loc2 = actualdef2[0] as vscode.Location;
+  assert.strictEqual(loc2.range.start.line, 27);
+  assert.strictEqual(loc2.range.start.character, 50);
+  assert.strictEqual(loc2.range.end.line, 27);
+  assert.strictEqual(loc2.range.end.character, 55);
+  assert.strictEqual(loc2.uri.path, docUri.path);
+
+  const pos3 = new vscode.Position(32, 31);
+  const actualdef3 = (await vscode.commands.executeCommand(
+    'vscode.executeDefinitionProvider',
+    docUri,
+    pos3
+  )) as vscode.Definition[];
+  const loc3 = actualdef3[0] as vscode.Location;
+  assert.strictEqual(loc3.range.start.line, 19);
+  assert.strictEqual(loc3.range.start.character, 8);
+  assert.strictEqual(loc3.range.end.line, 19);
+  assert.strictEqual(loc3.range.end.character, 12);
+  assert.strictEqual(loc3.uri.path, docUri.path);
+
+  const pos4 = new vscode.Position(29, 18);
+  const actualdef4 = (await vscode.commands.executeCommand(
+    'vscode.executeDefinitionProvider',
+    docUri,
+    pos4
+  )) as vscode.Definition[];
+  const loc4 = actualdef4[0] as vscode.Location;
+  assert.strictEqual(loc4.range.start.line, 23);
+  assert.strictEqual(loc4.range.start.character, 8);
+  assert.strictEqual(loc4.range.end.line, 23);
+  assert.strictEqual(loc4.range.end.character, 15);
+  assert.strictEqual(loc4.uri.path, docUri.path);
+
+  const pos5 = new vscode.Position(28, 14);
+  const actualdef5 = (await vscode.commands.executeCommand(
+    'vscode.executeDefinitionProvider',
+    docUri,
+    pos5
+  )) as vscode.Definition[];
+  const loc5 = actualdef5[0] as vscode.Location;
+  assert.strictEqual(loc5.range.start.line, 24);
+  assert.strictEqual(loc5.range.start.character, 8);
+  assert.strictEqual(loc5.range.end.line, 24);
+  assert.strictEqual(loc5.range.end.character, 14);
+  assert.strictEqual(loc5.uri.path, docUri.path);
+}
+
 async function testhover(docUri: vscode.Uri) {
 async function testhover(docUri: vscode.Uri) {
   await activate(docUri);
   await activate(docUri);
 
 

+ 45 - 0
vscode/src/testFixture/defs.sol

@@ -0,0 +1,45 @@
+contract deck {
+    enum suit {
+        club,
+        diamonds,
+        hearts,
+        spades
+    }
+    enum value {
+        two,
+        three,
+        four,
+        five,
+        six,
+        seven,
+        eight,
+        nine,
+        ten,
+        jack,
+        queen,
+        king,
+        ace
+    }
+    struct card {
+        value v;
+        suit s;
+    }
+
+    function score(card c) public returns (uint32 score) {
+        if (c.s == suit.hearts) {
+            if (c.v == value.ace) {
+                score = 14;
+            }
+            if (c.v == value.king) {
+                score = 13;
+            }
+            if (c.v == value.queen) {
+                score = 12;
+            }
+            if (c.v == value.jack) {
+                score = 11;
+            }
+        }
+        // all others score 0
+    }
+}

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott