Skip to main content

Overview

The NameGenerator class generates unique, sequential obfuscated identifiers in the format _$0, _$1, _$2, etc. It’s used by the RenamePass to create meaningless replacement names for classes, methods, and fields. Source: lib/src/engine/name_generator.dart:2

Constructor

NameGenerator({String prefix = r'_$'})
prefix
String
default:"_$"
The prefix for generated names. Defaults to _$.

Methods

next()

String next()
Returns the next unique obfuscated name by incrementing an internal counter.
return
String
The next sequential name, e.g., _$0, _$1, _$2, etc.
Example:
final gen = NameGenerator();
print(gen.next()); // _$0
print(gen.next()); // _$1
print(gen.next()); // _$2

reset()

void reset()
Resets the internal counter to 0. Useful for testing or when starting a new obfuscation run. Example:
final gen = NameGenerator();
gen.next(); // _$0
gen.next(); // _$1
gen.reset();
gen.next(); // _$0 (counter restarted)

Properties

currentCount

int get currentCount
Returns the current counter value without incrementing it. Useful for debugging or reporting.
currentCount
int
The current counter value (number of names generated since last reset)
Example:
final gen = NameGenerator();
gen.next();
gen.next();
print(gen.currentCount); // 2

Custom Prefixes

You can customize the prefix to match your obfuscation needs:
// Generate names like o0, o1, o2...
final gen = NameGenerator(prefix: 'o');

// Generate names like a_0, a_1, a_2...
final gen2 = NameGenerator(prefix: 'a_');
The default prefix _$ is chosen because:
  • Identifiers starting with underscore are private in Dart (library-scoped)
  • The $ character is valid in identifiers but uncommon in user code
  • Together they create names unlikely to collide with existing code

Usage with PassContext

NameGenerator is typically accessed through PassContext:
class MyCustomPass extends Pass {
  @override
  String get name => 'my_pass';

  @override
  void run(Component component, PassContext context) {
    final nameGen = context.nameGenerator;
    
    // Generate obfuscated names
    final className = nameGen.next();
    final methodName = nameGen.next();
    
    print('Class: $className');  // _$0
    print('Method: $methodName'); // _$1
  }
}

See Also

RenamePass

Uses NameGenerator to create obfuscated identifiers

PassContext

Provides access to the shared NameGenerator instance

SymbolTable

Records mappings from original to generated names

Build docs developers (and LLMs) love