protected virtual Emitter CreateEmitter(IMemberResolver resolver) { this.Log.Info("Creating emitter..."); var emitter = new Emitter(this.TypeDefinitions, this.BridgeTypes, this.Types, this.Validator, resolver, this.TypeInfoDefinitions, this.Log); this.Log.Info("Creating emitter done"); return emitter; }
public virtual string GetDefinitionName(IEmitter emitter, IMemberDefinition member, bool preserveMemberCase = false) { if (!preserveMemberCase) { preserveMemberCase = !this.IsNativeMember(member.FullName) ? this.AssemblyInfo.PreserveMemberCase : false; if (member is FieldDefinition && ((FieldDefinition)member).HasConstant && !member.DeclaringType.IsEnum) { preserveMemberCase = true; } } string attrName = Bridge.Translator.Translator.Bridge_ASSEMBLY + ".NameAttribute"; var attr = Helpers.GetInheritedAttribute(emitter, member, attrName); bool isIgnore = this.Validator.IsIgnoreType(member.DeclaringType); string name = member.Name; bool isStatic = false; if (member is MethodDefinition) { var method = (MethodDefinition)member; isStatic = method.IsStatic; if (method.IsConstructor) { name = "constructor"; } } else if (member is FieldDefinition) { isStatic = ((FieldDefinition)member).IsStatic; } else if (member is PropertyDefinition) { var prop = (PropertyDefinition)member; var accessor = prop.GetMethod ?? prop.SetMethod; isStatic = prop.GetMethod != null ? prop.GetMethod.IsStatic : false; } else if (member is EventDefinition) { var ev = (EventDefinition)member; isStatic = ev.AddMethod != null ? ev.AddMethod.IsStatic : false; } if (attr != null) { var value = attr.ConstructorArguments.First().Value; if (value is string) { name = value.ToString(); if (!isIgnore && ((isStatic && Emitter.IsReservedStaticName(name)) || Helpers.IsReservedWord(name))) { name = Helpers.ChangeReservedWord(name); } return(name); } preserveMemberCase = !(bool)value; } if (name.Contains(".")) { name = Object.Net.Utilities.StringUtils.RightOfRightmostOf(name, '.'); } name = preserveMemberCase ? name : Object.Net.Utilities.StringUtils.ToLowerCamelCase(name); if (!isIgnore && ((isStatic && Emitter.IsReservedStaticName(name)) || Helpers.IsReservedWord(name))) { name = Helpers.ChangeReservedWord(name); } return(name); }
protected void EmitGeneratorBlock() { this.BeginBlock(); var args = this.Parameters; if (!IsEnumeratorReturn) { this.WriteReturn(true); this.Write("new "); if (this.ReturnType.IsParameterized) { this.Write("(Bridge.GeneratorEnumerable$1(" + BridgeTypes.ToJsName(this.ReturnType.TypeArguments[0], this.Emitter) + "))"); } else { this.Write("Bridge.GeneratorEnumerable"); } this.WriteOpenParentheses(); this.Write(JS.Funcs.BRIDGE_BIND + "(this, "); this.WriteFunction(); if (args.Count > 0) { this.WriteOpenParentheses(); for (int i = 0; i < args.Count; i++) { this.Write(args[i]); if (i < args.Count - 1) { this.Write(", "); } } this.WriteCloseParentheses(); } else { this.WriteOpenCloseParentheses(true); } this.WriteSpace(); this.BeginBlock(); } this.WriteVar(true); this.Write(JS.Vars.ASYNC_STEP + " = 0"); this.Emitter.Comma = true; this.Indent(); // This is required to add async variables into Emitter.AsyncVariables and emit them prior to body IWriterInfo writerInfo = this.SaveWriter(); StringBuilder body = this.NewWriter(); Emitter.ResetLevel(writerInfo.Level - 1); this.EmitGeneratorBody(); this.RestoreWriter(writerInfo); foreach (var localVar in this.Emitter.AsyncVariables) { this.EnsureComma(true); this.Write(localVar); this.Emitter.Comma = true; } this.Emitter.Comma = false; this.WriteSemiColon(); this.Outdent(); this.WriteNewLine(); this.WriteNewLine(); this.WriteVar(true); this.Write(JS.Vars.ENUMERATOR + " = new "); if (this.ReturnType.IsParameterized) { this.Write("(" + JS.Types.Bridge.Generator.NAME_GENERIC + "(" + BridgeTypes.ToJsName(this.ReturnType.TypeArguments[0], this.Emitter) + "))"); } else { this.Write(JS.Types.Bridge.Generator.NAME); } this.WriteOpenParentheses(); this.Write(JS.Funcs.BRIDGE_BIND + "(this, "); this.WriteFunction(); this.WriteOpenCloseParentheses(true); this.Write(body); this.WriteCloseParentheses(); this.EmitFinallyHandler(); this.WriteCloseParentheses(); this.WriteSemiColon(); this.WriteNewLine(); this.WriteReturn(true); this.Write(JS.Vars.ENUMERATOR); this.WriteSemiColon(); this.WriteNewLine(); if (!IsEnumeratorReturn) { this.EndBlock(); if (args.Count > 0) { this.Write(", arguments"); } this.WriteCloseParentheses(); this.WriteCloseParentheses(); this.WriteSemiColon(); this.WriteNewLine(); } this.EndBlock(); }
public Dictionary <string, string> Translate() { var logger = this.Log; logger.Info("Translating..."); this.LogProductInfo(); var config = this.AssemblyInfo; if (this.FolderMode) { this.ReadFolderFiles(); } else { this.ReadProjectFile(); if (this.Rebuild || !File.Exists(this.AssemblyLocation)) { this.BuildAssembly(); } } var references = this.InspectReferences(); this.References = references; this.Plugins = Bridge.Translator.Plugins.GetPlugins(this, config, logger); logger.Info("Reading plugin configs..."); this.Plugins.OnConfigRead(config); logger.Info("Reading plugin configs done"); if (!string.IsNullOrWhiteSpace(config.BeforeBuild)) { try { logger.Info("Running BeforeBuild event " + config.BeforeBuild + " ..."); this.RunEvent(config.BeforeBuild); logger.Info("Running BeforeBuild event done"); } catch (System.Exception exc) { var message = "Error: Unable to run beforeBuild event command: " + exc.Message + "\nStack trace:\n" + exc.StackTrace; logger.Error("Exception occurred. Message: " + message); throw new Bridge.Translator.TranslatorException(message); } } this.BuildSyntaxTree(); var resolver = new MemberResolver(this.ParsedSourceFiles, Emitter.ToAssemblyReferences(references, logger)); resolver = this.Preconvert(resolver); this.InspectTypes(resolver, config); resolver.CanFreeze = true; var emitter = this.CreateEmitter(resolver); if (!this.AssemblyInfo.OverflowMode.HasValue) { this.AssemblyInfo.OverflowMode = this.OverflowMode; } emitter.Translator = this; emitter.AssemblyInfo = this.AssemblyInfo; emitter.References = references; emitter.SourceFiles = this.SourceFiles; emitter.Log = this.Log; emitter.Plugins = this.Plugins; emitter.InitialLevel = 1; this.SortReferences(); logger.Info("Before emitting..."); this.Plugins.BeforeEmit(emitter, this); logger.Info("Before emitting done"); this.Outputs = emitter.Emit(); logger.Info("After emitting..."); this.Plugins.AfterEmit(emitter, this); logger.Info("After emitting done"); logger.Info("Translating done"); return(this.Outputs); }
public void Translate() { var logger = this.Log; logger.Info("Translating..."); this.LogProductInfo(); var config = this.AssemblyInfo; if (!this.FolderMode) { if (this.Rebuild) { logger.Info("Building assembly as Rebuild option is enabled"); this.BuildAssembly(); } else if (!File.Exists(this.AssemblyLocation)) { logger.Info("Building assembly as it is not found at " + this.AssemblyLocation); this.BuildAssembly(); } } this.Outputs.Report = new TranslatorOutputItem { Content = new StringBuilder(), OutputKind = TranslatorOutputKind.Report, OutputType = TranslatorOutputType.None, Name = this.AssemblyInfo.Report.FileName ?? "bridge.report.log", Location = this.AssemblyInfo.Report.Path }; var references = this.InspectReferences(); this.References = references; this.Plugins = Bridge.Translator.Plugins.GetPlugins(this, config, logger); logger.Info("Reading plugin configs..."); this.Plugins.OnConfigRead(config); logger.Info("Reading plugin configs done"); if (!string.IsNullOrWhiteSpace(config.BeforeBuild)) { try { logger.Info("Running BeforeBuild event " + config.BeforeBuild + " ..."); this.RunEvent(config.BeforeBuild); logger.Info("Running BeforeBuild event done"); } catch (System.Exception exc) { var message = "Error: Unable to run beforeBuild event command: " + exc.Message + "\nStack trace:\n" + exc.StackTrace; logger.Error("Exception occurred. Message: " + message); throw new Bridge.Translator.TranslatorException(message); } } this.BuildSyntaxTree(); var resolver = new MemberResolver(this.ParsedSourceFiles, Emitter.ToAssemblyReferences(references, logger), this.AssemblyDefinition); resolver = this.Preconvert(resolver); this.InspectTypes(resolver, config); resolver.CanFreeze = true; var emitter = this.CreateEmitter(resolver); if (!this.AssemblyInfo.OverflowMode.HasValue) { this.AssemblyInfo.OverflowMode = this.OverflowMode; } emitter.Translator = this; emitter.AssemblyInfo = this.AssemblyInfo; emitter.References = references; emitter.SourceFiles = this.SourceFiles; emitter.Log = this.Log; emitter.Plugins = this.Plugins; emitter.InitialLevel = 1; this.SortReferences(); logger.Info("Before emitting..."); this.Plugins.BeforeEmit(emitter, this); logger.Info("Before emitting done"); this.AddMainOutputs(emitter.Emit()); this.EmitterOutputs = emitter.Outputs; logger.Info("After emitting..."); this.Plugins.AfterEmit(emitter, this); logger.Info("After emitting done"); logger.Info("Translating done"); }
public static string GetSymbolName(InvocationExpressionSyntax node, SemanticModel semanticModel) { var si = semanticModel.GetSymbolInfo(node.ArgumentList.Arguments[0].Expression); var symbol = si.Symbol; if (symbol == null && si.CandidateSymbols.Any()) { symbol = si.CandidateSymbols.First(); } var name = (string)semanticModel.GetConstantValue(node).Value; if (symbol != null && symbol.Kind != SymbolKind.Namespace) { bool preserveMemberChange = !(symbol.Kind == SymbolKind.Method || symbol.Kind == SymbolKind.Property); int enumMode = -1; if (symbol.ContainingType != null && symbol.ContainingType.TypeKind == TypeKind.Enum && symbol is IFieldSymbol) { string enumAttr = Translator.Bridge_ASSEMBLY + ".EnumAttribute"; enumMode = 7; foreach (var attr in symbol.ContainingType.GetAttributes()) { if (attr.AttributeClass != null && attr.AttributeClass.FullyQualifiedName() == enumAttr && attr.ConstructorArguments.Any()) { enumMode = (int)attr.ConstructorArguments.First().Value; break; } } } if (symbol is IFieldSymbol && ((IFieldSymbol)symbol).IsConst) { preserveMemberChange = true; } var nameAttr = SyntaxHelper.GetInheritedAttribute(symbol, Bridge.Translator.Translator.Bridge_ASSEMBLY + ".NameAttribute"); bool isIgnore = symbol.ContainingType != null && SyntaxHelper.IsIgnoreType(symbol.ContainingType); name = symbol.Name; if (nameAttr != null) { var value = nameAttr.ConstructorArguments.First().Value; if (value is string) { name = value.ToString(); if (!isIgnore && symbol.IsStatic && Emitter.IsReservedStaticName(name)) { name = Helpers.ChangeReservedWord(name); } return(name); } preserveMemberChange = !(bool)value; enumMode = -1; } if (enumMode > 6) { switch (enumMode) { case 7: break; case 8: name = name.ToLowerInvariant(); break; case 9: name = name.ToUpperInvariant(); break; } } else { name = !preserveMemberChange?Object.Net.Utilities.StringUtils.ToLowerCamelCase(name) : name; } if (!isIgnore && symbol.IsStatic && Emitter.IsReservedStaticName(name)) { name = Helpers.ChangeReservedWord(name); } } return(name); }
protected virtual void AddExtractedResourceOutput(ResourceConfigItem resource, byte[] code) { Emitter.AddOutputItem(this.Outputs.Resources, resource.Name, code, TranslatorOutputKind.Resource, resource.Output); }
public virtual string GetEntityName(IEntity member, bool forcePreserveMemberCase = false, bool ignoreInterface = false) { Tuple <IEntity, bool, bool> tuple = new Tuple <IEntity, bool, bool>(member, forcePreserveMemberCase, ignoreInterface); string result; if (this.entityNameCache.TryGetValue(tuple, out result)) { return(result); } bool preserveMemberChange = !this.IsNativeMember(member.FullName) ? this.AssemblyInfo.PreserveMemberCase : false; int enumMode = -1; if (member.DeclaringType.Kind == TypeKind.Enum && member is IField) { enumMode = this.Validator.EnumEmitMode(member.DeclaringType); } if (member is IMember && this.IsMemberConst((IMember)member) || member is IEvent) { preserveMemberChange = true; } var attr = Helpers.GetInheritedAttribute(member, Bridge.Translator.Translator.Bridge_ASSEMBLY + ".NameAttribute"); bool isIgnore = member.DeclaringTypeDefinition != null && this.Validator.IsIgnoreType(member.DeclaringTypeDefinition); string name = member.Name; if (member is IMethod && ((IMethod)member).IsConstructor) { name = JS.Funcs.CONSTRUCTOR; } if (attr != null) { var value = attr.PositionalArguments.First().ConstantValue; if (value is string) { name = value.ToString(); if (!isIgnore && ((member.IsStatic && Emitter.IsReservedStaticName(name)) /*|| Helpers.IsReservedWord(name)*/)) { name = Helpers.ChangeReservedWord(name); } this.entityNameCache.Add(tuple, name); return(name); } preserveMemberChange = !(bool)value; enumMode = -1; } if (name.Length > 1 && name.ToUpperInvariant() == name) { preserveMemberChange = true; } if (enumMode > 6) { switch (enumMode) { case 7: break; case 8: name = name.ToLowerInvariant(); break; case 9: name = name.ToUpperInvariant(); break; } } else { name = !preserveMemberChange && !forcePreserveMemberCase?Object.Net.Utilities.StringUtils.ToLowerCamelCase(name) : name; } if (!isIgnore && ((member.IsStatic && Emitter.IsReservedStaticName(name)) /* || Helpers.IsReservedWord(name)*/)) { name = Helpers.ChangeReservedWord(name); } this.entityNameCache.Add(tuple, name); return(name); }
public override void VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDeclaration) { Expression initializer = enumMemberDeclaration.Initializer; var member = this.Resolver.ResolveNode(enumMemberDeclaration, null) as MemberResolveResult; var initializerIsString = false; if (member != null) { var validator = new Validator(); var enumMode = validator.EnumEmitMode(member.Member.DeclaringTypeDefinition); if (enumMode >= 3 && enumMode < 7) { initializerIsString = true; string enumStringName = member.Member.Name; var attr = Helpers.GetInheritedAttribute(member.Member, Translator.Bridge_ASSEMBLY + ".NameAttribute"); if (attr != null) { var value = attr.PositionalArguments.First().ConstantValue; string name = null; if (value is string) { name = value.ToString(); } else if (value is bool) { name = (bool)value ? Object.Net.Utilities.StringUtils.ToLowerCamelCase(member.Member.Name) : member.Member.Name; } if (member.Member.IsStatic && Emitter.IsReservedStaticName(name)) { name = Helpers.ChangeReservedWord(name); } initializer = new PrimitiveExpression(name); } else { switch (enumMode) { case 3: enumStringName = Object.Net.Utilities.StringUtils.ToLowerCamelCase(member.Member.Name); break; case 4: break; case 5: enumStringName = enumStringName.ToLowerInvariant(); break; case 6: enumStringName = enumStringName.ToUpperInvariant(); break; } initializer = new PrimitiveExpression(enumStringName); } } } if (!initializerIsString) { if (enumMemberDeclaration.Initializer.IsNull) { dynamic i = this.CurrentType.LastEnumValue; ++i; this.CurrentType.LastEnumValue = i; if (member != null && member.Member.DeclaringTypeDefinition.EnumUnderlyingType.IsKnownType(KnownTypeCode.Int64)) { initializer = new PrimitiveExpression(Convert.ToInt64(this.CurrentType.LastEnumValue)); } else if (member != null && member.Member.DeclaringTypeDefinition.EnumUnderlyingType.IsKnownType(KnownTypeCode.UInt64)) { initializer = new PrimitiveExpression(Convert.ToUInt64(this.CurrentType.LastEnumValue)); } else { initializer = new PrimitiveExpression(this.CurrentType.LastEnumValue); } } else { var rr = this.Resolver.ResolveNode(enumMemberDeclaration.Initializer, null) as ConstantResolveResult; if (rr != null) { if (member != null && member.Member.DeclaringTypeDefinition.EnumUnderlyingType.IsKnownType(KnownTypeCode.Int64)) { initializer = new PrimitiveExpression(Convert.ToInt64(rr.ConstantValue)); } else if (member != null && member.Member.DeclaringTypeDefinition.EnumUnderlyingType.IsKnownType(KnownTypeCode.UInt64)) { initializer = new PrimitiveExpression(Convert.ToUInt64(rr.ConstantValue)); } else { initializer = new PrimitiveExpression(rr.ConstantValue); } this.CurrentType.LastEnumValue = rr.ConstantValue; } } } this.CurrentType.StaticConfig.Fields.Add(new TypeConfigItem { Name = enumMemberDeclaration.Name, Entity = enumMemberDeclaration, Initializer = initializer }); }
public Dictionary <string, string> Translate() { var logger = this.Log; logger.Info("Translating..."); var config = this.ReadConfig(); if (config.LoggerLevel.HasValue) { var l = logger as Bridge.Translator.Logging.Logger; if (l != null) { l.LoggerLevel = config.LoggerLevel.Value; } } logger.Trace("Read config file: " + Utils.AssemblyConfigHelper.ConfigToString(config)); if (!string.IsNullOrWhiteSpace(config.Configuration)) { this.Configuration = config.Configuration; logger.Trace("Set configuration: " + this.Configuration); } if (config.DefineConstants != null && config.DefineConstants.Count > 0) { this.DefineConstants.AddRange(config.DefineConstants); this.DefineConstants = this.DefineConstants.Distinct().ToList(); logger.Trace("Set constants: " + string.Join(",", this.DefineConstants)); } if (this.FolderMode) { this.ReadFolderFiles(); logger.Trace("Read folder files"); } else { this.ReadProjectFile(); logger.Trace("Read project file"); if (this.Rebuild || !File.Exists(this.AssemblyLocation)) { this.BuildAssembly(); logger.Trace("Build assembly"); } } var references = this.InspectReferences(); this.References = references; this.Plugins = Bridge.Translator.Plugins.GetPlugins(this, config, logger); this.Plugins.OnConfigRead(config); if (!string.IsNullOrWhiteSpace(config.BeforeBuild)) { try { logger.Trace("Running BeforeBuild event"); this.RunEvent(config.BeforeBuild); } catch (Exception exc) { var message = "Error: Unable to run beforeBuild event command: " + exc.Message + "\nStack trace:\n" + exc.StackTrace; logger.Error("Exception occurred. Message: " + message); throw new Bridge.Translator.Exception(message); } } logger.Trace("BuildSyntaxTree"); this.BuildSyntaxTree(); var resolver = new MemberResolver(this.ParsedSourceFiles, Emitter.ToAssemblyReferences(references)); this.InspectTypes(resolver, config); resolver.CanFreeze = true; var emitter = this.CreateEmitter(resolver); XmlMetaMaker.Load(XmlMetaFiles, emitter); emitter.Translator = this; emitter.AssemblyInfo = this.AssemblyInfo; emitter.References = references; emitter.SourceFiles = this.SourceFiles; emitter.Log = this.Log; emitter.Plugins = this.Plugins; this.SortReferences(); this.Plugins.BeforeEmit(emitter, this); this.Outputs = emitter.Emit(); this.Plugins.AfterEmit(emitter, this); logger.Info("Translating done"); return(this.Outputs); }