(member, moduleObject, qname)
| 234 | // available until then. |
| 235 | |
| 236 | function addModuleMember(member, moduleObject, qname) { |
| 237 | current_node = member; |
| 238 | var topLevel = qname === ''; |
| 239 | if (member instanceof TypeScript.FunctionDeclaration) { |
| 240 | var obj = moduleObject.getMember(member.name.text()) |
| 241 | if (obj instanceof TObject) { |
| 242 | obj.calls.push(parseFunctionType(member)) |
| 243 | } else { |
| 244 | throw new TypeError(member.name.text() + " is not a function") |
| 245 | } |
| 246 | } |
| 247 | else if (member instanceof TypeScript.VariableStatement) { |
| 248 | member.declaration.declarators.members.forEach(function(decl) { |
| 249 | moduleObject.setMember(decl.id.text(), parseType(decl.typeExpr)) |
| 250 | }) |
| 251 | } |
| 252 | else if (member instanceof TypeScript.ModuleDeclaration) { |
| 253 | var name = member.name.text() |
| 254 | if (member.isEnum()) { // enums are ModuleDeclarations in the AST, but they are semantically quite different |
| 255 | var enumObj = moduleObject.getModule(name) |
| 256 | var enumResult = parseEnum(member, enumObj, qname) |
| 257 | moduleObject.types.push(name, enumResult.enum) |
| 258 | } else { |
| 259 | if (name[0] === '"' || name[0] === "'") { // external module? |
| 260 | parseExternModule(member) |
| 261 | } else { |
| 262 | var submodule = moduleObject.getModule(name) |
| 263 | parseModule(member, submodule, qualify(qname, name)) |
| 264 | } |
| 265 | } |
| 266 | } |
| 267 | else if (member instanceof TypeScript.ClassDeclaration) { |
| 268 | var name = member.name.text() |
| 269 | var clazzObj = moduleObject.getModule(name) |
| 270 | var clazz = parseClass(member, clazzObj, qname) |
| 271 | // moduleObject.setMember(member.name.text(), clazz.constructorType) |
| 272 | moduleObject.types.push(member.name.text(), clazz.instanceType) |
| 273 | } |
| 274 | else if (member instanceof TypeScript.InterfaceDeclaration) { |
| 275 | var name = member.name.text() |
| 276 | var t = parseInterface(member, qname) |
| 277 | moduleObject.types.push(name, t) |
| 278 | } |
| 279 | else if (member instanceof TypeScript.ImportDeclaration) { |
| 280 | var ref = parseType(member.alias) |
| 281 | if (topLevel || TypeScript.hasFlag(member.getVarFlags(), TypeScript.VariableFlags.Exported)) { |
| 282 | moduleObject.types.push(member.id.text(), ref) |
| 283 | } else { |
| 284 | // private alias to (potentially) publicly visible type |
| 285 | current_scope.env.push(member.id.text(), ref) |
| 286 | } |
| 287 | } |
| 288 | else if (member instanceof TypeScript.ExportAssignment) { |
| 289 | // XXX: I think we can actually just ignore these in the tscheck project, |
| 290 | // but for completeness, maybe we should export this information somehow |
| 291 | // For reference, this is what I *think* happens: |
| 292 | // declare module "foo" { export = X } |
| 293 | // This means import("foo") will return the value in global variable X. |
no test coverage detected