| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | var AbstractPlugin = require("../AbstractPlugin"); | 
					
						
							|  |  |  | var HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency"); | 
					
						
							| 
									
										
										
										
											2015-10-22 03:05:01 +08:00
										 |  |  | var HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency"); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | var HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2015-10-22 03:05:01 +08:00
										 |  |  | var HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | var HarmonyImportDependency = require("./HarmonyImportDependency"); | 
					
						
							|  |  |  | var HarmonyModulesHelpers = require("./HarmonyModulesHelpers"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = AbstractPlugin.create({ | 
					
						
							|  |  |  | 	"export": function(statement) { | 
					
						
							| 
									
										
										
										
											2015-10-22 03:05:01 +08:00
										 |  |  | 		var dep = new HarmonyExportHeaderDependency(statement.declaration && statement.declaration.range, statement.range); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		dep.loc = statement.loc; | 
					
						
							|  |  |  | 		this.state.current.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2015-10-31 22:28:13 +08:00
										 |  |  | 		this.state.module.meta.harmonyModule = true; | 
					
						
							| 
									
										
										
										
											2016-05-06 16:44:31 +08:00
										 |  |  | 		this.state.module.strict = true; | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"export import": function(statement, source) { | 
					
						
							|  |  |  | 		var dep = new HarmonyImportDependency(source, HarmonyModulesHelpers.getNewModuleVar(this.state, source), statement.range); | 
					
						
							|  |  |  | 		dep.loc = statement.loc; | 
					
						
							|  |  |  | 		this.state.current.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2015-10-22 03:05:01 +08:00
										 |  |  | 		this.state.lastHarmoryImport = dep; | 
					
						
							| 
									
										
										
										
											2015-10-31 22:28:13 +08:00
										 |  |  | 		this.state.module.meta.harmonyModule = true; | 
					
						
							| 
									
										
										
										
											2016-05-06 16:44:31 +08:00
										 |  |  | 		this.state.module.strict = true; | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"export expression": function(statement, expr) { | 
					
						
							| 
									
										
										
										
											2015-10-22 03:05:01 +08:00
										 |  |  | 		var dep = new HarmonyExportExpressionDependency(this.state.module, expr.range, statement.range); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		dep.loc = statement.loc; | 
					
						
							|  |  |  | 		this.state.current.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2016-05-06 16:44:31 +08:00
										 |  |  | 		this.state.module.strict = true; | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-06-04 21:06:10 +08:00
										 |  |  | 	"export declaration": function(statement) {}, | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 	"export specifier": function(statement, id, name) { | 
					
						
							| 
									
										
										
										
											2016-01-07 04:39:50 +08:00
										 |  |  | 		var rename = this.scope.renames["$" + id]; | 
					
						
							|  |  |  | 		var dep; | 
					
						
							|  |  |  | 		if(rename === "imported var") { | 
					
						
							|  |  |  | 			var settings = this.state.harmonySpecifier["$" + id]; | 
					
						
							|  |  |  | 			dep = new HarmonyExportImportedSpecifierDependency(this.state.module, settings[0], settings[1], settings[2], name, statement.range[1]); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			var immutable = statement.declaration && isImmutableStatement(statement.declaration); | 
					
						
							|  |  |  | 			var hoisted = statement.declaration && isHoistedStatement(statement.declaration); | 
					
						
							| 
									
										
										
										
											2016-06-06 04:39:58 +08:00
										 |  |  | 			dep = new HarmonyExportSpecifierDependency(this.state.module, id, name, !immutable || hoisted ? -0.5 : (statement.range[1] + 0.5), immutable); | 
					
						
							| 
									
										
										
										
											2016-01-07 04:39:50 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		dep.loc = statement.loc; | 
					
						
							|  |  |  | 		this.state.current.addDependency(dep); | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"export import specifier": function(statement, source, id, name) { | 
					
						
							| 
									
										
										
										
											2015-10-31 21:43:44 +08:00
										 |  |  | 		var dep = new HarmonyExportImportedSpecifierDependency(this.state.module, this.state.lastHarmoryImport, HarmonyModulesHelpers.getModuleVar(this.state, source), id, name, 0); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 		dep.loc = statement.loc; | 
					
						
							|  |  |  | 		this.state.current.addDependency(dep); | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2015-10-31 21:43:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function isImmutableStatement(statement) { | 
					
						
							|  |  |  | 	if(statement.type === "FunctionDeclaration") return true; | 
					
						
							|  |  |  | 	if(statement.type === "ClassDeclaration") return true; | 
					
						
							| 
									
										
										
										
											2016-06-04 21:06:10 +08:00
										 |  |  | 	if(statement.type === "VariableDeclaration" && statement.kind === "const") return true; | 
					
						
							| 
									
										
										
										
											2015-10-31 21:43:44 +08:00
										 |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isHoistedStatement(statement) { | 
					
						
							|  |  |  | 	if(statement.type === "FunctionDeclaration") return true; | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } |