示例#1
0
        public override SyntaxNode VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node)
        {
            if (node.Declaration.Variables.Count == 1)
            {
                IDSLHandler dsl = null;
                dsl = ctx_.CreateDSL(node.Declaration.Type.ToString());
                if (dsl != null)
                {
                    if (node.Declaration.Variables.Count != 1)
                    {
                        //td: error
                        return(node);
                    }

                    var        variable = node.Declaration.Variables[0];
                    DSLContext dctx     = new DSLContext {
                        MainNode = variable, Surroundings = DSLSurroundings.Code, Assign = false, ExtraMembers = members_
                    };
                    Debug.Assert(pending_ == null);
                    pending_ = new ResolveDSLCode(dsl, ctx_, dctx);
                    return(dsl.compile(ctx_, dctx));
                }
            }

            return(base.VisitLocalDeclarationStatement(node));
        }
示例#2
0
文件: Context.cs 项目: zihotki/Excess
        public string RegisterDSL(IDSLHandler dsl)
        {
            int hash = dsl.GetHashCode();

            Debug.Assert(!_dslInstances.ContainsKey(hash));
            _dslInstances[hash] = dsl;

            return(hash.ToString());
        }
示例#3
0
        public override SyntaxNode VisitIncompleteMember(IncompleteMemberSyntax node)
        {
            string      typename = node.Type.ToString();
            IDSLHandler dsl      = ctx_.CreateDSL(typename);

            if (dsl != null)
            {
                pending_ = new ResolveDSLClass(dsl, ctx_, members_);
                return(null);
            }

            return(node);
        }
示例#4
0
        public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
        {
            //handle language constructs
            string typeName = node.ReturnType.ToString();

            switch (typeName)
            {
            case "on":       return(rewriteEventHandler(node));

            case "function": return(rewriteFunction(node, false));

            case "method":   return(rewriteFunction(node, true));

            case "typedef":  return(rewriteTypedef(node));

            case "":
            {
                switch (node.Identifier.ToString())
                {
                case "constructor": return(rewriteConstructor(node));
                }
                break;
            }
            }

            //handle dsls
            IDSLHandler     dsl = null;
            DSLSurroundings ds  = node.Parent is CompilationUnitSyntax ? DSLSurroundings.Global : DSLSurroundings.TypeBody;
            string          id  = null;

            if (!node.ReturnType.IsMissing)
            {
                dsl = ctx_.CreateDSL(typeName);
                id  = node.Identifier.ToString();
            }
            else
            {
                dsl = ctx_.CreateDSL(node.Identifier.ToString());
            }

            if (dsl != null)
            {
                DSLContext dctx = new DSLContext {
                    MainNode = node, Surroundings = ds, Id = id, ExtraMembers = members_
                };
                return(dsl.compile(ctx_, dctx));
            }

            return(node.WithBody((BlockSyntax)base.Visit(node.Body)));
        }
示例#5
0
文件: Context.cs 项目: zihotki/Excess
        public SyntaxNode Link(SyntaxNode node, SyntaxNode newNode, string linker, SemanticModel model)
        {
            if (linkers_.ContainsKey(linker))
            {
                return(linkers_[linker](this, node, newNode, model));
            }

            IDSLHandler dsl = GetDSL(linker);

            if (dsl != null)
            {
                return(dsl.link(this, node, model));
            }

            return(node);
        }
示例#6
0
        private SyntaxNode rewriteInvocation(InvocationExpressionSyntax node, bool assign)
        {
            IDSLHandler dsl = ctx_.CreateDSL(node.Expression.ToString());

            if (dsl != null)
            {
                DSLContext dctx = new DSLContext {
                    MainNode = node, Surroundings = DSLSurroundings.Code, Assign = assign, ExtraMembers = members_
                };

                Debug.Assert(pending_ == null);
                pending_ = new ResolveDSLCode(dsl, ctx_, dctx);
                return(dsl.compile(ctx_, dctx));
            }
            else if (node.ArgumentList.GetDiagnostics().Any())
            {
                return(SyntaxFactory.InvocationExpression(node.Expression, (ArgumentListSyntax)Visit(node.ArgumentList)));
            }

            return(node);
        }
示例#7
0
 public ResolveDSLCode(IDSLHandler dsl, ExcessContext ctx, DSLContext dctx)
 {
     dsl_  = dsl;
     ctx_  = ctx;
     dctx_ = dctx;
 }
示例#8
0
 public ResolveDSLClass(IDSLHandler dsl, ExcessContext ctx, List <MemberDeclarationSyntax> extraMembers)
 {
     dsl_          = dsl;
     ctx_          = ctx;
     extraMembers_ = extraMembers;
 }
示例#9
0
 public ResolveDSLClass(IDSLHandler dsl, ExcessContext ctx, List<MemberDeclarationSyntax> extraMembers)
 {
     dsl_ = dsl;
     ctx_ = ctx;
     extraMembers_ = extraMembers;
 }
示例#10
0
 public ResolveDSLCode(IDSLHandler dsl, ExcessContext ctx, DSLContext dctx)
 {
     dsl_  = dsl;
     ctx_  = ctx;
     dctx_ = dctx;
 }