C++_Refactoring_-_Now_for_Real

12
C++ Refactoring – Now for Real Sergey Prigogin Google CDT committer, refactoring component lead Copyright (c) 2012 Google. Made available under the Eclipse Public License v1.0.

description

Refactoring

Transcript of C++_Refactoring_-_Now_for_Real

Page 1: C++_Refactoring_-_Now_for_Real

C++ Refactoring – Now for Real Sergey Prigogin

Google

CDT committer, refactoring component lead

Copyright (c) 2012 Google. Made available under the Eclipse Public License v1.0.

Page 2: C++_Refactoring_-_Now_for_Real

History of refactoring in CDT

2003 2004 2005 2006 2007 2008 2009 2010 2011 2012

Rename

Toggle Function

Extract Local Variable

Getters and Setters

Hide Method

Implement Method

Extract Constant

Extract Function

Page 3: C++_Refactoring_-_Now_for_Real

What’s wrong with refactoring in CDT?

Ø Corrupts surrounding code

Ø Generated code is not formatted properly

Ø Often produces semantically invalid code

Ø Does it very slowly

Ø Requires you to save all files

Page 4: C++_Refactoring_-_Now_for_Real

Why was it slow?

Ø Refactoring requires AST

Ø AST requires index read lock

Ø Refactoring steps: o checkInitialConditions

o checkFinalConditions

o createChange

Page 5: C++_Refactoring_-_Now_for_Real

How we made it fast

Ø Disposable refactoring context object

Ø Caching of ASTs

Ø Using editor AST when available o Index doesn’t help with dirty editors

Page 6: C++_Refactoring_-_Now_for_Real

Preventing collateral damage

Ø AST rewrite infrastructure

Ø Creation of textual changes based on AST delta

Page 7: C++_Refactoring_-_Now_for_Real

Passing parameters by value or reference

class A {!

public:!

void setIntField(int intField) {!

this->intField = intField;!

}!

!

void setStrField(const std::string& strField) {!

this->strField = strField;!

}!

!

private:!

int intField;!

std::string strField;!

};!

Page 8: C++_Refactoring_-_Now_for_Real

Which variables should be returned int factorial(int k) {! int i = 1;! int f = 1;! while (i <= k)! f *= i++;! return f;!}!

int multiply(int f, int* i) {! f *= *i++;! return f;!}!!int factorial(int k) {! int i = 1;! int f = 1;! while (i <= k)! f = multiply(f, &i);! return f;!}!

Page 9: C++_Refactoring_-_Now_for_Real

How is was in CDT 8.0 int factorial(int k) {! int i = 1;! int f = 1;! while (i <= k)! f *= i++;! return f;!}!

int multiply(int f, int i)!{! f *= i++;!}!!int factorial(int k) {! int i = 1;! int f = 1;! while (i <= k)! f = multiply(f, i);! return f;!}!

Page 10: C++_Refactoring_-_Now_for_Real

New code style preferences

Page 11: C++_Refactoring_-_Now_for_Real

How can I try it myself?

Download https://hudson.eclipse.org/hudson/job/cdt-nightly/lastSuccessfulBuild/artifact/releng/org.eclipse.cdt.repo/target/org.eclipse.cdt.repo.zip

Page 12: C++_Refactoring_-_Now_for_Real

What’s next?

Ø Focus on quality

Ø Change Function Signature and Inline refactorings

Ø Rename file when renaming a class

Ø Organize Includes