git.fiddlerwoaroof.com
Raw Blame History
;;; print-modules.scm -- print routines for module-related AST structures
;;;
;;; author :  Sandra Loosemore
;;; date   :  6 Jan 1992
;;;
;;;
;;; This file corresponds to the file ast/modules.scm.

;;; Note: by default, only the module name is printed.  To print the
;;; full module, the function print-full-module must be called.

(define *print-abbreviated-modules* '#t)

(define-ast-printer module (object xp)
 (if *print-abbreviated-modules*
     (begin
       (write-string "Module " xp)
       (write-string (symbol->string (module-name object)) xp))
     (do-print-full-module object xp)))

(define (print-full-module object . maybe-stream)
  (let ((stream  (if (not (null? maybe-stream))
		     (car maybe-stream)
		     (current-output-port))))
    (dynamic-let ((*print-abbreviated-modules* '#f))
       (pprint object stream))))

(define (do-print-full-module object xp)
 (dynamic-let ((*print-abbreviated-modules* '#t))
  (let ((modid    (module-name object))
	(exports  (module-exports object))
	(body     (append (module-imports object)
			  (module-fixities object)
			  (module-synonyms object)
			  (module-algdatas object)
			  (module-classes object)
			  (module-instances object)
			  (if (or (not (module-default object))
				  (eq? (module-default object)
				       *standard-module-default*))
			      '()
			      (list (module-default object)))
			  (module-decls object))))
    (write-string "module " xp)
    (write-modid modid xp)
    (when (not (null? exports))
      (write-whitespace xp)
      (write-commaized-list exports xp))
    (write-wheredecls body xp))))

(define-ast-printer import-decl (object xp)
  (let ((modid     (import-decl-module-name object))
	(mode      (import-decl-mode object))
	(specs     (import-decl-specs object))
	(renamings (import-decl-renamings object)))
    (with-ast-block (xp)
      (write-string "import " xp)
      (write-modid modid xp)
      (if (eq? mode 'all)
	  (when (not (null? specs))
	    (write-whitespace xp)
	    (write-string "hiding " xp)
	    (write-commaized-list specs xp))
	  (begin
	    (write-whitespace xp)
	    (write-commaized-list specs xp)))
      (when (not (null? renamings))
	(write-whitespace xp)
	(write-string "renaming " xp)
	(write-commaized-list renamings xp))
      )))

(define-ast-printer entity-module (object xp)
  (write-modid (entity-name object) xp)
  (write-string ".." xp))

(define-ast-printer entity-var (object xp)
  (write-varid (entity-name object) xp))

(define-ast-printer entity-con (object xp)
  (write-tyconid (entity-name object) xp))

(define-ast-printer entity-abbreviated (object xp)
  (write-tyconid (entity-name object) xp)
  (write-string "(..)" xp))

(define-ast-printer entity-class (object xp)
  (with-ast-block (xp)
    (write-tyclsid (entity-name object) xp)
    (write-whitespace xp)
    (write-delimited-list (entity-class-methods object) xp
			  (function write-varid) "," "(" ")")))

(define-ast-printer entity-datatype (object xp)
  (with-ast-block (xp)
    (write-tyconid (entity-name object) xp)
    (write-whitespace xp)
    (write-delimited-list (entity-datatype-constructors object) xp
			  (function write-conid) "," "(" ")")))


(define-ast-printer renaming (object xp)
  (with-ast-block (xp)
    (write-varid-conid (renaming-from object) xp)
    (write-string " to" xp)
    (write-whitespace xp)
    (write-varid-conid (renaming-to object) xp)))

;;; *** Should it omit precedence if it's 9?

(define-ast-printer fixity-decl (object xp)
  (let* ((fixity         (fixity-decl-fixity object))
	 (associativity  (fixity-associativity fixity))
	 (precedence     (fixity-precedence fixity))
	 (ops            (fixity-decl-names object)))
    (with-ast-block (xp)
      (cond ((eq? associativity 'l)
	     (write-string "infixl " xp))
	    ((eq? associativity 'r)
	     (write-string "infixr " xp))
	    ((eq? associativity 'n)
	     (write-string "infix " xp)))
      (write precedence xp)
      (write-whitespace xp)
      (write-delimited-list ops xp (function write-varop-conop) "," "" ""))))