UNPKG

@specs-feup/alpakka

Version:

A Smali/APK source-to-source compiler written in Typescript

69 lines (59 loc) 1.89 kB
import InstructionNode from "./InstructionNode.js"; import BaseNode from "../../../graph/BaseNode.js"; import { NodeBuilder, NodeTypeGuard } from "../../../graph/Node.js"; import { Label } from "../../../../../../Joinpoints.js"; namespace LabelNode { export class Class< D extends Data = Data, S extends ScratchData = ScratchData, > extends InstructionNode.Class<D, S> { override get jp(): Label { return this.scratchData.$jp; } } export class Builder extends InstructionNode.Builder implements NodeBuilder<Data, ScratchData> { constructor($jp: Label) { super(InstructionNode.Type.LABEL, $jp); } buildData(data: BaseNode.Data): Data { return { ...(super.buildData(data) as InstructionNode.Data & { instructionFlowNodeType: InstructionNode.Type.LABEL; }), }; } buildScratchData(scratchData: BaseNode.ScratchData): ScratchData { return { ...(super.buildScratchData(scratchData) as InstructionNode.Data & { $jp: Label; }), }; } } export const TypeGuard: NodeTypeGuard<Data, ScratchData> = { isDataCompatible(data: BaseNode.Data): data is Data { if (!InstructionNode.TypeGuard.isDataCompatible(data)) return false; const d = data as Data; if (d.instructionFlowNodeType !== InstructionNode.Type.LABEL) return false; return true; }, isScratchDataCompatible( scratchData: BaseNode.ScratchData, ): scratchData is ScratchData { if (!InstructionNode.TypeGuard.isScratchDataCompatible(scratchData)) return false; return true; }, }; export interface Data extends InstructionNode.Data { instructionFlowNodeType: InstructionNode.Type.LABEL; } export interface ScratchData extends InstructionNode.ScratchData { $jp: Label; } } export default LabelNode;