示例#1
0
        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);
                }
            }
        }
示例#2
0
 /// <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}"),
     });
示例#3
0
        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));
        }
示例#4
0
 public UnionBranch(byte discriminator, RecordDefinition definition)
 {
     Discriminator = discriminator;
     Definition    = definition;
 }
示例#5
0
 public DuplicateOpcodeException(RecordDefinition definition)
     : base($"Multiple definitions for opcode '{definition.OpcodeAttribute?.Value}'", definition.Span, 110)
 {
 }
示例#6
0
 public FieldReference( RecordDefinition def, string field )
 {
     this.record = def;
     this.field = field;
 }