protected override void BeginEmit()
        {
            base.BeginEmit();
            OldRules = Emitter.Rules;


            if (Emitter.Resolver.ResolveNode(CustomEventDeclaration) is MemberResolveResult rr)
            {
                Emitter.Rules = Rules.Get(Emitter, rr.Member);
            }
        }
Beispiel #2
0
        protected override void BeginEmit()
        {
            base.BeginEmit();
            this.OldRules = this.Emitter.Rules;

            var rr = this.Emitter.Resolver.ResolveNode(this.MethodDeclaration, this.Emitter) as MemberResolveResult;

            if (rr != null)
            {
                this.Emitter.Rules = Rules.Get(this.Emitter, rr.Member);
            }
        }
Beispiel #3
0
        public override AstNode VisitTypeDeclaration(TypeDeclaration typeDeclaration)
        {
            if (Resolver.ResolveNode(typeDeclaration) is TypeResolveResult rr)
            {
                Rules = Contract.Rules.Get(Emitter, rr.Type.GetDefinition());
            }
            else
            {
                Rules = Contract.Rules.Default;
            }

            return(base.VisitTypeDeclaration(typeDeclaration));
        }
Beispiel #4
0
        public override AstNode VisitCustomEventDeclaration(CustomEventDeclaration eventDeclaration)
        {
            if (Resolver.ResolveNode(eventDeclaration) is MemberResolveResult rr)
            {
                Rules = Contract.Rules.Get(Emitter, rr.Member);
            }
            else
            {
                Rules = Contract.Rules.Default;
            }

            return(base.VisitCustomEventDeclaration(eventDeclaration));
        }
Beispiel #5
0
        public override AstNode VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration)
        {
            if (Resolver.ResolveNode(indexerDeclaration) is MemberResolveResult rr)
            {
                Rules = Contract.Rules.Get(Emitter, rr.Member);
            }
            else
            {
                Rules = Contract.Rules.Default;
            }

            return(base.VisitIndexerDeclaration(indexerDeclaration));
        }
Beispiel #6
0
        public override AstNode VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration)
        {
            if (Resolver.ResolveNode(propertyDeclaration) is MemberResolveResult rr)
            {
                Rules = Contract.Rules.Get(Emitter, rr.Member);
            }
            else
            {
                Rules = Contract.Rules.Default;
            }

            return(base.VisitPropertyDeclaration(propertyDeclaration));
        }
Beispiel #7
0
        private static CompilerRule ToRule(IAttribute attribute, CompilerRuleLevel level = CompilerRuleLevel.None)
        {
            var rule = new CompilerRule();

            foreach (var argument in attribute.NamedArguments)
            {
                var member = argument.Key;
                var value  = argument.Value;

                switch (member.Name)
                {
                case nameof(CompilerRule.Lambda):
                    rule.Lambda = (LambdaRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.Boxing):
                    rule.Boxing = (BoxingRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.ArrayIndex):
                    rule.ArrayIndex = (ArrayIndexRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.Integer):
                    rule.Integer = (IntegerRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.AnonymousType):
                    rule.AnonymousType = (AnonymousTypeRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.AutoProperty):
                    rule.AutoProperty = (AutoPropertyRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.InlineComment):
                    rule.InlineComment = (InlineCommentRule)(int)value.ConstantValue;
                    break;

                case nameof(CompilerRule.ExternalCast):
                    rule.ExternalCast = (ExternalCastRule)(int)value.ConstantValue;
                    break;

                default:
                    throw new NotSupportedException($"Property {member.Name} is not supported in {attribute.AttributeType.FullName}");
                }
            }

            rule.Level = level;
            return(rule);
        }
Beispiel #8
0
 public H5DotJson_AssemblySettings()
 {
     Dependencies       = new List <IModuleDependency>();
     Reflection         = new ReflectionConfig();
     ReflectionInternal = new ReflectionConfig();
     Assembly           = new AssemblyConfig();
     Resources          = new ResourceConfig();
     Loader             = new ModuleLoader();
     Output             = DEFAULT_OUTPUT;
     SourceMap          = new SourceMapConfig();
     Html  = new HtmlConfig();
     Rules = new CompilerRule();
     IgnoreDuplicateTypes = false;
 }
Beispiel #9
0
        public override AstNode VisitTypeDeclaration(TypeDeclaration typeDeclaration)
        {
            var rr = this.Resolver.ResolveNode(typeDeclaration, null) as TypeResolveResult;
            if (rr != null)
            {
                this.Rules = Contract.Rules.Get(this.Emitter, rr.Type.GetDefinition());
            }
            else
            {
                this.Rules = Contract.Rules.Default;
            }

            return base.VisitTypeDeclaration(typeDeclaration);
        }
Beispiel #10
0
        public override AstNode VisitCustomEventDeclaration(CustomEventDeclaration eventDeclaration)
        {
            var rr = this.Resolver.ResolveNode(eventDeclaration, null) as MemberResolveResult;
            if (rr != null)
            {
                this.Rules = Contract.Rules.Get(this.Emitter, rr.Member);
            }
            else
            {
                this.Rules = Contract.Rules.Default;
            }

            return base.VisitCustomEventDeclaration(eventDeclaration);
        }
Beispiel #11
0
        public override void VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration)
        {
            var rr = this.Resolver.ResolveNode(indexerDeclaration, null) as MemberResolveResult;
            if (rr != null)
            {
                this.Rules = Contract.Rules.Get(this.Emitter, rr.Member);
            }
            else
            {
                this.Rules = Contract.Rules.Default;
            }

            base.VisitIndexerDeclaration(indexerDeclaration);
        }
Beispiel #12
0
        private static CompilerRule MergeRules(List <CompilerRule> rules)
        {
            var resultRule = new CompilerRule
            {
                Lambda        = LambdaRule.Managed,
                AnonymousType = AnonymousTypeRule.Managed,
                Integer       = IntegerRule.Managed,
                Boxing        = BoxingRule.Managed,
                ArrayIndex    = ArrayIndexRule.Managed,
                AutoProperty  = null
            };

            for (int i = rules.Count - 1; i >= 0; i--)
            {
                var rule = rules[i];

                if (rule.Lambda.HasValue)
                {
                    resultRule.Lambda = rule.Lambda;
                }

                if (rule.AutoProperty.HasValue)
                {
                    resultRule.AutoProperty = rule.AutoProperty;
                }

                if (rule.AnonymousType.HasValue)
                {
                    resultRule.AnonymousType = rule.AnonymousType;
                }

                if (rule.Integer.HasValue)
                {
                    resultRule.Integer = rule.Integer;
                }

                if (rule.ArrayIndex.HasValue)
                {
                    resultRule.ArrayIndex = rule.ArrayIndex;
                }

                if (rule.Boxing.HasValue)
                {
                    resultRule.Boxing = rule.Boxing;
                }
            }

            return(resultRule);
        }
Beispiel #13
0
        public override AstNode VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration)
        {
            var rr = this.Resolver.ResolveNode(propertyDeclaration, null) as MemberResolveResult;

            if (rr != null)
            {
                this.Rules = Contract.Rules.Get(this.Emitter, rr.Member);
            }
            else
            {
                this.Rules = Contract.Rules.Default;
            }

            return(base.VisitPropertyDeclaration(propertyDeclaration));
        }
Beispiel #14
0
 public AssemblyInfo()
 {
     Dependencies       = new List <IPluginDependency>();
     DefineConstants    = new List <string>();
     Reflection         = new ReflectionConfig();
     ReflectionInternal = new ReflectionConfig();
     Assembly           = new AssemblyConfig();
     Resources          = new ResourceConfig();
     Loader             = new ModuleLoader();
     Output             = DEFAULT_OUTPUT;
     SourceMap          = new SourceMapConfig();
     Html    = new HtmlConfig();
     Console = new ConsoleConfig();
     Rules   = new CompilerRule();
     IgnoreDuplicateTypes = false;
 }
Beispiel #15
0
        public override void VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration)
        {
            if (Found)
            {
                return;
            }

            if (Resolver.ResolveNode(indexerDeclaration) is MemberResolveResult rr)
            {
                Rules = Contract.Rules.Get(Emitter, rr.Member);
            }
            else
            {
                Rules = Contract.Rules.Default;
            }

            base.VisitIndexerDeclaration(indexerDeclaration);
        }
Beispiel #16
0
        public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration)
        {
            if (this.Found)
            {
                return;
            }

            var rr = this.Resolver.ResolveNode(propertyDeclaration, null) as MemberResolveResult;

            if (rr != null)
            {
                this.Rules = Contract.Rules.Get(this.Emitter, rr.Member);
            }
            else
            {
                this.Rules = Contract.Rules.Default;
            }

            base.VisitPropertyDeclaration(propertyDeclaration);
        }
Beispiel #17
0
        public static CompilerRule Get(IEmitter emitter, IEntity entity)
        {
            CompilerRule memberRule = null;

            CompilerRule[] classRules     = null;
            CompilerRule[] assemblyRules  = null;
            CompilerRule[] interfaceRules = null;

            if (entity is IMember)
            {
                var attr = Helpers.GetInheritedAttribute(entity, attributeName);

                if (attr != null)
                {
                    memberRule = Rules.ToRule(attr, CompilerRuleLevel.Member);
                }

                var typeDef = entity.DeclaringTypeDefinition;

                if (typeDef != null)
                {
                    classRules = Rules.GetClassRules(emitter, typeDef);
                }

                interfaceRules = Rules.GetVirtualMemberRules(emitter, entity);
            }
            else if (entity is ITypeDefinition)
            {
                classRules = Rules.GetClassRules(emitter, (ITypeDefinition)entity);
            }

            var assembly = entity.ParentAssembly;

            if (emitter != null && emitter.AssemblyCompilerRuleCache.ContainsKey(assembly))
            {
                assemblyRules = emitter.AssemblyCompilerRuleCache[assembly];
            }
            else
            {
                IAttribute[] assemblyAttrs = assembly.AssemblyAttributes.Where(a => a.AttributeType.FullName == Rules.attributeName).ToArray();
                assemblyRules = new CompilerRule[assemblyAttrs.Length];
                for (int i = 0; i < assemblyAttrs.Length; i++)
                {
                    assemblyRules[i] = Rules.ToRule(assemblyAttrs[i], CompilerRuleLevel.Assembly);
                }

                if (emitter != null)
                {
                    emitter.AssemblyCompilerRuleCache.Add(assembly, assemblyRules);
                }
            }

            var rules = new List <CompilerRule>();

            if (memberRule != null)
            {
                rules.Add(memberRule);
            }

            if (classRules != null && classRules.Length > 0)
            {
                rules.AddRange(classRules);
            }

            if (interfaceRules != null && interfaceRules.Length > 0)
            {
                rules.AddRange(interfaceRules);
            }

            if (emitter != null)
            {
                rules.Add(emitter.AssemblyInfo.Rules);
            }

            if (assemblyRules != null && assemblyRules.Length > 0)
            {
                rules.AddRange(assemblyRules);
            }

            return(MergeRules(rules));
        }