compiler/crates/react_compiler_ast/src/expressions.rs RUST 563 lines View on github.com → Search inside
1use serde::Deserialize;2use serde::Serialize;34use crate::common::BaseNode;5use crate::common::RawNode;6use crate::jsx::JSXElement;7use crate::jsx::JSXFragment;8use crate::literals::*;9use crate::operators::*;10use crate::patterns::AssignmentPattern;11use crate::patterns::PatternLike;12use crate::statements::BlockStatement;1314#[derive(Debug, Clone, Serialize, Deserialize)]15pub struct Identifier {16    #[serde(flatten)]17    pub base: BaseNode,18    pub name: String,19    #[serde(20        default,21        skip_serializing_if = "Option::is_none",22        rename = "typeAnnotation"23    )]24    pub type_annotation: Option<RawNode>,25    #[serde(default, skip_serializing_if = "Option::is_none")]26    pub optional: Option<bool>,27    #[serde(default, skip_serializing_if = "Option::is_none")]28    pub decorators: Option<Vec<RawNode>>,29}3031#[derive(Debug, Clone, Serialize, Deserialize)]32#[serde(tag = "type")]33pub enum Expression {34    Identifier(Identifier),35    StringLiteral(StringLiteral),36    NumericLiteral(NumericLiteral),37    BooleanLiteral(BooleanLiteral),38    NullLiteral(NullLiteral),39    BigIntLiteral(BigIntLiteral),40    RegExpLiteral(RegExpLiteral),41    CallExpression(CallExpression),42    MemberExpression(MemberExpression),43    OptionalCallExpression(OptionalCallExpression),44    OptionalMemberExpression(OptionalMemberExpression),45    BinaryExpression(BinaryExpression),46    LogicalExpression(LogicalExpression),47    UnaryExpression(UnaryExpression),48    UpdateExpression(UpdateExpression),49    ConditionalExpression(ConditionalExpression),50    AssignmentExpression(AssignmentExpression),51    SequenceExpression(SequenceExpression),52    ArrowFunctionExpression(ArrowFunctionExpression),53    FunctionExpression(FunctionExpression),54    ObjectExpression(ObjectExpression),55    ArrayExpression(ArrayExpression),56    NewExpression(NewExpression),57    TemplateLiteral(TemplateLiteral),58    TaggedTemplateExpression(TaggedTemplateExpression),59    AwaitExpression(AwaitExpression),60    YieldExpression(YieldExpression),61    SpreadElement(SpreadElement),62    MetaProperty(MetaProperty),63    ClassExpression(ClassExpression),64    PrivateName(PrivateName),65    Super(Super),66    Import(Import),67    ThisExpression(ThisExpression),68    ParenthesizedExpression(ParenthesizedExpression),69    // JSX expressions70    JSXElement(Box<JSXElement>),71    JSXFragment(JSXFragment),72    // Pattern (can appear in expression position in error recovery)73    AssignmentPattern(AssignmentPattern),74    // TypeScript expressions75    TSAsExpression(TSAsExpression),76    TSSatisfiesExpression(TSSatisfiesExpression),77    TSNonNullExpression(TSNonNullExpression),78    TSTypeAssertion(TSTypeAssertion),79    TSInstantiationExpression(TSInstantiationExpression),80    // Flow expressions81    TypeCastExpression(TypeCastExpression),82}8384#[derive(Debug, Clone, Serialize, Deserialize)]85pub struct CallExpression {86    #[serde(flatten)]87    pub base: BaseNode,88    pub callee: Box<Expression>,89    pub arguments: Vec<Expression>,90    #[serde(91        default,92        skip_serializing_if = "Option::is_none",93        rename = "typeParameters"94    )]95    pub type_parameters: Option<RawNode>,96    #[serde(97        default,98        skip_serializing_if = "Option::is_none",99        rename = "typeArguments"100    )]101    pub type_arguments: Option<RawNode>,102    #[serde(default, skip_serializing_if = "Option::is_none")]103    pub optional: Option<bool>,104}105106#[derive(Debug, Clone, Serialize, Deserialize)]107pub struct MemberExpression {108    #[serde(flatten)]109    pub base: BaseNode,110    pub object: Box<Expression>,111    pub property: Box<Expression>,112    pub computed: bool,113}114115#[derive(Debug, Clone, Serialize, Deserialize)]116pub struct OptionalCallExpression {117    #[serde(flatten)]118    pub base: BaseNode,119    pub callee: Box<Expression>,120    pub arguments: Vec<Expression>,121    pub optional: bool,122    #[serde(123        default,124        skip_serializing_if = "Option::is_none",125        rename = "typeParameters"126    )]127    pub type_parameters: Option<RawNode>,128    #[serde(129        default,130        skip_serializing_if = "Option::is_none",131        rename = "typeArguments"132    )]133    pub type_arguments: Option<RawNode>,134}135136#[derive(Debug, Clone, Serialize, Deserialize)]137pub struct OptionalMemberExpression {138    #[serde(flatten)]139    pub base: BaseNode,140    pub object: Box<Expression>,141    pub property: Box<Expression>,142    pub computed: bool,143    pub optional: bool,144}145146#[derive(Debug, Clone, Serialize, Deserialize)]147pub struct BinaryExpression {148    #[serde(flatten)]149    pub base: BaseNode,150    pub operator: BinaryOperator,151    pub left: Box<Expression>,152    pub right: Box<Expression>,153}154155#[derive(Debug, Clone, Serialize, Deserialize)]156pub struct LogicalExpression {157    #[serde(flatten)]158    pub base: BaseNode,159    pub operator: LogicalOperator,160    pub left: Box<Expression>,161    pub right: Box<Expression>,162}163164#[derive(Debug, Clone, Serialize, Deserialize)]165pub struct UnaryExpression {166    #[serde(flatten)]167    pub base: BaseNode,168    pub operator: UnaryOperator,169    pub prefix: bool,170    pub argument: Box<Expression>,171}172173#[derive(Debug, Clone, Serialize, Deserialize)]174pub struct UpdateExpression {175    #[serde(flatten)]176    pub base: BaseNode,177    pub operator: UpdateOperator,178    pub argument: Box<Expression>,179    pub prefix: bool,180}181182#[derive(Debug, Clone, Serialize, Deserialize)]183pub struct ConditionalExpression {184    #[serde(flatten)]185    pub base: BaseNode,186    pub test: Box<Expression>,187    pub consequent: Box<Expression>,188    pub alternate: Box<Expression>,189}190191#[derive(Debug, Clone, Serialize, Deserialize)]192pub struct AssignmentExpression {193    #[serde(flatten)]194    pub base: BaseNode,195    pub operator: AssignmentOperator,196    pub left: Box<PatternLike>,197    pub right: Box<Expression>,198}199200#[derive(Debug, Clone, Serialize, Deserialize)]201pub struct SequenceExpression {202    #[serde(flatten)]203    pub base: BaseNode,204    pub expressions: Vec<Expression>,205}206207#[derive(Debug, Clone, Serialize, Deserialize)]208pub struct ArrowFunctionExpression {209    #[serde(flatten)]210    pub base: BaseNode,211    pub params: Vec<PatternLike>,212    pub body: Box<ArrowFunctionBody>,213    #[serde(default)]214    pub id: Option<Identifier>,215    #[serde(default)]216    pub generator: bool,217    #[serde(default, rename = "async")]218    pub is_async: bool,219    #[serde(default, skip_serializing_if = "Option::is_none")]220    pub expression: Option<bool>,221    #[serde(222        default,223        skip_serializing_if = "Option::is_none",224        rename = "returnType"225    )]226    pub return_type: Option<RawNode>,227    #[serde(228        default,229        skip_serializing_if = "Option::is_none",230        rename = "typeParameters"231    )]232    pub type_parameters: Option<RawNode>,233    #[serde(234        default,235        skip_serializing_if = "Option::is_none",236        rename = "predicate",237        deserialize_with = "crate::common::nullable_value"238    )]239    pub predicate: Option<RawNode>,240}241242#[derive(Debug, Clone, Serialize, Deserialize)]243#[serde(tag = "type")]244pub enum ArrowFunctionBody {245    BlockStatement(BlockStatement),246    #[serde(untagged)]247    Expression(Box<Expression>),248}249250#[derive(Debug, Clone, Serialize, Deserialize)]251pub struct FunctionExpression {252    #[serde(flatten)]253    pub base: BaseNode,254    pub params: Vec<PatternLike>,255    pub body: BlockStatement,256    #[serde(default)]257    pub id: Option<Identifier>,258    #[serde(default)]259    pub generator: bool,260    #[serde(default, rename = "async")]261    pub is_async: bool,262    #[serde(263        default,264        skip_serializing_if = "Option::is_none",265        rename = "returnType"266    )]267    pub return_type: Option<RawNode>,268    #[serde(269        default,270        skip_serializing_if = "Option::is_none",271        rename = "typeParameters"272    )]273    pub type_parameters: Option<RawNode>,274    #[serde(275        default,276        skip_serializing_if = "Option::is_none",277        rename = "predicate",278        deserialize_with = "crate::common::nullable_value"279    )]280    pub predicate: Option<RawNode>,281}282283#[derive(Debug, Clone, Serialize, Deserialize)]284pub struct ObjectExpression {285    #[serde(flatten)]286    pub base: BaseNode,287    pub properties: Vec<ObjectExpressionProperty>,288}289290#[derive(Debug, Clone, Serialize, Deserialize)]291#[serde(tag = "type")]292pub enum ObjectExpressionProperty {293    ObjectProperty(ObjectProperty),294    ObjectMethod(ObjectMethod),295    SpreadElement(SpreadElement),296}297298#[derive(Debug, Clone, Serialize, Deserialize)]299pub struct ObjectProperty {300    #[serde(flatten)]301    pub base: BaseNode,302    pub key: Box<Expression>,303    pub value: Box<Expression>,304    pub computed: bool,305    pub shorthand: bool,306    #[serde(default, skip_serializing_if = "Option::is_none")]307    pub decorators: Option<Vec<RawNode>>,308    #[serde(default, skip_serializing_if = "Option::is_none")]309    pub method: Option<bool>,310}311312#[derive(Debug, Clone, Serialize, Deserialize)]313pub struct ObjectMethod {314    #[serde(flatten)]315    pub base: BaseNode,316    pub method: bool,317    pub kind: ObjectMethodKind,318    pub key: Box<Expression>,319    pub params: Vec<PatternLike>,320    pub body: BlockStatement,321    pub computed: bool,322    #[serde(default)]323    pub id: Option<Identifier>,324    #[serde(default)]325    pub generator: bool,326    #[serde(default, rename = "async")]327    pub is_async: bool,328    #[serde(default, skip_serializing_if = "Option::is_none")]329    pub decorators: Option<Vec<RawNode>>,330    #[serde(331        default,332        skip_serializing_if = "Option::is_none",333        rename = "returnType"334    )]335    pub return_type: Option<RawNode>,336    #[serde(337        default,338        skip_serializing_if = "Option::is_none",339        rename = "typeParameters"340    )]341    pub type_parameters: Option<RawNode>,342    #[serde(343        default,344        skip_serializing_if = "Option::is_none",345        rename = "predicate",346        deserialize_with = "crate::common::nullable_value"347    )]348    pub predicate: Option<RawNode>,349}350351#[derive(Debug, Clone, Serialize, Deserialize)]352#[serde(rename_all = "lowercase")]353pub enum ObjectMethodKind {354    Method,355    Get,356    Set,357}358359#[derive(Debug, Clone, Serialize, Deserialize)]360pub struct ArrayExpression {361    #[serde(flatten)]362    pub base: BaseNode,363    pub elements: Vec<Option<Expression>>,364}365366#[derive(Debug, Clone, Serialize, Deserialize)]367pub struct NewExpression {368    #[serde(flatten)]369    pub base: BaseNode,370    pub callee: Box<Expression>,371    pub arguments: Vec<Expression>,372    #[serde(373        default,374        skip_serializing_if = "Option::is_none",375        rename = "typeParameters"376    )]377    pub type_parameters: Option<RawNode>,378    #[serde(379        default,380        skip_serializing_if = "Option::is_none",381        deserialize_with = "crate::common::nullable_value",382        rename = "typeArguments"383    )]384    pub type_arguments: Option<RawNode>,385}386387#[derive(Debug, Clone, Serialize, Deserialize)]388pub struct TemplateLiteral {389    #[serde(flatten)]390    pub base: BaseNode,391    pub quasis: Vec<TemplateElement>,392    pub expressions: Vec<Expression>,393}394395#[derive(Debug, Clone, Serialize, Deserialize)]396pub struct TaggedTemplateExpression {397    #[serde(flatten)]398    pub base: BaseNode,399    pub tag: Box<Expression>,400    pub quasi: TemplateLiteral,401    #[serde(402        default,403        skip_serializing_if = "Option::is_none",404        rename = "typeParameters"405    )]406    pub type_parameters: Option<RawNode>,407}408409#[derive(Debug, Clone, Serialize, Deserialize)]410pub struct AwaitExpression {411    #[serde(flatten)]412    pub base: BaseNode,413    pub argument: Box<Expression>,414}415416#[derive(Debug, Clone, Serialize, Deserialize)]417pub struct YieldExpression {418    #[serde(flatten)]419    pub base: BaseNode,420    #[serde(default, skip_serializing_if = "Option::is_none")]421    pub argument: Option<Box<Expression>>,422    pub delegate: bool,423}424425#[derive(Debug, Clone, Serialize, Deserialize)]426pub struct SpreadElement {427    #[serde(flatten)]428    pub base: BaseNode,429    pub argument: Box<Expression>,430}431432#[derive(Debug, Clone, Serialize, Deserialize)]433pub struct MetaProperty {434    #[serde(flatten)]435    pub base: BaseNode,436    pub meta: Identifier,437    pub property: Identifier,438}439440#[derive(Debug, Clone, Serialize, Deserialize)]441pub struct ClassExpression {442    #[serde(flatten)]443    pub base: BaseNode,444    #[serde(default)]445    pub id: Option<Identifier>,446    #[serde(rename = "superClass")]447    pub super_class: Option<Box<Expression>>,448    pub body: ClassBody,449    #[serde(default, skip_serializing_if = "Option::is_none")]450    pub decorators: Option<Vec<RawNode>>,451    #[serde(452        default,453        skip_serializing_if = "Option::is_none",454        rename = "implements"455    )]456    pub implements: Option<Vec<RawNode>>,457    #[serde(458        default,459        skip_serializing_if = "Option::is_none",460        rename = "superTypeParameters"461    )]462    pub super_type_parameters: Option<RawNode>,463    #[serde(464        default,465        skip_serializing_if = "Option::is_none",466        rename = "typeParameters"467    )]468    pub type_parameters: Option<RawNode>,469}470471#[derive(Debug, Clone, Serialize, Deserialize)]472pub struct ClassBody {473    #[serde(flatten)]474    pub base: BaseNode,475    pub body: Vec<RawNode>,476}477478#[derive(Debug, Clone, Serialize, Deserialize)]479pub struct PrivateName {480    #[serde(flatten)]481    pub base: BaseNode,482    pub id: Identifier,483}484485#[derive(Debug, Clone, Serialize, Deserialize)]486pub struct Super {487    #[serde(flatten)]488    pub base: BaseNode,489}490491#[derive(Debug, Clone, Serialize, Deserialize)]492pub struct Import {493    #[serde(flatten)]494    pub base: BaseNode,495}496497#[derive(Debug, Clone, Serialize, Deserialize)]498pub struct ThisExpression {499    #[serde(flatten)]500    pub base: BaseNode,501}502503#[derive(Debug, Clone, Serialize, Deserialize)]504pub struct ParenthesizedExpression {505    #[serde(flatten)]506    pub base: BaseNode,507    pub expression: Box<Expression>,508}509510// TypeScript expression nodes (pass-through with RawNode for type args)511#[derive(Debug, Clone, Serialize, Deserialize)]512pub struct TSAsExpression {513    #[serde(flatten)]514    pub base: BaseNode,515    pub expression: Box<Expression>,516    #[serde(rename = "typeAnnotation")]517    pub type_annotation: RawNode,518}519520#[derive(Debug, Clone, Serialize, Deserialize)]521pub struct TSSatisfiesExpression {522    #[serde(flatten)]523    pub base: BaseNode,524    pub expression: Box<Expression>,525    #[serde(rename = "typeAnnotation")]526    pub type_annotation: RawNode,527}528529#[derive(Debug, Clone, Serialize, Deserialize)]530pub struct TSNonNullExpression {531    #[serde(flatten)]532    pub base: BaseNode,533    pub expression: Box<Expression>,534}535536#[derive(Debug, Clone, Serialize, Deserialize)]537pub struct TSTypeAssertion {538    #[serde(flatten)]539    pub base: BaseNode,540    pub expression: Box<Expression>,541    #[serde(rename = "typeAnnotation")]542    pub type_annotation: RawNode,543}544545#[derive(Debug, Clone, Serialize, Deserialize)]546pub struct TSInstantiationExpression {547    #[serde(flatten)]548    pub base: BaseNode,549    pub expression: Box<Expression>,550    #[serde(rename = "typeParameters")]551    pub type_parameters: RawNode,552}553554// Flow expression nodes555#[derive(Debug, Clone, Serialize, Deserialize)]556pub struct TypeCastExpression {557    #[serde(flatten)]558    pub base: BaseNode,559    pub expression: Box<Expression>,560    #[serde(rename = "typeAnnotation")]561    pub type_annotation: RawNode,562}

Code quality findings 2

Info: Wildcard imports (`use some::path::*;`) can obscure the origin of names and lead to conflicts. Prefer importing specific items explicitly.
info maintainability wildcard-import
use crate::literals::*;
Info: Wildcard imports (`use some::path::*;`) can obscure the origin of names and lead to conflicts. Prefer importing specific items explicitly.
info maintainability wildcard-import
use crate::operators::*;

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.