tool.ss
(module tool mzscheme
  (require
   (lib "class.ss")
   (lib "contract.ss")
   (lib "list.ss")
   (lib "unit.ss")
   ;(lib "unitsig.ss")
   (lib "drscheme.ss" "drscheme")
   (lib "tool.ss" "drscheme")
   (lib "framework.ss" "framework")
   (prefix debug: "debugger.ss")
   (prefix lang: "language.ss")
   (prefix indent: "indentation.ss")
   (prefix mode: "text-mode.ss")
   (prefix typecheck: "typecheck.ss"))
  (provide tool@)
  (define tool@
    (unit ;drscheme:tool-exports^
      (import drscheme:tool^)
      (export drscheme:tool-exports^)
      (define (get-lang settings)
        (drscheme:language-configuration:language-settings-language
         settings))
      (define (get-settings-thunk)
        (drscheme:language-configuration:language-settings-settings
         (preferences:get (drscheme:language-configuration:get-settings-preferences-symbol))))
      (define (phase1) (void))
      (define (phase2)
        (drscheme:language-configuration:add-language
         (make-object
             ((drscheme:language:get-default-mixin)
              (lang:language% drscheme:language:language<%>))))
        
        (drscheme:language:register-capability 'ocaml:debug-button (flat-contract boolean?) #f)
        (drscheme:language:register-capability 'ocaml:typecheck-button (flat-contract boolean?) #f)
        
        (drscheme:get/extend:extend-interactions-text
         (lang:interactions-text-mixin drscheme:rep:text<%>))
        (drscheme:get/extend:extend-tab
         (lang:tab-mixin drscheme:unit:tab<%>))
        (drscheme:get/extend:extend-definitions-text
         (lang:definitions-text-mixin drscheme:unit:definitions-text<%>))
        (drscheme:get/extend:extend-unit-frame
         (debug:unit-frame-mixin drscheme:unit:frame<%> get-settings-thunk get-lang))
        (drscheme:get/extend:extend-tab
         (debug:tab-mixin drscheme:unit:tab<%>))
        (drscheme:get/extend:extend-definitions-text
         (debug:definitions-text-mixin drscheme:unit:definitions-text<%> get-settings-thunk))
        (drscheme:get/extend:extend-unit-frame
         (typecheck:unit-frame-mixin drscheme:unit:frame<%> get-settings-thunk get-lang))
        (drscheme:get/extend:extend-definitions-text
         (typecheck:definitions-text-mixin drscheme:unit:definitions-text<%>))
        (drscheme:get/extend:extend-interactions-text
         (indent:indent-mixin drscheme:rep:text<%>))
        (drscheme:get/extend:extend-definitions-text
         (indent:indent-mixin drscheme:unit:definitions-text<%>))

        (drscheme:modes:add-mode
         "OCaml mode" (make-object mode:text-mode%) mode:repl-submit mode:matches-language)
        #;(preferences:add-to-editor-checkbox-panel extend-editor-preferences-panel)
        (color-prefs:add-to-preferences-panel "OCaml" mode:extend-color-preferences-panel)
        (for-each
         (λ (line)
           (let ([sym (first line)]
                 [color (second line)])
             (color-prefs:register-color-preference
              (mode:short-sym->pref-name sym)
              (mode:short-sym->style-name sym)
              color)))
         mode:color-prefs-table)))))