internal void GenerateCode(INamedTypeSymbol entryPoint) { var context = new CompilationContext(); context.MainAssembly = entryPoint.ContainingAssembly; context.LibraryAssembly = entryPoint.BaseType.ContainingAssembly; context.Uglify = false; foreach (var declaration in this.classDictionary.Values) { context.MakeUglified(declaration.Symbol); if (declaration.Symbol is INamedTypeSymbol typeSymbol) { bool hasAnythingButFields = false; foreach (var member in typeSymbol.GetMembers()) { context.MakeUglified(member); if (member is IMethodSymbol methodSymbol) { if (methodSymbol.DeclaringSyntaxReferences.Length > 0) { hasAnythingButFields = true; } else { // Auto-generated. } } else if (!(member is IFieldSymbol)) { hasAnythingButFields = true; } } if ((typeSymbol.TypeKind == TypeKind.Class) && !hasAnythingButFields) { context.MarkAsAnonymous(declaration.Symbol); } } if (declaration.Declaration is ClassDeclarationSyntax classDeclarationSyntax) { foreach (var local in classDeclarationSyntax.DescendantNodes().OfType <VariableDeclaratorSyntax>()) { var symbol = declaration.SemanticModel.GetDeclaredSymbol(local); context.MakeUglified(symbol); } } } var entry = this.classDictionary[GetFullName(entryPoint)]; this.mainText.Append(@"import(""queue.fibonacci_heap"", ""FibonacciHeap"", 2);"); if (!context.Uglify) { this.mainText.AppendLine(); } GenerateInfo(entryPoint, context); foreach (var declaration in this.classDictionary.Values) { NodeWriter writer = new NodeWriter(declaration.SemanticModel, mainText, context); if (declaration.Declaration is EnumDeclarationSyntax enumDeclarationSyntax) { writer.Write(enumDeclarationSyntax, declaration.Symbol); } } foreach (var declaration in this.classDictionary.Values) { NodeWriter writer = new NodeWriter(declaration.SemanticModel, mainText, context); if (declaration.Declaration is ClassDeclarationSyntax classDeclarationSyntax) { writer.Write(classDeclarationSyntax, declaration.Symbol); } } context.AddToScript(mainText); var entryNs = Utilities.GetValue(entryPoint.ContainingNamespace, true); if (!string.IsNullOrEmpty(entryNs)) { mainText.Append($"class {entryPoint.Name} extends {entryNs}.{entryPoint.Name}{{}}"); } }
private void GenerateInfo(INamedTypeSymbol entryPoint, CompilationContext context) { string author = entryPoint.Name; string name = entryPoint.Name; string shortName = (entryPoint.Name + "____").Substring(0, 4); string description = string.Empty; int version = 1; int? minVersionToLoad = null; string date = DateTime.Now.ToString("yyyy-MM-dd"); bool? useAsRandomAi = null; string apiVersion = "1.8"; string url = null; foreach (var attribute in entryPoint.GetAttributes()) { if (Is(attribute.AttributeClass, AuthorAttibuteType)) { author = (string)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, NameAttributeType)) { name = (string)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, ShortNameAttributeType)) { shortName = (string)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, DescriptionAttributeType)) { description = (string)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, VersionAttributeType)) { version = (int)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, MinVersionToLoadAttributeType)) { minVersionToLoad = (int)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, DateAttributeType)) { date = (string)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, UseAsRandomAIAttributeType)) { useAsRandomAi = (bool)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, APIVersionAttributeType)) { apiVersion = (string)attribute.ConstructorArguments[0].Value; } else if (Is(attribute.AttributeClass, URLAttributeType)) { url = (string)attribute.ConstructorArguments[0].Value; } else { Debug.WriteLine("Unknown attribute: " + attribute.AttributeClass.Name); } } if ((shortName == null) || (shortName.Length != 4)) { throw new InvalidOperationException("ShortName must be 4 characters."); } infoText.AppendFormat("class {0} extends AIInfo", entryPoint.Name); infoText.Append("{"); string instanceName = context.GetName(entryPoint, entryPoint.Name); infoText.AppendFormat("function CreateInstance(){{return{0};}}", Utilities.WriteLiteral(instanceName, true)); infoText.AppendFormat("function GetAuthor(){{return{0};}}", Utilities.WriteLiteral(author, true)); infoText.AppendFormat("function GetName(){{return{0};}}", Utilities.WriteLiteral(name, true)); infoText.AppendFormat("function GetShortName(){{return{0};}}", Utilities.WriteLiteral(shortName, true)); infoText.AppendFormat("function GetDescription(){{return{0};}}", Utilities.WriteLiteral(description, true)); infoText.AppendFormat("function GetVersion(){{return{0};}}", Utilities.WriteLiteral(version, true)); if (minVersionToLoad.HasValue) { infoText.AppendFormat("function MinVersionToLoad(){{return{0};}}", Utilities.WriteLiteral(minVersionToLoad.Value)); } if (date != null) { infoText.AppendFormat("function GetDate(){{return{0};}}", Utilities.WriteLiteral(date)); } if (useAsRandomAi.HasValue) { infoText.AppendFormat("function UseAsRandomAI(){{return{0};}}", Utilities.WriteLiteral(useAsRandomAi.Value)); } if (apiVersion != null) { infoText.AppendFormat("function GetAPIVersion(){{return{0};}}", Utilities.WriteLiteral(apiVersion)); } if (url != null) { infoText.AppendFormat("function GetURL(){{return{0};}}", Utilities.WriteLiteral(url)); } infoText.Append("}RegisterAI("); infoText.Append(entryPoint.Name); infoText.Append("());"); }