diff --git a/.github/generated/ast_changes_watch_list.yml b/.github/generated/ast_changes_watch_list.yml index 5c78d942eaf3a..4fa31c451b262 100644 --- a/.github/generated/ast_changes_watch_list.yml +++ b/.github/generated/ast_changes_watch_list.yml @@ -38,6 +38,8 @@ src: - 'crates/oxc_formatter/src/generated/ast_nodes.rs' - 'crates/oxc_formatter/src/generated/format.rs' - 'crates/oxc_formatter/src/generated/format_write.rs' + - 'crates/oxc_linter/src/generated/assert_layouts.rs' + - 'crates/oxc_linter/src/lib.rs' - 'crates/oxc_regular_expression/src/ast.rs' - 'crates/oxc_regular_expression/src/generated/assert_layouts.rs' - 'crates/oxc_regular_expression/src/generated/derive_clone_in.rs' diff --git a/Cargo.lock b/Cargo.lock index c4482dd313d76..731197308d020 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1959,6 +1959,7 @@ dependencies = [ "oxc-schemars", "oxc_allocator", "oxc_ast", + "oxc_ast_macros", "oxc_ast_visit", "oxc_cfg", "oxc_codegen", diff --git a/crates/oxc_ast_macros/src/generated/structs.rs b/crates/oxc_ast_macros/src/generated/structs.rs index e4d0827dfa496..85b5a0fd7a814 100644 --- a/crates/oxc_ast_macros/src/generated/structs.rs +++ b/crates/oxc_ast_macros/src/generated/structs.rs @@ -9,299 +9,300 @@ pub static STRUCTS: phf::Map<&'static str, StructDetails> = ::phf::Map { key: 16287231350648472473, disps: &[ (0, 0), - (0, 12), - (0, 26), - (0, 1), - (0, 149), - (0, 105), - (0, 130), - (2, 181), - (1, 120), - (2, 197), - (0, 72), - (0, 6), - (0, 0), - (0, 209), - (0, 101), - (0, 1), - (0, 2), - (0, 120), - (11, 131), - (0, 82), - (16, 84), - (0, 0), - (0, 143), - (0, 216), - (0, 7), - (3, 125), - (1, 9), - (0, 13), - (2, 136), + (0, 45), + (0, 37), + (0, 18), + (0, 48), + (0, 35), + (1, 52), + (0, 96), + (9, 103), + (0, 224), + (1, 186), + (0, 24), + (0, 15), + (0, 40), + (0, 126), + (0, 3), + (0, 25), + (2, 3), + (17, 202), + (0, 44), + (1, 114), + (0, 4), + (0, 60), + (4, 210), + (1, 33), + (0, 23), + (0, 15), (0, 53), - (1, 30), - (0, 64), - (2, 100), - (0, 5), - (1, 195), - (4, 201), (0, 48), - (3, 94), + (0, 208), + (1, 221), + (0, 179), + (3, 90), + (0, 0), + (9, 71), + (1, 213), + (0, 15), + (20, 206), + (0, 0), + (3, 30), + (0, 42), + (1, 5), + (34, 174), + (0, 67), + (0, 93), + (141, 200), (0, 0), - (3, 57), - (2, 198), - (0, 5), - (25, 26), - (0, 31), - (0, 113), - (44, 69), - (1, 9), ], entries: &[ - ("PrivateIdentifier", StructDetails { field_order: None }), - ("ExportDefaultDeclaration", StructDetails { field_order: None }), - ("ChainExpression", StructDetails { field_order: None }), - ("TSTypeAliasDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 3, 5, 4]) }), - ("ClassStringDisjunction", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("ImportNamespaceSpecifier", StructDetails { field_order: None }), - ("LookAroundAssertion", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("MetaProperty", StructDetails { field_order: None }), - ("LabeledStatement", StructDetails { field_order: None }), - ("SpreadElement", StructDetails { field_order: None }), - ("BreakStatement", StructDetails { field_order: None }), - ("CatchClause", StructDetails { field_order: None }), + ("JSXFragment", StructDetails { field_order: None }), + ("TSTemplateLiteralType", StructDetails { field_order: None }), + ("Quantifier", StructDetails { field_order: Some(&[0, 1, 2, 4, 3]) }), + ("IdentifierReference", StructDetails { field_order: None }), + ("BindingPattern", StructDetails { field_order: None }), + ("TSUnknownKeyword", StructDetails { field_order: None }), + ("Elision", StructDetails { field_order: None }), ("Decorator", StructDetails { field_order: None }), - ("TSIntersectionType", StructDetails { field_order: None }), - ("ImportExpression", StructDetails { field_order: None }), - ("TSClassImplements", StructDetails { field_order: None }), - ("TSTypeAssertion", StructDetails { field_order: None }), - ("SwitchCase", StructDetails { field_order: None }), - ("IfStatement", StructDetails { field_order: None }), + ("UnaryExpression", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("JSXElement", StructDetails { field_order: None }), ("TSIntrinsicKeyword", StructDetails { field_order: None }), - ("TSArrayType", StructDetails { field_order: None }), - ("TSConstructorType", StructDetails { field_order: Some(&[0, 4, 1, 2, 3]) }), - ("LabelIdentifier", StructDetails { field_order: None }), - ("JSXClosingFragment", StructDetails { field_order: None }), - ("TSInstantiationExpression", StructDetails { field_order: None }), - ( - "Function", - StructDetails { field_order: Some(&[0, 8, 1, 9, 10, 11, 2, 3, 4, 5, 6, 7, 12]) }, - ), - ("NewExpression", StructDetails { field_order: None }), - ("TSStringKeyword", StructDetails { field_order: None }), - ("Alternative", StructDetails { field_order: None }), - ("TSTypeAnnotation", StructDetails { field_order: None }), - ("JSDocUnknownType", StructDetails { field_order: None }), - ("UpdateExpression", StructDetails { field_order: Some(&[0, 2, 3, 1]) }), - ("BindingIdentifier", StructDetails { field_order: None }), - ("TSVoidKeyword", StructDetails { field_order: None }), - ("ScopeId", StructDetails { field_order: None }), - ("ExportEntry", StructDetails { field_order: Some(&[1, 0, 2, 3, 4, 5, 6]) }), - ("ImportSpecifier", StructDetails { field_order: None }), + ("BreakStatement", StructDetails { field_order: None }), ("TSBigIntKeyword", StructDetails { field_order: None }), - ("TSNumberKeyword", StructDetails { field_order: None }), - ("BinaryExpression", StructDetails { field_order: Some(&[0, 1, 3, 2]) }), - ("WithStatement", StructDetails { field_order: None }), - ("BindingProperty", StructDetails { field_order: None }), - ("TSTypeLiteral", StructDetails { field_order: None }), - ("ExpressionStatement", StructDetails { field_order: None }), - ( - "PropertyDefinition", - StructDetails { field_order: Some(&[0, 5, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13]) }, - ), - ("JSXIdentifier", StructDetails { field_order: None }), - ("IdentifierReference", StructDetails { field_order: None }), - ("NumericLiteral", StructDetails { field_order: None }), - ("CharacterClass", StructDetails { field_order: Some(&[0, 2, 3, 4, 1]) }), - ("AwaitExpression", StructDetails { field_order: None }), - ("CommentNodeId", StructDetails { field_order: None }), + ("TSBooleanKeyword", StructDetails { field_order: None }), + ("TSEnumDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 4, 5, 3]) }), + ("BooleanLiteral", StructDetails { field_order: None }), ("StaticExport", StructDetails { field_order: None }), - ("NamedReference", StructDetails { field_order: None }), - ("JSXEmptyExpression", StructDetails { field_order: None }), - ("VariableDeclaration", StructDetails { field_order: Some(&[0, 2, 1, 3]) }), - ("JSDocNullableType", StructDetails { field_order: None }), - ("TSNonNullExpression", StructDetails { field_order: None }), - ("TSPropertySignature", StructDetails { field_order: Some(&[0, 3, 4, 5, 1, 2]) }), - ("DoWhileStatement", StructDetails { field_order: None }), - ("DebuggerStatement", StructDetails { field_order: None }), - ("StaticMemberExpression", StructDetails { field_order: None }), - ("TemplateElement", StructDetails { field_order: None }), - ("JSXAttribute", StructDetails { field_order: None }), - ("TSTemplateLiteralType", StructDetails { field_order: None }), - ("JSXExpressionContainer", StructDetails { field_order: None }), - ("TSModuleDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 4, 5, 3]) }), - ("Dot", StructDetails { field_order: None }), - ("Span", StructDetails { field_order: None }), - ("TaggedTemplateExpression", StructDetails { field_order: None }), + ("StaticImport", StructDetails { field_order: None }), + ("AwaitExpression", StructDetails { field_order: None }), + ("CatchParameter", StructDetails { field_order: None }), + ("LabelIdentifier", StructDetails { field_order: None }), + ("TSRestType", StructDetails { field_order: None }), ("TSUndefinedKeyword", StructDetails { field_order: None }), - ("Comment", StructDetails { field_order: None }), - ("TSFunctionType", StructDetails { field_order: None }), + ("JSXNamespacedName", StructDetails { field_order: None }), + ("ReturnStatement", StructDetails { field_order: None }), + ("TSConditionalType", StructDetails { field_order: None }), + ("CharacterClass", StructDetails { field_order: Some(&[0, 2, 3, 4, 1]) }), ( "MethodDefinition", StructDetails { field_order: Some(&[0, 4, 1, 2, 3, 5, 6, 7, 8, 9, 10]) }, ), - ("JSXOpeningElement", StructDetails { field_order: None }), - ("TemplateElementValue", StructDetails { field_order: None }), - ("RawTransferMetadata", StructDetails { field_order: Some(&[1, 2, 0]) }), + ("ObjectPattern", StructDetails { field_order: None }), ("TSTypeParameterDeclaration", StructDetails { field_order: None }), - ("TSBooleanKeyword", StructDetails { field_order: None }), - ("ErrorLabel", StructDetails { field_order: Some(&[1, 0]) }), - ("Modifiers", StructDetails { field_order: None }), - ("ObjectProperty", StructDetails { field_order: Some(&[0, 3, 1, 2, 4, 5, 6]) }), - ("Directive", StructDetails { field_order: None }), - ("YieldExpression", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("ForOfStatement", StructDetails { field_order: Some(&[0, 5, 1, 2, 3, 4]) }), - ("TSObjectKeyword", StructDetails { field_order: None }), - ("TSInterfaceDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 3, 4, 6, 5]) }), - ("BindingRestElement", StructDetails { field_order: None }), - ("IdentifierName", StructDetails { field_order: None }), + ("TSModuleDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 4, 5, 3]) }), + ("ForStatement", StructDetails { field_order: None }), ("ImportDefaultSpecifier", StructDetails { field_order: None }), - ("WhileStatement", StructDetails { field_order: None }), - ("UnicodePropertyEscape", StructDetails { field_order: Some(&[0, 3, 4, 1, 2]) }), - ("RegExpFlags", StructDetails { field_order: None }), + ("DebuggerStatement", StructDetails { field_order: None }), + ("CommentNodeId", StructDetails { field_order: None }), + ("Character", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("RawTransferMetadata2", StructDetails { field_order: Some(&[1, 2, 0]) }), + ("StringLiteral", StructDetails { field_order: None }), + ("TSInferType", StructDetails { field_order: None }), + ("TSThisType", StructDetails { field_order: None }), + ("TSTypeAssertion", StructDetails { field_order: None }), + ("ClassStringDisjunction", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("IdentifierName", StructDetails { field_order: None }), + ("ObjectAssignmentTarget", StructDetails { field_order: None }), + ( + "Function", + StructDetails { field_order: Some(&[0, 8, 1, 9, 10, 11, 2, 3, 4, 5, 6, 7, 12]) }, + ), + ("TSObjectKeyword", StructDetails { field_order: None }), + ("CharacterClassRange", StructDetails { field_order: None }), + ("ForInStatement", StructDetails { field_order: None }), + ("ExportNamedDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 3, 5, 4]) }), + ("TSInstantiationExpression", StructDetails { field_order: None }), + ("BoundaryAssertion", StructDetails { field_order: None }), + ("NamedReference", StructDetails { field_order: None }), + ("BinaryExpression", StructDetails { field_order: Some(&[0, 1, 3, 2]) }), + ("TSExportAssignment", StructDetails { field_order: None }), + ("RegExp", StructDetails { field_order: None }), ("CallExpression", StructDetails { field_order: None }), - ("AssignmentTargetWithDefault", StructDetails { field_order: None }), + ("Span", StructDetails { field_order: None }), + ("JSXOpeningElement", StructDetails { field_order: None }), + ("LookAroundAssertion", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("TSModuleBlock", StructDetails { field_order: None }), + ("V8IntrinsicExpression", StructDetails { field_order: None }), + ("ArrayAssignmentTarget", StructDetails { field_order: None }), ("TSIndexSignature", StructDetails { field_order: None }), - ("TSUnionType", StructDetails { field_order: None }), - ("TSMethodSignature", StructDetails { field_order: Some(&[0, 1, 7, 8, 9, 2, 3, 4, 5, 6]) }), + ("TSIndexSignatureName", StructDetails { field_order: None }), ("TSTypeReference", StructDetails { field_order: None }), - ("StaticBlock", StructDetails { field_order: None }), - ("JSDocNonNullableType", StructDetails { field_order: None }), - ("TSCallSignatureDeclaration", StructDetails { field_order: None }), - ("BooleanLiteral", StructDetails { field_order: None }), - ("IndexedReference", StructDetails { field_order: None }), - ("StaticImport", StructDetails { field_order: None }), + ("ThisExpression", StructDetails { field_order: None }), + ("TSSatisfiesExpression", StructDetails { field_order: None }), + ("JSXClosingFragment", StructDetails { field_order: None }), + ("UnicodePropertyEscape", StructDetails { field_order: Some(&[0, 3, 4, 1, 2]) }), + ("TSTypeAliasDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 3, 5, 4]) }), ("Class", StructDetails { field_order: Some(&[0, 9, 1, 2, 3, 4, 5, 6, 7, 10, 11, 8]) }), + ("ExportDefaultDeclaration", StructDetails { field_order: None }), + ("TSInterfaceBody", StructDetails { field_order: None }), + ("ParenthesizedExpression", StructDetails { field_order: None }), + ("PrivateFieldExpression", StructDetails { field_order: None }), + ("FormalParameter", StructDetails { field_order: None }), + ("ErrorLabel", StructDetails { field_order: Some(&[1, 0]) }), + ("TSOptionalType", StructDetails { field_order: None }), ("JSXText", StructDetails { field_order: None }), - ("AssignmentTargetPropertyProperty", StructDetails { field_order: None }), - ("TSThisType", StructDetails { field_order: None }), - ("TSModuleBlock", StructDetails { field_order: None }), - ("StringLiteral", StructDetails { field_order: None }), - ("Character", StructDetails { field_order: Some(&[0, 2, 1]) }), ("TSTypeParameter", StructDetails { field_order: None }), + ("RegExpPattern", StructDetails { field_order: None }), + ("ScopeId", StructDetails { field_order: None }), + ("ThrowStatement", StructDetails { field_order: None }), + ("Comment", StructDetails { field_order: None }), + ("TSMethodSignature", StructDetails { field_order: Some(&[0, 1, 7, 8, 9, 2, 3, 4, 5, 6]) }), + ("EmptyStatement", StructDetails { field_order: None }), + ("Pattern", StructDetails { field_order: None }), + ("TSNeverKeyword", StructDetails { field_order: None }), + ("TSInterfaceDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 3, 4, 6, 5]) }), ("RawTransferData", StructDetails { field_order: None }), - ("TSQualifiedName", StructDetails { field_order: None }), - ("TemplateLiteral", StructDetails { field_order: None }), - ("ObjectPattern", StructDetails { field_order: None }), - ("TSTypeQuery", StructDetails { field_order: None }), + ("SwitchStatement", StructDetails { field_order: None }), + ("JSXAttribute", StructDetails { field_order: None }), + ("RegExpLiteral", StructDetails { field_order: None }), + ("ImportSpecifier", StructDetails { field_order: None }), + ("TSArrayType", StructDetails { field_order: None }), + ("CapturingGroup", StructDetails { field_order: None }), + ("ImportDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 4, 3, 5]) }), + ("TSTypeOperator", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("ImportExpression", StructDetails { field_order: None }), + ("TSCallSignatureDeclaration", StructDetails { field_order: None }), + ("BlockStatement", StructDetails { field_order: None }), + ("TSLiteralType", StructDetails { field_order: None }), + ("StaticMemberExpression", StructDetails { field_order: None }), + ("AssignmentExpression", StructDetails { field_order: Some(&[0, 3, 1, 2]) }), + ("ExpressionStatement", StructDetails { field_order: None }), + ("ImportNamespaceSpecifier", StructDetails { field_order: None }), + ("Program", StructDetails { field_order: Some(&[0, 7, 1, 2, 3, 4, 5, 6]) }), + ("TSConstructorType", StructDetails { field_order: Some(&[0, 4, 1, 2, 3]) }), ("ArrayPattern", StructDetails { field_order: None }), + ("TSTypeLiteral", StructDetails { field_order: None }), + ("ClassString", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("IfStatement", StructDetails { field_order: None }), + ("JSXClosingElement", StructDetails { field_order: None }), + ("Dot", StructDetails { field_order: None }), + ("TSNumberKeyword", StructDetails { field_order: None }), + ("TSNonNullExpression", StructDetails { field_order: None }), + ("Disjunction", StructDetails { field_order: None }), + ("TSTypeAnnotation", StructDetails { field_order: None }), + ("WithClause", StructDetails { field_order: None }), + ("ExportAllDeclaration", StructDetails { field_order: None }), + ("Hashbang", StructDetails { field_order: None }), + ("ClassBody", StructDetails { field_order: None }), + ("ObjectProperty", StructDetails { field_order: Some(&[0, 3, 1, 2, 4, 5, 6]) }), + ("SwitchCase", StructDetails { field_order: None }), + ("ExportSpecifier", StructDetails { field_order: None }), + ("Alternative", StructDetails { field_order: None }), + ("PrivateIdentifier", StructDetails { field_order: None }), ("TSParenthesizedType", StructDetails { field_order: None }), - ("ReferenceId", StructDetails { field_order: None }), ("TSAnyKeyword", StructDetails { field_order: None }), - ("TSInterfaceHeritage", StructDetails { field_order: None }), - ("ThisExpression", StructDetails { field_order: None }), - ("PrivateFieldExpression", StructDetails { field_order: None }), - ("TSTypeOperator", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("TSUnknownKeyword", StructDetails { field_order: None }), - ("TSEnumDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 4, 5, 3]) }), - ("TSOptionalType", StructDetails { field_order: None }), + ("NewExpression", StructDetails { field_order: None }), + ("JSXIdentifier", StructDetails { field_order: None }), + ("RegExpFlags", StructDetails { field_order: None }), + ("BindingProperty", StructDetails { field_order: None }), + ("TSPropertySignature", StructDetails { field_order: Some(&[0, 3, 4, 5, 1, 2]) }), ("TSExternalModuleReference", StructDetails { field_order: None }), - ("TSNeverKeyword", StructDetails { field_order: None }), - ("ComputedMemberExpression", StructDetails { field_order: None }), - ("ImportEntry", StructDetails { field_order: None }), - ("AssignmentTargetRest", StructDetails { field_order: None }), + ("TSInterfaceHeritage", StructDetails { field_order: None }), + ("TSEnumMember", StructDetails { field_order: None }), + ("TSAsExpression", StructDetails { field_order: None }), + ("YieldExpression", StructDetails { field_order: Some(&[0, 2, 1]) }), + ("JSDocUnknownType", StructDetails { field_order: None }), + ("TryStatement", StructDetails { field_order: None }), + ("TSQualifiedName", StructDetails { field_order: None }), + ("AssignmentTargetWithDefault", StructDetails { field_order: None }), + ("Directive", StructDetails { field_order: None }), + ("JSXMemberExpression", StructDetails { field_order: None }), + ("TSThisParameter", StructDetails { field_order: None }), ("SequenceExpression", StructDetails { field_order: None }), - ("AssignmentPattern", StructDetails { field_order: None }), + ("TaggedTemplateExpression", StructDetails { field_order: None }), + ("FunctionBody", StructDetails { field_order: None }), + ("ImportAttribute", StructDetails { field_order: None }), + ("TSClassImplements", StructDetails { field_order: None }), + ("Super", StructDetails { field_order: None }), + ( + "AccessorProperty", + StructDetails { field_order: Some(&[0, 5, 1, 2, 3, 4, 6, 7, 8, 9, 10]) }, + ), + ("CatchClause", StructDetails { field_order: None }), ("TSImportType", StructDetails { field_order: None }), - ("TSTypePredicate", StructDetails { field_order: Some(&[0, 1, 3, 2]) }), - ("CommentNewlines", StructDetails { field_order: None }), + ("AssignmentTargetRest", StructDetails { field_order: None }), + ("LogicalExpression", StructDetails { field_order: Some(&[0, 1, 3, 2]) }), + ("AssignmentTargetPropertyIdentifier", StructDetails { field_order: None }), + ("CharacterClassEscape", StructDetails { field_order: None }), + ("JSXExpressionContainer", StructDetails { field_order: None }), ("ArrayExpression", StructDetails { field_order: None }), - ("Elision", StructDetails { field_order: None }), - ("ConditionalExpression", StructDetails { field_order: None }), - ("TSEnumMember", StructDetails { field_order: None }), - ("TSLiteralType", StructDetails { field_order: None }), + ("FormalParameters", StructDetails { field_order: Some(&[0, 3, 1, 2]) }), ("EcmaScriptModule", StructDetails { field_order: Some(&[4, 0, 1, 2, 3]) }), - ("FunctionBody", StructDetails { field_order: None }), - ("TSNamedTupleMember", StructDetails { field_order: None }), - ("JSXNamespacedName", StructDetails { field_order: None }), - ("TSTypeParameterInstantiation", StructDetails { field_order: None }), - ("ClassString", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("ImportDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 4, 3, 5]) }), + ("WithStatement", StructDetails { field_order: None }), + ("VariableDeclaration", StructDetails { field_order: Some(&[0, 2, 1, 3]) }), + ("ChainExpression", StructDetails { field_order: None }), + ("ContinueStatement", StructDetails { field_order: None }), + ("BindingRestElement", StructDetails { field_order: None }), + ("SymbolId", StructDetails { field_order: None }), ("DynamicImport", StructDetails { field_order: None }), - ("TSTupleType", StructDetails { field_order: None }), - ("ObjectExpression", StructDetails { field_order: None }), ("VariableDeclarator", StructDetails { field_order: Some(&[0, 3, 1, 2, 4]) }), - ("AssignmentTargetPropertyIdentifier", StructDetails { field_order: None }), - ("LogicalExpression", StructDetails { field_order: Some(&[0, 1, 3, 2]) }), - ("TSExportAssignment", StructDetails { field_order: None }), - ("RegExpPattern", StructDetails { field_order: None }), - ("CharacterClassRange", StructDetails { field_order: None }), + ("TSVoidKeyword", StructDetails { field_order: None }), + ("LabeledStatement", StructDetails { field_order: None }), + ("BindingIdentifier", StructDetails { field_order: None }), + ("SpreadElement", StructDetails { field_order: None }), + ("MetaProperty", StructDetails { field_order: None }), + ("TSIntersectionType", StructDetails { field_order: None }), + ("RawTransferMetadata", StructDetails { field_order: Some(&[1, 2, 0]) }), + ("ConditionalExpression", StructDetails { field_order: None }), + ("PrivateInExpression", StructDetails { field_order: None }), + ("TSStringKeyword", StructDetails { field_order: None }), + ("ObjectExpression", StructDetails { field_order: None }), + ("TSTypeParameterInstantiation", StructDetails { field_order: None }), + ("ReferenceId", StructDetails { field_order: None }), + ("TSTypePredicate", StructDetails { field_order: Some(&[0, 1, 3, 2]) }), + ("NonMaxU32", StructDetails { field_order: None }), + ("JSXOpeningFragment", StructDetails { field_order: None }), + ("JSXSpreadAttribute", StructDetails { field_order: None }), + ("FixedSizeAllocatorMetadata", StructDetails { field_order: Some(&[1, 0, 2]) }), + ("TSFunctionType", StructDetails { field_order: None }), + ("Modifiers", StructDetails { field_order: None }), + ("TSNullKeyword", StructDetails { field_order: None }), + ("TSConstructSignatureDeclaration", StructDetails { field_order: None }), + ("AssignmentPattern", StructDetails { field_order: None }), + ("TemplateElementValue", StructDetails { field_order: None }), + ("ComputedMemberExpression", StructDetails { field_order: None }), + ("TSNamespaceExportDeclaration", StructDetails { field_order: None }), ("TSSymbolKeyword", StructDetails { field_order: None }), - ("TSThisParameter", StructDetails { field_order: None }), - ("JSXSpreadChild", StructDetails { field_order: None }), - ("TSRestType", StructDetails { field_order: None }), - ("FormalParameters", StructDetails { field_order: Some(&[0, 3, 1, 2]) }), - ("WithClause", StructDetails { field_order: None }), - ("TSAsExpression", StructDetails { field_order: None }), + ("TemplateLiteral", StructDetails { field_order: None }), ( - "AccessorProperty", - StructDetails { field_order: Some(&[0, 5, 1, 2, 3, 4, 6, 7, 8, 9, 10]) }, + "PropertyDefinition", + StructDetails { field_order: Some(&[0, 5, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13]) }, ), - ("CatchParameter", StructDetails { field_order: None }), - ("AssignmentExpression", StructDetails { field_order: Some(&[0, 3, 1, 2]) }), - ("NonMaxU32", StructDetails { field_order: None }), - ("JSXOpeningFragment", StructDetails { field_order: None }), - ("ClassBody", StructDetails { field_order: None }), - ("ArrayAssignmentTarget", StructDetails { field_order: None }), - ("PrivateInExpression", StructDetails { field_order: None }), - ("SwitchStatement", StructDetails { field_order: None }), - ("ParenthesizedExpression", StructDetails { field_order: None }), - ("Quantifier", StructDetails { field_order: Some(&[0, 1, 2, 4, 3]) }), - ("BlockStatement", StructDetails { field_order: None }), - ("TSIndexedAccessType", StructDetails { field_order: None }), + ("ExportEntry", StructDetails { field_order: Some(&[1, 0, 2, 3, 4, 5, 6]) }), + ("BigIntLiteral", StructDetails { field_order: None }), + ("Modifier", StructDetails { field_order: None }), + ("Error", StructDetails { field_order: Some(&[4, 0, 1, 2, 3]) }), + ("WhileStatement", StructDetails { field_order: None }), + ("TSMappedType", StructDetails { field_order: Some(&[0, 1, 2, 3, 5, 6, 4]) }), + ("TemplateElement", StructDetails { field_order: None }), ( "ArrowFunctionExpression", StructDetails { field_order: Some(&[0, 6, 7, 1, 2, 3, 4, 5, 8]) }, ), - ("Pattern", StructDetails { field_order: None }), - ("EmptyStatement", StructDetails { field_order: None }), - ("FixedSizeAllocatorMetadata", StructDetails { field_order: Some(&[1, 0, 2]) }), - ("Hashbang", StructDetails { field_order: None }), - ("UnaryExpression", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("ThrowStatement", StructDetails { field_order: None }), - ("TSIndexSignatureName", StructDetails { field_order: None }), - ("ForInStatement", StructDetails { field_order: None }), - ("Modifier", StructDetails { field_order: None }), + ("NumericLiteral", StructDetails { field_order: None }), + ("TSTupleType", StructDetails { field_order: None }), ("NameSpan", StructDetails { field_order: Some(&[1, 0]) }), - ("SymbolId", StructDetails { field_order: None }), - ("ImportAttribute", StructDetails { field_order: None }), - ("TSConditionalType", StructDetails { field_order: None }), - ("JSXElement", StructDetails { field_order: None }), - ("ObjectAssignmentTarget", StructDetails { field_order: None }), - ("TSInterfaceBody", StructDetails { field_order: None }), - ("RegExpLiteral", StructDetails { field_order: None }), - ("TryStatement", StructDetails { field_order: None }), - ("TSNamespaceExportDeclaration", StructDetails { field_order: None }), - ("V8IntrinsicExpression", StructDetails { field_order: None }), - ("TSConstructSignatureDeclaration", StructDetails { field_order: None }), - ("CharacterClassEscape", StructDetails { field_order: None }), - ("TSMappedType", StructDetails { field_order: Some(&[0, 1, 2, 3, 5, 6, 4]) }), - ("Super", StructDetails { field_order: None }), - ("TSInferType", StructDetails { field_order: None }), - ("ExportAllDeclaration", StructDetails { field_order: None }), - ("TSSatisfiesExpression", StructDetails { field_order: None }), - ("Error", StructDetails { field_order: Some(&[4, 0, 1, 2, 3]) }), - ("Program", StructDetails { field_order: Some(&[0, 7, 1, 2, 3, 4, 5, 6]) }), - ("ContinueStatement", StructDetails { field_order: None }), + ("TSUnionType", StructDetails { field_order: None }), + ("TSNamedTupleMember", StructDetails { field_order: None }), + ("ForOfStatement", StructDetails { field_order: Some(&[0, 5, 1, 2, 3, 4]) }), + ("IndexedReference", StructDetails { field_order: None }), + ("JSDocNullableType", StructDetails { field_order: None }), + ("JSXEmptyExpression", StructDetails { field_order: None }), + ("JSDocNonNullableType", StructDetails { field_order: None }), + ("TSTypeQuery", StructDetails { field_order: None }), + ("UpdateExpression", StructDetails { field_order: Some(&[0, 2, 3, 1]) }), ("IgnoreGroup", StructDetails { field_order: None }), - ("Disjunction", StructDetails { field_order: None }), - ("ForStatement", StructDetails { field_order: None }), - ("JSXSpreadAttribute", StructDetails { field_order: None }), + ("DoWhileStatement", StructDetails { field_order: None }), + ("AssignmentTargetPropertyProperty", StructDetails { field_order: None }), + ("ImportEntry", StructDetails { field_order: None }), ("SourceType", StructDetails { field_order: None }), + ("StaticBlock", StructDetails { field_order: None }), + ("TSIndexedAccessType", StructDetails { field_order: None }), + ("JSXSpreadChild", StructDetails { field_order: None }), ("NullLiteral", StructDetails { field_order: None }), - ("BoundaryAssertion", StructDetails { field_order: None }), - ("TSNullKeyword", StructDetails { field_order: None }), - ("RegExp", StructDetails { field_order: None }), - ("FormalParameter", StructDetails { field_order: None }), - ("CapturingGroup", StructDetails { field_order: None }), - ("ExportNamedDeclaration", StructDetails { field_order: Some(&[0, 1, 2, 3, 5, 4]) }), - ("JSXClosingElement", StructDetails { field_order: None }), - ("TSEnumBody", StructDetails { field_order: None }), - ("JSXMemberExpression", StructDetails { field_order: None }), + ("CommentNewlines", StructDetails { field_order: None }), ("TSImportEqualsDeclaration", StructDetails { field_order: None }), - ("ReturnStatement", StructDetails { field_order: None }), - ("BindingPattern", StructDetails { field_order: None }), - ("ExportSpecifier", StructDetails { field_order: None }), - ("JSXFragment", StructDetails { field_order: None }), - ("BigIntLiteral", StructDetails { field_order: None }), + ("TSEnumBody", StructDetails { field_order: None }), ], }; diff --git a/crates/oxc_linter/Cargo.toml b/crates/oxc_linter/Cargo.toml index 2fbf7f8d50640..cd594260070b7 100644 --- a/crates/oxc_linter/Cargo.toml +++ b/crates/oxc_linter/Cargo.toml @@ -17,7 +17,7 @@ description.workspace = true default = [] ruledocs = ["oxc_macros/ruledocs"] # Enables the `ruledocs` feature for conditional compilation language_server = ["oxc_data_structures/rope"] # For the Runtime to support needed information for the language server -oxlint2 = ["tokio/rt-multi-thread"] +oxlint2 = ["dep:oxc_ast_macros", "tokio/rt-multi-thread"] disable_oxlint2 = [] force_test_reporter = [] @@ -30,6 +30,7 @@ doctest = true [dependencies] oxc_allocator = { workspace = true } oxc_ast = { workspace = true } +oxc_ast_macros = { workspace = true, optional = true } oxc_ast_visit = { workspace = true } oxc_cfg = { workspace = true } oxc_codegen = { workspace = true } diff --git a/crates/oxc_linter/src/generated/assert_layouts.rs b/crates/oxc_linter/src/generated/assert_layouts.rs new file mode 100644 index 0000000000000..aad5d6477412f --- /dev/null +++ b/crates/oxc_linter/src/generated/assert_layouts.rs @@ -0,0 +1,31 @@ +// Auto-generated code, DO NOT EDIT DIRECTLY! +// To edit this generated file you have to edit `tasks/ast_tools/src/generators/assert_layouts.rs`. + +#![allow(unused_imports)] + +use std::mem::{align_of, offset_of, size_of}; + +use crate::*; + +#[cfg(target_pointer_width = "64")] +const _: () = { + // Padding: 3 bytes + assert!(size_of::() == 16); + assert!(align_of::() == 8); + assert!(offset_of!(RawTransferMetadata2, data_offset) == 8); + assert!(offset_of!(RawTransferMetadata2, is_ts) == 12); + assert!(offset_of!(RawTransferMetadata2, _padding) == 0); +}; + +#[cfg(target_pointer_width = "32")] +const _: () = { + // Padding: 3 bytes + assert!(size_of::() == 16); + assert!(align_of::() == 8); + assert!(offset_of!(RawTransferMetadata2, data_offset) == 8); + assert!(offset_of!(RawTransferMetadata2, is_ts) == 12); + assert!(offset_of!(RawTransferMetadata2, _padding) == 0); +}; + +#[cfg(not(any(target_pointer_width = "64", target_pointer_width = "32")))] +const _: () = panic!("Platforms with pointer width other than 64 or 32 bit are not supported"); diff --git a/crates/oxc_linter/src/lib.rs b/crates/oxc_linter/src/lib.rs index bf6679d370e6e..2c6e451992838 100644 --- a/crates/oxc_linter/src/lib.rs +++ b/crates/oxc_linter/src/lib.rs @@ -6,6 +6,9 @@ use std::{path::Path, rc::Rc, sync::Arc}; use oxc_allocator::Allocator; use oxc_semantic::{AstNode, Semantic}; +#[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] +use oxc_ast_macros::ast; + #[cfg(test)] mod tester; @@ -29,6 +32,12 @@ pub mod loader; pub mod rules; pub mod table; +#[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] +mod generated { + #[cfg(debug_assertions)] + pub mod assert_layouts; +} + pub use crate::{ config::{ BuiltinLintPlugins, Config, ConfigBuilderError, ConfigStore, ConfigStoreBuilder, @@ -273,6 +282,33 @@ impl Linter { } } +#[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] +/// Metadata written to end of buffer. +/// +/// Duplicate of `RawTransferMetadata` in `napi/parser/src/raw_transfer_types.rs`. +/// Any changes made here also need to be made there. +/// `oxc_ast_tools` checks that the 2 copies are identical. +#[ast] +struct RawTransferMetadata2 { + /// Offset of `RawTransferData` within buffer. + pub data_offset: u32, + /// `true` if AST is TypeScript. + pub is_ts: bool, + /// Padding to pad struct to size 16. + pub(crate) _padding: u64, +} + +#[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] +use RawTransferMetadata2 as RawTransferMetadata; + +#[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] +#[expect(dead_code)] +impl RawTransferMetadata { + pub fn new(data_offset: u32, is_ts: bool) -> Self { + Self { data_offset, is_ts, _padding: 0 } + } +} + #[cfg(test)] mod test { use super::Oxlintrc; diff --git a/napi/parser/generated/deserialize/js.js b/napi/parser/generated/deserialize/js.js index 0151fbbff9496..f5b9ed3fec96e 100644 --- a/napi/parser/generated/deserialize/js.js +++ b/napi/parser/generated/deserialize/js.js @@ -5238,16 +5238,16 @@ function deserializeBoxTSExternalModuleReference(pos) { return deserializeTSExternalModuleReference(uint32[pos >> 2]); } -function deserializeOptionNameSpan(pos) { - if (uint32[(pos + 8) >> 2] === 0 && uint32[(pos + 12) >> 2] === 0) return null; - return deserializeNameSpan(pos); -} - function deserializeU64(pos) { const pos32 = pos >> 2; return uint32[pos32] + uint32[pos32 + 1] * 4294967296; } +function deserializeOptionNameSpan(pos) { + if (uint32[(pos + 8) >> 2] === 0 && uint32[(pos + 12) >> 2] === 0) return null; + return deserializeNameSpan(pos); +} + function deserializeOptionU64(pos) { if (uint8[pos] === 0) return null; return deserializeU64(pos + 8); diff --git a/napi/parser/generated/deserialize/ts.js b/napi/parser/generated/deserialize/ts.js index d5f6e83c3368f..63081411a7019 100644 --- a/napi/parser/generated/deserialize/ts.js +++ b/napi/parser/generated/deserialize/ts.js @@ -5369,16 +5369,16 @@ function deserializeBoxTSExternalModuleReference(pos) { return deserializeTSExternalModuleReference(uint32[pos >> 2]); } -function deserializeOptionNameSpan(pos) { - if (uint32[(pos + 8) >> 2] === 0 && uint32[(pos + 12) >> 2] === 0) return null; - return deserializeNameSpan(pos); -} - function deserializeU64(pos) { const pos32 = pos >> 2; return uint32[pos32] + uint32[pos32 + 1] * 4294967296; } +function deserializeOptionNameSpan(pos) { + if (uint32[(pos + 8) >> 2] === 0 && uint32[(pos + 12) >> 2] === 0) return null; + return deserializeNameSpan(pos); +} + function deserializeOptionU64(pos) { if (uint8[pos] === 0) return null; return deserializeU64(pos + 8); diff --git a/napi/parser/generated/lazy/constructors.js b/napi/parser/generated/lazy/constructors.js index b21fab8d4709a..193dc87dc223b 100644 --- a/napi/parser/generated/lazy/constructors.js +++ b/napi/parser/generated/lazy/constructors.js @@ -13752,17 +13752,17 @@ function constructBoxTSExternalModuleReference(pos, ast) { return new TSExternalModuleReference(ast.buffer.uint32[pos >> 2], ast); } -function constructOptionNameSpan(pos, ast) { - if (ast.buffer.uint32[(pos + 8) >> 2] === 0 && ast.buffer.uint32[(pos + 12) >> 2] === 0) return null; - return new NameSpan(pos, ast); -} - function constructU64(pos, ast) { const { uint32 } = ast.buffer, pos32 = pos >> 2; return uint32[pos32] + uint32[pos32 + 1] * 4294967296; } +function constructOptionNameSpan(pos, ast) { + if (ast.buffer.uint32[(pos + 8) >> 2] === 0 && ast.buffer.uint32[(pos + 12) >> 2] === 0) return null; + return new NameSpan(pos, ast); +} + function constructOptionU64(pos, ast) { if (ast.buffer[pos] === 0) return null; return constructU64(pos + 8, ast); diff --git a/napi/parser/src/raw_transfer_types.rs b/napi/parser/src/raw_transfer_types.rs index 50a88a9b8ad72..c724211cb1bee 100644 --- a/napi/parser/src/raw_transfer_types.rs +++ b/napi/parser/src/raw_transfer_types.rs @@ -26,6 +26,10 @@ pub struct RawTransferData<'a> { } /// Metadata written to end of buffer. +/// +/// Duplicated as `RawTransferMetadata2` in `crates/oxc_linter/src/lib.rs`. +/// Any changes made here also need to be made there. +/// `oxc_ast_tools` checks that the 2 copies are identical. #[ast] pub struct RawTransferMetadata { /// Offset of `RawTransferData` within buffer. diff --git a/tasks/ast_tools/src/generators/raw_transfer.rs b/tasks/ast_tools/src/generators/raw_transfer.rs index 6fc676f8f83d5..c0306bf267164 100644 --- a/tasks/ast_tools/src/generators/raw_transfer.rs +++ b/tasks/ast_tools/src/generators/raw_transfer.rs @@ -1058,6 +1058,27 @@ fn generate_constants(consts: Constants) -> (String, TokenStream) { /// Calculate constants. fn get_constants(schema: &Schema) -> Constants { let raw_metadata_struct = schema.type_by_name("RawTransferMetadata").as_struct().unwrap(); + let raw_metadata2_struct = schema.type_by_name("RawTransferMetadata2").as_struct().unwrap(); + + // Check layout and fields of `RawTransferMetadata` and `RawTransferMetadata2` are identical + assert_eq!(raw_metadata_struct.layout, raw_metadata2_struct.layout); + assert_eq!(raw_metadata_struct.fields.len(), raw_metadata2_struct.fields.len()); + + let mut data_offset_field = None; + let mut is_ts_field = None; + for (field1, field2) in raw_metadata_struct.fields.iter().zip(&raw_metadata2_struct.fields) { + assert_eq!(field1.name(), field2.name()); + assert_eq!(field1.type_id, field2.type_id); + assert_eq!(field1.offset_64(), field2.offset_64()); + match field1.name() { + "data_offset" => data_offset_field = Some(field1), + "is_ts" => is_ts_field = Some(field1), + _ => {} + } + } + let data_offset_field = data_offset_field.unwrap(); + let is_ts_field = is_ts_field.unwrap(); + let raw_metadata_size = raw_metadata_struct.layout_64().size; // Round up to multiple of `ALLOCATOR_CHUNK_END_ALIGN` @@ -1068,10 +1089,10 @@ fn get_constants(schema: &Schema) -> Constants { let buffer_size = BLOCK_SIZE - fixed_metadata_size; + // Get offsets of data within buffer let raw_metadata_pos = buffer_size - raw_metadata_size; - let data_pointer_pos = - raw_metadata_pos + raw_metadata_struct.field_by_name("data_offset").offset_64(); - let is_ts_pos = raw_metadata_pos + raw_metadata_struct.field_by_name("is_ts").offset_64(); + let data_pointer_pos = raw_metadata_pos + data_offset_field.offset_64(); + let is_ts_pos = raw_metadata_pos + is_ts_field.offset_64(); let program_offset = schema .type_by_name("RawTransferData") diff --git a/tasks/ast_tools/src/main.rs b/tasks/ast_tools/src/main.rs index cfd5be8eb2b06..d3d37582daf74 100644 --- a/tasks/ast_tools/src/main.rs +++ b/tasks/ast_tools/src/main.rs @@ -219,6 +219,7 @@ static SOURCE_PATHS: &[&str] = &[ "crates/oxc_ast/src/serialize/js.rs", "crates/oxc_ast/src/serialize/jsx.rs", "crates/oxc_ast/src/serialize/ts.rs", + "crates/oxc_linter/src/lib.rs", "crates/oxc_syntax/src/lib.rs", "crates/oxc_syntax/src/comment_node.rs", "crates/oxc_syntax/src/module_record.rs",