prettier-plugin-solidity
Version:
A Prettier Plugin for automatically formatting your Solidity code.
133 lines • 7.11 kB
JavaScript
import { NonterminalKind, TerminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
import { AssignmentExpression } from './AssignmentExpression.js';
import { ConditionalExpression } from './ConditionalExpression.js';
import { OrExpression } from './OrExpression.js';
import { AndExpression } from './AndExpression.js';
import { EqualityExpression } from './EqualityExpression.js';
import { InequalityExpression } from './InequalityExpression.js';
import { BitwiseOrExpression } from './BitwiseOrExpression.js';
import { BitwiseXorExpression } from './BitwiseXorExpression.js';
import { BitwiseAndExpression } from './BitwiseAndExpression.js';
import { ShiftExpression } from './ShiftExpression.js';
import { AdditiveExpression } from './AdditiveExpression.js';
import { MultiplicativeExpression } from './MultiplicativeExpression.js';
import { ExponentiationExpression } from './ExponentiationExpression.js';
import { PostfixExpression } from './PostfixExpression.js';
import { PrefixExpression } from './PrefixExpression.js';
import { FunctionCallExpression } from './FunctionCallExpression.js';
import { CallOptionsExpression } from './CallOptionsExpression.js';
import { MemberAccessExpression } from './MemberAccessExpression.js';
import { IndexAccessExpression } from './IndexAccessExpression.js';
import { NewExpression } from './NewExpression.js';
import { TupleExpression } from './TupleExpression.js';
import { TypeExpression } from './TypeExpression.js';
import { ArrayExpression } from './ArrayExpression.js';
import { HexNumberExpression } from './HexNumberExpression.js';
import { DecimalNumberExpression } from './DecimalNumberExpression.js';
import { StringExpression } from './StringExpression.js';
import { ElementaryType } from './ElementaryType.js';
import { Identifier } from './Identifier.js';
export class Expression {
constructor(ast, options) {
this.kind = NonterminalKind.Expression;
let metadata = getNodeMetadata(ast);
if (ast.variant instanceof TerminalNode) {
this.variant = new Identifier(ast.variant);
}
else {
switch (ast.variant.cst.kind) {
case NonterminalKind.AssignmentExpression:
this.variant = new AssignmentExpression(ast.variant, options);
break;
case NonterminalKind.ConditionalExpression:
this.variant = new ConditionalExpression(ast.variant, options);
break;
case NonterminalKind.OrExpression:
this.variant = new OrExpression(ast.variant, options);
break;
case NonterminalKind.AndExpression:
this.variant = new AndExpression(ast.variant, options);
break;
case NonterminalKind.EqualityExpression:
this.variant = new EqualityExpression(ast.variant, options);
break;
case NonterminalKind.InequalityExpression:
this.variant = new InequalityExpression(ast.variant, options);
break;
case NonterminalKind.BitwiseOrExpression:
this.variant = new BitwiseOrExpression(ast.variant, options);
break;
case NonterminalKind.BitwiseXorExpression:
this.variant = new BitwiseXorExpression(ast.variant, options);
break;
case NonterminalKind.BitwiseAndExpression:
this.variant = new BitwiseAndExpression(ast.variant, options);
break;
case NonterminalKind.ShiftExpression:
this.variant = new ShiftExpression(ast.variant, options);
break;
case NonterminalKind.AdditiveExpression:
this.variant = new AdditiveExpression(ast.variant, options);
break;
case NonterminalKind.MultiplicativeExpression:
this.variant = new MultiplicativeExpression(ast.variant, options);
break;
case NonterminalKind.ExponentiationExpression:
this.variant = new ExponentiationExpression(ast.variant, options);
break;
case NonterminalKind.PostfixExpression:
this.variant = new PostfixExpression(ast.variant, options);
break;
case NonterminalKind.PrefixExpression:
this.variant = new PrefixExpression(ast.variant, options);
break;
case NonterminalKind.FunctionCallExpression:
this.variant = new FunctionCallExpression(ast.variant, options);
break;
case NonterminalKind.CallOptionsExpression:
this.variant = new CallOptionsExpression(ast.variant, options);
break;
case NonterminalKind.MemberAccessExpression:
this.variant = new MemberAccessExpression(ast.variant, options);
break;
case NonterminalKind.IndexAccessExpression:
this.variant = new IndexAccessExpression(ast.variant, options);
break;
case NonterminalKind.NewExpression:
this.variant = new NewExpression(ast.variant, options);
break;
case NonterminalKind.TupleExpression:
this.variant = new TupleExpression(ast.variant, options);
break;
case NonterminalKind.TypeExpression:
this.variant = new TypeExpression(ast.variant, options);
break;
case NonterminalKind.ArrayExpression:
this.variant = new ArrayExpression(ast.variant, options);
break;
case NonterminalKind.HexNumberExpression:
this.variant = new HexNumberExpression(ast.variant);
break;
case NonterminalKind.DecimalNumberExpression:
this.variant = new DecimalNumberExpression(ast.variant);
break;
case NonterminalKind.StringExpression:
this.variant = new StringExpression(ast.variant, options);
break;
case NonterminalKind.ElementaryType:
this.variant = new ElementaryType(ast.variant);
break;
default:
throw new Error(`Unexpected variant: ${ast.variant.cst.kind}`);
}
}
metadata = updateMetadata(metadata, this.variant.kind === TerminalKind.Identifier ? [] : [this.variant]);
this.comments = metadata.comments;
this.loc = metadata.loc;
}
print(path, print) {
return path.call(print, 'variant');
}
}
//# sourceMappingURL=Expression.js.map