Skip to content

Commit

Permalink
feat: Support let arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
famoser committed Sep 17, 2023
1 parent 204ab20 commit 187259b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 5 deletions.
15 changes: 13 additions & 2 deletions server/src/tasks/collectors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {
BasicpatternContext,
NeidentseqContext, NepatternseqContext,
BasicpatternContext, MayfailvartypeseqContext,
NeidentseqContext, NemayfailvartypeseqContext, NepatternseqContext,
NevartypeContext,
OnevartypeContext,
TpatternContext, TpatternseqContext
Expand Down Expand Up @@ -70,4 +70,15 @@ export const collectBasicpattern = (ctx: BasicpatternContext): TerminalNode[] =>
}

return [];
};

export const collectNemayfailvartypeseq = (ctx: NemayfailvartypeseqContext) : TerminalNode[] => {
const identifiers = collectNeidentseqIDENTs(ctx.mayfailvartype().neidentseq());

const nemayfailvartypeseq = ctx.nemayfailvartypeseq();
if (nemayfailvartypeseq) {
return [...identifiers, ...collectNemayfailvartypeseq(nemayfailvartypeseq)];
}

return [...identifiers];
};
21 changes: 19 additions & 2 deletions server/src/tasks/create_symbol_table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import {
TprocessContext
} from "../parser-proverif/ProverifParser";
import {TerminalNode} from "antlr4ts/tree/TerminalNode";
import {collectNeidentseqIDENTs, collectNevartypeIDENTs, collectTPatternIDENTs} from "./collectors";
import {
collectNeidentseqIDENTs, collectNemayfailvartypeseq,
collectNevartypeIDENTs,
collectTPatternIDENTs
} from "./collectors";


export type CreateSymbolTableResult = {
Expand Down Expand Up @@ -50,7 +54,20 @@ class SymbolTableVisitor extends AbstractParseTreeVisitor<ProverifSymbolTable> i
});
}

return this.visitChildren(ctx);
if (ctx.LET()) {
return this.withContext(ctx, () => {
const mayfailvartypeseq = ctx.mayfailvartypeseq();
const nemayfailvartypeseq = mayfailvartypeseq?.nemayfailvartypeseq();
if (nemayfailvartypeseq) {
collectNemayfailvartypeseq(nemayfailvartypeseq).forEach(identifier => {
this.registerVariable(identifier);
});
}
return this.visitChildren(ctx);
});
} else {
return this.visitChildren(ctx);
}
};

public visitTprocess = (ctx: TprocessContext) => {
Expand Down
10 changes: 9 additions & 1 deletion server/tests/go_to_definition.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,21 @@ describe('parser', function () {
});

it("consider query variables", async () => {
const code = `free b: bitstring.\nquery x:bitstring; attacker(x). process \nin(c, b)`;
const code = `free b: bitstring.\nquery x:bitstring; attacker(x). process 0`;
const click = {line: 1, character: 29};
const target = {line: 1, character: 6};

await assertSingleFileNavigation(code, click, target, 1);
});

it("consider let arguments", async () => {
const code = `let Proc(c: channel) = \nin(c, b:bitstring).\nprocess 0`;
const click = {line: 1, character: 4};
const target = {line: 0, character: 9};

await assertSingleFileNavigation(code, click, target, 1);
});

it("checks in dependencies if not found in main", async () => {
const dependencyCode = `channel c.`;
const dependencyUri = 'dependency';
Expand Down

0 comments on commit 187259b

Please sign in to comment.