| -------------------------------------------------------------------------------- | 
 | --  Copyright (c) 2012 Sierra Wireless. | 
 | --  All rights reserved. This program and the accompanying materials | 
 | --  are made available under the terms of the Eclipse Public License v1.0 | 
 | --  which accompanies this distribution, and is available at | 
 | --  http://www.eclipse.org/legal/epl-v10.html | 
 | -- | 
 | --  Contributors: | 
 | --       Kevin KIN-FOO <kkinfoo@sierrawireless.com> | 
 | --           - initial API and implementation and initial documentation | 
 | -------------------------------------------------------------------------------- | 
 | require 'metalua.loader' | 
 | local compiler = require 'metalua.compiler' | 
 | local mlc = compiler.new() | 
 | local M = {} | 
 |  | 
 | -- | 
 | -- Define default supported languages | 
 | -- | 
 | M.supportedlanguages = {} | 
 | local extractors = require 'extractors' | 
 |  | 
 | -- Support Lua comment extracting | 
 | for _,lua in ipairs({'lua', 'doclua'}) do | 
 |   M.supportedlanguages[lua] = extractors.lua | 
 | end | 
 |  | 
 | -- Support C comment extracting | 
 | for _,c in ipairs({'c', 'cpp', 'c++'}) do | 
 |   M.supportedlanguages[c] = extractors.c | 
 | end | 
 |  | 
 | -- Extract comment from code, | 
 | -- type of code is deduced from filename extension | 
 | function M.extract(filename, code) | 
 |   -- Check parameters | 
 |   if not code then return nil, 'No code provided' end | 
 |   if type(filename) ~= "string" then | 
 |     return nil, 'No string for file name provided' | 
 |   end | 
 |  | 
 |   -- Extract file extension | 
 |   local fileextension = filename:gmatch('.*%.(.*)')() | 
 |   if not fileextension then | 
 |     return nil, 'File '..filename..' has no extension, could not determine how to extract documentation.' | 
 |   end | 
 |  | 
 |   -- Check if it is possible to extract documentation from these files | 
 |   local extractor = M.supportedlanguages[ fileextension ] | 
 |   if not extractor then | 
 |     return nil, 'Unable to extract documentation from '.. fileextension .. ' file.' | 
 |   end | 
 |   return extractor( code ) | 
 | end | 
 | -- Generate a file gathering only comments from given code | 
 | function M.generatecommentfile(filename, code) | 
 |   local comments, error = M.extract(filename, code) | 
 |   if not comments then | 
 |     return nil, 'Unable to generate comment file.\n'..error | 
 |   end | 
 |   local filecontent = {} | 
 |   for _, comment in ipairs( comments ) do | 
 |     table.insert(filecontent, "--[[") | 
 |     table.insert(filecontent, comment) | 
 |     table.insert(filecontent, "\n]]\n\n") | 
 |   end | 
 |   return table.concat(filecontent)..'return nil\n' | 
 | end | 
 | -- Create API Model module from a 'comment only' lua file | 
 | function M.generateapimodule(filename, code,noheuristic) | 
 |   if not filename then return nil, 'No file name given.' end | 
 |   if not code then return nil, 'No code provided.' end | 
 |   if type(filename) ~= "string" then return nil, 'No string for file name provided' end | 
 |  | 
 |   -- for non lua file get comment file | 
 |   if filename:gmatch('.*%.(.*)')() ~= 'lua' then | 
 |     local err | 
 |     code, err = M.generatecommentfile(filename, code) | 
 |     if not code then | 
 |       return nil, 'Unable to create api module for "'..filename..'".\n'..err | 
 |     end | 
 |   else | 
 |     -- manage shebang | 
 |     if code then code = code:gsub("^(#.-\n)", function (s) return string.rep(' ',string.len(s)) end) end | 
 |  | 
 |     -- check for errors | 
 |     local f, err = loadstring(code,'source_to_check') | 
 |     if not f then | 
 |       return nil, 'File'..filename..'contains syntax error.\n' .. err | 
 |     end | 
 |   end | 
 |  | 
 |   local status, ast = pcall(mlc.src_to_ast, mlc, code) | 
 |   if not status then | 
 |     return nil, 'Unable to compute ast for "'..filename..'".\n'..ast | 
 |   end | 
 |  | 
 |   -- Extract module name as the filename without extension | 
 |   local modulename | 
 |   local matcher = string.gmatch(filename,'.*/(.*)%..*$') | 
 |   if matcher then modulename = matcher() end | 
 |  | 
 |   -- Create api model | 
 |   local apimodelbuilder = require 'models.apimodelbuilder' | 
 |   local _file, comment2apiobj = apimodelbuilder.createmoduleapi(ast, modulename) | 
 |  | 
 |   -- Create internal model | 
 |   if not noheuristic then | 
 |     local internalmodelbuilder = require "models.internalmodelbuilder" | 
 |     local _internalcontent = internalmodelbuilder.createinternalcontent(ast,_file,comment2apiobj, modulename) | 
 |   end | 
 |   return _file | 
 | end | 
 | return M |