visitIdentifierExpr method
Implementation
@override
Uint8List visitIdentifierExpr(IdentifierExpr expr) {
final bytesBuilder = BytesBuilder();
bytesBuilder.add(_lineInfo(expr.line, expr.column));
final localVariable = _localReference(expr);
if (localVariable != null) {
if (_isCurrentFunctionVariable(localVariable)) {
bytesBuilder.addByte(
localVariable.storage == HTResolvedStorage.capturedCell
? OpCode.localCellGet
: OpCode.localSlotGet,
);
bytesBuilder.add(_uint16(localVariable.slot!));
} else {
final upvalueIndex = _upvalueIndex(localVariable);
assert(upvalueIndex >= 0);
bytesBuilder.addByte(OpCode.upvalueGet);
bytesBuilder.add(_uint16(upvalueIndex));
}
return bytesBuilder.toBytes();
}
var symbolId = expr.id;
if (_markedSymbolsList.isNotEmpty) {
final map = _markedSymbolsList.last;
for (final symbol in map.keys) {
if (symbolId == symbol) {
symbolId = map[symbol]!;
break;
}
}
}
bytesBuilder.addByte(OpCode.local);
bytesBuilder.addByte(HTValueTypeCode.identifier);
bytesBuilder.add(_identifier(symbolId));
bytesBuilder.addByte(expr.isLocal ? 1 : 0);
// if (expr.typeArgs.isNotEmpty) {
// bytesBuilder.addByte(1);
// bytesBuilder.addByte(expr.typeArgs.length); // bool: has type args
// for (final ast in expr.typeArgs) {
// final bytes = visitTypeExpr(ast);
// bytesBuilder.add(bytes);
// }
// } else {
// bytesBuilder.addByte(0); // bool: has type args
// }
return bytesBuilder.toBytes();
}