예제 #1
0
        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;
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
        }
예제 #4
0
        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);
        }
예제 #5
0
        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");
        }
예제 #6
0
        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);
        }
예제 #7
0
 protected virtual void AddExtractedResourceOutput(ResourceConfigItem resource, byte[] code)
 {
     Emitter.AddOutputItem(this.Outputs.Resources, resource.Name, code, TranslatorOutputKind.Resource, resource.Output);
 }
예제 #8
0
        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);
        }
예제 #9
0
        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
            });
        }
예제 #10
0
        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);
        }