private static IEnumerable <MemberDeclarationSyntax> GetGeneratedNodes(RecordDefinition def) { yield return(CSharpSyntaxTree.ParseText( @" private NotifyRecord _value; ") .GetRoot().ChildNodes() .OfType <MemberDeclarationSyntax>() .First() .WithTrailingTrivia(CarriageReturnLineFeed, CarriageReturnLineFeed) .WithAdditionalAnnotations(Formatter.Annotation) ); foreach (var p in def.Properties) { foreach (var s in WithTrivia(GetGeneratedMember(p), p.LeadingTrivia, p.TrailingTrivia)) { yield return(s); } } foreach (var p in def.DependentProperties) { foreach (var s in WithTrivia(GetGeneratedMember(p), p.LeadingTrivia, p.TrailingTrivia)) { yield return(s); } } }
/// <summary> /// Generate the body of the <c>encode</c> function for the given <see cref="RecordDefinition"/>. /// </summary> /// <param name="definition">The definition to generate code for.</param> /// <returns>The generated CPlusPlus <c>encode</c> function body.</returns> public string CompileEncode(RecordDefinition definition) { return(definition switch { MessageDefinition d => CompileEncodeMessage(d), StructDefinition d => CompileEncodeStruct(d), UnionDefinition d => CompileEncodeUnion(d), _ => throw new InvalidOperationException($"invalid CompileEncode kind: {definition}"), });
private static async Task <CompilationUnitSyntax> GeneratePartialDeclaration(Document document, ClassDeclarationSyntax classDecl, bool isCharp6, CancellationToken cancellationToken) { var strDecl = (StructDeclarationSyntax)classDecl.ChildNodes().First(x => x is StructDeclarationSyntax); var semanticModel = await document.GetSemanticModelAsync(cancellationToken); var ti = semanticModel.GetTypeInfo(strDecl); var opt = new CodeGenerationOptions(isCharp6); var def = new RecordDefinition(strDecl, opt); var generatedNodes = GetGeneratedNodes(def).ToArray(); var newClassDecl = classDecl.GetPartialTypeDelaration() .AddMembers(generatedNodes) .WithAdditionalAnnotations(Formatter.Annotation); var ns = classDecl.FirstAncestorOrSelf <NamespaceDeclarationSyntax>()?.Name.WithoutTrivia().GetText().ToString(); MemberDeclarationSyntax topDecl; if (ns != null) { topDecl = NamespaceDeclaration(IdentifierName(ns)) .AddMembers(newClassDecl) .WithAdditionalAnnotations(Formatter.Annotation); } else { topDecl = newClassDecl; } var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false) as CompilationUnitSyntax; return(CompilationUnit().AddUsings(WithComponentModel(root.Usings)) .AddMembers(topDecl) .WithTrailingTrivia(CarriageReturnLineFeed) .WithAdditionalAnnotations(Formatter.Annotation)); }
public UnionBranch(byte discriminator, RecordDefinition definition) { Discriminator = discriminator; Definition = definition; }
public DuplicateOpcodeException(RecordDefinition definition) : base($"Multiple definitions for opcode '{definition.OpcodeAttribute?.Value}'", definition.Span, 110) { }
public FieldReference( RecordDefinition def, string field ) { this.record = def; this.field = field; }