in Public/Src/FrontEnd/Script/Ast/Node.Persistence.cs [45:289]
public static Node Read(DeserializationContext context)
{
var reader = context.Reader;
var kind = (SyntaxKind)reader.ReadInt32Compact();
// Empty node is special, because if the node is missing the only information that is stored in the stream is Kind and no location.
if (kind == SyntaxKind.None)
{
return null;
}
var location = LineInfo.Read(context.LineMap, reader);
switch (kind)
{
case SyntaxKind.SourceFile:
return new SourceFile(context, location);
case SyntaxKind.EnumMember:
return new EnumMemberDeclaration(context, location);
case SyntaxKind.Parameter:
return new Parameter(context, location);
case SyntaxKind.TypeParameter:
return new TypeParameter(context, location);
case SyntaxKind.ApplyExpression:
return new NonGenericApplyExpression(context, location);
case SyntaxKind.ApplyExpressionWithTypeArguments:
return new ApplyExpressionWithTypeArguments(context, location);
case SyntaxKind.ArrayExpression:
return new ArrayExpression(context, location);
case SyntaxKind.BinaryExpression:
return new BinaryExpression(context, location);
case SyntaxKind.FullNameBasedSymbolReference:
return new FullNameBasedSymbolReference(context, location);
case SyntaxKind.ModuleReferenceExpression:
return new ModuleReferenceExpression(context, location);
case SyntaxKind.NameBasedSymbolReference:
return new NameBasedSymbolReference(context, location);
case SyntaxKind.LocalReferenceExpression:
return new LocalReferenceExpression(context, location);
case SyntaxKind.LocationBasedSymbolReference:
return new LocationBasedSymbolReference(context, location);
case SyntaxKind.ModuleIdExpression:
return new ModuleIdExpression(context, location);
case SyntaxKind.WithQualifierExpression:
return new WithQualifierExpression(context, location);
case SyntaxKind.QualifierReferenceExpression:
return new QualifierReferenceExpression(location);
case SyntaxKind.CoerceQualifierTypeExpression:
return new CoerceQualifierTypeExpression(context, location);
case SyntaxKind.IndexExpression:
return new IndexExpression(context, location);
case SyntaxKind.IteExpression:
return new ConditionalExpression(context, location);
case SyntaxKind.SwitchExpression:
return new SwitchExpression(context, location);
case SyntaxKind.SwitchExpressionClause:
return new SwitchExpressionClause(context, location);
case SyntaxKind.LambdaExpression:
return new FunctionLikeExpression(context, location);
case SyntaxKind.SelectorExpression:
return new SelectorExpression(context, location);
case SyntaxKind.ResolvedSelectorExpression:
return new ResolvedSelectorExpression(context, location);
case SyntaxKind.ModuleSelectorExpression:
return new ModuleSelectorExpression(context, location);
case SyntaxKind.UnaryExpression:
return new UnaryExpression(context, location);
case SyntaxKind.PropertyAssignment:
return new PropertyAssignment(context, location);
case SyntaxKind.AssignmentExpression:
return new AssignmentExpression(context, location);
case SyntaxKind.IncrementDecrementExpression:
return new IncrementDecrementExpression(context, location);
case SyntaxKind.CastExpression:
return new CastExpression(context, location);
case SyntaxKind.ImportAliasExpression:
return new ImportAliasExpression(context, location);
case SyntaxKind.ModuleToObjectLiteral:
return new ModuleToObjectLiteral(context, location);
case SyntaxKind.PathLiteral:
return new PathLiteral(context, location);
case SyntaxKind.InterpolatedPaths:
return new InterpolatedPaths(context, location);
case SyntaxKind.FileLiteral:
return new FileLiteral(context, location);
case SyntaxKind.FileLiteralExpression:
return new FileLiteralExpression(context, location);
case SyntaxKind.StringLiteralExpression:
return new StringLiteralExpression(context, location);
case SyntaxKind.DirectoryLiteral:
return new DirectoryLiteralExpression(context, location);
case SyntaxKind.PathAtomLiteral:
return new PathAtomLiteral(context, location);
case SyntaxKind.RelativePathLiteral:
return new RelativePathLiteral(context, location);
case SyntaxKind.StringLiteral:
return new StringLiteral(reader, location);
case SyntaxKind.BoolLiteral:
return new BoolLiteral(context, location);
case SyntaxKind.NumberLiteral:
return new NumberLiteral(reader, location);
case SyntaxKind.UndefinedLiteral:
return UndefinedLiteral.Instance;
case SyntaxKind.ResolvedStringLiteral:
return new ResolvedStringLiteral(context, location);
case SyntaxKind.ImportDeclaration:
return new ImportDeclaration(context, location);
case SyntaxKind.ExportDeclaration:
return new ExportDeclaration(context, location);
case SyntaxKind.VarDeclaration:
return new VarDeclaration(context, location);
case SyntaxKind.BlockStatement:
return new BlockStatement(context, location);
case SyntaxKind.BreakStatement:
return new BreakStatement(location);
case SyntaxKind.ContinueStatement:
return new ContinueStatement(location);
case SyntaxKind.CaseClause:
return new CaseClause(context, location);
case SyntaxKind.DefaultClause:
return new DefaultClause(context, location);
case SyntaxKind.ExpressionStatement:
return new ExpressionStatement(context, location);
case SyntaxKind.IfStatement:
return new IfStatement(context, location);
case SyntaxKind.ReturnStatement:
return new ReturnStatement(context, location);
case SyntaxKind.SwitchStatement:
return new SwitchStatement(context, location);
case SyntaxKind.VarStatement:
return new VarStatement(context, location);
case SyntaxKind.ForStatement:
return new ForStatement(context, location);
case SyntaxKind.ForOfStatement:
return new ForOfStatement(context, location);
case SyntaxKind.WhileStatement:
return new WhileStatement(context, location);
case SyntaxKind.ArrayType:
return new ArrayType(context, location);
case SyntaxKind.FunctionType:
return new FunctionType(context, location);
case SyntaxKind.NamedTypeReference:
return new NamedTypeReference(context, location);
case SyntaxKind.ObjectType:
return new ObjectType(context, location);
case SyntaxKind.PredefinedType:
return new PrimitiveType(context, location);
case SyntaxKind.TupleType:
return new TupleType(context, location);
case SyntaxKind.UnionType:
return new UnionType(context, location);
case SyntaxKind.TypeQuery:
return new TypeQuery(context, location);
case SyntaxKind.PropertySignature:
return new PropertySignature(context, location);
case SyntaxKind.CallSignature:
return new CallSignature(context, location);
case SyntaxKind.TypeOrNamespaceModuleLiteral:
return TypeOrNamespaceModuleLiteral.Deserialize(context, location);
case SyntaxKind.ObjectLiteral0:
case SyntaxKind.ObjectLiteralN:
case SyntaxKind.ObjectLiteralSlim:
return ObjectLiteral.Create(context, location);
case SyntaxKind.ArrayLiteral:
return ArrayLiteral.Create(context, location);
case SyntaxKind.ArrayLiteralWithSpreads:
return new ArrayLiteralWithSpreads(context, location);
// Serialization is not needed for configurations.
case SyntaxKind.ConfigurationDeclaration:
return new ConfigurationDeclaration(context, location);
case SyntaxKind.PackageDeclaration:
return new PackageDeclaration(context, location);
// Types are not used at runtime, so we can skip these if their serialization becomes troublesome
case SyntaxKind.InterfaceDeclaration:
return new InterfaceDeclaration(context, location);
case SyntaxKind.ModuleDeclaration:
return new ModuleDeclaration(context, location);
case SyntaxKind.NamespaceImport:
return new NamespaceImport(context, location);
case SyntaxKind.NamespaceAsVarImport:
return new NamespaceAsVarImport(context, location);
case SyntaxKind.ImportOrExportModuleSpecifier:
return new ImportOrExportModuleSpecifier(context, location);
case SyntaxKind.ImportOrExportVarSpecifier:
return new ImportOrExportVarSpecifier(context, location);
case SyntaxKind.NamedImportsOrExports:
return new NamedImportsOrExports(context, location);
case SyntaxKind.ImportOrExportClause:
return new ImportOrExportClause(context, location);
case SyntaxKind.TypeAliasDeclaration:
return new TypeAliasDeclaration(context, location);
// Enum declarations are represented as TypeOrNamespace instances at runtime
case SyntaxKind.EnumDeclaration:
return new EnumDeclaration(context, location);
// Enum members are stored as constants.
case SyntaxKind.EnumMemberDeclaration:
return new EnumMemberDeclaration(context, location);
// LambdaExpressions are serialized instead.
case SyntaxKind.FunctionDeclaration:
return new FunctionDeclaration(context, location);
// Supported only in V1 and V1 modules are not serializable.
case SyntaxKind.QualifierSpaceDeclaration:
return new QualifierSpaceDeclaration(context, location);
// Serialized separately
case SyntaxKind.FileModuleLiteral:
// Prelude is not serializable
case SyntaxKind.GlobalModuleLiteral:
// Closures are not serializable, only LambdaExpressions are
case SyntaxKind.Closure:
case SyntaxKind.Function0:
case SyntaxKind.Function1:
case SyntaxKind.Function2:
case SyntaxKind.FunctionN:
case SyntaxKind.BoundFunction:
// Not serializable.
case SyntaxKind.ImportValue:
// Not serializable.
case SyntaxKind.MergeModuleValue:
case SyntaxKind.ImportExpression:
case SyntaxKind.QualifiedLocationBasedSymbolReference:
case SyntaxKind.ObjectLiteralOverride:
// Added for completeness
case SyntaxKind.None:
break;
// We will hit this exception if we are missing one value from the enum
default:
throw new BuildXLException(I($"Unable to deserialize syntax kind {kind.ToString()}"));
}
string message = I($"The node {kind} is not deserializable yet.");
throw new InvalidOperationException(message);
}