public override List <Change> PerformChanges(RefactoringOptions options, object prop) { IResolver resolver = options.GetResolver(); List <Change> result = new List <Change> (); INRefactoryASTProvider provider = options.GetASTProvider(); if (resolver == null || provider == null) { return(result); } TypeDeclaration newType = new TypeDeclaration(ICSharpCode.NRefactory.Ast.Modifiers.None, null); newType.Name = createExpression.CreateType.Type; newType.Type = GetNewTypeType(); ConstructorDeclaration constructor = new ConstructorDeclaration(newType.Name, ICSharpCode.NRefactory.Ast.Modifiers.Public, null, null); constructor.Body = new BlockStatement(); int i = 0; foreach (Expression expression in createExpression.Parameters) { i++; string output = provider.OutputNode(options.Dom, expression); string parameterName; if (Char.IsLetter(output[0]) || output[0] == '_') { parameterName = output; } else { parameterName = "par" + i; } ResolveResult resolveResult2 = resolver.Resolve(new ExpressionResult(output), options.ResolveResult.ResolvedExpression.Region.Start); TypeReference typeReference = new TypeReference(resolveResult2.ResolvedType.ToInvariantString()); typeReference.IsKeyword = true; ParameterDeclarationExpression pde = new ParameterDeclarationExpression(typeReference, parameterName); constructor.Parameters.Add(pde); } ICSharpCode.NRefactory.Ast.INode node = newType; IType curType = options.Document.CompilationUnit.GetTypeAt(options.Document.Editor.Caret.Line, options.Document.Editor.Caret.Column); if (curType != null && !string.IsNullOrEmpty(curType.Namespace)) { NamespaceDeclaration namespaceDeclaration = new NamespaceDeclaration(curType.Namespace); namespaceDeclaration.Children.Add(newType); node = namespaceDeclaration; } newType.Children.Add(constructor); string fileName = GetName(Path.Combine(Path.GetDirectoryName(options.Document.FileName), newType.Name + Path.GetExtension(options.Document.FileName))); string header = options.Dom.Project is DotNetProject?StandardHeaderService.GetHeader(options.Dom.Project, fileName, true) + Environment.NewLine : ""; CreateFileChange createFile = new CreateFileChange(fileName, header + provider.OutputNode(options.Dom, node)); result.Add(createFile); result.Add(new OpenFileChange(fileName)); return(result); }
public override List <Change> PerformChanges(RefactoringOptions options, object properties) { List <Change> changes = new List <Change>(); var resolveResult = options.ResolveResult; if (resolveResult == null) { throw new InvalidOperationException("Cannot generate class here"); } var resType = resolveResult.ResolvedType; var doc = options.Document; var editor = doc.Editor; var currentDir = doc.FileName.ParentDirectory; var nspace = resType.Namespace; string typeName = resolveResult.ResolvedExpression.Expression; var body = resType.Type.BodyRegion; var content = editor.GetTextBetween(body.Start.Line, 1, body.End.Line, body.End.Column); var contentLength = content.Length; content = fileFormatResolver.GetNewTypeFileContent(content, nspace, editor.EolMarker); CreateFileChange createFileChange = new CreateFileChange(@"{0}\{1}.cs".ToFormat(currentDir, typeName), content); changes.Add(createFileChange); TextReplaceChange textReplaceChange = new TextReplaceChange(); textReplaceChange.FileName = context.GetCurrentFilePath(); textReplaceChange.RemovedChars = contentLength + 1; int num = editor.Document.LocationToOffset(body.Start.Line, 1); textReplaceChange.Offset = num - 1; textReplaceChange.InsertedText = string.Empty; changes.Add(textReplaceChange); return(changes); }
public override List<Change> PerformChanges (RefactoringOptions options, object prop) { IResolver resolver = options.GetResolver (); List<Change> result = new List<Change> (); INRefactoryASTProvider provider = options.GetASTProvider (); if (resolver == null || provider == null) return result; TypeDeclaration newType = new TypeDeclaration (ICSharpCode.NRefactory.Ast.Modifiers.None, null); newType.Name = createExpression.CreateType.Type; newType.Type = GetNewTypeType (); ConstructorDeclaration constructor = new ConstructorDeclaration (newType.Name, ICSharpCode.NRefactory.Ast.Modifiers.Public, null, null); constructor.Body = new BlockStatement (); int i = 0; foreach (Expression expression in createExpression.Parameters) { i++; string output = provider.OutputNode (options.Dom, expression); string parameterName; if (Char.IsLetter (output[0]) || output[0] == '_') { parameterName = output; } else { parameterName = "par" + i; } ResolveResult resolveResult2 = resolver.Resolve (new ExpressionResult (output), options.ResolveResult.ResolvedExpression.Region.Start); TypeReference typeReference = new TypeReference (resolveResult2.ResolvedType.ToInvariantString ()); typeReference.IsKeyword = true; ParameterDeclarationExpression pde = new ParameterDeclarationExpression (typeReference, parameterName); constructor.Parameters.Add (pde); } ICSharpCode.NRefactory.Ast.INode node = newType; IType curType = options.Document.CompilationUnit.GetTypeAt (options.Document.TextEditor.CursorLine, options.Document.TextEditor.CursorColumn); if (curType != null && !string.IsNullOrEmpty (curType.Namespace)) { NamespaceDeclaration namespaceDeclaration = new NamespaceDeclaration (curType.Namespace); namespaceDeclaration.Children.Add (newType); node = namespaceDeclaration; } newType.Children.Add (constructor); string fileName = GetName (Path.Combine (Path.GetDirectoryName (options.Document.FileName), newType.Name + Path.GetExtension (options.Document.FileName))); string header = options.Dom.Project is DotNetProject ? StandardHeaderService.GetHeader (options.Dom.Project, fileName, true) + Environment.NewLine : ""; CreateFileChange createFile = new CreateFileChange (fileName, header + provider.OutputNode (options.Dom, node)); result.Add (createFile); result.Add (new OpenFileChange (fileName)); return result; }