DependencyWalker.Mod 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. MODULE DependencyWalker;
  2. IMPORT Commands, Diagnostics, Files, Options, Streams, FoxBasic, FoxGlobal, FoxParser, FoxScanner, FoxSyntaxTree;
  3. PROCEDURE Process (CONST moduleName, fileExtension: ARRAY OF CHAR; diagnostics: Diagnostics.Diagnostics; writer: Streams.Writer): BOOLEAN;
  4. VAR reader: Streams.Reader; scanner: FoxScanner.Scanner; parser: FoxParser.Parser;
  5. VAR module: FoxSyntaxTree.Module; import: FoxSyntaxTree.Import; string: ARRAY 64 OF CHAR;
  6. BEGIN
  7. reader := FoxBasic.GetFileReader (moduleName);
  8. IF reader = NIL THEN diagnostics.Error (moduleName, Streams.Invalid, "Failed to open module"); RETURN FALSE END;
  9. scanner := FoxScanner.NewScanner (moduleName, reader, 0, diagnostics);
  10. NEW (parser, scanner, diagnostics, "");
  11. module := parser.Module ();
  12. IF parser.error THEN RETURN FALSE END;
  13. FoxGlobal.ModuleFileName (module.name, module.context, string);
  14. writer.String (string);
  15. writer.String (fileExtension);
  16. writer.String (": ");
  17. writer.String (moduleName);
  18. import := module.moduleScope.firstImport;
  19. WHILE import # NIL DO
  20. IF import.moduleName # FoxGlobal.SystemName THEN
  21. writer.Char (' ');
  22. IF import.context # FoxSyntaxTree.invalidIdentifier THEN
  23. FoxGlobal.ModuleFileName (import.moduleName, import.context, string);
  24. ELSE
  25. FoxGlobal.ModuleFileName (import.moduleName, module.context, string);
  26. END;
  27. writer.String (string);
  28. writer.String (fileExtension);
  29. END;
  30. import := import.nextImport;
  31. END;
  32. writer.Ln;
  33. RETURN TRUE;
  34. END Process;
  35. PROCEDURE Walk* (context: Commands.Context);
  36. VAR options : Options.Options; diagnostics : Diagnostics.StreamDiagnostics;
  37. VAR fileExtension: Options.Parameter; moduleName: Files.FileName;
  38. BEGIN
  39. NEW (options);
  40. options.Add ('e', "fileExtension", Options.String);
  41. IF ~options.Parse (context.arg, context.error) THEN
  42. context.result := Commands.CommandParseError; RETURN;
  43. END;
  44. IF ~options.GetString ("fileExtension", fileExtension) THEN fileExtension := ".Sym" END;
  45. NEW (diagnostics, context.error);
  46. LOOP
  47. context.arg.SkipWhitespace;
  48. context.arg.String (moduleName);
  49. IF moduleName = "" THEN EXIT END;
  50. IF ~Process (moduleName, fileExtension, diagnostics, context.out) THEN
  51. context.result := Commands.CommandError; RETURN;
  52. END;
  53. END;
  54. END Walk;
  55. END DependencyWalker.