Exemplo n.º 1
0
        public Expression TryInline(ResolveContext rc)
        {
            if (!(Expr is Invocation))
            {
                return(Expr);
            }

            invocation = (Expr as Invocation);
            if (invocation.MethodGroup.BestCandidate == null)
            {
                return(Expr);
            }

            methodSpec = invocation.MethodGroup.BestCandidate;
            if (!(methodSpec.MemberDefinition is MethodCore))
            {
                return(Expr);
            }

            method     = methodSpec.MemberDefinition as MemberCore;
            methodData = method as IMethodData;

            if (methodData.IsInlinable)
            {
                return(Expr);
            }

            TypeSpec returnType = methodData.ReturnType;

            ToplevelBlock block = methodData.Block;

            if (block.Parameters.Count > 0 || block.TopBlock.NamesCount > 0 && block.TopBlock.LabelsCount > 0)
            {
                return(Expr);
            }

            if (returnType != rc.BuiltinTypes.Void &&
                block.Statements.Count == 1 && block.Statements [0] is Return)
            {
                inlineExpr = ((Return)block.Statements [0]).Expr.Clone(new CloneContext());
            }
            else if (returnType == rc.BuiltinTypes.Void)
            {
                Block newBlock = new Block(rc.CurrentBlock, block.StartLocation, block.EndLocation);
                foreach (var st in block.Statements)
                {
                    newBlock.AddStatement(st.Clone(new CloneContext()));
                }
//				inlineExpr = newBlock;
            }

            this.rc           = rc;
            this.inlineFailed = false;

            Expression ret;

            inlineExpr.Accept(this);
            ret = inlineExpr;

            if (inlineFailed)
            {
                return(Expr);
            }

            return(ret);
        }
Exemplo n.º 2
0
			void AddFixedFieldInitializer (VariableInitializer variable, Expression initializer)
			{
				if (initializer == null)
					return;
				if (initializer is ConstInitializer) {
					variable.AddChild (new CSharpTokenNode (Convert (initializer.Location), 1), FieldDeclaration.Roles.LBracket);
					variable.AddChild ((INode)initializer.Accept (this), FieldDeclaration.Roles.Initializer);
					var initializerLoc = LocationsBag.GetLocations (initializer);
					if (initializerLoc != null)
						variable.AddChild (new CSharpTokenNode (Convert (initializerLoc[0]), 1), FieldDeclaration.Roles.RBracket);
				} else {
					variable.AddChild (new CSharpTokenNode (Convert (initializer.Location), 1), FieldDeclaration.Roles.Assign);
					variable.AddChild ((INode)initializer.Accept (this), FieldDeclaration.Roles.Initializer);
				}
			}