Repository navigation
Expand file tree
/
Copy pathes_modules.js
More file actions
1 lines (1 loc) · 3.29 KB
/
Copy pathes_modules.js
File metadata and controls
1 lines (1 loc) · 3.29 KB
1
!function(mod){"object"==typeof exports&&"object"==typeof module?mod(require("../lib/infer"),require("../lib/tern"),require("acorn-walk"),require("./modules")):"function"==typeof define&&define.amd?define(["../lib/infer","../lib/tern","acorn-walk/dist/walk","./modules"],mod):mod(tern,tern,acorn.walk)}(function(infer,tern,walk){"use strict";var WG_IMPORT_DEFAULT_FALLBACK=80;function connectModule(file,out){var modules=infer.cx().parent.mod.modules,outObj=null;function exp(prop,type,originNode){outObj||((outObj=new infer.Obj(!0)).origin=file.name,outObj.originNode=file.ast,out.addType(outObj));var propObj=outObj.defProp(prop,originNode);propObj.origin=file.name,type.propagate(propObj)}walk.simple(file.ast,{ImportDeclaration:function(node){for(var input=modules.resolveModule(node.source.value,file.name),i=0;i<node.specifiers.length;i++){var spec=node.specifiers[i],aval=file.scope.getProp(spec.local.name);"ImportNamespaceSpecifier"==spec.type?input.propagate(aval):"ImportDefaultSpecifier"==spec.type?(input.getProp("default").propagate(aval),input.propagate(aval,WG_IMPORT_DEFAULT_FALLBACK)):input.getProp(spec.imported.name).propagate(aval)}},ExportAllDeclaration:function(node){var input;modules.resolveModule(node.source.value,file.name).forAllProps(function(prop,val,local){local&&exp(prop,val,val.originNode)})},ExportDefaultDeclaration:function(node){var decl=node.declaration.id||node.declaration;exp("default",infer.expressionType({node:decl,state:file.scope}),decl)},ExportNamedDeclaration:function(node){var decl=node.declaration;if(decl)if("VariableDeclaration"==decl.type)for(var i=0;i<decl.declarations.length;++i){var cur=decl.declarations[i];"Identifier"==cur.id.type&&exp(cur.id.name,file.scope.getProp(cur.id.name),cur.id)}else decl.id&&exp(decl.id.name,file.scope.getProp(decl.id.name),decl.id);if(node.specifiers.length)for(var src=node.source?modules.resolveModule(node.source.value,file.name):file.scope,i=0;i<node.specifiers.length;i++){var spec=node.specifiers[i];exp(spec.exported.name,src.getProp(spec.local.name),spec.local)}}})}function isModuleName(node){if("Literal"==node.type&&"string"==typeof node.value){var decl=infer.findExpressionAround(node.sourceFile.ast,null,node.end,null,function(_,node){return"ImportDeclaration"==node.type||/Export(All|Named)Declaration/.test(node.type)});if(decl&&decl.node.source==node)return node.value}}function isImport(node,pos){if("Identifier"==node.type){var imp=infer.findExpressionAround(node.sourceFile.ast,null,node.end,null,"ImportDeclaration");if(!imp)return;for(var specs=imp.node.specifiers,i=0;i<specs.length;i++){var spec=specs[i];if(spec.local==node){var result={name:imp.node.source.value,prop:null};return"ImportDefaultSpecifier"==spec.type?result.prop="default":"ImportSpecifier"==spec.type&&(result.prop=spec.imported.name),result}}}else if("ImportDeclaration"==node.type&&/^import\s+\{\s*([\w$]+\s*,\s*)*$/.test(node.sourceFile.text.slice(node.start,pos)))return{name:node.source.value,prop:""}}tern.registerPlugin("es_modules",function(server){server.loadPlugin("modules"),server.mod.modules.on("getExports",connectModule),server.mod.modules.modNameTests.push(isModuleName),server.mod.modules.importTests.push(isImport),server.mod.modules.completableTypes.Identifier=!0,server.mod.modules.completableTypes.Literal=!0,server.mod.modules.completableTypes.ImportDeclaration=!0})});