raptor
Version:
RaptorJS provides an AMD module loader that works in Node, Rhino and the web browser. It also includes various sub-modules to support building optimized web applications.
144 lines (111 loc) • 5.92 kB
JavaScript
define(
"raptor/jsdoc/raptor-plugin",
function(require, exports, module) {
"use strict";
var Type = require("raptor/jsdoc/Type"),
resolveDefine = require("./resolver-define.js"),
resolveExtend = require("./resolver-define.extend.js");
return {
load: function(env) {
var createTypeForComment = function(comment) {
var resolvedType;
if (comment.hasTag("function")) {
resolvedType = new Type("function");
resolvedType.setComment(comment);
var paramTags = comment.getTags("param");
paramTags.forEach(function(paramTag) {
resolvedType.addFunctionParam({name: paramTag.paramName});
}, this);
return resolvedType;
}
return null;
};
env.addHandlers({
"property": function(eventArgs) {
var comment = eventArgs.comment;
if (comment) {
var resolvedType = createTypeForComment(comment);
if (resolvedType) {
eventArgs.setType(resolvedType);
}
}
},
"ReturnStatement": function(eventArgs) {
var comment = eventArgs.comment;
if (comment) {
var nameTag = comment.getTag("name");
if (nameTag) {
if (!eventArgs.node.resolvedReturnType) {
}
else {
eventArgs.symbols.addSymbol(nameTag.getValue(), eventArgs.node.resolvedReturnType);
}
}
}
},
"assignment": function(eventArgs) {
var comment = eventArgs.comment;
var resolvedType = eventArgs.type;
if (comment) {
if (!resolvedType) {
resolvedType = createTypeForComment(comment);
if (resolvedType) {
eventArgs.setType(resolvedType);
}
}
if (resolvedType) {
var nameTag = comment.getTag("name");
resolvedType.setComment(comment);
if (nameTag && !comment.hasTag("memberOf")) {
var name = nameTag.getValue();
eventArgs.symbols.addSymbol(name, resolvedType);
}
}
}
},
"JSDocComment": function(eventArgs) {
var comment = eventArgs.node;
var memberOfTag = comment.getTag("memberOf");
var nameTag = comment.getTag("name");
if (memberOfTag && nameTag) {
var targetType = eventArgs.symbols.resolveSymbolType(memberOfTag.getValue());
if (targetType) {
var resolvedType = createTypeForComment(comment);
if (resolvedType) {
targetType.setProperty({
name: nameTag.getValue(),
type: resolvedType,
comment: comment
});
}
}
}
}
}, this);
env.getGlobal().addProperties({
"require": function(node, walker) {
var args = node['arguments'];
if (args && args.length === 1) {
var nameArg = args[0];
if (nameArg.type === 'Literal') {
var name = nameArg.value;
var requiredType = walker.symbols.getSymbolType(name);
return requiredType;
}
}
},
"define": {
__function: function(node, walker) {
return resolveDefine("define", node, walker, false /* is class */, false /* is extend */, false /* is enum */);
},
"Class": function(node, walker) {
return resolveDefine("define.Class", node, walker, true /* is class */, false /* is extend */, false /* is enum */);
},
"extend": function(node, walker) {
return resolveExtend("define.extend", node, walker, false /* is class */, true /* is extend */, false /* is enum */);
}
}
});
}
};
});