UnstableAddress

Trait UnstableAddress 

Source
pub trait UnstableAddress {
    // Provided method
    fn unstable_address(&self) -> Address { ... }
}
Expand description

Trait for getting the memory address of an AST node which is not necessarily stable.

See UnstableAddress::unstable_address for more details.

This trait is implemented for all AST struct types.

DO NOT implement this trait on any other type.

Provided Methods§

Source

fn unstable_address(&self) -> Address

Get the memory Address of a reference to an AST node in arena, which is not necessarily stable.

§Stable addresses

It’s ideal to obtain an Address for an AST node which is guaranteed to be stable for the life of the AST.

Then you can reliably compare two Addresses to determine if they refer to the same node, without any risk of the result being wrong because one or other of the nodes has moved in memory.

Types which have a stable address:

  • Box<T>
  • AST enums where all variants are Boxes (e.g. Statement, Expression)

Some other types guarantee stability for a shorter period of time:

  • oxc_ast::AstKind - guaranteed stable address while Semantic is alive.
  • oxc_traverse::Ancestor - guaranteed stable address while traversing descendents of the ancestor.

The above types all implement GetAddress::address. If you have access to one of these types, it’s better to use GetAddress::address instead of this method.

§Why this method exists

Sometimes you only have access to a reference to an AST node, but you know from context that the node will not move in memory during the time you need the Address to remain stable.

You can use this method in such cases, but you need to be careful. For correct behavior, you must ensure yourself that the node will not move in memory during the time you need the Address to remain accurate.

When using this method, it is recommended to make a comment at the call site, explaining how you can prove that the Address will remain accurate (the AST node will not move) for the time period that you need it to be.

§When a type does not move in memory

If the AST is immutable (e.g. in Visit trait), then any node in the AST is statically positioned in memory. Therefore, in the linter, any reference to an AST node is guaranteed to have a stable Address.

If an AST node is in Vec, then it’ll remain at same memory address, but only as long as the Vec does not reallocate (e.g. by Vec::push, Vec::extend).

This method will return a stable Address for any AST node in such circumstances.

§Common pitfalls
§References to AST nodes on the stack

Ensure that the reference passed to this method is to a node which is in the arena, not on the stack.

let binary_expr: BinaryExpression<'a> = get_owned_binary_expression_somehow();
// WRONG: `binary_expr` is on the stack, so the `Address` will be meaningless
let address = binary_expr.unstable_address();
// More correct: `binary_expr` is in the arena.
// Will have a stable `Address` as long as `vec` does not reallocate.
let mut vec = Vec::new_in(&allocator);
vec.push(binary_expr);
let address = vec[0].unstable_address();
§AST nodes in Vecs
let mut vec: &mut Vec<BinaryExpression<'a>> = get_vec_somehow();

let address = vec[0].unstable_address();
vec.push(get_owned_binary_expression_somehow());
let address_after_push = vec[0].unstable_address();

// This assertion may or may not pass, depending on whether `push` caused the `Vec` to reallocate.
// This depends on whether `vec` had spare capacity or not, prior to the `push` call.
assert!(address_after_push == address);
§Guardrails

This method is less error-prone than Address::from_ptr, because it provides a few guardrails:

  • UnstableAddress is only implemented on AST struct types, so you can’t call it on a type which it doesn’t make sense to get the Address of.

  • You don’t need to worry about passing it a double-reference (&&T), because this method will automatically dereference as required.

Even with these guardrails, usage of this method still requires care, for the reasons discussed above.

Implementors§

Source§

impl UnstableAddress for AccessorProperty<'_>

Source§

impl UnstableAddress for ArrayAssignmentTarget<'_>

Source§

impl UnstableAddress for ArrayExpression<'_>

Source§

impl UnstableAddress for ArrayPattern<'_>

Source§

impl UnstableAddress for ArrowFunctionExpression<'_>

Source§

impl UnstableAddress for AssignmentExpression<'_>

Source§

impl UnstableAddress for AssignmentPattern<'_>

Source§

impl UnstableAddress for AssignmentTargetPropertyIdentifier<'_>

Source§

impl UnstableAddress for AssignmentTargetPropertyProperty<'_>

Source§

impl UnstableAddress for AssignmentTargetRest<'_>

Source§

impl UnstableAddress for AssignmentTargetWithDefault<'_>

Source§

impl UnstableAddress for AwaitExpression<'_>

Source§

impl UnstableAddress for BigIntLiteral<'_>

Source§

impl UnstableAddress for BinaryExpression<'_>

Source§

impl UnstableAddress for BindingIdentifier<'_>

Source§

impl UnstableAddress for BindingProperty<'_>

Source§

impl UnstableAddress for BindingRestElement<'_>

Source§

impl UnstableAddress for BlockStatement<'_>

Source§

impl UnstableAddress for BooleanLiteral

Source§

impl UnstableAddress for BreakStatement<'_>

Source§

impl UnstableAddress for CallExpression<'_>

Source§

impl UnstableAddress for CatchClause<'_>

Source§

impl UnstableAddress for CatchParameter<'_>

Source§

impl UnstableAddress for ChainExpression<'_>

Source§

impl UnstableAddress for Class<'_>

Source§

impl UnstableAddress for ClassBody<'_>

Source§

impl UnstableAddress for ComputedMemberExpression<'_>

Source§

impl UnstableAddress for ConditionalExpression<'_>

Source§

impl UnstableAddress for ContinueStatement<'_>

Source§

impl UnstableAddress for DebuggerStatement

Source§

impl UnstableAddress for Decorator<'_>

Source§

impl UnstableAddress for Directive<'_>

Source§

impl UnstableAddress for DoWhileStatement<'_>

Source§

impl UnstableAddress for Elision

Source§

impl UnstableAddress for EmptyStatement

Source§

impl UnstableAddress for ExportAllDeclaration<'_>

Source§

impl UnstableAddress for ExportDefaultDeclaration<'_>

Source§

impl UnstableAddress for ExportNamedDeclaration<'_>

Source§

impl UnstableAddress for ExportSpecifier<'_>

Source§

impl UnstableAddress for ExpressionStatement<'_>

Source§

impl UnstableAddress for ForInStatement<'_>

Source§

impl UnstableAddress for ForOfStatement<'_>

Source§

impl UnstableAddress for ForStatement<'_>

Source§

impl UnstableAddress for FormalParameter<'_>

Source§

impl UnstableAddress for FormalParameterRest<'_>

Source§

impl UnstableAddress for FormalParameters<'_>

Source§

impl UnstableAddress for Function<'_>

Source§

impl UnstableAddress for FunctionBody<'_>

Source§

impl UnstableAddress for Hashbang<'_>

Source§

impl UnstableAddress for IdentifierName<'_>

Source§

impl UnstableAddress for IdentifierReference<'_>

Source§

impl UnstableAddress for IfStatement<'_>

Source§

impl UnstableAddress for ImportAttribute<'_>

Source§

impl UnstableAddress for ImportDeclaration<'_>

Source§

impl UnstableAddress for ImportDefaultSpecifier<'_>

Source§

impl UnstableAddress for ImportExpression<'_>

Source§

impl UnstableAddress for ImportNamespaceSpecifier<'_>

Source§

impl UnstableAddress for ImportSpecifier<'_>

Source§

impl UnstableAddress for JSDocNonNullableType<'_>

Source§

impl UnstableAddress for JSDocNullableType<'_>

Source§

impl UnstableAddress for JSDocUnknownType

Source§

impl UnstableAddress for JSXAttribute<'_>

Source§

impl UnstableAddress for JSXClosingElement<'_>

Source§

impl UnstableAddress for JSXClosingFragment

Source§

impl UnstableAddress for JSXElement<'_>

Source§

impl UnstableAddress for JSXEmptyExpression

Source§

impl UnstableAddress for JSXExpressionContainer<'_>

Source§

impl UnstableAddress for JSXFragment<'_>

Source§

impl UnstableAddress for JSXIdentifier<'_>

Source§

impl UnstableAddress for JSXMemberExpression<'_>

Source§

impl UnstableAddress for JSXNamespacedName<'_>

Source§

impl UnstableAddress for JSXOpeningElement<'_>

Source§

impl UnstableAddress for JSXOpeningFragment

Source§

impl UnstableAddress for JSXSpreadAttribute<'_>

Source§

impl UnstableAddress for JSXSpreadChild<'_>

Source§

impl UnstableAddress for JSXText<'_>

Source§

impl UnstableAddress for LabelIdentifier<'_>

Source§

impl UnstableAddress for LabeledStatement<'_>

Source§

impl UnstableAddress for LogicalExpression<'_>

Source§

impl UnstableAddress for MetaProperty<'_>

Source§

impl UnstableAddress for MethodDefinition<'_>

Source§

impl UnstableAddress for NewExpression<'_>

Source§

impl UnstableAddress for NullLiteral

Source§

impl UnstableAddress for NumericLiteral<'_>

Source§

impl UnstableAddress for ObjectAssignmentTarget<'_>

Source§

impl UnstableAddress for ObjectExpression<'_>

Source§

impl UnstableAddress for ObjectPattern<'_>

Source§

impl UnstableAddress for ObjectProperty<'_>

Source§

impl UnstableAddress for ParenthesizedExpression<'_>

Source§

impl UnstableAddress for PrivateFieldExpression<'_>

Source§

impl UnstableAddress for PrivateIdentifier<'_>

Source§

impl UnstableAddress for PrivateInExpression<'_>

Source§

impl UnstableAddress for Program<'_>

Source§

impl UnstableAddress for PropertyDefinition<'_>

Source§

impl UnstableAddress for RegExpLiteral<'_>

Source§

impl UnstableAddress for ReturnStatement<'_>

Source§

impl UnstableAddress for SequenceExpression<'_>

Source§

impl UnstableAddress for SpreadElement<'_>

Source§

impl UnstableAddress for StaticBlock<'_>

Source§

impl UnstableAddress for StaticMemberExpression<'_>

Source§

impl UnstableAddress for StringLiteral<'_>

Source§

impl UnstableAddress for Super

Source§

impl UnstableAddress for SwitchCase<'_>

Source§

impl UnstableAddress for SwitchStatement<'_>

Source§

impl UnstableAddress for TSAnyKeyword

Source§

impl UnstableAddress for TSArrayType<'_>

Source§

impl UnstableAddress for TSAsExpression<'_>

Source§

impl UnstableAddress for TSBigIntKeyword

Source§

impl UnstableAddress for TSBooleanKeyword

Source§

impl UnstableAddress for TSCallSignatureDeclaration<'_>

Source§

impl UnstableAddress for TSClassImplements<'_>

Source§

impl UnstableAddress for TSConditionalType<'_>

Source§

impl UnstableAddress for TSConstructSignatureDeclaration<'_>

Source§

impl UnstableAddress for TSConstructorType<'_>

Source§

impl UnstableAddress for TSEnumBody<'_>

Source§

impl UnstableAddress for TSEnumDeclaration<'_>

Source§

impl UnstableAddress for TSEnumMember<'_>

Source§

impl UnstableAddress for TSExportAssignment<'_>

Source§

impl UnstableAddress for TSExternalModuleReference<'_>

Source§

impl UnstableAddress for TSFunctionType<'_>

Source§

impl UnstableAddress for TSGlobalDeclaration<'_>

Source§

impl UnstableAddress for TSImportEqualsDeclaration<'_>

Source§

impl UnstableAddress for TSImportType<'_>

Source§

impl UnstableAddress for TSImportTypeQualifiedName<'_>

Source§

impl UnstableAddress for TSIndexSignature<'_>

Source§

impl UnstableAddress for TSIndexSignatureName<'_>

Source§

impl UnstableAddress for TSIndexedAccessType<'_>

Source§

impl UnstableAddress for TSInferType<'_>

Source§

impl UnstableAddress for TSInstantiationExpression<'_>

Source§

impl UnstableAddress for TSInterfaceBody<'_>

Source§

impl UnstableAddress for TSInterfaceDeclaration<'_>

Source§

impl UnstableAddress for TSInterfaceHeritage<'_>

Source§

impl UnstableAddress for TSIntersectionType<'_>

Source§

impl UnstableAddress for TSIntrinsicKeyword

Source§

impl UnstableAddress for TSLiteralType<'_>

Source§

impl UnstableAddress for TSMappedType<'_>

Source§

impl UnstableAddress for TSMethodSignature<'_>

Source§

impl UnstableAddress for TSModuleBlock<'_>

Source§

impl UnstableAddress for TSModuleDeclaration<'_>

Source§

impl UnstableAddress for TSNamedTupleMember<'_>

Source§

impl UnstableAddress for TSNamespaceExportDeclaration<'_>

Source§

impl UnstableAddress for TSNeverKeyword

Source§

impl UnstableAddress for TSNonNullExpression<'_>

Source§

impl UnstableAddress for TSNullKeyword

Source§

impl UnstableAddress for TSNumberKeyword

Source§

impl UnstableAddress for TSObjectKeyword

Source§

impl UnstableAddress for TSOptionalType<'_>

Source§

impl UnstableAddress for TSParenthesizedType<'_>

Source§

impl UnstableAddress for TSPropertySignature<'_>

Source§

impl UnstableAddress for TSQualifiedName<'_>

Source§

impl UnstableAddress for TSRestType<'_>

Source§

impl UnstableAddress for TSSatisfiesExpression<'_>

Source§

impl UnstableAddress for TSStringKeyword

Source§

impl UnstableAddress for TSSymbolKeyword

Source§

impl UnstableAddress for TSTemplateLiteralType<'_>

Source§

impl UnstableAddress for TSThisParameter<'_>

Source§

impl UnstableAddress for TSThisType

Source§

impl UnstableAddress for TSTupleType<'_>

Source§

impl UnstableAddress for TSTypeAliasDeclaration<'_>

Source§

impl UnstableAddress for TSTypeAnnotation<'_>

Source§

impl UnstableAddress for TSTypeAssertion<'_>

Source§

impl UnstableAddress for TSTypeLiteral<'_>

Source§

impl UnstableAddress for TSTypeOperator<'_>

Source§

impl UnstableAddress for TSTypeParameter<'_>

Source§

impl UnstableAddress for TSTypeParameterDeclaration<'_>

Source§

impl UnstableAddress for TSTypeParameterInstantiation<'_>

Source§

impl UnstableAddress for TSTypePredicate<'_>

Source§

impl UnstableAddress for TSTypeQuery<'_>

Source§

impl UnstableAddress for TSTypeReference<'_>

Source§

impl UnstableAddress for TSUndefinedKeyword

Source§

impl UnstableAddress for TSUnionType<'_>

Source§

impl UnstableAddress for TSUnknownKeyword

Source§

impl UnstableAddress for TSVoidKeyword

Source§

impl UnstableAddress for TaggedTemplateExpression<'_>

Source§

impl UnstableAddress for TemplateElement<'_>

Source§

impl UnstableAddress for TemplateLiteral<'_>

Source§

impl UnstableAddress for ThisExpression

Source§

impl UnstableAddress for ThrowStatement<'_>

Source§

impl UnstableAddress for TryStatement<'_>

Source§

impl UnstableAddress for UnaryExpression<'_>

Source§

impl UnstableAddress for UpdateExpression<'_>

Source§

impl UnstableAddress for V8IntrinsicExpression<'_>

Source§

impl UnstableAddress for VariableDeclaration<'_>

Source§

impl UnstableAddress for VariableDeclarator<'_>

Source§

impl UnstableAddress for WhileStatement<'_>

Source§

impl UnstableAddress for WithClause<'_>

Source§

impl UnstableAddress for WithStatement<'_>

Source§

impl UnstableAddress for YieldExpression<'_>