in pkg/compiler/lib/src/common/codegen.dart [1801:2216]
T read<T extends js.Node>({bool allowNull = false}) {
if (allowNull) {
bool hasValue = source.readBool();
if (!hasValue) return null;
}
JsNodeKind kind = source.readEnum(JsNodeKind.values);
js.Node node;
switch (kind) {
case JsNodeKind.comment:
source.begin(JsNodeTags.comment);
node = js.Comment(source.readString());
source.end(JsNodeTags.comment);
break;
case JsNodeKind.await:
source.begin(JsNodeTags.await);
node = js.Await(read());
source.end(JsNodeTags.await);
break;
case JsNodeKind.regExpLiteral:
source.begin(JsNodeTags.regExpLiteral);
node = js.RegExpLiteral(source.readString());
source.end(JsNodeTags.regExpLiteral);
break;
case JsNodeKind.property:
source.begin(JsNodeTags.property);
js.Expression name = read();
js.Expression value = read();
node = js.Property(name, value);
source.end(JsNodeTags.property);
break;
case JsNodeKind.methodDefinition:
source.begin(JsNodeTags.methodDefinition);
js.Expression name = read();
js.Expression function = read();
node = js.MethodDefinition(name, function);
source.end(JsNodeTags.methodDefinition);
break;
case JsNodeKind.objectInitializer:
source.begin(JsNodeTags.objectInitializer);
List<js.Property> properties = readList();
bool isOneLiner = source.readBool();
node = js.ObjectInitializer(properties, isOneLiner: isOneLiner);
source.end(JsNodeTags.objectInitializer);
break;
case JsNodeKind.arrayHole:
source.begin(JsNodeTags.arrayHole);
node = js.ArrayHole();
source.end(JsNodeTags.arrayHole);
break;
case JsNodeKind.arrayInitializer:
source.begin(JsNodeTags.arrayInitializer);
List<js.Expression> elements = readList();
node = js.ArrayInitializer(elements);
source.end(JsNodeTags.arrayInitializer);
break;
case JsNodeKind.parentheses:
source.begin(JsNodeTags.parentheses);
node = js.Parentheses(read());
source.end(JsNodeTags.parentheses);
break;
case JsNodeKind.modularName:
source.begin(JsNodeTags.modularName);
ModularName modularName = ModularName.readFromDataSource(source);
modularNames.add(modularName);
node = modularName;
source.end(JsNodeTags.modularName);
break;
case JsNodeKind.asyncName:
source.begin(JsNodeTags.asyncName);
js.Name prefix = read();
js.Name base = read();
node = AsyncName(prefix, base);
source.end(JsNodeTags.asyncName);
break;
case JsNodeKind.stringBackedName:
source.begin(JsNodeTags.stringBackedName);
node = StringBackedName(source.readString());
source.end(JsNodeTags.stringBackedName);
break;
case JsNodeKind.stringConcatenation:
source.begin(JsNodeTags.stringConcatenation);
List<js.Literal> parts = readList();
node = js.StringConcatenation(parts);
source.end(JsNodeTags.stringConcatenation);
break;
case JsNodeKind.literalNull:
source.begin(JsNodeTags.literalNull);
node = js.LiteralNull();
source.end(JsNodeTags.literalNull);
break;
case JsNodeKind.literalNumber:
source.begin(JsNodeTags.literalNumber);
node = js.LiteralNumber(source.readString());
source.end(JsNodeTags.literalNumber);
break;
case JsNodeKind.literalString:
source.begin(JsNodeTags.literalString);
node = js.LiteralString(source.readString());
source.end(JsNodeTags.literalString);
break;
case JsNodeKind.literalStringFromName:
source.begin(JsNodeTags.literalStringFromName);
js.Name name = read();
node = js.LiteralStringFromName(name);
source.end(JsNodeTags.literalStringFromName);
break;
case JsNodeKind.literalBool:
source.begin(JsNodeTags.literalBool);
node = js.LiteralBool(source.readBool());
source.end(JsNodeTags.literalBool);
break;
case JsNodeKind.modularExpression:
source.begin(JsNodeTags.modularExpression);
ModularExpression modularExpression =
ModularExpression.readFromDataSource(source);
modularExpressions.add(modularExpression);
node = modularExpression;
source.end(JsNodeTags.modularExpression);
break;
case JsNodeKind.function:
source.begin(JsNodeTags.function);
List<js.Parameter> params = readList();
js.Block body = read();
js.AsyncModifier asyncModifier =
source.readEnum(js.AsyncModifier.values);
node = js.Fun(params, body, asyncModifier: asyncModifier);
source.end(JsNodeTags.function);
break;
case JsNodeKind.arrowFunction:
source.begin(JsNodeTags.arrowFunction);
List<js.Parameter> params = readList();
js.Block body = read();
js.AsyncModifier asyncModifier =
source.readEnum(js.AsyncModifier.values);
node = js.ArrowFunction(params, body, asyncModifier: asyncModifier);
source.end(JsNodeTags.arrowFunction);
break;
case JsNodeKind.namedFunction:
source.begin(JsNodeTags.namedFunction);
js.Declaration name = read();
js.Fun function = read();
node = js.NamedFunction(name, function);
source.end(JsNodeTags.namedFunction);
break;
case JsNodeKind.access:
source.begin(JsNodeTags.access);
js.Expression receiver = read();
js.Expression selector = read();
node = js.PropertyAccess(receiver, selector);
source.end(JsNodeTags.access);
break;
case JsNodeKind.parameter:
source.begin(JsNodeTags.parameter);
node = js.Parameter(source.readString());
source.end(JsNodeTags.parameter);
break;
case JsNodeKind.variableDeclaration:
source.begin(JsNodeTags.variableDeclaration);
String name = source.readString();
bool allowRename = source.readBool();
node = js.VariableDeclaration(name, allowRename: allowRename);
source.end(JsNodeTags.variableDeclaration);
break;
case JsNodeKind.thisExpression:
source.begin(JsNodeTags.thisExpression);
node = js.This();
source.end(JsNodeTags.thisExpression);
break;
case JsNodeKind.variableUse:
source.begin(JsNodeTags.variableUse);
node = js.VariableUse(source.readString());
source.end(JsNodeTags.variableUse);
break;
case JsNodeKind.postfix:
source.begin(JsNodeTags.postfix);
String op = source.readString();
js.Expression argument = read();
node = js.Postfix(op, argument);
source.end(JsNodeTags.postfix);
break;
case JsNodeKind.prefix:
source.begin(JsNodeTags.prefix);
String op = source.readString();
js.Expression argument = read();
node = js.Prefix(op, argument);
source.end(JsNodeTags.prefix);
break;
case JsNodeKind.binary:
source.begin(JsNodeTags.binary);
String op = source.readString();
js.Expression left = read();
js.Expression right = read();
node = js.Binary(op, left, right);
source.end(JsNodeTags.binary);
break;
case JsNodeKind.callExpression:
source.begin(JsNodeTags.callExpression);
js.Expression target = read();
List<js.Expression> arguments = readList();
node = js.Call(target, arguments);
source.end(JsNodeTags.callExpression);
break;
case JsNodeKind.newExpression:
source.begin(JsNodeTags.newExpression);
js.Expression cls = read();
List<js.Expression> arguments = readList();
node = js.New(cls, arguments);
source.end(JsNodeTags.newExpression);
break;
case JsNodeKind.conditional:
source.begin(JsNodeTags.conditional);
js.Expression condition = read();
js.Expression then = read();
js.Expression otherwise = read();
node = js.Conditional(condition, then, otherwise);
source.end(JsNodeTags.conditional);
break;
case JsNodeKind.variableInitialization:
source.begin(JsNodeTags.variableInitialization);
js.Declaration declaration = read();
js.Expression value = source.readValueOrNull(read);
node = js.VariableInitialization(declaration, value);
source.end(JsNodeTags.variableInitialization);
break;
case JsNodeKind.assignment:
source.begin(JsNodeTags.assignment);
js.Expression leftHandSide = read();
String op = source.readStringOrNull();
js.Expression value = read();
node = js.Assignment.compound(leftHandSide, op, value);
source.end(JsNodeTags.assignment);
break;
case JsNodeKind.variableDeclarationList:
source.begin(JsNodeTags.variableDeclarationList);
List<js.VariableInitialization> declarations = readList();
bool indentSplits = source.readBool();
node = js.VariableDeclarationList(declarations,
indentSplits: indentSplits);
source.end(JsNodeTags.variableDeclarationList);
break;
case JsNodeKind.literalExpression:
source.begin(JsNodeTags.literalExpression);
node = js.LiteralExpression(source.readString());
source.end(JsNodeTags.literalExpression);
break;
case JsNodeKind.dartYield:
source.begin(JsNodeTags.dartYield);
js.Expression expression = read();
bool hasStar = source.readBool();
node = js.DartYield(expression, hasStar);
source.end(JsNodeTags.dartYield);
break;
case JsNodeKind.literalStatement:
source.begin(JsNodeTags.literalStatement);
node = js.LiteralStatement(source.readString());
source.end(JsNodeTags.literalStatement);
break;
case JsNodeKind.labeledStatement:
source.begin(JsNodeTags.labeledStatement);
String label = source.readString();
js.Statement body = read();
node = js.LabeledStatement(label, body);
source.end(JsNodeTags.labeledStatement);
break;
case JsNodeKind.functionDeclaration:
source.begin(JsNodeTags.functionDeclaration);
js.Declaration name = read();
js.Fun function = read();
node = js.FunctionDeclaration(name, function);
source.end(JsNodeTags.functionDeclaration);
break;
case JsNodeKind.switchDefault:
source.begin(JsNodeTags.switchDefault);
js.Block body = read();
node = js.Default(body);
source.end(JsNodeTags.switchDefault);
break;
case JsNodeKind.switchCase:
source.begin(JsNodeTags.switchCase);
js.Expression expression = read();
js.Block body = read();
node = js.Case(expression, body);
source.end(JsNodeTags.switchCase);
break;
case JsNodeKind.switchStatement:
source.begin(JsNodeTags.switchStatement);
js.Expression key = read();
List<js.SwitchClause> cases = readList();
node = js.Switch(key, cases);
source.end(JsNodeTags.switchStatement);
break;
case JsNodeKind.catchClause:
source.begin(JsNodeTags.catchClause);
js.Declaration declaration = read();
js.Block body = read();
node = js.Catch(declaration, body);
source.end(JsNodeTags.catchClause);
break;
case JsNodeKind.tryStatement:
source.begin(JsNodeTags.tryStatement);
js.Block body = read();
js.Catch catchPart = source.readValueOrNull(read);
js.Block finallyPart = source.readValueOrNull(read);
node = js.Try(body, catchPart, finallyPart);
source.end(JsNodeTags.tryStatement);
break;
case JsNodeKind.throwStatement:
source.begin(JsNodeTags.throwStatement);
js.Expression expression = read();
node = js.Throw(expression);
source.end(JsNodeTags.throwStatement);
break;
case JsNodeKind.returnStatement:
source.begin(JsNodeTags.returnStatement);
js.Expression value = source.readValueOrNull(read);
node = js.Return(value);
source.end(JsNodeTags.returnStatement);
break;
case JsNodeKind.breakStatement:
source.begin(JsNodeTags.breakStatement);
String targetLabel = source.readStringOrNull();
node = js.Break(targetLabel);
source.end(JsNodeTags.breakStatement);
break;
case JsNodeKind.continueStatement:
source.begin(JsNodeTags.continueStatement);
String targetLabel = source.readStringOrNull();
node = js.Continue(targetLabel);
source.end(JsNodeTags.continueStatement);
break;
case JsNodeKind.doStatement:
source.begin(JsNodeTags.doStatement);
js.Statement body = read();
js.Expression condition = read();
node = js.Do(body, condition);
source.end(JsNodeTags.doStatement);
break;
case JsNodeKind.whileStatement:
source.begin(JsNodeTags.whileStatement);
js.Expression condition = read();
js.Statement body = read();
node = js.While(condition, body);
source.end(JsNodeTags.whileStatement);
break;
case JsNodeKind.forInStatement:
source.begin(JsNodeTags.forInStatement);
js.Expression leftHandSide = read();
js.Expression object = read();
js.Statement body = read();
node = js.ForIn(leftHandSide, object, body);
source.end(JsNodeTags.forInStatement);
break;
case JsNodeKind.forStatement:
source.begin(JsNodeTags.forStatement);
js.Expression init = read(allowNull: true);
js.Expression condition = read(allowNull: true);
js.Expression update = read(allowNull: true);
js.Statement body = read();
node = js.For(init, condition, update, body);
source.end(JsNodeTags.forStatement);
break;
case JsNodeKind.ifStatement:
source.begin(JsNodeTags.ifStatement);
js.Expression condition = read();
js.Statement then = read();
js.Statement otherwise = read();
node = js.If(condition, then, otherwise);
source.end(JsNodeTags.ifStatement);
break;
case JsNodeKind.emptyStatement:
source.begin(JsNodeTags.emptyStatement);
node = js.EmptyStatement();
source.end(JsNodeTags.emptyStatement);
break;
case JsNodeKind.expressionStatement:
source.begin(JsNodeTags.expressionStatement);
node = js.ExpressionStatement(read());
source.end(JsNodeTags.expressionStatement);
break;
case JsNodeKind.block:
source.begin(JsNodeTags.block);
List<js.Statement> statements = readList();
node = js.Block(statements);
source.end(JsNodeTags.block);
break;
case JsNodeKind.program:
source.begin(JsNodeTags.program);
List<js.Statement> body = readList();
node = js.Program(body);
source.end(JsNodeTags.program);
break;
case JsNodeKind.stringReference:
source.begin(JsNodeTags.stringReference);
node = StringReference.readFromDataSource(source);
source.end(JsNodeTags.stringReference);
break;
case JsNodeKind.typeReference:
source.begin(JsNodeTags.typeReference);
node = TypeReference.readFromDataSource(source);
source.end(JsNodeTags.typeReference);
break;
case JsNodeKind.deferredHolderExpression:
source.begin(JsNodeTags.deferredHolderExpression);
node = DeferredHolderExpression.readFromDataSource(source);
source.end(JsNodeTags.deferredHolderExpression);
break;
}
SourceInformation sourceInformation =
source.readCached<SourceInformation>(() {
return SourceInformation.readFromDataSource(source);
});
if (sourceInformation != null) {
node = node.withSourceInformation(sourceInformation);
}
return node;
}