Пример #1
0
		public BlockStatement CreateMethodBody()
		{
			if (methodDef.Body == null) return null;
			
			context.CancellationToken.ThrowIfCancellationRequested();
			ILBlock ilMethod = new ILBlock();
			ILAstBuilder astBuilder = new ILAstBuilder();
			ilMethod.Body = astBuilder.Build(methodDef, true);
			
			context.CancellationToken.ThrowIfCancellationRequested();
			ILAstOptimizer bodyGraph = new ILAstOptimizer();
			bodyGraph.Optimize(context, ilMethod);
			context.CancellationToken.ThrowIfCancellationRequested();
			
			NameVariables.AssignNamesToVariables(methodDef.Parameters.Select(p => p.Name), astBuilder.Variables, ilMethod);
			
			context.CancellationToken.ThrowIfCancellationRequested();
			Ast.BlockStatement astBlock = TransformBlock(ilMethod);
			CommentStatement.ReplaceAll(astBlock); // convert CommentStatements to Comments
			foreach (ILVariable v in localVariablesToDefine) {
				DeclareVariableInSmallestScope.DeclareVariable(astBlock, AstBuilder.ConvertType(v.Type), v.Name);
			}
			
			return astBlock;
		}
Пример #2
0
        public BlockStatement CreateMethodBody()
        {
            if (methodDef.Body == null) return null;

            ILBlock ilMethod = new ILBlock();
            ILAstBuilder astBuilder = new ILAstBuilder();
            ilMethod.Body = astBuilder.Build(methodDef, true);

            ILAstOptimizer bodyGraph = new ILAstOptimizer();
            bodyGraph.Optimize(ilMethod);

            List<string> intNames = new List<string>(new string[] {"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"});
            Dictionary<string, int> typeNames = new Dictionary<string, int>();
            foreach(ILVariable varDef in astBuilder.Variables) {
                if (varDef.Type.FullName == Constants.Int32 && intNames.Count > 0) {
                    varDef.Name = intNames[0];
                    intNames.RemoveAt(0);
                } else {
                    string name;
                    if (varDef.Type.IsArray) {
                        name = "array";
                    } else if (!typeNameToVariableNameDict.TryGetValue(varDef.Type.FullName, out name)) {
                        name = varDef.Type.Name;
                        // remove the 'I' for interfaces
                        if (name.Length >= 3 && name[0] == 'I' && char.IsUpper(name[1]) && char.IsLower(name[2]))
                            name = name.Substring(1);
                        // remove the backtick (generics)
                        int pos = name.IndexOf('`');
                        if (pos >= 0)
                            name = name.Substring(0, pos);
                        if (name.Length == 0)
                            name = "obj";
                        else
                            name = char.ToLower(name[0]) + name.Substring(1);
                    }
                    if (!typeNames.ContainsKey(name)) {
                        typeNames.Add(name, 0);
                    }
                    int count = ++(typeNames[name]);
                    if (count > 1) {
                        name += count.ToString();
                    }
                    varDef.Name = name;
                }

            //				Ast.VariableDeclaration astVar = new Ast.VariableDeclaration(varDef.Name);
            //				Ast.LocalVariableDeclaration astLocalVar = new Ast.LocalVariableDeclaration(astVar);
            //				astLocalVar.TypeReference = new Ast.TypeReference(varDef.VariableType.FullName);
            //				astBlock.Children.Add(astLocalVar);
            }

            Ast.BlockStatement astBlock = TransformBlock(ilMethod);
            CommentStatement.ReplaceAll(astBlock); // convert CommentStatements to Comments
            return astBlock;
        }