package gotools;

import ghidra.app.services.AnalyzerType;
import ghidra.app.util.importer.MessageLog;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.data.CharDataType;
import ghidra.program.model.data.DataTypeConflictHandler;
import ghidra.program.model.data.Pointer64DataType;
import ghidra.program.model.data.PointerDataType;
import ghidra.program.model.data.QWordDataType;
import ghidra.program.model.data.StructureDataType;
import ghidra.program.model.listing.Program;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskMonitor;

public class GoTypesAnalyzer extends AnalyzerBase {
  public GoTypesAnalyzer() {
    super("Go Types Analyzer", "Analyzes Types like string and slices",
        AnalyzerType.FUNCTION_ANALYZER);
  }

  @Override
  public boolean added(Program program, AddressSetView addressSetView, TaskMonitor taskMonitor,
      MessageLog messageLog) throws CancelledException {
    StructureDataType s = new StructureDataType("GoString", 0);
    s.add(new QWordDataType(), "len", null);
    s.add(new Pointer64DataType(new CharDataType()), "str", null);
    program.getDataTypeManager().addDataType(s, DataTypeConflictHandler.KEEP_HANDLER);

    StructureDataType sl = new StructureDataType("GoSlice", 0);
    sl.add(new PointerDataType(), 8, "data", null);
    sl.add(new QWordDataType(), "len", null);
    sl.add(new QWordDataType(), "cap", null);

    program.getDataTypeManager().addDataType(sl, DataTypeConflictHandler.KEEP_HANDLER);
    return false;
  }
}