private void EmitEnum(TransportModelEnum enumModel, ICodeStream output) { var outputFile = (CodeFileCSharp)output.CreateCodeFile($"{CsEmitterHelper.GetCSharpModelShortName(enumModel, ModelType.Transport)}.cs"); var unit = CompilationUnit(); unit = unit.AddUsings( UsingDirective(ParseName(nameof(System)))); var enumDeclaration = EnumDeclaration(CsEmitterHelper.GetCSharpModelShortName(enumModel, ModelType.Transport)); enumDeclaration = enumDeclaration.AddModifiers(Token(SyntaxKind.PublicKeyword)); enumDeclaration = enumDeclaration.WithMembers(SeparatedList <EnumMemberDeclarationSyntax>(enumModel.Members.Values.Select(EmitEnumMember))); if (enumModel.IsFlags) { enumDeclaration = enumDeclaration.WithAttributeLists( List <AttributeListSyntax>( new[] { AttributeList( SingletonSeparatedList <AttributeSyntax>( Attribute( IdentifierName(typeof(System.FlagsAttribute).FullName)))) })); } var nsContainer = NamespaceDeclaration(ParseName(this.settings.CsTransportModelNamespace)); nsContainer = nsContainer.AddMembers(enumDeclaration); unit = unit.AddMembers(nsContainer); outputFile.SyntaxTree = unit.SyntaxTree; }
public StatementSyntax EmitForEntity(TransportModelEntity entity, TransportModelEnum syntaxKindEnum) { var discriminant = entity.TsDiscriminant as TransportModelEntityTsDiscriminantSyntaxKind; var recognizedNodeVarName = "concreteNode"; var block = Block(); List <ArgumentSyntax> constructorArguments = new List <ArgumentSyntax>(); block = block.AddStatements( LocalDeclarationStatement( VariableDeclaration( ParseTypeName("var"), SeparatedList <VariableDeclaratorSyntax>(new[] { VariableDeclarator(recognizedNodeVarName) .WithInitializer(EqualsValueClause(CastExpression(ParseTypeName(CsEmitterHelper.GetCSharpModelFullyQualifiedName(entity, this.settings, ModelType.Transport)), IdentifierName(this.nodeParameterName)))) }))) ); foreach (var member in CsEmitterHelper.GetMembers(entity)) { if (member.Key != "kind") { if (CsEmitterHelper.IsNode(member.Value.Type)) { if (member.Value.Type.IsCollection) { constructorArguments.Add( Argument( InvocationExpression( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), GenericName( Identifier(this.convertFromNodeCollectionMethodName), TypeArgumentList(SeparatedList <TypeSyntax>(new[] { ParseTypeName(CsEmitterHelper.GetCSharpModelFullyQualifiedName(((ITransportModelTypeReferenceTransportModelItem <TransportModelItem>)member.Value.Type).TransportModelItem, this.settings, ModelType.Ast)) })))), ArgumentList(SeparatedList <ArgumentSyntax>(new[] { Argument( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName(recognizedNodeVarName), IdentifierName(NameHelper.GetSafeVariableName(member.Key)))) }))) )); } else { constructorArguments.Add( Argument( CastExpression( ParseTypeName(CsEmitterHelper.GetAstModelPropertyTypeName(member.Value, this.settings, true)), InvocationExpression( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(this.convertFromNodeMethodName)), ArgumentList(SeparatedList <ArgumentSyntax>(new[] { Argument( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName(recognizedNodeVarName), IdentifierName(NameHelper.GetSafeVariableName(member.Key)))) }))) ) )); } } else { constructorArguments.Add( Argument( CastExpression( ParseTypeName(CsEmitterHelper.GetAstModelPropertyTypeName(member.Value, this.settings, true)), MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName(recognizedNodeVarName), IdentifierName(NameHelper.GetSafeVariableName(member.Key)))))); } } } block = block.AddStatements( LocalDeclarationStatement( VariableDeclaration( ParseTypeName("var"), SeparatedList <VariableDeclaratorSyntax>(new[] { VariableDeclarator("result") .WithInitializer( EqualsValueClause( ObjectCreationExpression(ParseTypeName(CsEmitterHelper.GetCSharpModelFullyQualifiedName(entity, this.settings, ModelType.Ast))) .WithArgumentList(ArgumentList(SeparatedList <ArgumentSyntax>(constructorArguments))))) })) )); block = block.AddStatements(ReturnStatement(IdentifierName("result"))); var result = IfStatement( BinaryExpression( SyntaxKind.EqualsExpression, MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(this.nodeParameterName), IdentifierName("kind")), MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName(CsEmitterHelper.GetCSharpModelFullyQualifiedName(syntaxKindEnum, this.settings, ModelType.Transport)), IdentifierName(discriminant.SyntaxKindValueName))), block); return(result); }