Skip to content

Commit

Permalink
Merge pull request #6 from jeasonstudio/feat-modify-g4-support-using-…
Browse files Browse the repository at this point in the history
…aliases

feat: support using aliases
  • Loading branch information
jeasonstudio authored Jan 22, 2024
2 parents 221f5dc + 96561ae commit e0895f7
Show file tree
Hide file tree
Showing 12 changed files with 1,662 additions and 1,591 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,5 @@ dist
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

grammar/.antlr/*
9 changes: 8 additions & 1 deletion grammar/SolidityParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,14 @@ userDefinableOperator:
* Using directive to attach library functions and free functions to types.
* Can occur within contracts and libraries and at the file level.
*/
usingDirective: Using (identifierPath | (LBrace identifierPath (As userDefinableOperator)? (Comma identifierPath (As userDefinableOperator)?)* RBrace)) For (Mul | typeName) Global? Semicolon;
usingDirective:
Using (
identifierPath
| (LBrace usingAliases (Comma usingAliases)* RBrace)
) For (Mul | typeName) Global? Semicolon;

usingAliases: identifierPath (As userDefinableOperator)?;

/**
* A type name can be an elementary type, a function type, a mapping type, a user-defined type
* (e.g. a contract or struct) or an array type.
Expand Down
3 changes: 2 additions & 1 deletion src/antlr4/SolidityParser.interp

Large diffs are not rendered by default.

3,176 changes: 1,606 additions & 1,570 deletions src/antlr4/SolidityParser.ts

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions src/antlr4/SolidityParserListener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import { ErrorParameterContext } from "./SolidityParser.js";
import { ErrorDefinitionContext } from "./SolidityParser.js";
import { UserDefinableOperatorContext } from "./SolidityParser.js";
import { UsingDirectiveContext } from "./SolidityParser.js";
import { UsingAliasesContext } from "./SolidityParser.js";
import { TypeNameContext } from "./SolidityParser.js";
import { ElementaryTypeNameContext } from "./SolidityParser.js";
import { FunctionTypeNameContext } from "./SolidityParser.js";
Expand Down Expand Up @@ -507,6 +508,16 @@ export class SolidityParserListener implements ParseTreeListener {
* @param ctx the parse tree
*/
exitUsingDirective?: (ctx: UsingDirectiveContext) => void;
/**
* Enter a parse tree produced by `SolidityParser.usingAliases`.
* @param ctx the parse tree
*/
enterUsingAliases?: (ctx: UsingAliasesContext) => void;
/**
* Exit a parse tree produced by `SolidityParser.usingAliases`.
* @param ctx the parse tree
*/
exitUsingAliases?: (ctx: UsingAliasesContext) => void;
/**
* Enter a parse tree produced by `SolidityParser.typeName`.
* @param ctx the parse tree
Expand Down
7 changes: 7 additions & 0 deletions src/antlr4/SolidityParserVisitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import { ErrorParameterContext } from "./SolidityParser.js";
import { ErrorDefinitionContext } from "./SolidityParser.js";
import { UserDefinableOperatorContext } from "./SolidityParser.js";
import { UsingDirectiveContext } from "./SolidityParser.js";
import { UsingAliasesContext } from "./SolidityParser.js";
import { TypeNameContext } from "./SolidityParser.js";
import { ElementaryTypeNameContext } from "./SolidityParser.js";
import { FunctionTypeNameContext } from "./SolidityParser.js";
Expand Down Expand Up @@ -358,6 +359,12 @@ export class SolidityParserVisitor<Result> extends AbstractParseTreeVisitor<Resu
* @return the visitor result
*/
visitUsingDirective?: (ctx: UsingDirectiveContext) => Result;
/**
* Visit a parse tree produced by `SolidityParser.usingAliases`.
* @param ctx the parse tree
* @return the visitor result
*/
visitUsingAliases?: (ctx: UsingAliasesContext) => Result;
/**
* Visit a parse tree produced by `SolidityParser.typeName`.
* @param ctx the parse tree
Expand Down
1 change: 1 addition & 0 deletions src/ast/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export class SolidityASTBuilder extends parser.SolidityParserVisitor<ast.SyntaxN
visitErrorDefinition = (ctx: parser.ErrorDefinitionContext) => new ast.ErrorDefinition(ctx, this);
visitUserDefinableOperator = (ctx: parser.UserDefinableOperatorContext) =>
new ast.UserDefinableOperator(ctx, this);
visitUsingAliases = (ctx: parser.UsingAliasesContext) => new ast.UsingAliases(ctx, this);
visitUsingDirective = (ctx: parser.UsingDirectiveContext) => new ast.UsingDirective(ctx, this);
visitTypeName = (ctx: parser.TypeNameContext) => new ast.TypeName(ctx, this);
visitElementaryTypeName = (ctx: parser.ElementaryTypeNameContext) =>
Expand Down
2 changes: 2 additions & 0 deletions src/ast/meta/index.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { ModifierInvocation } from './modifier-invocation';
import { Path } from './path';
import { PragmaDirective } from './pragma-directive';
import { SourceUnit } from './source-unit';
import { UsingAliases } from './using-aliases';
import { UsingDirective } from './using-directive';

export {
Expand All @@ -19,5 +20,6 @@ export {
Path,
PragmaDirective,
SourceUnit,
UsingAliases,
UsingDirective,
};
1 change: 1 addition & 0 deletions src/ast/meta/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ export * from './path';
export * from './pragma-directive';
export * from './source-unit';
export * from './symbol-aliases';
export * from './using-aliases';
export * from './using-directive';
15 changes: 15 additions & 0 deletions src/ast/meta/using-aliases.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { BaseNode } from '../base';
import { UsingAliasesContext, SolidityParserVisitor } from '../../antlr4';
import { IdentifierPath } from './identifier-path';
import { UserDefinableOperator } from '../expression';

export class UsingAliases extends BaseNode {
type = 'UsingAliases' as const;
name: IdentifierPath;
operator: UserDefinableOperator | null = null;
constructor(ctx: UsingAliasesContext, visitor: SolidityParserVisitor<any>) {
super(ctx, visitor);
this.name = ctx.identifierPath().accept(visitor);
this.operator = ctx.userDefinableOperator()?.accept(visitor) ?? null;
}
}
18 changes: 5 additions & 13 deletions src/ast/meta/using-directive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,23 @@ import { UsingDirectiveContext, SolidityParserVisitor } from '../../antlr4';
import { UserDefinedValueTypeDefinition } from '../declaration';
import { IdentifierPath } from './identifier-path';
import { TypeName } from '../type';
import { UserDefinableOperator } from '../expression';
import { UsingAliases } from './using-aliases';

export class UsingDirective extends BaseNode {
type = 'UsingDirective' as const;
global: boolean;
libraryName: UserDefinedValueTypeDefinition | IdentifierPath | null = null;
definitions: IdentifierPath[] | null = null;
operators: (UserDefinableOperator | null)[] | null = null;
usingAliases: UsingAliases[] | null = null;
typeName: TypeName | '*';
constructor(ctx: UsingDirectiveContext, visitor: SolidityParserVisitor<any>) {
super(ctx, visitor);
this.global = !!ctx.Global();
this.typeName = !!ctx.Mul() ? '*' : ctx.typeName()?.accept(visitor);

const isObjectUsing = !!ctx.LBrace() && !!ctx.RBrace();
if (!isObjectUsing) {
this.libraryName = ctx.identifierPath(0)?.accept(visitor) ?? null;
if (ctx.identifierPath() && !ctx.usingAliases().length) {
this.libraryName = ctx.identifierPath()!.accept(visitor);
} else {
this.operators = [];
this.definitions = [];
ctx.identifierPath().forEach((p, index) => {
this.definitions![index] = p.accept(visitor);
// TODO@jeason: How to relate operator and definition together
this.operators![index] = null;
});
this.usingAliases = ctx.usingAliases().map((usingAlias) => usingAlias.accept(visitor));
}
}
}
8 changes: 2 additions & 6 deletions src/tests/meta.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,12 @@ test('usingDirective', () => {
global: true,
});
expect(createParse((p) => p.usingDirective())(`using { A, C.D } for B;`)).toMatchObject({
definitions: ['A', 'C.D'],
usingAliases: [{ name: 'A' }, { name: 'C.D' }],
typeName: 'B',
global: false,
});
expect(createParse((p) => p.usingDirective())(`using { B, add as + } for B;`)).toMatchObject({
definitions: [
'B',
'add',
// operator: '+', // TODO
],
usingAliases: [{ name: 'B' }, { name: 'add', operator: '+' }],
typeName: 'B',
global: false,
});
Expand Down

0 comments on commit e0895f7

Please sign in to comment.