TiogaDWIMCommands.mesa
Mike Spreitzer March 1, 1987 5:45:39 pm PST
Last tweaked by Mike Spreitzer on November 30, 1987 2:48:46 pm PST
DIRECTORY Atom, Commander, CommandTool, Convert, DefDWIM, DocCache, IO, PutGet, Rope, TextNode, TFS;
TiogaDWIMCommands: CEDAR PROGRAM
IMPORTS Atom, Commander, CommandTool, Convert, DefDWIM, DocCache, IO, PutGet, Rope, TextNode, TFS
=
BEGIN
FindDefCommand: PROC [cmd: Commander.Handle] RETURNS [result: REF ANYNIL, msg: Rope.ROPENIL] --Commander.CommandProc-- ~ {
argv: CommandTool.ArgumentVector;
fromDoc: TextNode.Ref ← NIL;
fromPos: INT;
searchOrder: DefDWIM.SearchOrder;
deep, verbose: BOOL;
fp: DefDWIM.FoundPlace;
from: DefDWIM.Place;
argv ← CommandTool.Parse[cmd !CommandTool.Failed => {msg ← errorMsg; GOTO Failed}];
IF argv.argc # 7 THEN RETURN [$Failure, "Usage: FindDef subject filename pos searchOrder deep verbose"];
fromDoc ← DocCache.GetDoc[argv[2] !
PutGet.FromFileError => {msg ← Rope.Cat["PutGet.FromFile[", argv[2], "] => FromFileError"]; GOTO Failed};
TFS.Error => {msg ← IO.PutFR["PutGet.FromFile[%g] => TFS.Error[%g, %g]", [rope[argv[2]]], [atom[error.code]], [rope[error.explanation]] ]; GOTO Failed}];
fromPos ← Convert.IntFromRope[argv[3] !Convert.Error => {msg ← "pos should be an INT literal"; GOTO Failed}];
SELECT Atom.MakeAtom[argv[4]] FROM
$fb, $fwdThenBkwd => searchOrder ← fwdThenBkwd;
$bf, $bkwdThenFwd => searchOrder ← bkwdThenFwd;
$fs, $fromStart => searchOrder ← fromStart;
ENDCASE => {msg ← "searchOrder should be one of: fb, fwdThenBkwd, bf, bkwdThenFwd, fs, fromStart"; GOTO Failed};
deep ← Convert.BoolFromRope[argv[5] !Convert.Error => {msg ← "deep should be a BOOLEAN literal"; GOTO Failed}];
verbose ← Convert.BoolFromRope[argv[6] !Convert.Error => {msg ← "verbose should be a BOOLEAN literal"; GOTO Failed}];
from ← [argv[2], TextNode.LocRelative[[fromDoc, 0], fromPos], searchOrder];
fp ← DefDWIM.FindDef[argv[1], from, deep, verbose !DefDWIM.Failure => {msg ← Rope.Cat["DefDWIM.Failre[", FmtPlace[where], ", ", why, "]"]; GOTO Failed}];
msg ← Rope.Cat["Found ", FmtPlace[fp.where]];
RETURN;
EXITS Failed => result ← $Failure};
FmtPlace: PROC [place: DefDWIM.Place] RETURNS [Rope.ROPE] ~ {
pos: INT ← TextNode.LocOffset[[TextNode.Root[place.loc.node], 0], place.loc];
RETURN IO.PutFR["%g|%g", [rope[place.fileName]], [integer[pos]]]};
Start: PROC = {
Commander.Register["FindDef", FindDefCommand, " subject filename pos searchOrder deep verbose"];
};
Start[];
END.