Пример #1
0
        private CodeStatementCollection GenerateImperativeAssignStatement(BinaryOperatorExpression node)
        {
            //if (node.RightOperand.Type == AphidNodeType.CallExpression)
            //{
            //    var call = (CallExpression)node.RightOperand;

            //    if (call.FunctionExpression.Type == AphidNodeType.IdentifierExpression &&
            //        ((IdentifierExpression)call.FunctionExpression).Identifier == "NextToken")
            //    {
            //        var assignStatements = GenerateImperativeStatement(new BinaryOperatorExpression(
            //            node.LeftOperand,
            //            node.Operator,
            //            new IdentifierExpression(_tokenTypeId)));

            //        var statements = assignStatements
            //            .OfType<CodeStatement>()
            //            .Concat(new CodeStatement[] { GetNextTokenStatement(), })
            //            .ToArray();

            //        return new CodeStatementCollection(statements);
            //    }
            //}

            if (node.LeftOperand.Type == AphidExpressionType.IdentifierExpression)
            {
                var id = ((IdentifierExpression)node.LeftOperand).Identifier;
                if (!_scope.TryResolve(id, out _))
                {
                    _scope.Add(id, AphidObject.Complex());

                    return(new CodeStatementCollection(new[] { CodeHelper.VarDecl(id, GenerateImperativeExpression(node.RightOperand)) }));
                }
            }

            var leftExp    = GenerateImperativeExpression(node.LeftOperand);
            var assignStmt = CodeHelper.Assign(leftExp, GenerateImperativeExpression(node.RightOperand));

            return(new CodeStatementCollection(new[] { assignStmt }));
        }
Пример #2
0
 private CodeStatement GenerateContextAssign() => CodeHelper.Assign(
     ParserName.ContextField,
     CodeHelper.New(CodeHelper.TypeRef(_config.ExpressionContextClass)));
Пример #3
0
        public Type BuildType(string typeName)
        {
            var nameTable = _sourcePropertyTable.Value;

            var type2 = new CodeTypeDeclaration(typeName)
            {
                CustomAttributes = new CodeAttributeDeclarationCollection(
                    new[] { new CodeAttributeDeclaration(CodeHelper.TypeRef <SerializableAttribute>()) })
            };

            var fields = nameTable
                         .ToDictionary(
                x => x.Key,
                x => new CodeMemberField(x.Value.PropertyType, string.Format("_autoField_{0}", x.Key)));

            var props = nameTable
                        .Select(x => new CodeMemberProperty
            {
                Attributes       = MemberAttributes.Public,
                Type             = CodeHelper.TypeRef(x.Value.PropertyType),
                Name             = x.Key,
                HasGet           = true,
                HasSet           = true,
                CustomAttributes = new CodeAttributeDeclarationCollection(
                    new[] { new CodeAttributeDeclaration(CodeHelper.TypeRef <TAttribute>()) })
            })
                        .ToArray();

            foreach (var p in props)
            {
                var field = CodeHelper.FieldRef(fields[p.Name].Name);
                p.GetStatements.Add(CodeHelper.Return(field));
                p.SetStatements.Add(CodeHelper.Assign(field, CodeHelper.VarRef("value")));
            }

            type2.Members.AddRange(fields.Select(x => x.Value).ToArray());
            type2.Members.AddRange(props);

            var code = CSharpHelper.GenerateCode(type2);

            using (var provider = new CSharpCodeProvider())
            {
                var options = new CompilerParameters
                {
                    GenerateExecutable = false,
                    GenerateInMemory   = true,
                };

                var references = nameTable
                                 .Select(x => x.Value.PropertyType.Assembly.Location)
                                 .Concat(new[] { typeof(SerializableAttribute), typeof(TAttribute) }
                                         .Select(x => x.Assembly.Location))
                                 .Distinct()
                                 .ToArray();

                options.ReferencedAssemblies.AddRange(references);

                var results = provider.CompileAssemblyFromSource(options, code);

                return(results.CompiledAssembly.GetType(typeName));
            }
        }