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); }
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); } }