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) ); } }; }
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); } ); } } }; }
public void Attach(InspectorAddinNode node, ObservableAstVisitor <InspectionData, object> visitior) { if (visitior == null) { throw new ArgumentNullException("visitior"); } this.node = node; Attach(visitior); }
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); }
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; }
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; }
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); } ); } } }; }
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); } ); } } }; }
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) ); } }; }
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); }
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); }
protected abstract void Attach (ObservableAstVisitor<InspectionData, object> visitior);
protected abstract void Attach(ObservableAstVisitor <InspectionData, object> visitior);
protected override void Attach (ObservableAstVisitor<InspectionData, object> visitor) { visitor.UsingDeclarationVisited += HandleVisitorUsingDeclarationVisited; }
protected override void Attach(ObservableAstVisitor <InspectionData, object> visitor) { visitor.UsingDeclarationVisited += HandleVisitorUsingDeclarationVisited; }
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); } ); } } }; }
protected override void Attach(ObservableAstVisitor <InspectionData, object> visitior) { visitior.VariableDeclarationStatementVisited += HandleVisitiorVariableDeclarationStatementVisited; }
protected override void Attach (ObservableAstVisitor<InspectionData, object> visitior) { visitior.VariableDeclarationStatementVisited += HandleVisitiorVariableDeclarationStatementVisited; }