OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_AST_MODULES_H_ | 5 #ifndef V8_AST_MODULES_H_ |
6 #define V8_AST_MODULES_H_ | 6 #define V8_AST_MODULES_H_ |
7 | 7 |
8 #include "src/parsing/scanner.h" // Only for Scanner::Location. | 8 #include "src/parsing/scanner.h" // Only for Scanner::Location. |
9 #include "src/pending-compilation-error-handler.h" | 9 #include "src/pending-compilation-error-handler.h" |
10 #include "src/zone-containers.h" | 10 #include "src/zone-containers.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 // export * from "foo.js"; | 63 // export * from "foo.js"; |
64 void AddStarExport( | 64 void AddStarExport( |
65 const AstRawString* module_request, const Scanner::Location loc, | 65 const AstRawString* module_request, const Scanner::Location loc, |
66 Zone* zone); | 66 Zone* zone); |
67 | 67 |
68 // Check if module is well-formed and report error if not. | 68 // Check if module is well-formed and report error if not. |
69 // Also canonicalize indirect exports. | 69 // Also canonicalize indirect exports. |
70 bool Validate(ModuleScope* module_scope, | 70 bool Validate(ModuleScope* module_scope, |
71 PendingCompilationErrorHandler* error_handler, Zone* zone); | 71 PendingCompilationErrorHandler* error_handler, Zone* zone); |
72 | 72 |
73 struct ModuleEntry : public ZoneObject { | 73 struct Entry : public ZoneObject { |
74 const Scanner::Location location; | 74 const Scanner::Location location; |
75 const AstRawString* export_name; | 75 const AstRawString* export_name; |
76 const AstRawString* local_name; | 76 const AstRawString* local_name; |
77 const AstRawString* import_name; | 77 const AstRawString* import_name; |
78 const AstRawString* module_request; | 78 const AstRawString* module_request; |
79 | 79 |
80 explicit ModuleEntry(Scanner::Location loc) | 80 explicit Entry(Scanner::Location loc) |
81 : location(loc), | 81 : location(loc), |
82 export_name(nullptr), | 82 export_name(nullptr), |
83 local_name(nullptr), | 83 local_name(nullptr), |
84 import_name(nullptr), | 84 import_name(nullptr), |
85 module_request(nullptr) {} | 85 module_request(nullptr) {} |
86 }; | 86 }; |
87 | 87 |
88 // Empty imports and namespace imports. | 88 // Empty imports and namespace imports. |
89 const ZoneList<const ModuleEntry*>& special_imports() const { | 89 const ZoneList<const Entry*>& special_imports() const { |
90 return special_imports_; | 90 return special_imports_; |
91 } | 91 } |
92 | 92 |
93 // All the remaining imports, indexed by local name. | 93 // All the remaining imports, indexed by local name. |
94 const ZoneMap<const AstRawString*, const ModuleEntry*>& regular_imports() | 94 const ZoneMap<const AstRawString*, const Entry*>& regular_imports() const { |
95 const { | |
96 return regular_imports_; | 95 return regular_imports_; |
97 } | 96 } |
98 | 97 |
99 // Star exports and explicitly indirect exports. | 98 // Star exports and explicitly indirect exports. |
100 const ZoneList<const ModuleEntry*>& special_exports() const { | 99 const ZoneList<const Entry*>& special_exports() const { |
101 return special_exports_; | 100 return special_exports_; |
102 } | 101 } |
103 | 102 |
104 // All the remaining exports, indexed by local name. | 103 // All the remaining exports, indexed by local name. |
105 const ZoneMultimap<const AstRawString*, ModuleEntry*>& regular_exports() | 104 const ZoneMultimap<const AstRawString*, Entry*>& regular_exports() const { |
106 const { | |
107 return regular_exports_; | 105 return regular_exports_; |
108 } | 106 } |
109 | 107 |
110 private: | 108 private: |
111 // TODO(neis): Use STL datastructure instead of ZoneList? | 109 // TODO(neis): Use STL datastructure instead of ZoneList? |
112 ZoneList<const ModuleEntry*> special_exports_; | 110 ZoneList<const Entry*> special_exports_; |
113 ZoneList<const ModuleEntry*> special_imports_; | 111 ZoneList<const Entry*> special_imports_; |
114 ZoneMultimap<const AstRawString*, ModuleEntry*> regular_exports_; | 112 ZoneMultimap<const AstRawString*, Entry*> regular_exports_; |
115 ZoneMap<const AstRawString*, const ModuleEntry*> regular_imports_; | 113 ZoneMap<const AstRawString*, const Entry*> regular_imports_; |
116 | 114 |
117 // If there are multiple export entries with the same export name, return one | 115 // If there are multiple export entries with the same export name, return one |
118 // of them. Otherwise return nullptr. | 116 // of them. Otherwise return nullptr. |
119 const ModuleEntry* FindDuplicateExport(Zone* zone) const; | 117 const Entry* FindDuplicateExport(Zone* zone) const; |
120 | 118 |
121 // Find any implicitly indirect exports and make them explicit. | 119 // Find any implicitly indirect exports and make them explicit. |
122 // | 120 // |
123 // An explicitly indirect export is an export entry arising from an export | 121 // An explicitly indirect export is an export entry arising from an export |
124 // statement of the following form: | 122 // statement of the following form: |
125 // export {a as c} from "X"; | 123 // export {a as c} from "X"; |
126 // An implicitly indirect export corresponds to | 124 // An implicitly indirect export corresponds to |
127 // export {b as c}; | 125 // export {b as c}; |
128 // in the presence of an import statement of the form | 126 // in the presence of an import statement of the form |
129 // import {a as b} from "X"; | 127 // import {a as b} from "X"; |
130 // This function finds such implicitly indirect export entries and rewrites | 128 // This function finds such implicitly indirect export entries and rewrites |
131 // them by filling in the import name and module request, as well as nulling | 129 // them by filling in the import name and module request, as well as nulling |
132 // out the local name. Effectively, it turns | 130 // out the local name. Effectively, it turns |
133 // import {a as b} from "X"; export {b as c}; | 131 // import {a as b} from "X"; export {b as c}; |
134 // into: | 132 // into: |
135 // import {a as b} from "X"; export {a as c} from "X"; | 133 // import {a as b} from "X"; export {a as c} from "X"; |
136 // (The import entry is never deleted.) | 134 // (The import entry is never deleted.) |
137 void MakeIndirectExportsExplicit(Zone* zone); | 135 void MakeIndirectExportsExplicit(Zone* zone); |
138 }; | 136 }; |
139 | 137 |
140 } // namespace internal | 138 } // namespace internal |
141 } // namespace v8 | 139 } // namespace v8 |
142 | 140 |
143 #endif // V8_AST_MODULES_H_ | 141 #endif // V8_AST_MODULES_H_ |
OLD | NEW |