Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Tobias Hunger
qt-creator
Commits
56a677e0
Commit
56a677e0
authored
Nov 09, 2009
by
Roberto Raggi
Browse files
Cleanup
Done with: Erik Verbruggen
parent
e0b27ef7
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/tools/cplusplus/Main.cpp
View file @
56a677e0
...
...
@@ -4,6 +4,7 @@
#include
<QTextDocument>
#include
<QTextCursor>
#include
<QTextBlock>
#include
<QDir>
#include
<QDebug>
#include
<Control.h>
...
...
@@ -163,77 +164,88 @@ private:
Overview
oo
;
};
int
main
(
int
argc
,
char
*
argv
[]
)
void
generateAST_H
(
const
Snapshot
&
snapshot
,
const
QDir
&
cplusplusDir
)
{
QCoreApplication
app
(
argc
,
argv
);
QStringList
files
=
app
.
arguments
();
files
.
removeFirst
();
QFileInfo
fileAST_h
(
cplusplusDir
,
QLatin1String
(
"AST.h"
));
Q_ASSERT
(
fileAST_h
.
exists
());
if
(
files
.
isEmpty
())
{
std
::
cerr
<<
"Usage: cplusplus AST.h"
<<
std
::
endl
;
return
EXIT_FAILURE
;
}
const
QString
fileName
=
fileAST_h
.
absoluteFilePath
();
Snapshot
snapshot
;
QFile
file
(
fileName
);
if
(
!
file
.
open
(
QFile
::
ReadOnly
))
return
;
//const QString configuration = QLatin1String("#define CPLUSPLUS_EXPORT\n");
const
QString
source
=
QTextStream
(
&
file
).
readAll
();
file
.
close
();
foreach
(
const
QString
&
fileName
,
files
)
{
QFile
file
(
fileName
);
if
(
!
file
.
open
(
QFile
::
ReadOnly
))
continue
;
QTextDocument
document
;
document
.
setPlainText
(
source
);
const
QString
source
=
QTextStream
(
&
file
).
readAll
();
QTextDocument
document
;
document
.
setPlainText
(
source
);
Document
::
Ptr
doc
=
Document
::
create
(
fileName
);
const
QByteArray
preprocessedCode
=
snapshot
.
preprocessedCode
(
source
,
fileName
);
doc
->
setSource
(
preprocessedCode
);
doc
->
check
();
Document
::
Ptr
doc
=
Document
::
create
(
fileName
);
//doc->control()->setDiagnosticClient(0);
const
QByteArray
preprocessedCode
=
snapshot
.
preprocessedCode
(
source
,
fileName
);
doc
->
setSource
(
preprocessedCode
);
doc
->
check
();
FindASTNodes
process
(
doc
,
&
document
);
ASTNodes
astNodes
=
process
(
doc
->
translationUnit
()
->
ast
());
FindASTNodes
process
(
doc
,
&
document
);
ASTNodes
astNodes
=
process
(
doc
->
translationUnit
()
->
ast
());
RemoveCastMethods
removeCastMethods
(
doc
,
&
document
);
RemoveCastMethods
removeCastMethods
(
doc
,
&
document
);
QList
<
QTextCursor
>
baseCastMethodCursors
=
removeCastMethods
(
astNodes
.
base
);
QMap
<
ClassSpecifierAST
*
,
QList
<
QTextCursor
>
>
cursors
;
QMap
<
ClassSpecifierAST
*
,
QString
>
replacementCastMethods
;
QList
<
QTextCursor
>
baseCastMethodCursors
=
removeCastMethods
(
astNodes
.
base
);
QMap
<
ClassSpecifierAST
*
,
QList
<
QTextCursor
>
>
cursors
;
QMap
<
ClassSpecifierAST
*
,
QString
>
replacementCastMethods
;
Overview
oo
;
Overview
oo
;
QStringList
castMethods
;
foreach
(
ClassSpecifierAST
*
classAST
,
astNodes
.
deriveds
)
{
cursors
[
classAST
]
=
removeCastMethods
(
classAST
);
const
QString
className
=
oo
(
classAST
->
symbol
->
name
());
const
QString
methodName
=
QLatin1String
(
"as"
)
+
className
.
mid
(
0
,
className
.
length
()
-
3
);
replacementCastMethods
[
classAST
]
=
QString
(
" virtual %1 *%2() { return this; }
\n
"
).
arg
(
className
,
methodName
);
castMethods
.
append
(
QString
(
" virtual %1 *%2() { return 0; }
\n
"
).
arg
(
className
,
methodName
));
}
QStringList
castMethods
;
foreach
(
ClassSpecifierAST
*
classAST
,
astNodes
.
deriveds
)
{
cursors
[
classAST
]
=
removeCastMethods
(
classAST
);
const
QString
className
=
oo
(
classAST
->
symbol
->
name
());
const
QString
methodName
=
QLatin1String
(
"as"
)
+
className
.
mid
(
0
,
className
.
length
()
-
3
);
replacementCastMethods
[
classAST
]
=
QString
(
" virtual %1 *%2() { return this; }
\n
"
).
arg
(
className
,
methodName
);
castMethods
.
append
(
QString
(
" virtual %1 *%2() { return 0; }"
).
arg
(
className
,
methodName
));
if
(
!
baseCastMethodCursors
.
isEmpty
())
{
castMethods
.
sort
();
for
(
int
i
=
0
;
i
<
baseCastMethodCursors
.
length
();
++
i
)
{
baseCastMethodCursors
[
i
].
removeSelectedText
();
}
if
(
!
baseCastMethodCursors
.
isEmpty
())
{
castMethods
.
sort
();
for
(
int
i
=
0
;
i
<
baseCastMethodCursors
.
length
();
++
i
)
{
baseCastMethodCursors
[
i
].
removeSelectedText
();
}
baseCastMethodCursors
.
first
().
insertText
(
castMethods
.
join
(
QLatin1String
(
""
)));
}
for
(
int
classIndex
=
0
;
classIndex
<
astNodes
.
deriveds
.
size
();
++
classIndex
)
{
ClassSpecifierAST
*
classAST
=
astNodes
.
deriveds
.
at
(
classIndex
);
baseCastMethodCursors
.
first
().
insertText
(
castMethods
.
join
(
QLatin1String
(
"
\n
"
)));
// remove the cast methods.
QList
<
QTextCursor
>
c
=
cursors
.
value
(
classAST
);
for
(
int
i
=
0
;
i
<
c
.
length
();
++
i
)
{
c
[
i
].
removeSelectedText
();
}
for
(
int
classIndex
=
0
;
classIndex
<
astNodes
.
deriveds
.
size
();
++
classIndex
)
{
ClassSpecifierAST
*
classAST
=
astNodes
.
deriveds
.
at
(
classIndex
);
astNodes
.
endOfPublicClassSpecifiers
[
classIndex
].
insertText
(
replacementCastMethods
.
value
(
classAST
));
}
// remove the cast methods.
QList
<
QTextCursor
>
c
=
cursors
.
value
(
classAST
);
for
(
int
i
=
0
;
i
<
c
.
length
();
++
i
)
{
c
[
i
].
removeSelectedText
();
}
if
(
file
.
open
(
QFile
::
WriteOnly
))
{
QTextStream
out
(
&
file
);
out
<<
document
.
toPlainText
();
}
}
astNodes
.
endOfPublicClassSpecifiers
[
classIndex
].
insertText
(
replacementCastMethods
.
value
(
classAST
));
}
int
main
(
int
argc
,
char
*
argv
[])
{
QCoreApplication
app
(
argc
,
argv
);
QStringList
files
=
app
.
arguments
();
files
.
removeFirst
();
std
::
cout
<<
qPrintable
(
document
.
toPlainText
());
if
(
files
.
isEmpty
())
{
std
::
cerr
<<
"Usage: cplusplus [path to C++ front-end]"
<<
std
::
endl
;
return
EXIT_FAILURE
;
}
QDir
cplusplusDir
(
files
.
first
());
Snapshot
snapshot
;
generateAST_H
(
snapshot
,
cplusplusDir
);
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment