Exemplo n.º 1
0
        private List <MethodDefinition> GetConstructors(TypeDefinition type, bool isBaseInitializer)
        {
            List <MethodDefinition> constructors = new List <MethodDefinition>();
            var visitor = new ObservableAstVisitor();

            visitor.EnterConstructorDeclaration += exp => {
                var constructor = exp.Annotation <MethodReference>();
                if (!isBaseInitializer || exp.Initializer.ConstructorInitializerType == ConstructorInitializerType.Base)
                {
                    constructors.Add(constructor.Resolve());
                }
            };

            copier.Process();

            var d = new DecompilerContext(type.Module)
            {
                CurrentType = type
            };
            var astBuilder = new AstBuilder(d);

            astBuilder.AddType(type);
            astBuilder.SyntaxTree.AcceptVisitor(visitor);
            return(constructors);
        }
 protected override void Attach(ObservableAstVisitor <InspectionData, object> visitior)
 {
     visitior.ThrowStatementVisited += delegate(ThrowStatement node, InspectionData data) {
         if (node.Expression.IsNull)
         {
             return;
         }
         if (node.Expression is IdentifierExpression && ((IdentifierExpression)node.Expression).Identifier != "NotImplementedException")
         {
             return;
         }
         if (node.Expression is MemberReferenceExpression && ((MemberReferenceExpression)node.Expression).MemberName != "NotImplementedException")
         {
             return;
         }
         // may be a not implemented exception, to get 100% sure we need to make a resolve.
         var resolver = data.Resolver;
         var result   = resolver.Resolve(node.Expression.ToString(), new DomLocation(node.StartLocation.Line, node.EndLocation.Column));
         if (result != null && result.ResolvedType.FullName != null && result.ResolvedType.FullName == "System.NotImplementedException")
         {
             data.Add(new Result(
                          new DomRegion(node.StartLocation.Line, node.StartLocation.Column, node.EndLocation.Line, node.EndLocation.Column),
                          GettextCatalog.GetString("NotImplemented exception thrown"),
                          MonoDevelop.SourceEditor.QuickTaskSeverity.Suggestion,
                          ResultCertainty.High,
                          ResultImportance.Low,
                          false)
                      );
         }
     };
 }
Exemplo n.º 3
0
		public void Attach (InspectorAddinNode node, ObservableAstVisitor<InspectionData, object> visitior)
		{
			if (visitior == null)
				throw new ArgumentNullException ("visitior");
			this.node = node;
			Attach (visitior);
		}
        protected override void Attach(ObservableAstVisitor <InspectionData, object> visitior)
        {
            visitior.BinaryOperatorExpressionVisited += delegate(BinaryOperatorExpression binOp, InspectionData data) {
                foreach (var match in Matches)
                {
                    if (match.IsMatch(binOp) && ComparesEqualNodes(binOp))
                    {
                        AddResult(data,
                                  new DomRegion(binOp.StartLocation.Line, binOp.StartLocation.Column, binOp.EndLocation.Line, binOp.EndLocation.Column),
                                  GettextCatalog.GetString("Use string.IsNullOrEmpty"),
                                  delegate {
                            Expression invocation = new InvocationExpression(new MemberReferenceExpression(new TypeReferenceExpression(new PrimitiveType("string")), "IsNullOrEmpty"), GetParameter(binOp));
//							binOp.Replace (data.Document, invocation);
                        }
                                  );
                    }
                }
                foreach (var match in NegatedMatches)
                {
                    if (match.IsMatch(binOp) && ComparesEqualNodes(binOp))
                    {
                        AddResult(data,
                                  new DomRegion(binOp.StartLocation.Line, binOp.StartLocation.Column, binOp.EndLocation.Line, binOp.EndLocation.Column),
                                  GettextCatalog.GetString("Use string.IsNullOrEmpty"),
                                  delegate {
                            Expression invocation = new InvocationExpression(new MemberReferenceExpression(new TypeReferenceExpression(new PrimitiveType("string")), "IsNullOrEmpty"), GetParameter(binOp));
                            invocation            = new UnaryOperatorExpression(UnaryOperatorType.Not, invocation);
//								binOp.Replace (data.Document, invocation);
                        }
                                  );
                    }
                }
            };
        }
Exemplo n.º 5
0
 public void Attach(InspectorAddinNode node, ObservableAstVisitor <InspectionData, object> visitior)
 {
     if (visitior == null)
     {
         throw new ArgumentNullException("visitior");
     }
     this.node = node;
     Attach(visitior);
 }
Exemplo n.º 6
0
        private void CopyConstructorInitInstructions()
        {
            var constructors = GetConstructors(DestinationType, true);

            var visitor = new ObservableAstVisitor();

            bool isNewConstructor = false;

            visitor.EnterConstructorDeclaration += exp => {
                var constructor = exp.Annotation <MethodReference>();
                if (!copier.CopyMap.ContainsKey(constructor))
                {
                    isNewConstructor = true;
                }
            };
            visitor.LeaveConstructorDeclaration += exp => {
                isNewConstructor = false;
            };
            visitor.EnterConstructorInitializer += exp => {
                isNewConstructor = false;
            };
            visitor.EnterAssignmentExpression += exp => {
                var member = exp.Left.Annotation <MemberReference>();
                if (isNewConstructor)
                {
                    if (copier.CopyMap.ContainsKey(member))
                    {
                        var argILRange      = exp.Annotation <List <ILRange> >();
                        var newInstructions = GetInstructions(exp);
                        foreach (var constructor in constructors)
                        {
                            var newInstruction = GetInstruction(newInstructions, argILRange[0].To);
                            newInstruction = newInstruction.Previous;
                            while (newInstruction != null && newInstruction.Offset >= argILRange[0].From)
                            {
                                constructor.Body.Instructions.Insert(0, copier.Copy(newInstruction));
                                newInstruction = newInstruction.Previous;
                            }
                        }
                        Console.WriteLine("Copied to " + constructors.Count + " constructor assigment of " + member);
                    }
                }
            };

            copier.Process();

            var d = new DecompilerContext(OriginType.Module)
            {
                CurrentType = OriginType
            };
            var astBuilder = new AstBuilder(d);

            astBuilder.AddType(OriginType);
            astBuilder.SyntaxTree.AcceptVisitor(visitor);
        }
Exemplo n.º 7
0
		protected override void Attach (ObservableAstVisitor<InspectionData, object> visitor)
		{
			visitor.VariableDeclarationStatementVisited += HandleVisitorVariableDeclarationStatementVisited;
			visitor.FixedFieldDeclarationVisited += HandleVisitorFixedFieldDeclarationVisited;
			visitor.ParameterDeclarationVisited += HandleVisitorParameterDeclarationVisited;
			visitor.PropertyDeclarationVisited += HandleVisitorPropertyDeclarationVisited;
			visitor.MethodDeclarationVisited += HandleVisitorMethodDeclarationVisited;
			visitor.FieldDeclarationVisited += HandleVisitorFieldDeclarationVisited;
			visitor.CustomEventDeclarationVisited += HandleVisitorCustomEventDeclarationVisited;
			visitor.EventDeclarationVisited += HandleVisitorEventDeclarationVisited;
			visitor.TypeDeclarationVisited += HandleVisitorTypeDeclarationVisited;
			visitor.DelegateDeclarationVisited += HandleVisitorDelegateDeclarationVisited;
			visitor.NamespaceDeclarationVisited += HandleVisitorNamespaceDeclarationVisited;
			visitor.TypeParameterDeclarationVisited += HandleVisitorTypeParameterDeclarationVisited;
			visitor.EnumMemberDeclarationVisited += HandleVisitorEnumMemberDeclarationVisited;
		}
Exemplo n.º 8
0
 protected override void Attach(ObservableAstVisitor <InspectionData, object> visitor)
 {
     visitor.VariableDeclarationStatementVisited += HandleVisitorVariableDeclarationStatementVisited;
     visitor.FixedFieldDeclarationVisited        += HandleVisitorFixedFieldDeclarationVisited;
     visitor.ParameterDeclarationVisited         += HandleVisitorParameterDeclarationVisited;
     visitor.PropertyDeclarationVisited          += HandleVisitorPropertyDeclarationVisited;
     visitor.MethodDeclarationVisited            += HandleVisitorMethodDeclarationVisited;
     visitor.FieldDeclarationVisited             += HandleVisitorFieldDeclarationVisited;
     visitor.CustomEventDeclarationVisited       += HandleVisitorCustomEventDeclarationVisited;
     visitor.EventDeclarationVisited             += HandleVisitorEventDeclarationVisited;
     visitor.TypeDeclarationVisited          += HandleVisitorTypeDeclarationVisited;
     visitor.DelegateDeclarationVisited      += HandleVisitorDelegateDeclarationVisited;
     visitor.NamespaceDeclarationVisited     += HandleVisitorNamespaceDeclarationVisited;
     visitor.TypeParameterDeclarationVisited += HandleVisitorTypeParameterDeclarationVisited;
     visitor.EnumMemberDeclarationVisited    += HandleVisitorEnumMemberDeclarationVisited;
 }
Exemplo n.º 9
0
        private void FixGeneratedType()
        {
            var d = new DecompilerContext(DestinationType.Module);

            d.CurrentType = DestinationType;
            var visitor = new ObservableAstVisitor();

            visitor.EnterInvocationExpression += exp => {
                var target       = exp.Target;
                var methodInvoke = exp.Annotation <MethodReference>();
                if (methodInvoke == null)
                {
                    return;
                }
                for (var i = 0; i < exp.Arguments.Count; i++)
                {
                    var arg       = exp.Arguments.ToList()[i];
                    var argType   = arg.Annotation <TypeInformation>().InferredType;
                    var param     = methodInvoke.Parameters[i];
                    var paramType = param.ParameterType;
                    if (argType.IsValueType && !paramType.IsValueType)
                    {
                        var argILRange = arg.Annotation <List <ILRange> >();
                        var insts      = GetInstructions(arg);
                        var inst       = GetInstruction(insts, argILRange[0].To);
                        if (inst.Previous.OpCode.Code != Code.Box)
                        {
                            var box = Instruction.Create(OpCodes.Box, argType);
                            insts.Insert(insts.IndexOf(inst), box);
                            Console.WriteLine("Box inserted! Method Arg " + param.Name + " " + argType + " to " + paramType);
                        }
                    }
                }
            };

            copier.Process();

            var astBuilder = new AstBuilder(d);

            astBuilder.AddType(DestinationType);
            // astBuilder.RunTransformations();
            astBuilder.SyntaxTree.AcceptVisitor(visitor);
        }
		protected override void Attach (ObservableAstVisitor<InspectionData, object> visitior)
		{
			visitior.ConditionalExpressionVisited += delegate(ConditionalExpression node, InspectionData data) {
				foreach (var match in Matches) {
					if (match.IsMatch (node) && IsCandidate (node)) {
						
						AddResult (data,
							new DomRegion (node.StartLocation.Line, node.StartLocation.Column, node.EndLocation.Line, node.EndLocation.Column),
							GettextCatalog.GetString ("Convert to '??' expression"),
							delegate {
								var expressions = GetExpressions (node);
										
								Expression expr = new BinaryOperatorExpression (expressions.Item1.Clone (), BinaryOperatorType.NullCoalescing, expressions.Item2.Clone ());
//								node.Replace (data.Document, expr);
							}
						);
					}
				}
			};
		}
Exemplo n.º 11
0
		public static void Run(IEnumerable<SyntaxTree> files)
		{
			files = files.ToList();
			
			RunTest("recursive method using for", files, (syntaxTree, list) => WalkTreeFor(syntaxTree, list));
			RunTest("recursive method using foreach", files, (syntaxTree, list) => WalkTreeForEach(syntaxTree, list));
			RunTest("non-recursive loop", files, (syntaxTree, list) => WalkTreeNonRecursive(syntaxTree, list));
			RunTest("foreach over Descendants.OfType()", files, (syntaxTree, list) => {
			        	foreach (var node in syntaxTree.Descendants.OfType<IdentifierExpression>()) {
			        		list.Add(node);
			        	}
			        });
			RunTest("DepthFirstAstVisitor", files, (syntaxTree, list) => syntaxTree.AcceptVisitor(new DepthFirst(list)));
			RunTest("DepthFirstAstVisitor<object>", files, (syntaxTree, list) => syntaxTree.AcceptVisitor(new DepthFirst<object>(list)));
			RunTest("DepthFirstAstVisitor<object, object>", files, (syntaxTree, list) => syntaxTree.AcceptVisitor(new DepthFirst<object, object>(list), null));
			RunTest("ObservableAstVisitor", files, (syntaxTree, list) => {
			        	var visitor = new ObservableAstVisitor();
			        	visitor.EnterIdentifierExpression += list.Add;
			        	syntaxTree.AcceptVisitor(visitor);
			        });
		}
        protected override void Attach(ObservableAstVisitor <InspectionData, object> visitior)
        {
            visitior.ConditionalExpressionVisited += delegate(ConditionalExpression node, InspectionData data) {
                foreach (var match in Matches)
                {
                    if (match.IsMatch(node) && IsCandidate(node))
                    {
                        AddResult(data,
                                  new DomRegion(node.StartLocation.Line, node.StartLocation.Column, node.EndLocation.Line, node.EndLocation.Column),
                                  GettextCatalog.GetString("Convert to '??' expression"),
                                  delegate {
                            var expressions = GetExpressions(node);

                            Expression expr = new BinaryOperatorExpression(expressions.Item1.Clone(), BinaryOperatorType.NullCoalescing, expressions.Item2.Clone());
//								node.Replace (data.Document, expr);
                        }
                                  );
                    }
                }
            };
        }
Exemplo n.º 13
0
        public static void Run(IEnumerable <SyntaxTree> files)
        {
            files = files.ToList();

            RunTest("recursive method using for", files, (syntaxTree, list) => WalkTreeFor(syntaxTree, list));
            RunTest("recursive method using foreach", files, (syntaxTree, list) => WalkTreeForEach(syntaxTree, list));
            RunTest("non-recursive loop", files, (syntaxTree, list) => WalkTreeNonRecursive(syntaxTree, list));
            RunTest("foreach over Descendants.OfType()", files, (syntaxTree, list) => {
                foreach (var node in syntaxTree.Descendants.OfType <IdentifierExpression>())
                {
                    list.Add(node);
                }
            });
            RunTest("DepthFirstAstVisitor", files, (syntaxTree, list) => syntaxTree.AcceptVisitor(new DepthFirst(list)));
            RunTest("DepthFirstAstVisitor<object>", files, (syntaxTree, list) => syntaxTree.AcceptVisitor(new DepthFirst <object>(list)));
            RunTest("DepthFirstAstVisitor<object, object>", files, (syntaxTree, list) => syntaxTree.AcceptVisitor(new DepthFirst <object, object>(list), null));
            RunTest("ObservableAstVisitor", files, (syntaxTree, list) => {
                var visitor = new ObservableAstVisitor();
                visitor.EnterIdentifierExpression += list.Add;
                syntaxTree.AcceptVisitor(visitor);
            });
        }
		protected override void Attach (ObservableAstVisitor<InspectionData, object> visitior)
		{
			visitior.ThrowStatementVisited += delegate(ThrowStatement node, InspectionData data) {
				if (node.Expression.IsNull)
					return;
				if (node.Expression is IdentifierExpression && ((IdentifierExpression)node.Expression).Identifier != "NotImplementedException")
					return;
				if (node.Expression is MemberReferenceExpression && ((MemberReferenceExpression)node.Expression).MemberName != "NotImplementedException")
					return;
				// may be a not implemented exception, to get 100% sure we need to make a resolve.
				var resolver = data.Resolver;
				var result = resolver.Resolve (node.Expression.ToString (), new DomLocation (node.StartLocation.Line, node.EndLocation.Column));
				if (result != null && result.ResolvedType.FullName != null && result.ResolvedType.FullName == "System.NotImplementedException") {
					data.Add (new Result (
						new DomRegion (node.StartLocation.Line, node.StartLocation.Column, node.EndLocation.Line, node.EndLocation.Column),
						GettextCatalog.GetString ("NotImplemented exception thrown"),
						MonoDevelop.SourceEditor.QuickTaskSeverity.Suggestion,
						ResultCertainty.High,
						ResultImportance.Low,
						false)
					);
				}
			};
		}
Exemplo n.º 15
0
        private void FixGeneratedType()
        {
            var d = new DecompilerContext(DestinationType.Module);
            d.CurrentType = DestinationType;
            var visitor = new ObservableAstVisitor();

            visitor.EnterInvocationExpression += exp => {
                var target = exp.Target;
                var methodInvoke = exp.Annotation<MethodReference>();
                if(methodInvoke==null)
                    return;
                for(var i = 0; i< exp.Arguments.Count; i++){
                    var arg = exp.Arguments.ToList()[i];
                    var argType = arg.Annotation<TypeInformation>().InferredType;
                    var param = methodInvoke.Parameters[i];
                    var paramType = param.ParameterType;
                    if(argType.IsValueType && !paramType.IsValueType){
                        var argILRange = arg.Annotation<List<ILRange>>();
                        var insts = GetInstructions(arg);
                        var inst = GetInstruction(insts, argILRange[0].To);
                        if(inst.Previous.OpCode.Code != Code.Box){
                            var box = Instruction.Create(OpCodes.Box,argType);
                            insts.Insert(insts.IndexOf(inst),box);
                            Console.WriteLine("Box inserted! Method Arg "+ param.Name + " " +argType + " to " + paramType);
                        }
                    }
                }
            };

               ProcessNewInstructions();

               var astBuilder = new AstBuilder(d);
               astBuilder.AddType(DestinationType);
               // astBuilder.RunTransformations();
               astBuilder.SyntaxTree.AcceptVisitor(visitor);
        }
Exemplo n.º 16
0
        private void CopyConstructorInitInstructions()
        {
            var constructors = GetConstructors(DestinationType, true);

            var visitor = new ObservableAstVisitor();

            bool isNewConstructor = false;
            visitor.EnterConstructorDeclaration += exp => {
                var constructor = exp.Annotation<MethodReference>();
                if(!copier.CopyMap.ContainsKey(constructor)){
                    isNewConstructor = true;
                }
            };
            visitor.LeaveConstructorDeclaration += exp => {
                isNewConstructor = false;
            };
            visitor.EnterConstructorInitializer += exp => {
                isNewConstructor = false;
            };
            visitor.EnterAssignmentExpression += exp => {
                var member = exp.Left.Annotation<MemberReference>();
                if(isNewConstructor){
                    if(copier.CopyMap.ContainsKey(member)){
                        var argILRange = exp.Annotation<List<ILRange>>();
                        var newInstructions = GetInstructions(exp);
                        foreach(var constructor in constructors){
                            var newInstruction = GetInstruction(newInstructions, argILRange[0].To);
                            newInstruction = newInstruction.Previous;
                            while(newInstruction != null && newInstruction.Offset >= argILRange[0].From){
                                constructor.Body.Instructions.Insert(0, copier.Copy(newInstruction));
                                newInstruction = newInstruction.Previous;
                            }
                        }
                        Console.WriteLine("Copied to "+constructors.Count+" constructor assigment of "+member);
                    }
                }
            };

               ProcessNewInstructions();

               var d = new DecompilerContext(OriginType.Module) {CurrentType = OriginType};
               var astBuilder = new AstBuilder(d);
               astBuilder.AddType(OriginType);
               astBuilder.SyntaxTree.AcceptVisitor(visitor);
        }
Exemplo n.º 17
0
		protected abstract void Attach (ObservableAstVisitor<InspectionData, object> visitior);
Exemplo n.º 18
0
 protected abstract void Attach(ObservableAstVisitor <InspectionData, object> visitior);
Exemplo n.º 19
0
		protected override void Attach (ObservableAstVisitor<InspectionData, object> visitor)
		{
			visitor.UsingDeclarationVisited += HandleVisitorUsingDeclarationVisited;
		}
Exemplo n.º 20
0
 protected override void Attach(ObservableAstVisitor <InspectionData, object> visitor)
 {
     visitor.UsingDeclarationVisited += HandleVisitorUsingDeclarationVisited;
 }
Exemplo n.º 21
0
        private List<MethodDefinition> GetConstructors(TypeDefinition type, bool isBaseInitializer)
        {
            List<MethodDefinition> constructors = new List<MethodDefinition>();
            var visitor = new ObservableAstVisitor();
            visitor.EnterConstructorDeclaration += exp => {
                var constructor = exp.Annotation<MethodReference>();
                if(!isBaseInitializer || exp.Initializer.ConstructorInitializerType == ConstructorInitializerType.Base){
                    constructors.Add(constructor.Resolve());
                }
            };

               ProcessNewInstructions();

               var d = new DecompilerContext(type.Module) {CurrentType = type};
               var astBuilder = new AstBuilder(d);
               astBuilder.AddType(type);
               astBuilder.SyntaxTree.AcceptVisitor(visitor);
               return constructors;
        }
		protected override void Attach (ObservableAstVisitor<InspectionData, object> visitior)
		{
			visitior.BinaryOperatorExpressionVisited += delegate(BinaryOperatorExpression binOp, InspectionData data) {
				foreach (var match in Matches) {
					if (match.IsMatch (binOp) && ComparesEqualNodes (binOp)) {
						AddResult (data,
							new DomRegion (binOp.StartLocation.Line, binOp.StartLocation.Column, binOp.EndLocation.Line, binOp.EndLocation.Column),
							GettextCatalog.GetString ("Use string.IsNullOrEmpty"),
							delegate {
							Expression invocation = new InvocationExpression (new MemberReferenceExpression (new TypeReferenceExpression (new PrimitiveType ("string")), "IsNullOrEmpty"), GetParameter (binOp));
//							binOp.Replace (data.Document, invocation);	
						}
						);
					}
				}
				foreach (var match in NegatedMatches) {
					if (match.IsMatch (binOp) && ComparesEqualNodes (binOp)) {
						AddResult (data,
							new DomRegion (binOp.StartLocation.Line, binOp.StartLocation.Column, binOp.EndLocation.Line, binOp.EndLocation.Column),
							GettextCatalog.GetString ("Use string.IsNullOrEmpty"),
							delegate {
								Expression invocation = new InvocationExpression (new MemberReferenceExpression (new TypeReferenceExpression (new PrimitiveType ("string")), "IsNullOrEmpty"), GetParameter (binOp));
								invocation = new UnaryOperatorExpression (UnaryOperatorType.Not, invocation);
//								binOp.Replace (data.Document, invocation);	
							}
						);
					}
				}
			};
		}
Exemplo n.º 23
0
 protected override void Attach(ObservableAstVisitor <InspectionData, object> visitior)
 {
     visitior.VariableDeclarationStatementVisited += HandleVisitiorVariableDeclarationStatementVisited;
 }
Exemplo n.º 24
0
		protected override void Attach (ObservableAstVisitor<InspectionData, object>  visitior)
		{
			visitior.VariableDeclarationStatementVisited += HandleVisitiorVariableDeclarationStatementVisited;
		}