Module: dfmc-environment-database Synopsis: DFM compiler database utilities Author: Andy Armstrong, Chris Page Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND define function ensure-server-database (server :: ) => (database :: ) select (server by instance?) => server; => server.project-compiler-database; otherwise => #f; end | error("Unexpectedly failed to find database for %s", server) end function ensure-server-database; // Return the appropriate environment class for a definition source form. define inline function environment-class-for-source-form (server :: , source-form :: ) => (class :: subclass()) local method method-class () => (class :: subclass()) let database = ensure-server-database(server); if (internal-dylan-method?(database, source-form)) else end end method method-class; select (source-form by instance?) //---*** andrewa: this mapping is no longer correct, we //---*** map s to . // => ; => ; => ; => method-class(); => ; => method-class(); // Order of next two is significant => method-class(); => ; => ; => ; => ; => if (member?(#"thread", source-form-adjectives(source-form))) else end; otherwise => ; end end function environment-class-for-source-form; define sealed method make-environment-object-for-source-form (server :: , definition :: ) => (object :: ) let environment-class = environment-class-for-source-form(server, definition); make-environment-object(environment-class, project: server.server-project, compiler-object-proxy: definition) end method make-environment-object-for-source-form; //--- Special case 'define function' so that it doesn't look like //--- a macro call. define sealed method make-environment-object-for-source-form (server :: , form :: ) => (object :: ) let function? = source-form-define-word(form) == #"function"; let forms = if (function?) form.macro-form-expanded-forms end | #[]; if (size(forms) = 1) make-environment-object-for-source-form(server, forms[0]) else next-method() end end method make-environment-object-for-source-form; define sealed method make-environment-object-for-source-form (server :: , definition :: ) => (object :: ) let name = definition.library-definition-name; let database = server.ensure-server-database; let project = find-project-for-library-name(database, name); make-environment-object(, project: server.server-project, compiler-object-proxy: project) end method make-environment-object-for-source-form; define class () end; define method environment-object-primitive-name (server :: , expression :: ) => (result :: false-or()); let s :: = make(, contents: make(, size: 32), direction: #"output"); print(expression.compiler-object-proxy, s, escape?: #f); s.stream-contents end; define function make-environment-object-for-type-expression (server :: , type-expression :: false-or()) => (object :: ) let type-definition = type-expression-to-definition(server, type-expression); if (type-definition) make-environment-object-for-source-form (server.server-project, type-definition) else make-environment-object(, project: server.server-project, compiler-object-proxy: type-expression) end end function make-environment-object-for-type-expression; define function find- (server :: ) => (definition :: ) find-compiler-database-proxy(server, $-id) | error("Failed to find !") end function find-; define method type-expression-to-definition (server :: , type-expression :: false-or()) => (object :: false-or()) let context = browsing-context(server, server); // Arbitrarily complex type expression case type-expression == #t => #f; type-expression == #f => find-(server); instance?(type-expression, ) => let definition = variable-active-definition(context, type-expression); unless (definition) debug-message("No active definition found for %=", type-expression) end; definition; end case end method type-expression-to-definition; define method type-expression-to-definition (server :: , type-expression :: ) => (object :: false-or()) //---*** cpage: 1997.12.16 This case shouldn't occur, but used to // in the past. Since there's a trivial work-around, // let's do it here for the short-term until we verify // that this case no longer occurs. debug-message("make-environment-object-for-type-expression:" " The type expression %= is a " " when it should be a ", type-expression); type-expression end method type-expression-to-definition; define function name-to-string (name :: ) => (string :: ) as-lowercase(as(, name)) end function name-to-string;