private static void parseExportMap(ExportStatement export, ParseInfo state, ref int index) { index++; Tools.SkipSpaces(state.Code, ref index); if (state.Code[index] == '}') { ExceptionHelper.ThrowSyntaxError("Empty export map", state.Code, index); } while (state.Code[index] != '}') { var start = index; if (!Parser.ValidateName(state.Code, ref index)) { ExceptionHelper.ThrowSyntaxError("Invalid export name", state.Code, index); } var name = state.Code.Substring(start, index - start); var alias = name; Tools.SkipSpaces(state.Code, ref index); alias = parseAlias(state.Code, ref index) ?? name; for (var i = 0; i < export._map.Count; i++) { if (export._map[i].Key == name) { ExceptionHelper.ThrowSyntaxError("Duplicate import", state.Code, index); } } export._map.Add( new KeyValuePair <string, Expression>( alias, new Variable(name, state.LexicalScopeLevel) { Position = start, Length = name.Length })); if (Parser.Validate(state.Code, ",", ref index)) { Tools.SkipSpaces(state.Code, ref index); } } index++; }
internal static CodeNode Parse(ParseInfo state, ref int index) { if (!Parser.Validate(state.Code, "export", ref index)) { return(null); } Tools.SkipSpaces(state.Code, ref index); var result = new ExportStatement(); var reexport = 0; if (Parser.Validate(state.Code, "*", ref index)) { reexport = 1; } else if (Parser.Validate(state.Code, "default", ref index)) { reexport = -1; Tools.SkipSpaces(state.Code, ref index); result._map.Add(new KeyValuePair <string, Expression>("", (Expression)ExpressionTree.Parse(state, ref index))); } else if (state.Code[index] == '{') { parseExportMap(result, state, ref index); } else { reexport = -1; var definition = VariableDefinition.Parse(state, ref index) ?? ClassDefinition.Parse(state, ref index) ?? FunctionDefinition.Parse(state, ref index, FunctionKind.Function); if (definition == null) { ExceptionHelper.ThrowSyntaxError(Messages.UnexpectedToken, state.Code, index); } result._internalDefinition = definition; } Tools.SkipSpaces(state.Code, ref index); if (Parser.Validate(state.Code, "from", ref index)) { if (reexport == -1) { ExceptionHelper.ThrowSyntaxError("Reexport is not allowed with this syntax", state.Code, index - 4); } Tools.SkipSpaces(state.Code, ref index); var start = index; if (!Parser.ValidateString(state.Code, ref index, false)) { ExceptionHelper.ThrowSyntaxError("Expected module name", state.Code, index); } result.ReExportSourceModuleName = Tools.Unescape(state.Code.Substring(start + 1, index - start - 2), false); } else if (reexport == 1) { ExceptionHelper.ThrowSyntaxError("Expected 'from'", state.Code, index); } return(result); }