예제 #1
0
파일: MemberRefs.cs 프로젝트: ostuda/de4dot
        string getPinvokeName(MethodDef methodDef)
        {
            var methodNames = new Dictionary<string, bool>(StringComparer.Ordinal);
            foreach (var method in methods.getAll())
                methodNames[method.NewName] = true;

            var entryPoint = methodDef.MethodDefinition.PInvokeInfo.EntryPoint;
            if (Regex.IsMatch(entryPoint, @"^#\d+$"))
                entryPoint = DotNetUtils.getDllName(methodDef.MethodDefinition.PInvokeInfo.Module.Name) + "_" + entryPoint.Substring(1);
            while (true) {
                var newName = MemberRenameState.variableNameState.pinvokeNameCreator.newName(entryPoint);
                if (!methodNames.ContainsKey(newName))
                    return newName;
            }
        }
예제 #2
0
파일: MemberRefs.cs 프로젝트: ostuda/de4dot
 public void add(MethodDef m)
 {
     methods.add(m);
 }
예제 #3
0
파일: MemberRefs.cs 프로젝트: ostuda/de4dot
        INameCreator getMethodNameCreator(MethodDef methodDef, string suggestedName)
        {
            var variableNameState = MemberRenameState.variableNameState;
            INameCreator nameCreator = null;
            string newName = null;

            if (methodDef.MethodDefinition.HasPInvokeInfo)
                newName = getPinvokeName(methodDef);
            else if (methodDef.MethodDefinition.IsStatic)
                nameCreator = variableNameState.staticMethodNameCreator;
            else if (methodDef.isVirtual()) {
                MethodRef otherMethodRef;
                if ((otherMethodRef = MemberRenameState.get(methodDef)) != null)
                    newName = otherMethodRef.NewName;
                else if (methodDef.MethodDefinition.HasOverrides) {
                    var overrideMethod = methodDef.MethodDefinition.Overrides[0];
                    var otherMethodDef = defFinder.findMethod(overrideMethod);
                    if (otherMethodDef != null)
                        newName = getOverrideMethodName(overrideMethod.DeclaringType, otherMethodDef.NewName);
                    else
                        newName = getOverrideMethodName(overrideMethod.DeclaringType, overrideMethod.Name);
                }
                else
                    nameCreator = variableNameState.virtualMethodNameCreator;
            }
            else
                nameCreator = variableNameState.instanceMethodNameCreator;

            if (newName == null)
                newName = suggestedName;
            if (newName != null)
                nameCreator = new OneNameCreator(newName);

            return nameCreator;
        }
예제 #4
0
파일: MemberRefs.cs 프로젝트: ostuda/de4dot
        void renameMethod(MethodDef methodDef, string suggestedName = null)
        {
            if (methodDef.Renamed)
                return;
            methodDef.Renamed = true;
            var variableNameState = MemberRenameState.variableNameState;
            bool isVirtual = methodDef.isVirtual();

            var nameCreator = getMethodNameCreator(methodDef, suggestedName);

            if (!methodDef.MethodDefinition.IsRuntimeSpecialName && !variableNameState.IsValidName(methodDef.OldName))
                methodDef.NewName = nameCreator.newName();

            if (methodDef.ParamDefs.Count > 0) {
                var newVariableNameState = variableNameState.clone();
                foreach (var paramDef in methodDef.ParamDefs) {
                    if (!newVariableNameState.IsValidName(paramDef.OldName)) {
                        paramDef.NewName = newVariableNameState.getNewParamName(paramDef.ParameterDefinition);
                        paramDef.Renamed = true;
                    }
                }
            }

            prepareRenameGenericParams(methodDef.GenericParams, variableNameState.IsValidName, methodDef.Owner == null ? null : methodDef.Owner.genericParams);

            if (isVirtual)
                MemberRenameState.add(methodDef);
        }