private static string GetText(string indexName, IndexDefinition indexDefinition) { var usings = RoslynHelper.CreateUsings(Usings); // Create a IndexName get property PropertyDeclarationSyntax indexNameProperty = PropertyDeclaration(PredefinedType(Token(TriviaList(), SyntaxKind.StringKeyword, TriviaList(Space))), Identifier(TriviaList(), IndexName, TriviaList(Space))) .WithModifiers(TokenList(Token(TriviaList(Tab), SyntaxKind.PublicKeyword, TriviaList(Space)), Token(TriviaList(), SyntaxKind.OverrideKeyword, TriviaList(Space)))) .WithExpressionBody(ArrowExpressionClause( LiteralExpression(SyntaxKind.StringLiteralExpression, Literal($"{indexName}"))) .WithArrowToken(Token(TriviaList(), SyntaxKind.EqualsGreaterThanToken, TriviaList(Space)))) .WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(LineFeed, LineFeed))); MethodDeclarationSyntax createIndexDefinition = MethodDeclaration(IdentifierName(Identifier(TriviaList(), "IndexDefinition", TriviaList(Space))), Identifier(CreateIndexDefinition)) .WithModifiers(TokenList(Token(TriviaList(Tab), SyntaxKind.PublicKeyword, TriviaList(Space)), Token(TriviaList(), SyntaxKind.OverrideKeyword, TriviaList(Space)))) .WithParameterList(ParameterList().WithCloseParenToken(Token(TriviaList(), SyntaxKind.CloseParenToken, TriviaList(LineFeed)))) .WithBody(Block( SingletonList <StatementSyntax>(ReturnStatement( ObjectCreationExpression(IdentifierName(Identifier(TriviaList(), "IndexDefinition", TriviaList(LineFeed)))) .WithNewKeyword(Token(TriviaList(), SyntaxKind.NewKeyword, TriviaList(Space))) .WithInitializer(InitializerExpression(SyntaxKind.ObjectInitializerExpression, SeparatedList <ExpressionSyntax>(ParsingIndexDefinitionFields(indexDefinition))) .WithOpenBraceToken(Token(TriviaList(Tab, Tab), SyntaxKind.OpenBraceToken, TriviaList(LineFeed))) .WithCloseBraceToken(Token(TriviaList(LineFeed, Tab, Tab), SyntaxKind.CloseBraceToken, TriviaList())))) .WithReturnKeyword(Token(TriviaList(Tab, Tab), SyntaxKind.ReturnKeyword, TriviaList(Space))) .WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(LineFeed))))) .WithOpenBraceToken(Token(TriviaList(Tab), SyntaxKind.OpenBraceToken, TriviaList(LineFeed))) .WithCloseBraceToken(Token(TriviaList(Tab), SyntaxKind.CloseBraceToken, TriviaList(LineFeed)))); ClassDeclarationSyntax c = ClassDeclaration(Identifier(TriviaList(), GetCSharpSafeName(indexName), TriviaList(Space))) .AddModifiers(Token(TriviaList(LineFeed, LineFeed), SyntaxKind.PublicKeyword, TriviaList(Space))) .WithKeyword(Token(TriviaList(), SyntaxKind.ClassKeyword, TriviaList(Space))) .AddBaseListTypes(SimpleBaseType(IdentifierName(Identifier(TriviaList(), "AbstractIndexCreationTask", TriviaList(LineFeed))))) .WithOpenBraceToken(Token(TriviaList(), SyntaxKind.OpenBraceToken, TriviaList(LineFeed))) .WithMembers(List(new List <MemberDeclarationSyntax> { indexNameProperty, createIndexDefinition })); CompilationUnitSyntax cu = CompilationUnit() .WithUsings(usings) .NormalizeWhitespace() .AddMembers(c); SyntaxNode formattedCompilationUnit; using (var workspace = new AdhocWorkspace()) { formattedCompilationUnit = Formatter.Format(cu, workspace); } return(formattedCompilationUnit.ToFullString()); }
private static string GetText(MemberDeclarationSyntax indexClassDefinition) { StringBuilder sb = new StringBuilder(); var u = RoslynHelper.CreateUsings(Usings); u.ForEach(item => sb.Append($"{item.NormalizeWhitespace()}{Environment.NewLine}")); sb.Append(Environment.NewLine); sb.Append(indexClassDefinition.NormalizeWhitespace().ToFullString()); return(sb.ToString()); }
private static CompilationResult CompileInternal(string originalName, string cSharpSafeName, MemberDeclarationSyntax @class, IndexDefinition definition) { var name = cSharpSafeName + "." + Guid.NewGuid() + IndexExtension; var @namespace = RoslynHelper.CreateNamespace(IndexNamespace) .WithMembers(SyntaxFactory.SingletonList(@class)); var res = GetUsingDirectiveAndSyntaxTreesAndReferences(definition); var compilationUnit = SyntaxFactory.CompilationUnit() .WithUsings(RoslynHelper.CreateUsings(res.UsingDirectiveSyntaxes)) .WithMembers(SyntaxFactory.SingletonList <MemberDeclarationSyntax>(@namespace)) .NormalizeWhitespace(); SyntaxNode formattedCompilationUnit; using (var workspace = new AdhocWorkspace()) { formattedCompilationUnit = Formatter.Format(compilationUnit, workspace); } string sourceFile = null; if (EnableDebugging) { sourceFile = Path.Combine(Path.GetTempPath(), name + ".cs"); File.WriteAllText(sourceFile, formattedCompilationUnit.ToFullString(), Encoding.UTF8); } var st = EnableDebugging ? SyntaxFactory.ParseSyntaxTree(File.ReadAllText(sourceFile), path: sourceFile, encoding: Encoding.UTF8) : SyntaxFactory.ParseSyntaxTree(formattedCompilationUnit.ToFullString()); res.SyntaxTrees.Add(st); var compilation = CSharpCompilation.Create( assemblyName: name, syntaxTrees: res.SyntaxTrees, references: res.References, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithOptimizationLevel(EnableDebugging ? OptimizationLevel.Debug : OptimizationLevel.Release) ); var code = formattedCompilationUnit.SyntaxTree.ToString(); var asm = new MemoryStream(); var pdb = EnableDebugging ? new MemoryStream() : null; var result = compilation.Emit(asm, pdb, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb)); if (result.Success == false) { IEnumerable <Diagnostic> failures = result.Diagnostics .Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error); var sb = new StringBuilder(); sb.AppendLine($"Failed to compile index {originalName}"); sb.AppendLine(); sb.AppendLine(code); sb.AppendLine(); foreach (var diagnostic in failures) { sb.AppendLine(diagnostic.ToString()); } throw new IndexCompilationException(sb.ToString()); } asm.Position = 0; Assembly assembly; if (EnableDebugging) { pdb.Position = 0; assembly = AssemblyLoadContext.Default.LoadFromStream(asm, pdb); } else { assembly = AssemblyLoadContext.Default.LoadFromStream(asm); } return(new CompilationResult { Code = code, Type = assembly.GetType($"{IndexNamespace}.{cSharpSafeName}") }); }